From 0cd5ee479ec3e404ec263bb2cb8d00c07f2238ea Mon Sep 17 00:00:00 2001 From: API Changelog Bot Date: Fri, 12 Jun 2026 10:59:04 +0800 Subject: [PATCH] =?UTF-8?q?changelog(v2):=20=E8=BD=A6=E5=9E=8B=E4=BB=B7?= =?UTF-8?q?=E6=A0=BC=E6=97=A5=E5=8E=86=E4=B8=89=E6=A8=A1=E5=BC=8F=E8=B0=83?= =?UTF-8?q?=E4=BB=B7+=E8=8A=82=E5=81=87=E6=97=A5=E7=AD=9B=E9=80=89+?= =?UTF-8?q?=E4=BA=92=E6=96=A5=E6=A0=A1=E9=AA=8C=20=C2=A79=20=E5=85=A8?= =?UTF-8?q?=E5=9D=97=E8=AF=B4=E6=98=8E=20(PR=20#3714)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...—¥åŽ†ä¸‰æ¨¡å¼è°ƒä»·ä¸ŽèЂ凿—¥ç­›é€‰-修改接å£-管ç†åŽå°.md | 175 ++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 changelogs-v2/2026-06/12_3714_车型价格日历三模å¼è°ƒä»·ä¸ŽèЂ凿—¥ç­›é€‰-修改接å£-管ç†åŽå°.md diff --git a/changelogs-v2/2026-06/12_3714_车型价格日历三模å¼è°ƒä»·ä¸ŽèЂ凿—¥ç­›é€‰-修改接å£-管ç†åŽå°.md b/changelogs-v2/2026-06/12_3714_车型价格日历三模å¼è°ƒä»·ä¸ŽèЂ凿—¥ç­›é€‰-修改接å£-管ç†åŽå°.md new file mode 100644 index 0000000..627125a --- /dev/null +++ b/changelogs-v2/2026-06/12_3714_车型价格日历三模å¼è°ƒä»·ä¸ŽèЂ凿—¥ç­›é€‰-修改接å£-管ç†åŽå°.md @@ -0,0 +1,175 @@ +# ã€ä¿®æ”¹æŽ¥å£Â·ç®¡ç†åŽå°ã€‘车型价格日历——三模å¼è°ƒä»·(ABS/DELTA/PERCENT)+èŠ‚å‡æ—¥ç­›é€‰+互斥校验è½åœ°(§9 å…¨å—说明) + +> æœåŠ¡:hl-fleet-service(8087) | 分支:dev-v3 | PR:#3714 | 已部署测试æœå¹¶ 22 项 API 实测通过(2026-06-12) +> 契约出处:FLEET API §9.1-§9.4(æ–‡æ¡£å·²åŒ PR 更新至 v1.5.61) | å‰ç«¯è§¦å‘ä½:车管控制å°ã€Œä»·æ ¼æ—¥åކã€é¡µ(page_pricing 原型 BulkPriceSheet) +> 本文是价格日历**æ•´å— 4 接å£çš„完整说明**(应åŽç«¯è¦æ±‚å…¨é¢åŒæ­¥),已上线功能 + 本次新增一并列出,å‰ç«¯å¯æŒ‰æœ¬æ–‡ç›´æŽ¥å¯¹æŽ¥ã€‚ + +## âš ï¸ å…³é”®è¯´æ˜Ž + +1. **完全å‘åŽå…¼å®¹,已对接代ç é›¶æ”¹åЍ**:本次新增字段全部å¯é€‰ã€‚ä¸ä¼  `adjustMode` 默认 `ABS`(固定价),与原行为完全一致。 +2. **新增三模å¼è°ƒä»·**(本次 PR):`adjustMode` = `ABS`(设为固定价) / `DELTA`(åœ¨å„æ—¥çŽ°ä»·ä¸ŠåŠ å‡é‡‘é¢) / `PERCENT`(按百分比调整)。`DELTA`/`PERCENT` æ—¶ `dayPrice` ä¸éœ€è¦ä¼ ,改传 `adjustValue`。 +3. **DELTA/PERCENT 的基准价规则**:命中日已设价 → 用当日现价计算;未设价 → 用车型 `basePrice` 兜底;两者都没有 → **该日跳过ä¸å†™**(䏿Х错)。计算结果 < 0 一律按 `0.00` è½åº“。`PERCENT` 结果四èˆäº”å…¥ä¿ç•™ä¸¤ä½(HALF_UP)。 +4. **æ–°å¢žä»…èŠ‚å‡æ—¥ç­›é€‰**(本次 PR):`holidayOnly=true` åªè®¾ç½®èЂ凿—¥(èŠ‚å‡æ—¥æ¸…å•ç”±åŽç«¯ Nacos é…置维护,**当å‰ä¸ºéªŒè¯å ä½æ—¥æœŸ,ä¸šåŠ¡æ³•å®šèŠ‚å‡æ—¥æ¸…å•待车管确认åŽç”±åŽç«¯é…ç½®**,å‰ç«¯æ— éœ€å…³å¿ƒæ•°æ®æº)。 +5. **三筛选互斥**(本次 PR,è¡Œä¸ºå˜æ›´):`weekdayOnly` / `weekendOnly` / `holidayOnly` åŒæ—¶ä¼ ä¸¤ä¸ªåŠä»¥ä¸Š `true` → è¿” `code=400` 傿•°é”™(æ­¤å‰æ˜¯é™é»˜ 0 命中返æˆåŠŸ,**å‰ç«¯è‹¥æœ‰ä¾èµ–æ—§é™é»˜è¡Œä¸ºçš„逻辑请注æ„**)。 +6. **金é¢å­—段两ä½å°æ•°**(本次 PR):`dayPrice`/`adjustValue` 传超过 2 ä½å°æ•°è¿” `code=400`。 +7. **防åŒå‡»/å¹¶å‘**(本次 PR):三个写端点(批é‡è®¾ä»·/æ‰¹é‡æ”¹çжæ€/区间清除)都加了幂等(åŒå‚æ•° 3 秒窗å£é‡å¤æäº¤è¿”「…处ç†ä¸­,请勿é‡å¤æäº¤ã€)+ åŒè½¦åž‹å¹¶å‘互斥é”。å‰ç«¯è¿žç‚¹æŒ‰é’®ä¼šæ”¶åˆ° 400 ç±»æç¤º,æ­£å¸¸å•æ¬¡æ“作无感。 +8. **错误ç å£å¾„勘正**:傿•°æ ¡éªŒå¤±è´¥ç»Ÿä¸€è¿”ä¸šåŠ¡ç  **400**(HTTP æ’ 200,错误信æ¯åœ¨ `message`)。文档旧版写的 `400001` 为笔误,以 400 为准。 +9. 所有金é¢å‡ºå‚为**字符串**(如 `"800.00"`),雪花 ID 出å‚为字符串,å‰ç«¯å‹¿å½“æ•°å­—è§£æžã€‚ + +## 1. 查询价格日历(月视图) — æ— å˜æ›´,完整契约 + +`GET /admin/fleet/pricing-calendar/{vehicleModelId}?year=2026&month=3` + +| 傿•° | ä½ç½® | 类型 | å¿…å¡« | 说明 | +|---|---|---|---|---| +| vehicleModelId | path | string | 是 | è½¦åž‹åž‹å· ID(车型树 models[].id) | +| year | query | number | 是 | 年份(2020-2100,越界返 400) | +| month | query | number | 是 | 月份(1-12,越界返 400) | + +### 请求示例 + +```bash +curl -k "https://web.test.1814.love:9443/admin/fleet/pricing-calendar/2057378612593823745?year=2099&month=1" \ + -H "Authorization: Bearer {token}" +``` + +### å“应示例(测试æœå®žæµ‹) + +```json +{ + "code": 200, + "message": "æˆåŠŸ", + "data": { + "year": 2099, + "month": 1, + "vehicleModelId": "2057378612593823745", + "modelName": "丰田普拉多", + "prices": [ + { "date": "2099-01-01", "dayPrice": "800.00", "status": "AVAILABLE", "remark": "旺季价格" }, + { "date": "2099-01-08", "dayPrice": "900.00", "status": "CLOSED", "remark": "临时åœç§Ÿ" } + ] + } +} +``` + +| 出å‚字段 | 说明 | +|---|---| +| prices | **仅返回已设置价格的日期**(未设价日期ä¸å‡ºçް,空月返回空数组) | +| prices[].dayPrice | 当日租èµä»·,**字符串**两ä½å°æ•° | +| prices[].status | å¯å”®çжæ€:`AVAILABLE`=å¯å”® / `CLOSED`=关闭 | + +## 2. 批é‡è®¾ç½®ä»·æ ¼ — 本次新增三模å¼/èŠ‚å‡æ—¥/互斥,完整契约 + +`PUT /admin/fleet/pricing-calendar/{vehicleModelId}` + +### å…¥å‚(body) + +| 字段 | 类型 | å¿…å¡« | 说明 | +|---|---|---|---| +| startDate | string | 是 | 开始日期 yyyy-MM-dd | +| endDate | string | 是 | ç»“æŸæ—¥æœŸ,é¡» ≥ startDate 且总天数 ≤ 366 | +| adjustMode | string | å¦ | 🆕 调价模å¼:`ABS`=设为固定价 / `DELTA`=现价加å‡é‡‘é¢ / `PERCENT`=现价按百分比调;**ä¸ä¼ é»˜è®¤ ABS**(å‘åŽå…¼å®¹);éžæ³•值返 400 | +| dayPrice | string | ABS å¿…å¡« | 当日租èµä»·(Â¥,≥0,两ä½å°æ•°)。**ä»… ABS 模å¼å¿…填且生效**,DELTA/PERCENT ä¸éœ€è¦ä¼  | +| adjustValue | string | DELTA/PERCENT å¿…å¡« | 🆕 调整值:DELTA=加å‡é‡‘é¢(å¯è´Ÿ,如 `-100.00`) / PERCENT=百分比数值(`10`=+10%,`-5`=-5%)。两ä½å°æ•° | +| status | string | å¦ | `AVAILABLE` / `CLOSED`,ä¸ä¼ é»˜è®¤ AVAILABLE,éžæ³•值返 400 | +| remark | string | å¦ | 备注 | +| weekdayOnly | boolean | å¦ | 仅工作日(命中周末跳过) | +| weekendOnly | boolean | å¦ | 仅周末(命中工作日跳过) | +| holidayOnly | boolean | å¦ | 🆕 ä»…èŠ‚å‡æ—¥(命中éžèЂ凿—¥è·³è¿‡,èŠ‚å‡æ—¥æ¸…å•åŽç«¯ Nacos 维护) | +| selectedWeekdays | number[] | å¦ | 指定星期几(1=周一…7=周日),éžç©ºåˆ™åªè®¾å‘½ä¸­æ˜ŸæœŸ | +| excludeDates | string[] | å¦ | 排除日期列表(区间内这些日期ä¸è®¾ç½®) | + +> âš ï¸ `weekdayOnly`/`weekendOnly`/`holidayOnly` **互斥**,≥2 ä¸ªåŒæ—¶ true è¿” 400「工作日/周末/èŠ‚å‡æ—¥ç­›é€‰ä¸å¯åŒæ—¶å¯ç”¨ã€ã€‚ + +### 请求示例 1——固定价(原有用法,完全ä¸å˜) + +```bash +curl -k -X PUT "https://web.test.1814.love:9443/admin/fleet/pricing-calendar/2057378612593823745" \ + -H "Authorization: Bearer {token}" -H "Content-Type: application/json" \ + -d '{"startDate":"2099-01-01","endDate":"2099-01-05","dayPrice":"800.00","remark":"旺季价格"}' +``` + +### 请求示例 2——🆕 全月工作日涨 100 å…ƒ(DELTA) + +```bash +curl -k -X PUT "https://web.test.1814.love:9443/admin/fleet/pricing-calendar/2057378612593823745" \ + -H "Authorization: Bearer {token}" -H "Content-Type: application/json" \ + -d '{"startDate":"2099-01-01","endDate":"2099-01-31","adjustMode":"DELTA","adjustValue":"100","weekdayOnly":true}' +``` + +### 请求示例 3——🆕 èŠ‚å‡æ—¥ç»Ÿä¸€ä¸Šæµ® 15%(PERCENT + holidayOnly) + +```bash +curl -k -X PUT "https://web.test.1814.love:9443/admin/fleet/pricing-calendar/2057378612593823745" \ + -H "Authorization: Bearer {token}" -H "Content-Type: application/json" \ + -d '{"startDate":"2099-01-01","endDate":"2099-01-31","adjustMode":"PERCENT","adjustValue":"15","holidayOnly":true}' +``` + +### å“应 + +æˆåŠŸ:`{ "code": 200, "message": "æˆåŠŸ" }`(æ—  data) + +### 测试æœå®žæµ‹æ•°æ®ç‚¹(å¯ä½œå‰ç«¯è”调预期) + +| æ“作 | 结果 | +|---|---| +| ABS 800 åŽ DELTA +100 | 900.00 | +| 900 åŽ PERCENT -10 | 810.00 | +| DELTA +100 作用于未设价日(车型 basePrice=1000) | 1100.00 | +| DELTA -99999(è´Ÿç©¿) | 0.00(兜底) | +| holidayOnly=true,区间 11 å¤©å« 1 ä¸ªèŠ‚å‡æ—¥ | ä»…èŠ‚å‡æ—¥ 1 天写入 | +| weekdayOnly+weekendOnly åŒ true | code=400 | +| adjustMode="FOO" / DELTA 缺 adjustValue / ABS 缺 dayPrice / dayPrice 三ä½å°æ•° | code=400 | + +## 3. 批é‡ä¿®æ”¹çŠ¶æ€ â€” æ— å˜æ›´(新增幂等防护),完整契约 + +`PUT /admin/fleet/pricing-calendar/{vehicleModelId}/status` + +| 字段 | 类型 | å¿…å¡« | 说明 | +|---|---|---|---| +| startDate | string | 是 | 开始日期 yyyy-MM-dd | +| endDate | string | 是 | ç»“æŸæ—¥æœŸ | +| status | string | 是 | `AVAILABLE` / `CLOSED`,éžæ³•值返 400 | +| remark | string | å¦ | 备注;**ä¸ä¼ åˆ™ä¿ç•™å„记录原备注** | + +åªæ”¹åŒºé—´å†…**已有记录**的状æ€(ä¸å½±å“ä»·æ ¼,未设价日期ä¸ä¼šå‡­ç©ºå»ºè®°å½•)。 + +```bash +curl -k -X PUT "https://web.test.1814.love:9443/admin/fleet/pricing-calendar/2057378612593823745/status" \ + -H "Authorization: Bearer {token}" -H "Content-Type: application/json" \ + -d '{"startDate":"2099-01-01","endDate":"2099-01-31","status":"CLOSED","remark":"临时åœç§Ÿ"}' +``` + +æˆåŠŸ:`{ "code": 200, "message": "æˆåŠŸ" }` + +## 4. 清除价格日历 — æ— å˜æ›´(新增幂等防护),完整契约 + +`DELETE /admin/fleet/pricing-calendar/{vehicleModelId}?startDate=2099-01-01&endDate=2099-01-31` + +| 傿•° | ä½ç½® | 类型 | å¿…å¡« | 说明 | +|---|---|---|---|---| +| startDate | query | string | 是 | 开始日期 yyyy-MM-dd | +| endDate | query | string | 是 | ç»“æŸæ—¥æœŸ | + +软删除区间内该车型全部价格记录;删åŽ**å¯é‡æ–°è®¾ç½®åŒæ—¥ä»·æ ¼**(测试æœå®žæµ‹é€šè¿‡)。 + +```bash +curl -k -X DELETE "https://web.test.1814.love:9443/admin/fleet/pricing-calendar/2057378612593823745?startDate=2099-01-01&endDate=2099-01-31" \ + -H "Authorization: Bearer {token}" +``` + +æˆåŠŸ:`{ "code": 200, "message": "æˆåŠŸ" }` + +## 5. 错误ç è¡¨(§9 å…¨å—) + +| code | message | 触å‘场景 | 涉åŠç«¯ç‚¹ | +|---|---|---|---| +| 400 | (具体校验消æ¯) | 傿•°æ ¡éªŒå¤±è´¥:必填缺失/æ ¼å¼é”™/æžšä¸¾éžæ³•/互斥冲çª/超两ä½å°æ•°/year·month 越界 | 全部 | +| 600500 | 日租价ä¸èƒ½ä¸ºè´Ÿ | dayPrice < 0(防御兜底,正常会先被 400 拦) | §9.2 | +| 600501 | æ—¥æœŸèŒƒå›´éžæ³•:开始日期ä¸èƒ½æ™šäºŽç»“æŸæ—¥æœŸ | startDate > endDate | §9.2 | +| 600502 | 日期范围ä¸èƒ½è¶…过 366 天 | 区间总天数(å«é¦–å°¾) > 366 | §9.2 | +| 600503 | 车型型å·ä¸å­˜åœ¨ | vehicleModelId 无效/已软删 | §9.1 / §9.2 / §9.3 | +| 401 | 未登录 | token 缺失/过期 | 全部 | + +> §9.4 清除接å£ä¸æ ¡éªŒè½¦åž‹å­˜åœ¨æ€§(按契约,清ä¸å­˜åœ¨è½¦åž‹çš„区间等于无æ“作返 200)。 +> HTTP 状æ€ç æ’ 200,业务错误看 `code` 字段。