2.9 KiB
2.9 KiB
fix(mp-product): 价格日历接口接收 startDate/endDate 时抛 500
PR: #1778 Issue: #1776 合并: 2026-05-07
通知对象: @mmg(小程序前端,建议小修一处)
后端修了什么
GET /mp/product/{id}/price-calendar 接口当传 ?startDate=YYYY-MM-DD&endDate=YYYY-MM-DD 时报 500:
DateTimeParseException: Text 'null-01' could not be parsed at index 0
根因:MpPriceCalendarReqVO 原本只声明 month 字段。前端 packages/order/supplement/supplement.js:531 传的是 {startDate, endDate} → Spring 没字段绑定 → req.getMonth()=null → LocalDate.parse("null-01") 抛异常。
PR #1778 补的:
- VO 加
startDate/endDate字段(与month二选一,向前兼容) - Service 抽
resolveMonthRange()私有方法:startDate+endDate同月优先 →month兜底 → 全空/格式错抛BusinessException - 加 2 个 ErrorCode:
410108 PRICE_CALENDAR_PARAM_MISSING参数缺失或格式错误410109 PRICE_CALENDAR_DATE_RANGE_CROSS_MONTHstartDate/endDate 跨月
- 缓存 key 仍
yyyy-MM月级粒度(startDate=2026-07-01&endDate=2026-07-31与month=2026-07命中同一 cacheKey,无碎片) - 单测加 5 场景全过:onlyMonth / sameMonth / crossMonth / allBlank / invalidFormat
行为对照
| 请求 | 修复前 | 修复后 |
|---|---|---|
?month=2026-07 |
200 | 200(不变) |
?startDate=2026-07-01&endDate=2026-07-31 |
500 DateTimeParseException | 200(与 month=2026-07 字段级 IDENTICAL) |
?startDate=2026-07-01&endDate=2026-08-15 |
500 | 200 + Result.code=410109 跨月业务错 |
| 无参数 | 500 | 200 + Result.code=410108 参数缺失业务错 |
前端建议(可选,@mmg)
后端已完整兼容 startDate/endDate,前端不修也能用。
但 month 是默认契约(detail.js / confirm.js 都用 month),建议小程序 packages/order/supplement/supplement.js:531 也改成传 {month},与其他两处统一:
// 当前(OK 但不一致)
const data = await productApi.getPriceCalendar(this.data.product.id, { startDate, endDate });
// 建议(与 detail.js / confirm.js 一致)
const month = startDate ? startDate.substring(0, 7) : formatTime(new Date(), 'YYYY-MM');
const data = await productApi.getPriceCalendar(this.data.product.id, { month });
非紧急,看你方便。
调用方对照(仓库 grep 全 3 处)
packages/product/core/detail/detail.js:1319传{month}✅packages/order/confirm/confirm.js:526传{month, tierSeq}✅packages/order/supplement/supplement.js:531传{startDate, endDate}✅(后端已兼容,建议改 month 但不强制)
验证
- 单测 67/67 全过
- 本地 product-v2:8083 直连 round-trip 4 场景全通过(含字段级 IDENTICAL 等价性证据)
- 测试服部署后会再次 round-trip 一次