# 订单下单方法改进说明 ## 问题分析 通过分析您的下单方法,发现了以下安全和业务逻辑问题: ### 原有问题: 1. **缺乏商品验证**:没有从数据库查询商品信息进行验证 2. **价格安全风险**:完全依赖前端传递的价格,存在被篡改的风险 3. **库存未验证**:没有检查商品库存是否充足 4. **商品状态未检查**:没有验证商品是否上架、是否删除等 ## 改进方案 ### 1. 新增商品验证逻辑 在 `OrderBusinessService.createOrder()` 方法中添加了商品验证步骤: ```java // 2. 验证商品信息(从数据库查询) ShopGoods goods = validateAndGetGoods(request); ``` ### 2. 实现商品信息验证方法 新增 `validateAndGetGoods()` 方法,包含以下验证: - **商品存在性验证**:检查商品ID是否存在 - **商品状态验证**: - 检查商品是否已删除 (`deleted != 1`) - 检查商品是否上架 (`status == 0`) - 检查商品是否展示 (`isShow == true`) - **库存验证**:检查库存是否充足 - **价格验证**:对比数据库价格与请求价格(允许0.01元误差) ### 3. 价格安全保护 修改 `buildShopOrder()` 方法,使用数据库中的商品价格: ```java // 使用数据库中的商品信息覆盖价格(确保价格准确性) if (goods.getPrice() != null && request.getTotalNum() != null) { BigDecimal totalPrice = goods.getPrice().multiply(new BigDecimal(request.getTotalNum())); shopOrder.setTotalPrice(totalPrice); shopOrder.setPrice(totalPrice); } ``` ### 4. 空指针保护 为所有配置相关的调用添加了空指针检查,提高代码健壮性。 ## 主要改进点 ### 安全性提升 - ✅ 防止价格篡改:使用数据库价格计算订单金额 - ✅ 商品状态验证:确保只能购买正常上架的商品 - ✅ 库存保护:防止超卖 ### 业务逻辑完善 - ✅ 商品存在性检查 - ✅ 商品状态检查(上架、展示、未删除) - ✅ 库存充足性检查 - ✅ 价格一致性验证 ### 代码质量 - ✅ 添加详细的日志记录 - ✅ 异常信息更加明确 - ✅ 空指针保护 - ✅ 单元测试覆盖 ## 使用示例 ### 正常下单流程 ```java OrderCreateRequest request = new OrderCreateRequest(); request.setFormId(1); // 商品ID request.setTotalNum(2); // 购买数量 request.setTotalPrice(new BigDecimal("200.00")); // 前端计算的总价 request.setTenantId(1); // 系统会自动: // 1. 查询商品ID=1的商品信息 // 2. 验证商品状态(上架、未删除、展示中) // 3. 检查库存是否>=2 // 4. 验证价格是否与数据库一致 // 5. 使用数据库价格重新计算订单金额 ``` ### 异常处理 系统会在以下情况抛出异常: - 商品不存在:`"商品不存在"` - 商品已删除:`"商品已删除"` - 商品未上架:`"商品未上架"` - 库存不足:`"商品库存不足,当前库存:X"` - 价格异常:`"商品价格异常,数据库价格:X,请求价格:Y"` ## 测试验证 创建了完整的单元测试 `OrderBusinessServiceTest.java`,覆盖: - 正常下单流程 - 商品不存在场景 - 库存不足场景 - 价格不匹配场景 - 商品状态异常场景 ## 建议 1. **运行测试**:执行单元测试确保功能正常 2. **前端配合**:前端仍需传递商品ID和数量,但价格以服务端计算为准 3. **监控日志**:关注商品验证相关的日志,及时发现异常情况 4. **性能优化**:如果商品查询频繁,可考虑添加缓存 ## 总结 通过这次改进,您的下单方法现在: - ✅ **安全可靠**:防止价格篡改和恶意下单 - ✅ **业务完整**:包含完整的商品验证逻辑 - ✅ **代码健壮**:有完善的异常处理和空指针保护 - ✅ **易于维护**:有清晰的日志和测试覆盖 这样的改进确保了订单系统的安全性和可靠性,符合电商系统的最佳实践。