xp-robotaxi-order-boot 代码问题分析

本文档记录了对该模块代码实现中发现的问题。

问题列表

addOrder 方法 (XpOrderServiceImpl.java:2624-2630)

1. 缺少事务注解 @Transactional:
java public boolean addOrder(XpOrder xpOrder) { int insert = this.baseMapper.insert(xpOrder); if (insert <= 0) { return false; } return true; }
- 如果插入后还需要执行其他数据库操作(比如插入关联数据),无法保证一致性
- 应该添加 @Transactional 注解

2. 缺少输入校验:
- 对必填字段(如 vehicleId, appUserId, cityId 等)没有校验
- 非法数据可能直接插入数据库

3. 缺少缓存同步:
- 订单创建后,活跃订单数量的缓存没有更新
- 动态调价功能依赖活跃订单数量统计,可能导致统计不准确

4. 缺少车辆状态更新:
- 订单创建后,车辆应该被标记为"已接单"状态,但该方法中没有调用车辆服务更新状态
- 这个逻辑缺失,需要在其他地方补,容易遗漏


payment 支付处理方法 (XpOrderServiceImpl.java:2590-2615)

1. 严重 Bug: 抹掉用户ID:
java order.setAppUserId(null); // !!!
- 这行代码会永久删除订单记录中的 appUserId
- 导致:
- 后续无法查询该订单属于哪个用户
- 历史订单统计和数据分析缺少用户关联信息
- 这是逻辑错误,不应该将用户ID置空

2. 缺少事务注解 @Transactional:
- 如果优惠券扣减成功,但订单更新失败,无法回滚优惠券的使用
- 导致优惠券已使用但订单支付未完成的数据不一致

3. 优惠券调用失败被静默忽略:
- 如果 xpAppUserCouponClient.useUserCoupon 返回非 200(调用失败),代码不做任何错误处理
- 用户享受不到优惠但依然要付全款,这是业务逻辑漏洞

4. 竞态条件问题:
- 先读取订单 → 修改字段 → 更新数据库,这种"读-改-写"模式在并发场景下会造成丢失更新
- 最后一次更新会覆盖掉之前的修改

5. 缺少事件发布/通知:
- 支付成功后:
- 没有给用户发送支付成功通知
- 没有发布领域事件触发生成报表/统计/发票等后续业务流程

6. 缺少幂等性保护:
- 重复提交支付请求可能会导致多次扣减优惠券
- 虽然这里因为先改状态后续会被拦截,但仍然缺少显式的幂等处理


updateOrderStatus 方法 (XpOrderServiceImpl.java:1576-1714)

同样存在 xpOrder.setAppUserId(null); 问题 (line 1711):
- 和支付方法一样,会永久删除用户ID

线程泄漏问题 (line 1659):
java ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
- 每次推送失败都会**创建一个新的线程池**
- 随着失败次数增多,会产生大量空闲线程,浪费资源
- 应该使用共享的线程池


问题总结

问题类型 严重程度 修复优先级
抹掉用户ID (payment/updateOrderStatus) 🔴 高 P0
缺少事务注解 🔴 高 P1
优惠券调用失败静默忽略 🟠 中高 P1
竞态条件 / 丢失更新 🟠 中高 P1
线程泄漏 🟠 中高 P1
缺少输入校验 🟡 中 P2
缺少缓存同步 🟡 中 P2
缺少事件/通知 🟡 中 P2
缺少幂等保护 🟡 中 P2