hl-api-changelog/changelogs/2026-04/27_fix_admin-product_deposit-vs-price-validation.md
API Changelog Bot 3e4549efee docs: 27 日新增两条修复 changelog
- fix(admin/product): 固定订金模式产品售价必须 > 订金(双向校验) (#1497)
- fix(mp/admin/order): 班期内部报价补 toddler/infant 字段, GROUP 订单 totalPrice 含小童金额 (#1498)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 19:26:00 +08:00

3.0 KiB

修复:固定订金模式产品售价必须大于订金(双向校验)

类型: 后端 BUG 修复 + 校验加严 关联: 工单 #1497 / PR #1501 日期: 2026-04-27 影响范围: 管理端产品基础信息保存 + 价格日历批量设置 + 班期保存


现象

后台「支付类型=订金+尾款」+「订金设置=固定金额(元/人)」组合下,保存价格时未校验售价 > 订金。极端 case: 用户设定金 5000 元/人但成人价配 1000,定金比总价还高,业务彻底崩。

后端改动

1. 正向校验(保存价格时)

接口 1: 价格日历批量设置 POST /admin/product/item/{id}/price-calendar/batch (CORE/CUSTOM)

  • 触发条件: 产品 paymentType=DEPOSIT 且 depositAmount > 0
  • 校验: adultSellPrice > depositAmount AND childSellPrice > depositAmount
  • 不通过会返:
    • code=410105: 成人售价({0}元)必须大于产品订金({1}元/人),请调整定价或修改基础信息中的订金
    • code=410106: 儿童售价({0}元)必须大于产品订金({1}元/人),请调整定价或修改基础信息中的订金

接口 2: 班期保存 POST /admin/product/item/{id}/schedule (GROUP) 与 班期批量创建

  • 同样规则套用 adultPrice / childPrice
  • 错误码同上

2. 反向校验(保存基础信息时)

接口: Step1 基础信息保存 POST /admin/product/item/basic

  • 触发条件: 用户调高 depositAmount(固定金额模式)
  • 校验: 反查产品现有 product_price_calendar + group_tour_batch,任一售价 ≤ 新订金即抛错
  • 不通过会返:
    • code=410107: 订金({0}元/人)不能高于现有价格({1} {2}的售价{3}元),请先调整定价
    • 占位符 {1} 是日期(如 2026-05-17)或班期号(如 班期Q26050101),{2} 是「成人」或「儿童」

3. 跳过项(不校验)

  • 比例订金模式 (depositRatio 有值, depositAmount 为空): 不校验,比例 < 100% 数学上必然 < 总价
  • 全款模式 (paymentType=FULL): 不校验
  • 幼童价 / 小童优惠: 不校验,幼童价 0 是合法免费语义

前端建议

  1. 不需要改逻辑,后端已加硬校验
  2. UI 体验优化(可选): 在「订金设置」输入框旁加提示"订金须低于最低成人/儿童售价"
  3. 接到 code=410105/410106 时建议提示用户「请调整价格或回基础信息修改订金」
  4. 接到 code=410107 时建议解析消息中的日期/班期号高亮冲突项

测试建议

  • 管理端 CORE 产品基础信息设固定订金 100,价格日历配成人价 50 → 应报错 410105
  • 同上配成人价 200 → 应通过
  • 管理端 GROUP 产品班期保存 adultPrice=50,固定订金 100 → 应报错 410105
  • 已配价格日历(成人价 100),回基础信息把订金调到 200 → 应报错 410107 含冲突日期
  • 比例订金 30% 配成人价 50 → 应通过(不受影响)
  • 全款模式 → 应通过(不受影响)

后端单测

ProductPricingServiceTest 新增 8 用例 + ProductBasicServiceTest 新增 5 用例,全量 1000 用例通过。