feat: 会员折扣与订单状态同步 #1

Open
ai_bot wants to merge 7 commits from feature/discount into main
Owner

新增会员 9 折逻辑,并在提交订单时同步状态到数据库。请评审。

新增会员 9 折逻辑,并在提交订单时同步状态到数据库。请评审。
ai_bot added 1 commit 2026-11-02 13:16:18 +08:00
ai_bot added 1 commit 2026-11-02 13:22:43 +08:00
ai_bot added 1 commit 2026-11-02 13:24:08 +08:00
ai_bot added 1 commit 2026-11-02 13:26:22 +08:00
admin added 1 commit 2026-11-02 13:28:41 +08:00
ai_bot left a comment
Author
Owner

🤖 AI 评审(qwen3.8-max)

结论:必须阻断(存在硬编码凭据、金额计算错误、连接泄漏与事务不一致)。

问题

严重

  • [OrderService.java] 生产数据库 URL/账号密码硬编码 → 凭据泄露与合规风险 → 立即移除,改配置中心/环境变量并轮换密码。
  • [OrderService.java] 折扣在循环内对累计 sum 反复打 9 折 → 多行订单金额错误,可能资损;“9折/50%”含义需确认 → 先汇总小计再统一折扣,或按行折扣。
  • [OrderService.java] Connection 未关闭,异常时也不释放 → 连接泄漏,数据库连接耗尽 → 使用 try-with-resources/finally,并改用连接池。
  • [OrderService.java] repository.save 与 JDBC 更新未在同一事务/连接 → 失败时订单与状态不一致;是否已有事务需确认 → 统一事务边界,失败回滚或补偿。

中等

  • [OrderService.java] SQL 拼接 order.getId() → 潜在 SQL 注入/类型风险 → 使用 PreparedStatement 参数化。
  • [OrderService.java] getCustomer()、getLines()、getPrice() 未判空 → NPE → 增加入参校验与空集合处理。
  • [OrderService.java] executeUpdate 未检查影响行数 → 更新 0 行会静默成功 → 校验返回值并抛错/告警。
  • [OrderService.java] throws Exception 过宽 → 异常语义不清 → 使用具体异常或业务异常。

建议

  • [OrderService.java] BigDecimal.valueOf(0.9) 与货币舍入规则未定义 → 金额展示/对账差异 → 用 new BigDecimal("0.9") 并统一 setScale/RoundingMode。
  • [OrderService.java] DriverManager 直连且 URL 写死 → 不可配置、性能差 → 使用 DataSource/连接池并外置配置。
### 🤖 AI 评审(qwen3.8-max) **结论**:必须阻断(存在硬编码凭据、金额计算错误、连接泄漏与事务不一致)。 **问题** **严重** - [OrderService.java] 生产数据库 URL/账号密码硬编码 → 凭据泄露与合规风险 → 立即移除,改配置中心/环境变量并轮换密码。 - [OrderService.java] 折扣在循环内对累计 `sum` 反复打 9 折 → 多行订单金额错误,可能资损;“9折/50%”含义需确认 → 先汇总小计再统一折扣,或按行折扣。 - [OrderService.java] `Connection` 未关闭,异常时也不释放 → 连接泄漏,数据库连接耗尽 → 使用 try-with-resources/finally,并改用连接池。 - [OrderService.java] `repository.save` 与 JDBC 更新未在同一事务/连接 → 失败时订单与状态不一致;是否已有事务需确认 → 统一事务边界,失败回滚或补偿。 **中等** - [OrderService.java] SQL 拼接 `order.getId()` → 潜在 SQL 注入/类型风险 → 使用 `PreparedStatement` 参数化。 - [OrderService.java] `getCustomer()`、`getLines()`、`getPrice()` 未判空 → NPE → 增加入参校验与空集合处理。 - [OrderService.java] `executeUpdate` 未检查影响行数 → 更新 0 行会静默成功 → 校验返回值并抛错/告警。 - [OrderService.java] `throws Exception` 过宽 → 异常语义不清 → 使用具体异常或业务异常。 **建议** - [OrderService.java] `BigDecimal.valueOf(0.9)` 与货币舍入规则未定义 → 金额展示/对账差异 → 用 `new BigDecimal("0.9")` 并统一 `setScale/RoundingMode`。 - [OrderService.java] `DriverManager` 直连且 URL 写死 → 不可配置、性能差 → 使用 `DataSource`/连接池并外置配置。 <!-- cpa-review-bot sha=12500e74fada8fb6b222e98a52a84afd3fb30c15 -->
admin added 1 commit 2026-11-02 18:59:30 +08:00
admin added 1 commit 2026-11-02 19:00:17 +08:00
ai_bot left a comment
Author
Owner

🤖 AI 评审(qwen3.8-max)

结论:必须阻断。

问题:

严重

  • [OrderService.java] 折扣在循环内反复乘 0.9,首行不打折,非总额 9 折 → 金额错误 → 循环外汇总后统一打折并补测试。
  • [OrderService.java] 硬编码生产库地址、root 密码 → 凭据泄露 → 移除并改用配置/密钥管理,立即轮换。
  • [OrderService.java] SQL 拼接 order.getId() → 注入风险 → 使用 PreparedStatement 参数化。
  • [OrderService.java] Connection/Statement 未安全关闭 → 连接泄漏 → 用 try-with-resources/连接池。
  • [OrderService.java] save 与 JDBC 更新无统一事务/补偿 → 状态不一致 → 同事务处理或可靠补偿,并校验影响行数。

中等

  • [OrderService.java] order/customer/lines/price 可能为空,level 若为包装类可能拆箱 NPE → 运行时异常 → 增加校验。需确认。
  • [OrderService.java] UPDATE 未带原状态/版本号 → 并发覆盖 → 加状态条件或乐观锁。需确认。
  • [OrderService.java] 每次 DriverManager 直连生产库 → 性能差 → 使用统一 DataSource。

建议

  • [OrderService.java] throws Exception 过宽,未处理 SQLException → 异常语义不清 → 捕获并转业务异常。
  • [OrderService.java] 未校验更新行数/ID → 静默失败 → 校验并告警。
  • [OrderService.java] BigDecimal.valueOf(0.9) 建议常量化 → 可读性 → 定义 new BigDecimal("0.9")。

亮点

  • 金额使用 BigDecimal 方向正确。
### 🤖 AI 评审(qwen3.8-max) **结论**:必须阻断。 **问题**: **严重** - [OrderService.java] 折扣在循环内反复乘 0.9,首行不打折,非总额 9 折 → 金额错误 → 循环外汇总后统一打折并补测试。 - [OrderService.java] 硬编码生产库地址、root 密码 → 凭据泄露 → 移除并改用配置/密钥管理,立即轮换。 - [OrderService.java] SQL 拼接 `order.getId()` → 注入风险 → 使用 `PreparedStatement` 参数化。 - [OrderService.java] `Connection/Statement` 未安全关闭 → 连接泄漏 → 用 try-with-resources/连接池。 - [OrderService.java] `save` 与 JDBC 更新无统一事务/补偿 → 状态不一致 → 同事务处理或可靠补偿,并校验影响行数。 **中等** - [OrderService.java] `order/customer/lines/price` 可能为空,`level` 若为包装类可能拆箱 NPE → 运行时异常 → 增加校验。需确认。 - [OrderService.java] `UPDATE` 未带原状态/版本号 → 并发覆盖 → 加状态条件或乐观锁。需确认。 - [OrderService.java] 每次 `DriverManager` 直连生产库 → 性能差 → 使用统一 `DataSource`。 **建议** - [OrderService.java] `throws Exception` 过宽,未处理 `SQLException` → 异常语义不清 → 捕获并转业务异常。 - [OrderService.java] 未校验更新行数/ID → 静默失败 → 校验并告警。 - [OrderService.java] `BigDecimal.valueOf(0.9)` 建议常量化 → 可读性 → 定义 `new BigDecimal("0.9")`。 **亮点** - 金额使用 `BigDecimal` 方向正确。 <!-- cpa-review-bot sha=411b18710f4fe298684eb93b66161bc60d6264bd -->
ai_bot left a comment
Author
Owner

🤖 AI Code Review

  1. Blocking issues
  • 硬编码生产数据库凭证(严重安全问题)

    DriverManager.getConnection("jdbc:mysql://prod-db:3306/order", "root", "root123")
    

    直接把生产库地址、root 账号和密码写进源码,存在泄密风险,也违反最小权限原则。
    建议:

    • 移除硬编码凭证;
    • 使用环境配置/密钥管理系统;
    • 使用数据库账号,而不是 root;
    • 使用连接池,例如 DataSource;
    • 如果凭证已进入 Git 历史,应轮换密码并清理历史或至少视为已泄露。
  • submit 直接绕过 repository,破坏分层和数据一致性

    repository.save(order);
    ...
    st.executeUpdate("UPDATE orders SET status = 1 WHERE id = " + order.getId());
    

    OrderService 已经依赖 repository,但这里又直接用 JDBC 更新订单状态。建议把状态更新放到 OrderRepository 内,例如:

    repository.saveWithStatus(order, OrderStatus.SUBMITTED);
    

    或:

    repository.save(order);
    repository.updateStatus(order.getId(), OrderStatus.SUBMITTED);
    

    并且需要保证 save 和 updateStatus 在同一个事务里。

  • SQL 拼接存在 SQL 注入风险

    "UPDATE orders SET status = 1 WHERE id = " + order.getId()
    

    如果 order.getId() 没有严格类型保证,可能存在 SQL 注入。即使当前是 Long,也应使用预编译语句:

    String sql = "UPDATE orders SET status = ? WHERE id = ?";
    try (PreparedStatement ps = conn.prepareStatement(sql)) {
        ps.setInt(1, OrderStatus.SUBMITTED.getCode());
        ps.setLong(2, order.getId());
        ps.executeUpdate();
    }
    
  • JDBC 资源泄漏

    st.close();
    

    只关闭了 Statement,没有关闭 Connection。如果中途异常,连接会泄漏。
    建议统一使用 try-with-resources:

    try (Connection conn = dataSource.getConnection();
         PreparedStatement ps = conn.prepareStatement(sql)) {
        ...
        ps.executeUpdate();
    }
    
  • 订单保存和状态更新不在同一事务

    repository.save(order);
    // 单独 JDBC update
    

    如果 repository.save(order) 成功,但后续状态更新失败,会出现“订单已保存但状态未同步”的不一致状态。
    建议:

    • 使用事务;
    • 或在 repository 内部一次性保存并更新状态;
    • 如果框架支持 @Transactional,应放在事务边界内;否则需要显式 conn.setAutoCommit(false) / commit / rollback,但更推荐交给 repository/事务层处理。
  • 会员折扣逻辑错误

    for (OrderLine line : order.getLines()) {
        if (order.getCustomer().getLevel() == 2) {
            sum = sum.multiply(BigDecimal.valueOf(0.9));
        }
        sum = sum.add(line.getPrice().multiply(BigDecimal.valueOf(line.getQuantity())));
    }
    

    这段逻辑有问题:

    • 第一行不会被折扣,因为 sum 初始是 ZERO,0 * 0.9 = 0;
    • 折扣会作用在“之前累计金额”上,不是当前订单总额;
    • 多行订单会出现错误折扣,例如两行订单只有第一行被折扣,第二行不受折扣影响;
    • 如果 order.getCustomer() 为 null,会 NPE;
    • 如果 getLevel() 是包装类型 Integer 且为 null,也会 NPE。

    如果目标是“会员整单 9 折”,应改为:

    public BigDecimal total(Order order) {
        BigDecimal sum = BigDecimal.ZERO;
    
        for (OrderLine line : order.getLines()) {
            sum = sum.add(
                line.getPrice().multiply(BigDecimal.valueOf(line.getQuantity()))
            );
        }
    
        if (order.getCustomer() != null && order.getCustomer().getLevel() != null
                && order.getCustomer().getLevel() == 2) {
            sum = sum.multiply(new BigDecimal("0.9"));
        }
    
        return sum;
    }
    

    如果目标是“每行商品都打 9 折”,则应在每行金额上立即乘 0.9,而不是对 sum 循环折扣。需要明确业务规则。

  • throws Exception 太宽泛,且可能破坏调用方兼容性

    public void submit(Order order) throws Exception
    

    throws Exception 会要求所有调用方处理异常,属于较宽泛的 API 变更。
    建议:

    • 定义业务异常,例如 OrderSubmitException;
    • 或在 repository 层封装 SQLException;
    • 如果是 Spring 项目,通常 repository 会转换数据库异常,service 方法不需要声明 checked exception。
  • 订单状态魔法值 1

    status = 1
    

    建议用枚举或常量:

    repository.updateStatus(order.getId(), OrderStatus.SUBMITTED);
    
  1. Non-blocking suggestions
  • BigDecimal.valueOf(0.9) 可以工作,但金额场景建议使用字符串构造,避免潜在精度语义问题:

    new BigDecimal("0.9")
    
  • 注释与业务不一致:

    // 会员 9 折 50%
    

    “9 折”通常表示支付 90%,而“50%”含义不清。建议注释明确:

    // 会员整单 9 折,即按 90% 计费
    
  • order.getId() 可能为空。虽然 repository.save(order) 后 ID 可能已经生成,但最好在状态更新前校验。

  • OrderService 不应直接持有 JDBC 连接或 SQL。建议保持服务层只调用领域/repository,持久化细节由 repository 实现处理。

  • README 中新增 bot 触发记录属于测试噪音,不影响功能,但建议保持文档整洁。

  1. Tests

建议至少补充以下测试:

  • total():

    • 非会员,单行订单:金额不打折;
    • 会员,单行订单:金额按 9 折计算;
    • 会员,多行订单:整单按 9 折计算;
    • customer == null:不 NPE,按业务预期不打折或抛业务异常;
    • level == null:安全处理;
    • 数量、金额为 0、小数金额、多币种/小数精度场景。
  • submit():

    • 验证调用 repository.save 后,状态在同一个事务内被同步;
    • 验证不会直接访问硬编码生产数据库;
    • 验证状态更新失败时,不会留下“已保存但状态未更新”的不一致数据;
    • 如果重构为 repository.updateStatus,可用 mock repository 验证调用。
  • 可选架构测试:

    • 禁止 service 层直接创建 Connection / Statement;
    • 检查源码中不包含数据库密码字段,例如 "root"、"123"、"password"。
  1. Overall assessment

不建议合并。当前改动存在严重安全问题和明显业务逻辑错误:硬编码生产库凭证、SQL 拼接、资源泄漏、事务不一致,以及会员折扣计算错误。建议先重构为通过 repository + 参数化 SQL/事务处理状态更新,并修正 total() 折扣逻辑后再评审。


Automated review by AI Git Bot

## 🤖 AI Code Review 1. Blocking issues - 硬编码生产数据库凭证(严重安全问题) ```java DriverManager.getConnection("jdbc:mysql://prod-db:3306/order", "root", "root123") ``` 直接把生产库地址、`root` 账号和密码写进源码,存在泄密风险,也违反最小权限原则。 建议: - 移除硬编码凭证; - 使用环境配置/密钥管理系统; - 使用数据库账号,而不是 `root`; - 使用连接池,例如 `DataSource`; - 如果凭证已进入 Git 历史,应轮换密码并清理历史或至少视为已泄露。 - `submit` 直接绕过 `repository`,破坏分层和数据一致性 ```java repository.save(order); ... st.executeUpdate("UPDATE orders SET status = 1 WHERE id = " + order.getId()); ``` `OrderService` 已经依赖 `repository`,但这里又直接用 JDBC 更新订单状态。建议把状态更新放到 `OrderRepository` 内,例如: ```java repository.saveWithStatus(order, OrderStatus.SUBMITTED); ``` 或: ```java repository.save(order); repository.updateStatus(order.getId(), OrderStatus.SUBMITTED); ``` 并且需要保证 `save` 和 `updateStatus` 在同一个事务里。 - SQL 拼接存在 SQL 注入风险 ```java "UPDATE orders SET status = 1 WHERE id = " + order.getId() ``` 如果 `order.getId()` 没有严格类型保证,可能存在 SQL 注入。即使当前是 `Long`,也应使用预编译语句: ```java String sql = "UPDATE orders SET status = ? WHERE id = ?"; try (PreparedStatement ps = conn.prepareStatement(sql)) { ps.setInt(1, OrderStatus.SUBMITTED.getCode()); ps.setLong(2, order.getId()); ps.executeUpdate(); } ``` - JDBC 资源泄漏 ```java st.close(); ``` 只关闭了 `Statement`,没有关闭 `Connection`。如果中途异常,连接会泄漏。 建议统一使用 try-with-resources: ```java try (Connection conn = dataSource.getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { ... ps.executeUpdate(); } ``` - 订单保存和状态更新不在同一事务 ```java repository.save(order); // 单独 JDBC update ``` 如果 `repository.save(order)` 成功,但后续状态更新失败,会出现“订单已保存但状态未同步”的不一致状态。 建议: - 使用事务; - 或在 `repository` 内部一次性保存并更新状态; - 如果框架支持 `@Transactional`,应放在事务边界内;否则需要显式 `conn.setAutoCommit(false)` / commit / rollback,但更推荐交给 repository/事务层处理。 - 会员折扣逻辑错误 ```java for (OrderLine line : order.getLines()) { if (order.getCustomer().getLevel() == 2) { sum = sum.multiply(BigDecimal.valueOf(0.9)); } sum = sum.add(line.getPrice().multiply(BigDecimal.valueOf(line.getQuantity()))); } ``` 这段逻辑有问题: - 第一行不会被折扣,因为 `sum` 初始是 `ZERO`,`0 * 0.9 = 0`; - 折扣会作用在“之前累计金额”上,不是当前订单总额; - 多行订单会出现错误折扣,例如两行订单只有第一行被折扣,第二行不受折扣影响; - 如果 `order.getCustomer()` 为 `null`,会 NPE; - 如果 `getLevel()` 是包装类型 `Integer` 且为 `null`,也会 NPE。 如果目标是“会员整单 9 折”,应改为: ```java public BigDecimal total(Order order) { BigDecimal sum = BigDecimal.ZERO; for (OrderLine line : order.getLines()) { sum = sum.add( line.getPrice().multiply(BigDecimal.valueOf(line.getQuantity())) ); } if (order.getCustomer() != null && order.getCustomer().getLevel() != null && order.getCustomer().getLevel() == 2) { sum = sum.multiply(new BigDecimal("0.9")); } return sum; } ``` 如果目标是“每行商品都打 9 折”,则应在每行金额上立即乘 0.9,而不是对 `sum` 循环折扣。需要明确业务规则。 - `throws Exception` 太宽泛,且可能破坏调用方兼容性 ```java public void submit(Order order) throws Exception ``` `throws Exception` 会要求所有调用方处理异常,属于较宽泛的 API 变更。 建议: - 定义业务异常,例如 `OrderSubmitException`; - 或在 repository 层封装 `SQLException`; - 如果是 Spring 项目,通常 repository 会转换数据库异常,service 方法不需要声明 checked exception。 - 订单状态魔法值 `1` ```java status = 1 ``` 建议用枚举或常量: ```java repository.updateStatus(order.getId(), OrderStatus.SUBMITTED); ``` 2. Non-blocking suggestions - `BigDecimal.valueOf(0.9)` 可以工作,但金额场景建议使用字符串构造,避免潜在精度语义问题: ```java new BigDecimal("0.9") ``` - 注释与业务不一致: ```java // 会员 9 折 50% ``` “9 折”通常表示支付 90%,而“50%”含义不清。建议注释明确: ```java // 会员整单 9 折,即按 90% 计费 ``` - `order.getId()` 可能为空。虽然 `repository.save(order)` 后 ID 可能已经生成,但最好在状态更新前校验。 - `OrderService` 不应直接持有 JDBC 连接或 SQL。建议保持服务层只调用领域/repository,持久化细节由 repository 实现处理。 - README 中新增 bot 触发记录属于测试噪音,不影响功能,但建议保持文档整洁。 3. Tests 建议至少补充以下测试: - `total()`: - 非会员,单行订单:金额不打折; - 会员,单行订单:金额按 9 折计算; - 会员,多行订单:整单按 9 折计算; - `customer == null`:不 NPE,按业务预期不打折或抛业务异常; - `level == null`:安全处理; - 数量、金额为 `0`、小数金额、多币种/小数精度场景。 - `submit()`: - 验证调用 `repository.save` 后,状态在同一个事务内被同步; - 验证不会直接访问硬编码生产数据库; - 验证状态更新失败时,不会留下“已保存但状态未更新”的不一致数据; - 如果重构为 `repository.updateStatus`,可用 mock repository 验证调用。 - 可选架构测试: - 禁止 service 层直接创建 `Connection` / `Statement`; - 检查源码中不包含数据库密码字段,例如 `"root"`、`"123"`、`"password"`。 4. Overall assessment 不建议合并。当前改动存在严重安全问题和明显业务逻辑错误:硬编码生产库凭证、SQL 拼接、资源泄漏、事务不一致,以及会员折扣计算错误。建议先重构为通过 repository + 参数化 SQL/事务处理状态更新,并修正 `total()` 折扣逻辑后再评审。 --- *Automated review by AI Git Bot*
ai_bot left a comment
Author
Owner

🤖 AI 评审(qwen3.8-max)

结论:必须阻断

问题

严重

  • [OrderService.java] 会员折扣在循环内对累计金额反复乘 0.9,首次对 0 计算 → 订单金额错误,可能资损 → 先累计小计,最后统一打折,或对每行单价打折并补单测
  • [OrderService.java] 生产库账号密码硬编码 → 密钥泄露与越权访问 → 立即移除并轮换密码,改用配置中心/环境变量/连接池
  • [OrderService.java] UPDATE 语句拼接 order.getId() → SQL 注入与误改数据 → 使用 PreparedStatement 参数化
  • [OrderService.java] Connection 未关闭,异常时 Statement 也不关闭 → 数据库连接耗尽 → 使用 try-with-resources

中等

  • [OrderService.java] repository.save 与 JDBC 更新不在可见的同一事务中 → 状态不一致 → 统一事务/补偿/消息,需确认事务边界
  • [OrderService.java] order.getCustomer()、getLines()、line.getPrice() 未判空 → NPE → 增加入参校验与防御性检查
  • [OrderService.java] submit 抛出 Exception 过宽 → 调用方难处理且可能泄漏底层细节 → 捕获 SQLException 并转业务异常
  • [OrderService.java] UPDATE 未校验影响行数且无状态条件 → 静默失败或并发下覆盖状态 → 校验行数并带状态机/版本号,需确认

建议

  • [OrderService.java] BigDecimal.valueOf(0.9) 与硬编码等级 2 可读性一般 → 建议 new BigDecimal("0.9")/枚举配置
  • [OrderService.java] 直接 DriverManager 连生产库 → 建议统一 DataSource/ORM 与连接池
  • [README.md] 触发 AI 的注释无业务价值 → 建议移除或放提交说明

亮点

  • 金额使用 BigDecimal 的方向正确
### 🤖 AI 评审(qwen3.8-max) **结论**:必须阻断 **问题** **严重** - [OrderService.java] 会员折扣在循环内对累计金额反复乘 0.9,首次对 0 计算 → 订单金额错误,可能资损 → 先累计小计,最后统一打折,或对每行单价打折并补单测 - [OrderService.java] 生产库账号密码硬编码 → 密钥泄露与越权访问 → 立即移除并轮换密码,改用配置中心/环境变量/连接池 - [OrderService.java] UPDATE 语句拼接 `order.getId()` → SQL 注入与误改数据 → 使用 `PreparedStatement` 参数化 - [OrderService.java] `Connection` 未关闭,异常时 `Statement` 也不关闭 → 数据库连接耗尽 → 使用 try-with-resources **中等** - [OrderService.java] `repository.save` 与 JDBC 更新不在可见的同一事务中 → 状态不一致 → 统一事务/补偿/消息,需确认事务边界 - [OrderService.java] `order.getCustomer()`、`getLines()`、`line.getPrice()` 未判空 → NPE → 增加入参校验与防御性检查 - [OrderService.java] `submit` 抛出 `Exception` 过宽 → 调用方难处理且可能泄漏底层细节 → 捕获 `SQLException` 并转业务异常 - [OrderService.java] UPDATE 未校验影响行数且无状态条件 → 静默失败或并发下覆盖状态 → 校验行数并带状态机/版本号,需确认 **建议** - [OrderService.java] `BigDecimal.valueOf(0.9)` 与硬编码等级 2 可读性一般 → 建议 `new BigDecimal("0.9")`/枚举配置 - [OrderService.java] 直接 `DriverManager` 连生产库 → 建议统一 `DataSource`/ORM 与连接池 - [README.md] 触发 AI 的注释无业务价值 → 建议移除或放提交说明 **亮点** - 金额使用 `BigDecimal` 的方向正确 <!-- cpa-review-bot sha=b5c2c304628932cdeba0f19af3c42e2eef194320 -->
You are not authorized to merge this pull request.
This pull request can be merged automatically.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feature/discount:feature/discount
git checkout feature/discount
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ai_bot/ai-review-demo#1