跨城出行包车价格功能实现 - 完整修改总结

修改日期

2026-06-25

需求说明

实现包车模式使用专门的包车价格(charterPrice5/6/7),而不是用目的地单人价格乘以座位数。

业务逻辑变更

修改前

  • 拼车模式 (travelMode=1): 订单金额 = 单人价格(price5/6/7) × 实际乘客数
  • 包车模式 (travelMode=2): 订单金额 = 单人价格(price5/6/7) × 车辆座位数 ❌

修改后

  • 拼车模式 (travelMode=1): 订单金额 = 单人价格(price5/6/7) × 实际乘客数
  • 包车模式 (travelMode=2): 订单金额 = 包车价格(charterPrice5/6/7) ✅

价格选择逻辑

根据车辆座位数选择对应价格:
- 5座车: 使用 charterPrice5(包车)或 price5(拼车)
- 6座车: 使用 charterPrice6(包车)或 price6(拼车)
- 7座车: 使用 charterPrice7(包车)或 price7(拼车)
- 其他: 默认使用5座价格


第一阶段:修复6座车价格计算错误

问题

6座车错误地使用了 price7 而不是 price6。

修复文件(4个文件)

1. UserYKDTravel 模块

OrderCrossCityServiceImpl.java
- 修复 getDestinationPrice() 方法(第3508-3516行)
- 正确区分 5/6/7 座车的价格选择

LineMapper.xml
- queryLineDestinations 查询添加 price6 字段
- queryLineDestinationById 查询添加 price6 字段

2. DriverYKDTravel 模块

OrderCrossCityServiceImpl.java
- 修复 getDestinationPrice() 方法(第1353-1361行)
- 正确区分 5/6/7 座车的价格选择

LineMapper.xml
- queryLineDestinations 查询添加 price6 字段
- queryLineDestinationById 查询添加 price6 字段


第二阶段:实现包车价格功能

数据库层修改

1. 数据库表结构

表: t_line

新增字段(如果尚未添加):
- charterPrice5 DECIMAL(10,2) - 包车5座价格
- charterPrice6 DECIMAL(10,2) - 包车6座价格
- charterPrice7 DECIMAL(10,2) - 包车7座价格

SQL脚本: add_charter_price_fields.sql

UserYKDTravel 模块修改

1. Line.java 模型

路径: UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/Line.java

添加字段:
java private BigDecimal charterPrice5; private BigDecimal charterPrice6; private BigDecimal charterPrice7;

添加 getter/setter 方法

2. LineMapper.java 接口

路径: UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineMapper.java

新增方法:
java Map<String, Object> queryLineCharterPrices(@Param("lineId") Integer lineId);

3. LineMapper.xml

路径: UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineMapper.xml

新增查询:
xml <select id="queryLineCharterPrices" resultType="map"> select id, charterPrice5, charterPrice6, charterPrice7 from t_line where id = #{lineId} and state = 1 limit 1 </select>

4. OrderCrossCityServiceImpl.java

路径: UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java

新增方法:
java private BigDecimal getLineCharterPrice(Integer lineId, Integer totalSeat)
- 根据座位数选择对应的包车价格
- 支持 5/6/7 座车
- 如果选择的价格为空,回退到5座价格

修改方法:
- getPriceV2() - 包车模式使用包车价格
- getPrice() - 包车模式使用包车价格

DriverYKDTravel 模块修改

与 UserYKDTravel 模块相同的修改:

  1. Line.java - 添加 charterPrice5/6/7 字段和方法
  2. LineMapper.java - 添加 queryLineCharterPrices() 方法
  3. LineMapper.xml - 添加查询包车价格的 SQL
  4. OrderCrossCityServiceImpl.java - 添加 getLineCharterPrice() 方法,修改 getPrice() 和 getPriceV2() 方法

ManagementYKDTravel 模块

无需修改 - 管理后台已经支持录入和编辑包车价格字段。


修改文件清单

第一阶段(修复6座价格)

  1. UserYKDTravel/.../OrderCrossCityServiceImpl.java - 修复价格选择逻辑
  2. UserYKDTravel/.../LineMapper.xml - 添加 price6 字段到查询
  3. DriverYKDTravel/.../OrderCrossCityServiceImpl.java - 修复价格选择逻辑
  4. DriverYKDTravel/.../LineMapper.xml - 添加 price6 字段到查询

第二阶段(实现包车价格)

  1. UserYKDTravel/.../Line.java - 添加包车价格字段
  2. UserYKDTravel/.../LineMapper.java - 添加查询方法
  3. UserYKDTravel/.../LineMapper.xml - 添加查询 SQL
  4. UserYKDTravel/.../OrderCrossCityServiceImpl.java - 实现包车价格逻辑
  5. DriverYKDTravel/.../Line.java - 添加包车价格字段
  6. DriverYKDTravel/.../LineMapper.java - 添加查询方法
  7. DriverYKDTravel/.../LineMapper.xml - 添加查询 SQL
  8. DriverYKDTravel/.../OrderCrossCityServiceImpl.java - 实现包车价格逻辑

总计: 12 个文件


测试建议

前置条件

  1. 执行 add_charter_price_fields.sql 添加包车价格字段(如果未添加)
  2. 在管理后台为线路设置不同的包车价格(charterPrice5/6/7)
  3. 确保包车价格与单人价格有明显差异,便于测试验证

测试场景

场景1:拼车模式 - 5座车

  • 创建拼车订单,3人,5座车
  • 预期: 订单金额 = price5 × 3

场景2:拼车模式 - 6座车

  • 创建拼车订单,4人,6座车
  • 预期: 订单金额 = price6 × 4

场景3:拼车模式 - 7座车

  • 创建拼车订单,5人,7座车
  • 预期: 订单金额 = price7 × 5

场景4:包车模式 - 5座车 ⭐

  • 创建包车订单,5座车
  • 预期: 订单金额 = charterPrice5(不是 price5 × 5)

场景5:包车模式 - 6座车 ⭐

  • 创建包车订单,6座车
  • 预期: 订单金额 = charterPrice6(不是 price6 × 6)

场景6:包车模式 - 7座车 ⭐

  • 创建包车订单,7座车
  • 预期: 订单金额 = charterPrice7(不是 price7 × 7)

验证方法

  1. API 测试:
  • 用户端: POST /base/orderCrossCity/queryOrderMoney
  • 司机端: POST /api/line/queryOrderMoney
  • 参数: travelMode=2(包车)
  1. 数据库验证:
  • 查询创建的订单: SELECT * FROM t_order_cross_city WHERE id = ?
  • 检查 orderMoney 字段是否等于对应的包车价格
  1. 日志验证:
  • 查看应用日志确认调用了 getLineCharterPrice() 方法
  • 确认返回的价格是包车价格而非单人价格

部署步骤

  1. 数据库: 执行 add_charter_price_fields.sql(如果字段已存在可跳过)
  2. 管理后台: 为现有线路设置包车价格
  3. 编译: 重新编译 UserYKDTravel 和 DriverYKDTravel 模块
  4. 部署: 部署用户端和司机端服务
  5. 验证: 执行上述测试场景

注意事项

  1. 向后兼容: 如果包车价格为空,系统会回退到5座价格,不会报错
  2. 数据迁移: 建议为所有线路补充包车价格数据
  3. 价格策略: 包车价格通常应该低于"单人价格 × 座位数",以吸引包车用户
  4. API 版本: 现有 API 接口无需修改,客户端无需升级

相关文档

  • fix_price6_calculation_summary.md - 第一阶段修复6座价格的文档
  • add_price6_field.sql - 目的地表添加 price6 字段的 SQL
  • add_charter_price_fields.sql - 线路表添加包车价格字段的 SQL