本文档记录了对该模块代码实现中发现的问题。
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 |