# 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