提交图
2952 次代码提交
作者 SHA1 备注 提交日期
API Changelog Bot和Claude Opus 5 9798fb31f4 docs(changelog): #8002 605075 新错误码 + #8064 共用关系成员失去占用后自动收缩
changelog-filename-gate / validate (push) Failing after 1s
#8002:605008 语义收窄为「等待窗口内没抢到」专用,持锁期内复核/续租发现锁已
丢的 4 处改抛 605075(带 {0} 锁身份标签)。前端不能再把两者都按「系统繁忙,
稍后重试」处理——605075 重试无效且意味着可能已有并发写入。

#8064:接口契约零变化,变的是同一请求的副作用。共用关系的成员因真实释放路径
失去占用时会被自动移出,剩余不足 2 人时关系自动解除。这两件事在修复前于当前
部署形态(占用账本 LEGACY)下一次都没发生过——全库 release_reason=
AUTO_SINGLE_MEMBER 计数由 0 变 1 是它的硬判据。

两份都按 origin/dev-v3=c1a6e96c8 逐条复核过行号与文案;#8002 那份订正了自动
生成稿里的 5 处事实错误,订正记录连同旧值一起留在文件里。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 10:00:25 +08:00
Mimingguang acdff03133 docs(changelogs-v2): #8046 用房订房记录前端已交付回写 verified(mmg)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-21 09:49:45 +08:00
Mimingguang 1d1aec6d02 docs(changelogs-v2): #5935 改期残留清理前端已交付回写 verified(mmg)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-21 09:41:37 +08:00
API Changelog Bot和Claude Opus 5 ba87a9b611 docs(changelog): #7987 订正被 mmg 实证推翻的「前端必须新增渲染分支」,并清空 not_required 上的认领字段
changelog-filename-gate / validate (push) Failing after 1s
正文第 38 行说「前端必须新增这两个 event_type 的渲染分支」,而 mmg 在
frontmatter 里已用实证翻成 not_required(StatusLogsPanel 渲染
eventTypeName || eventType || '事件',后端直供中文名+原码兜底,前端无自建
映射表,零改动)。订正了状态位却没回头改正文,那句话会让下一个读的人以为
前端还有活。原句划掉保留接 grep,并注明这条结论依赖「后端继续直供
eventTypeName」——该字段哪天返 null,渲染缺口会重新成立。

frontend_owner/frontend_ref 清空:交付指南写死 not_required 条目任何人
(含前端)不得回写这 4 个认领字段,填了会被 E_FRONTEND 残留校验拦下
(2026-08-19 #6077 先例)。本文件能推上去是因为门禁只扫新增路径,
不是因为合规。mmg 的实证本身原样保留。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 09:02:10 +08:00
API Changelog Bot和Claude Opus 5 9d4b4387f0 docs(changelog): #8061 清理 status_note 里重复的 gateway_status 说明
changelog-filename-gate / validate (push) Failing after 1s
连续修订留下一段标着 frontend_status 却在讲 gateway_status 语义的残渣,
标签与内容不符会误导下一个填这个字段的人。内容并入括注,标签改回对的。

mmg 的 frontend_status=not_required 原样保留:他们在自己代码库里查实
getOrderOperationLog(api/fleet/board.js:58) 全仓零调用方、src/views/fleet
无 operationType 命中,后端担心的白名单过滤层尚不存在。那是前端负责人
带证据的判定,比后端的推断硬。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 00:15:45 +08:00
Mimingguang 5770e3faa4 chore(changelog): #7980 AC-6 司机险台账同名锁回写 mmg 前端复核 note
changelog-filename-gate / validate (push) Failing after 1s
2026-09-21 00:08:16 +08:00
API Changelog Bot和Claude Opus 5 bc07d07f20 docs(changelog): #7980 AC-6 司机险年保台账两写口补同名锁——新增 100503(内部接口,无 C 端)
changelog-filename-gate / validate (push) Failing after 1s
PR #8072(合并提交 8bf9c520c)。三个端点都在 /v3/internal/insurance/**,只有 fleet 经
Feign 调,fleet 侧 Controller 全挂 /admin/fleet/drivers/**,无小程序 C 端路径。

🔴 本次只有两个端点新增 100503,不是三个:
- driver-annual/upsert 与 driver-annual/{driverId}/invalidate 共用 name=driver-ins:ledger,
  这两者之间新增互斥,因此新增 100503。
- driver-purchase 补的是自成一域的 name=driver-ins:purchase,锁语义与改前完全等价
  (只是 Redis 键字符串从「类全名+方法名」变成显式 name),未新增任何错误码。

唯一可能传导到 hl-ui 的路径已逐行核实:DriverInsuranceService:352-353 投保后同步作废
旧 MANUAL 台账,失败在 :226 被 catch(AnnualBindingRollbackQueuedException) 捕获并统一
包装成既有错误码 600206,前端看到的仍是既有码,无需为 100503 新增处理。

backend_status=deployed:2026-09-20 23:43 order-v3 滚到 8bf9c520c(运行版本与合并提交
精确相等),两实例 12/13 秒起监听。「八、测试环境已验证」明写了没有做任何功能调用取证、
100503 在测试服上一次都没触发过——是「没测」不是「测过不会触发」,理由是端点不经网关且
手动触发会污染真实司机台账、触发真实保游扣费。

文件名日前缀用 21 是因为提交日已跨过零点;updated_at 同步为 2026-09-21。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 00:00:11 +08:00
Mimingguang 8a59255f93 chore(changelog): #8061/#7980 三批同名锁回写 mmg 前端实证,翻 not_required
changelog-filename-gate / validate (push) Failing after 1s
2026-09-20 23:35:03 +08:00
API Changelog Bot和Claude Opus 5 6ce29f1872 docs(changelog): #7980 补三份 @Lock4j 同名锁 changelog(房务7口/出行人+发票8口/产品库存2口)
changelog-filename-gate / validate (push) Failing after 1s
三份同属一个机制:@Lock4j 未写 name 时 lock4j 把方法名拼进锁键,keys 逐字相同的
多个方法各持一把锁、互不阻塞。本批给各组补同一个显式 name,互斥才真正生效。
对前端唯一可见的变化是这些端点新增一个可能返回的 100503(HTTP 200 + body code)。
路径、方法、请求/响应字段全部零变化。

- 配房工作台 7 个写口(PR #8069):全 admin,无 mp/C 端。
- 出行人删改 + 发票申请 8 个写口(PR #8049):三组全部触达小程序 C 端,
  逐端点沿 hl-mp-service 的 Feign 与公网 Controller 查证了调用链。
- 产品库存扣减/恢复 2 个 internal 口(PR #8047):当前零调用方,修复是预防性的。

三份 backend_status 均为 deployed 且附真实部署读数:product-v2 滚到 ba8aab3ab
(部署前 4cbccc26b,落后 93 个提交)、order-v3 滚到 ba8aab3ab(部署前 c35251b07),
merge-base --is-ancestor 逐个验过。其中 AC-5 的 b9738a20f 在部署前确实不在运行版本内,
是真正的「从不生效到生效」。

🔴 三份的「八、测试环境已验证」都明写了没有做功能调用取证及其原因(写口调用会真实
改动配房行/出行人行/库存,测试服数据多会话共用且撤不回来),并写明 100503 一次都
没触发过——是「没测」不是「测过不会触发」。互斥由落库级并发 IT 与按效果枚举的契约
用例覆盖,这是 name 契约类改动的恰当取证层级。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 23:26:24 +08:00
API Changelog Bot和Claude Opus 5 6ade6e1332 docs(changelog): #8061 解除共用关系只清成员占用,同槽非成员不动
changelog-filename-gate / validate (push) Failing after 1s
fleet 已部署测试服 00930f5d6,网关实测取得阳性与阴性两条对照:
阳性 releasedSourceIds 恰为两个成员且库内真变 unassigned;
阴性 非成员 C 的 assignment_status/vehicle_id/driver_id 解除前后逐一相等。

两条缺一不可——只有阳性的话,「C 没变」与「解除没跑起来」观测相同,
且阳性在修复前同样成立(旧实现一样释放成员,只是顺手把 C 也清了)。

frontend_status=pending:请求/响应字段零增删,但派车操作日志新增
operation_type 取值 share_release_cleared,前端若按白名单过滤会静默
丢掉这条记录,而那正是本次补留痕要解决的问题。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 23:21:18 +08:00
Mimingguang 1883b39f8f chore(frontmatter): #7990 AC-8 前端实证翻 not_required(字面渲染无特判)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-20 20:08:06 +08:00
API Changelog Bot和Claude Opus 5 e813ea774d docs(changelog): #7990 候选资源槽位需求锚点按 requirementId 反查(AC-8 修复)
changelog-filename-gate / validate (push) Failing after 1s
本单名下已有一份 changelog(看板身份三元组,PR #8048),但按内容 grep 那份已推送
文件,requirementMatched / seatsEnough / requirementMismatchReasonCode / 候选 / 座位
六个关键词全部 0 命中——AC-8 的候选面行为变化一个字都没有。

这正是 #7443 被重开的形态:按单号数文件全绿,按内容查全空。所以另写一份,
而不是让那份顶数。

行为变化(POST /admin/fleet/assignments/candidates):
TRANSFER-only 订单上,seatsEnough / requirementMatched / requirementMismatchReasonCode
由「恒空/退化」变为按 TRANSFER 需求真实判定。

修复前 AssignmentCandidateService.resolveSlotRequirement 的车型/座位锚点恒取 TRAVEL
需求:两类并存时接送机槽锚到 TRAVEL 需求的第 fleetItemIndex 项;TRANSFER-only 单上
取到 null、锚点整块退空、座位判据回退到整单 headcount,于是 5 座 SUV 反而「够」,
只剩车型一条提示(少报一半)。

两种失败出口都是 SlotRequirement.empty() 这条「仅提示不限制」的正常路径——不抛错、
不打日志。车务只看到提示不对,没有任何信号能顺藤摸瓜。这条静默属性已写进正文。

网关实测(2026-09-20 22:0x,同一次请求两辆车判定截然相反):
7 座 SUV 蒙A-U1557 → seatsEnough=true / requirementMatched=true / reasonCode=null;
5 座 SUV 蒙P321A → seatsEnough=false / requirementMatched=false / reasonCode=SEATS。
修复前两车都会是 requirementMatched=null。这组阴性对照排除了「返回一堆候选但根本
没过滤」这个竞争解释。

取证前先补了部署缺口:开测时 fleet 停在 c35251b07,而 bf4fba5a2(#8062) 触及 fleet
却未部署,重新部署到 0/N 才开测,否则会测到旧字节。

请求契约完全不变:修法是按 requirementId 匹配式反查 kind,不是给请求补 kind 位。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 20:00:03 +08:00
Mimingguang 8ce545aa7e chore(frontmatter): #8051 前端实证维持 not_required(全仓零命中,知会点已收)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-20 19:48:07 +08:00
API Changelog Bot和Claude Opus 5 ff834a4858 docs(changelog): #8051 订正 PR 字段——写的是「待建」,实际已合入 ac9efb735
changelog-filename-gate / validate (push) Failing after 1s
交接件里的「待建」会活得比它的语境久:下一个人看到它会以为代码还没合。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 19:40:10 +08:00
API Changelog Bot和Claude Opus 5 52b3f81fd0 docs(changelog): #8051 解除共用关系不再跨服务日跨团误清派车行
changelog-filename-gate / validate (push) Failing after 1s
代码 PR #8058(squash ac9efb735)已合入 dev-v3,fleet 测试服部署在 c35251b07
(2026-09-20 18:58,STATE=ok),merge-base --is-ancestor ac9efb735 c35251b07 = 真,
并用 jar 字节正负两向自证:新类 AssignmentOccupancyDayScope 部署前不在 jar 里、
部署后在(只查后一次没有分辨力)。

网关两轮独立实测 DELETE .../share-groups/{id}?survivorPolicy=RELEASE,两半边都取了:
- 阳性对照:本服务日那张确实被处理(assigned/有车 -> unassigned/NULL,且在
  releasedSourceIds 里);
- 负对照:跨日的独立派单三字段逐一不变,跨日+跨团的原受害者所在三个团七个服务日
  共 7 行 fleet_group_dispatch 释放前后逐字段完全一致。
缺任一半,「另一日没变」与「解除根本没跑起来」观测上完全一样。

frontend_status=not_required:本次不改请求/响应形状、不增删字段、不新增错误码。
但仍是给 mmg 的知会件——「解除共用关系」这个动作的影响范围变了,看板上此前莫名
变成「待派车」的那些户,原因在此。

一并订正两处事实:
- 误伤是 6 行不是 7 行(第 7 行同日同槽,RELEASE 策略下本就在处置范围,补了日期
  过滤照样会被释放);
- 修复只动了 ASSIGNMENT 侧,GROUP_DISPATCH 侧本就按 trip_date 精确过滤、从无此 bug。

仍未解决且不在本篇范围:同一资源同一服务日上的非成员在途行仍会被 RELEASE 一并
软清(releaseClaims 不引用 members),已另立工单 #8061 待产品口径。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 19:39:07 +08:00
Mimingguang 27ec0f1eb1 chore(frontmatter): #7987/#8013 前端实证翻 not_required,#7988/#8046 维持 pending 记挂起口径,#8030 补 589596 订正复核
changelog-filename-gate / validate (push) Failing after 2s
2026-09-20 19:16:14 +08:00
API Changelog Bot和Claude Opus 5 91cca38c2e docs(changelog): #7987 #7988 #8013 网关实测通过,gateway_status 置 verified,并订正 #7987 一处契约偏差
changelog-filename-gate / validate (push) Failing after 2s
2026-09-20 18:22-18:46 经网关 api.test.1814.love:9443 实测(账号 cw_test_7444):

- #7988 GET .../vehicle-requirement:七个只读观测字段全部出现,字段名/类型与正文
  一字对应,逐字段对照无出入。
- #7987 GET .../status-logs:开窗(BATCH_VEHICLE_REQUIREMENT_REOPENED)与重配
  (BATCH_VEHICLE_DISPATCH_RECONFIGURED)两类事件均取到,extra 各项齐全。
- #8013 POST/GET .../share-groups:只改 costBearer 不改成员,写出的历史行是
  COST_BEARER_CHANGED 而非 MEMBER_ADDED,且按正文声明的口径用事后 GET 查证,
  没有拿 POST 响应体推断。

订正 #7987 一处契约偏差(5 个位置):重配事件的 operatorId 正文写字符串 "SYSTEM",
实测为 null,与库里其它 SYSTEM 类事件(如 BATCH_VEHICLE_REQUIREMENT_DONE)惯例一致,
判为文档写错而非实现错。前端若按原文档判空会得到相反预期,故订正与发布同一批。

backend_status 的判据是 merge-base --is-ancestor 对各自 squash 提交与测试服部署点
(fleet 311dc92ee / order-v3 e179e09bd)逐条为真,不是「已在主线」这种弱判据。

verified_at 留空:该字段归 frontend_status 用,与 gateway 的验证时刻是两码事。

同批还有 #7444 与 #7973 两份草稿未推送,gateway_status 如实保持 pending——
#7444 缺 reconfigure / restore-cancel happy path / DELETE 三处证据,
#7973 的 confirmCrossResident 入参未被真正走到(目标资源已占用,未触发 605036 分支)。
「同一个端点被调通了」不等于「本篇登记的那个入参被验过了」。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 19:00:10 +08:00
jw和Claude Opus 5 304477d880 docs(changelog): order-v3 团期用房新增子订单订房记录接口(#8046);回填 #8030 实测并订正错误码
changelog-filename-gate / validate (push) Failing after 2s
#8046 新增接口条目(含 TEST 真实响应、AC-1~AC-11 实测读数、地域字段该用
district 而非 city 的实测依据)。

同时补两处 #8030 的遗留:
- 「八、测试环境已验证」当时留着「待部署后回填」的占位没填,现按当轮实测回填;
- 正文里的降级错误码 589574 订正为 589596(589574 是 #7932 的保留位)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 19:00:06 +08:00
Mimingguang 72bb0ff4ad docs(changelog): #7990/#7964 前端实证 not_required(#7990 TRAVEL 流程逐字正确,TRANSFER 取参口径入 memory;#7964 internal 不可达)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-20 18:02:12 +08:00
Mimingguang bb2814981d docs(changelog): #7443 AC-24 前端实证维持 not_required(契约零变化;canonicalSnapshot null 自验静默 return;挂起条件已收紧)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-20 17:59:52 +08:00
API Changelog Bot和Claude Opus 5 73e0def125 docs(changelog): #7990 车务看板订单详情按需求各返一组身份三元组,接送机确认参数有来源了
changelog-filename-gate / validate (push) Failing after 2s
GET /admin/fleet/board/orders/{orderId} 新增 requirementIdentities:
每条用车需求各一项,含 kind / requirementId / requirementVersion /
requirementSha256 / dispatchPlanGeneration。
顶层原有的那一组三字段语义不变,仍指行程用车(TRAVEL),前端不改也不炸。

为什么前端必须接:POST /admin/fleet/assignments/requirements/{id}/confirm
的三个 expected 入参(version / sha256 / planGeneration,均 @NotNull 或 @NotBlank)
唯一公开来源就是本端点,而此前它只给 TRAVEL 那一组
⇒ 接送机需求在管理后台确认不动。

同时修掉一个必 500 的场景:同一订单同时有两条已确认需求时,
本端点每一次都抛 IllegalStateException。现改为正常返回;
真出现无法判定的代际时抛新业务码 605311(HTTP 200)。

行为变化(是修复不是回归):接送机需求未定稿时,它的待派车行
现在会出现在逐日计划里——那些行归它自己的需求,先前隐藏它们才是缺陷。

gateway_status=verified 的依据是真实调用不是推断:经测试网关拿到
requirementIdentities 两项后,原样用于需求级确认返 code=200、
confirmed=true、finalPlanPublished=true ⇒ 该字段不只是返回了,
而是真的能驱动接送机确认走通。

Refs #7990

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 17:59:50 +08:00
jw 867e5ad790 docs(changelog): order-v3 订单取消同事务失活用车需求,已取消户不再进 fleet 待配车池(#7964)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-20 17:57:22 +08:00
API Changelog Bot和Claude Sonnet 5 24dde670d1 docs(changelog): #7443 AC-26 TRANSFER 派车行四端点网关实测收尾,gateway_status 回填 verified
changelog-filename-gate / validate (push) Failing after 2s
四个既有端点(candidates/change/confirm(assignmentId)/confirm(requirementId))经网关
逐一实测通过;此前缺失的 confirm(requirementId) 借新上线的
GET /admin/fleet/board/orders/{orderId} requirementIdentities 字段取得
expectedRequirementVersion/Sha256/expectedPlanGeneration 真值补齐验证。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-20 17:52:04 +08:00
Mimingguang d3028eb02a docs(changelog): #7980 AC-4 发票三写口锁 前端实证翻 not_required(admin 两写口拦截器透 message,mp 侧归 mp loop)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-20 17:49:25 +08:00
API Changelog Bot和Claude Opus 5 9ee36c0b94 docs(changelog): #7980 AC-4 发票签发组三写口补同一把锁,新增可重试冲突码 100503(会触达小程序 C 端)
changelog-filename-gate / validate (push) Failing after 2s
order-v3 的 InvoiceAdminService.issueInvoice / reuploadInvoice 与 InvoiceMpService.reissueInvoice
三处 @Lock4j 写了逐字相同的 keys 却都没写 name;lock4j 的 Redis 键在 name 缺省时退化成
「类全限定名+方法名」,于是三处各持一把锁。后果是 reupload ∥ reissue 会留下一单两张有效票。
本次三处补同一个 name = "order-invoice:issue"。PR #8043 → 09b8f2323 已合 dev-v3。

接口路径、方法、请求/响应字段、既有错误码全部零增删。唯一契约变化是新增一个可能返回的错误码 100503
(RESOURCE_LOCKED「资源被占用,请稍后重试」),且它以 HTTP 200 + body code 返回——
前端只看 HTTP 状态码会把它当成功。

该码会触达小程序 C 端:reissue 经 hl-mp-service 两个入口透传
(MpV3InvoiceController:54 直接透传;MpInvoiceController:108 经 getCheckedData(),
Result:143-148 用上游 code 原样重抛)。用户点「申请重开发票」时若财务端正在同一张票上操作,
等最多 3 秒后收到该提示;反向同理。此前这几条互不阻塞。

测试服证据(backend_status 因此才从 pending 转 deployed;此前门禁 E_BACKEND_PENDING 正确拦下过一次,
没有为换绿灯改状态,而是去把部署真的做了):运行版本 5d14bc524,
merge-base --is-ancestor 09b8f2323 5d14bc524 → YES。
⚠️ 如实记:部署前 COMMIT 已是 5d14bc524(另一会话此前推上去的),本次重跑不等于「使它从不生效变生效」。

🔴 证据强度按实际收窄,没有拔高:redis-cli MONITOR 抓到键
lock4j:order-invoice:issue#order-invoice:issue:<invoiceId>、无方法名混入,
但 MONITOR 只跑了三个写口里的一个(issueInvoice);另两处由代码同源 + 反射守卫用例
InvoiceIssueLockNameGuardTest(断言三处 name 非空且相等)覆盖,未在测试服上单独抓包。
正文里 §2/§3 原本写「同第 1 节,链路一致」会被读成「也实测过」,已改成明确写「未单独抓包」。

100503 未复现:并发两个 issueInvoice,一个 code=200、另一个 code=581502(INVOICE_CANNOT_ISSUE
业务状态守卫),不是锁超时码。原因是临界区极短(与 fleet 那轮 34 并发未触发同因)。
第二个请求被业务守卫拦下说明没产生并发脏写,但这是旁证不是互斥证据。
两面都写:路径源码级真实存在(已读码确认 + IT 里实测过等 3024ms),但测试服未能触发,
不代表更长事务/生产数据量下不会触发。

取证干净:三张票全是测试夹具(客户名「核团甲/乙/丙」,apply_reason 为 #7932 造数),
改前均 REQUESTED/NULL/NULL,已按改前快照逐列 UPDATE 还原并复读一致,
Redis --scan lock4j:*order-invoice* 复扫为空。过程中发生过一次 code=401(token 被别的会话顶掉),
该次调用前无任何读数,已重登并把那段整个重做。

顺带修掉一个会挂门禁的文件名 bug:原名后缀写的是「小程序管理后台」,而 changelogs-v2/ 根目录
要求端类型字面量必须是「管理后台」,改名前文件名校验确实报 E_CLIENT。

Refs #7980

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 17:47:14 +08:00
Mimingguang 0cd51c06b4 docs(changelog): #7972 前端实证维持 not_required(809114/584131 零命中走拦截器,TRANSFER 不可达)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-20 17:43:23 +08:00
API Changelog Bot和Claude Opus 5 8ff7f0761e docs(changelog): #5935 改期残留清理——前端要的能力已具备,用现有读写口即可
changelog-filename-gate / validate (push) Failing after 2s
前端 2026-09-20 待办清单第 4 项要求读侧补 residueServiceDates 日期数组,
并称写口 POST .../slots/{slotId}/clear-residue-dates 已就绪。两条都不成立:

- 那个写口在 origin/dev-v3 上零命中——「槽位(slot)」概念已随 #7067 退役,
  基于 slotId 的写口不会再有;
- 读侧能力早就有,只是不叫 residueServiceDates:candidates 响应的 cells[]
  逐日带 rescheduleResidue + serviceDate + assignmentId,
  另有 editableServiceDates 已并入残留日期。

故本件是用法说明,后端零代码改动:逐日清理走 DELETE /assignments/{id},
整批清理走 POST /batch 不提交残留项(diff 会精确取消)。
已写明真正的写侧边界——POST /batch 有「已过去日期不可改」硬门禁,
而改期后延场景的残留日多半已过去。

DELETE 路径对已过去日期是否放行未取证,如实标【需确认】;
若实测也挡住,那才需要另开工单放开残留行的过去日期取消。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 17:41:05 +08:00
Mimingguang 875a682ea9 docs(changelog): #7925/#7937/#8023/#8030 前端接入「用房·汇总」建页交付,翻 verified(mmg@9a14ad86)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-20 17:39:04 +08:00
API Changelog Bot和Claude Opus 5 41c0f752f9 docs(changelog): #7972 接送机的免车闸与结算闸改为非对称判据,809114 放宽 / 584131 新增拒绝
changelog-filename-gate / validate (push) Failing after 2s
PR #7976(572dc4037)改了两个既有错误码的抛出条件,零新增错误码:

- 809114(整团免车被派车阻塞)改为只看 TRAVEL——「只订接送机、没有团车」
  是合法的在团户,不该被上游拒绝免车,属于放宽。
- 584131(团期用车未就绪)对 TRANSFER 补独立的非对称判据:不存在放行 /
  DONE 放行 / 其余拒。原 TRAVEL 的抛出与放行结论逐字不变。
  整团免车现在只短路 TRAVEL 一支,两类互不豁免。

🔴 运维注意已写进正文:存量里停在 PENDING 的 TRANSFER 需求行,其所在户的
finalize 会从 200 变 584131——那是本次改动的预期行为,不是回归。

backend_status=deployed 依据 572dc4037 是测试服 order-v3 所在提交的祖先;
gateway_status=not_required 依据本次不涉及网关路由变更(仅后端判定条件)。
校验器 PASS,校验对象 4 个端点。

Refs #7972

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 17:35:19 +08:00
API Changelog Bot和Claude Opus 5 89d7e4f75d docs(changelog): 订正 01_6905 里「estimatedCost 已可用」这条错误交接(共 4 处,非 1 处)
前端会话核出 01_6905 第 446 行写着「预计毛利 = totalPrice − estimatedCost 现可直接算
(estimatedCost 已可用)」,而该字段从未有过数据。前端据此规划的「预计毛利」列在任何时点都算不出来。

本会话独立复核成立,并补上两个原 grep 会漏的口径:
- setEstimatedCost 在 main 代码 0 命中;
- getEstimatedCost 也是 0 命中——这条关键,MyBatis-Plus 的
  LambdaUpdateWrapper.set(Entity::getXxx, v) 用的是 getter 引用,只 grep setter 会整类漏掉;
- 字段名在整个 Java 侧只出现在实体 OrderInfo.java 自身的声明里,其余全是 docs 与建表 DDL
  ⇒ 没有任何别的 DTO/VO 带这个属性名,连 BeanUtil 那种反射拷贝也无从填它。
⇒ order_main.estimated_cost 全仓零写入点,estimatedCost 自 #6905(47aaff0be) 透出那天起恒 null,
不是后来才失效;已于 #7536(6182d566d) 从 003 出参删除。

⚠️ 同一条错话在正文共 4 处(字段表 :281、totalPrice 行的毛利公式 :282、
新增/派生对照表 :390、联调口径第 4 条 :446),外加在途返工表 :455 的半句。
只改被举报的那一处会让订正本身成为新的不一致来源,故五处一并改,并做了全文残留断言:
无订正标记而仍出现 estimatedCost 的行 = 0。

订正一律保留原文加删除线、不抹除,旧串仍可被 grep 接住(estimatedCost 出现 11 次)。
同时指向现行宿主:逐户毛利在核团接口 GET /v3/admin/order/group-batch/{groupBatchId}/audit 的
allocs[].grossProfit / costAmount(GroupBatchAuditRespVO:204-208 声明,
GroupBatchAuditService:742-743 真实填值,见 18_7932,亦即 14_7536:97「毛利改核单页」所指)。
顺带订正出处:estimatedCost 由 #6905(47aaff0be) 引入,不是 df8dbea0c——后者只加了 totalPrice。

发现来源:前端问题会话对 origin/dev-v3 的两轮核查(核查 + 对抗复核)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 17:30:44 +08:00
Mimingguang 126855b95d chore(changelog): #8030 前端实证翻 not_required(汇总端点未接入;用房汇总表属新功能排期)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-20 17:18:38 +08:00
jw和Claude Opus 5 af00e6fa30 docs(changelog): order-v3 全团需求汇总逐日房间补酒店维度与住宿日期(#8030)
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 17:07:34 +08:00
Mimingguang 96ac790821 chore(changelog): #7980 前端实证翻 not_required(100503 走拦截器透 message)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-20 16:39:25 +08:00
API Changelog Bot和Claude Opus 5 7bc90b0be6 docs(changelog): #7980 价格日历四个写接口补齐真实并发互斥 + 新增可重试冲突码 100503
changelog-filename-gate / validate (push) Failing after 2s
hl-fleet-service 车型价格日历四个写口(批量设价 / 多车型批量设价 / 批量改状态 / 清除价格日历)
此前虽各自写了相同的 @Lock4j keys,但都没写 name;lock4j 落 Redis 的锁键含方法名,
name 缺省时退化成「类全限定名 + 方法名」,四处因此各自持有一把互不相干的锁——
接口文档里一直写着的「四个价格写端点全互斥」此前并不成立。本次补上同一个显式 name,互斥才真正生效。

接口路径、方法、请求/响应字段、既有 4 个业务错误码(600500-600503)均零增删。
唯一的契约变化是新增一条可能返回的错误码 100503(RESOURCE_LOCKED,「资源被占用,请稍后重试」),
且它以 HTTP 200 + body code 的形式返回——前端只看 HTTP 状态码会把它当成功。

关于 100503 的触发频率,正文两面都写,缺一面都会误导前端:
- 该路径源码级真实存在(acquireTimeout 默认 3000ms + LockFailureExceptionHandler 转 100503
  + @ResponseStatus(HttpStatus.OK),三处均已读码确认);
- 但测试服用 4/8/17/34 并发 × 365 天多轮尝试均返回 200,一次未触发(推断原因:本次优化后
  单车型 366 天的 DB 往返从 732 次降到个位数,临界区极短,累计排队远小于 3 秒)。
⇒ 前端仍应防御性处理并允许重试,但不必按高频路径设计交互;
同时不能因为测试服没测到就当它不会发生——更长事务 / 更大载荷 / 生产数据量下的行为未知。

测试服证据(backend_status 因此才从 pending 转为 deployed,此前门禁 E_BACKEND_PENDING 正确拦下过一次):
部署前 53c2ff2d1 → 部署后 10efbaddf,merge-base --is-ancestor ee1937950 10efbaddf 返回 ANCESTOR_YES;
redis-cli MONITOR 实时抓包证实 12 并发只命中同一把锁键
lock4j:fleet:pricing-calendar:write#fleet:pricing-calendar:write,改前那种含方法名的坏形态一次未现,
12 组干净的 acquire→release、未观察到两个持有者同时持锁;71 次回归调用全部 code=200。
测试数据写在原本全空的未来年份(2027 部分/2028/2031/2032/2033,71 组车型×年份),
已用 71 次 DELETE 逐一还原并按年复核归零,真实业务数据(2026-09 丰田普拉多 24 条)抽查与改前一致。

gateway_status 记 not_required:四端点路径/方法零变化、hl-gateway 版本未动(4cbccc26b),
是判定不是漏验证,判据已写进 status_note。

Refs #7980

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 16:29:13 +08:00
Mimingguang 8e72e63879 chore(changelog): #8023/#7965/#8003/#8004 前端实证翻 not_required(grep 零消费面/自动受益);#7443 到件维持 pending 挂起
changelog-filename-gate / validate (push) Failing after 2s
2026-09-20 16:09:06 +08:00
Mimingguang 7ea4012f2a chore(changelog): #7741 订单用餐七接口回写 verified(mmg@061b728a)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-20 16:00:55 +08:00
jw 4e9e0c50bf docs(changelog): #7965 改派幂等重放 assignmentSlotId 口径订正 + 补实测读数
changelog-filename-gate / validate (push) Failing after 2s
该文件的初稿被 #8023 那次提交(ba78f96)连带提交上来了,内容是未修正版。本次补齐并订正:

1. 口径订正(重要):初稿沿用工单与 PR #7997 的说法「重放的响应体里这个字段消失了」,
   该说法对响应体不成立。NON_NULL inclusion 只挂在回执写 outcome_json 的私有
   CANONICAL_MAPPER 上,响应 VO 无 @JsonInclude、全仓无 default-property-inclusion 配置;
   网关实测响应原文里 "warningCode": null、"vehicleFeeAdjustmentReason": null 均原样带出。
   ⇒ 前端改前看到的是 "assignmentSlotId": null(键在、值为 null),不是键消失。
   已同步改掉「按键可能不存在判空」这条会误导前端的契约约束。

2. 请求/响应示例换成 TEST 实测原文(2026-09-20 15:26,两次调用响应体 MD5 相同)。

3. 补「八、测试环境已验证」:网关双调读数、重放佐证、存量 19 行统计与反推前提核验、
   本地 fleet 全量 verify 读数。

4. 补前端现状核查与「重放路径确实会走到」的依据(hl-ui useAssignFlow.js:757 复用 requestId)。

三个校验器均 PASS。

Refs wx/HL#7965
2026-09-20 15:56:36 +08:00
jw b72bdaa469 docs(fleet): #8003 共用关系跨维度成员改绑与悬挂核对任务 1045
changelog-filename-gate / validate (push) Failing after 2s
2026-09-20 15:42:46 +08:00
jw和Claude Opus 5 59efa9d540 docs(changelog): #8004 候选面拆出 shareEligible,两个读口 cityJunctionShareCandidate 恢复同义(修改接口)
changelog-filename-gate / validate (push) Failing after 2s
同名字段在 candidates 与 precheck 上含义不同:#7444 把 candidates 一侧扩写成
「同城衔接 或 已确认共用关系」,precheck 一侧保持原义,于是同一对跨城派单
两个读口返回相反的 true/false。本次 candidates 该列回到 #5302 已发布的原义,
新增 shareEligible 承载「这条冲突被放行了吗」(恒等于 !blocking)。
precheck 出参与两端点入参一律不变。

收件人 mmg:若前端已按 #7444 口径把 cityJunctionShareCandidate 当「可不可以选」用,
须改读 shareEligible 或 blocking。

Refs #8004

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 15:40:36 +08:00
API Changelog Bot f5596bf88e docs(changelog): 20_7443 按 CHANGELOG_TEMPLATE 重构分章节,过接口类门禁(#7443)
changelog-filename-gate / validate (push) Failing after 1s
E_API_TEMPLATE 要求接口类正文必须有 二/三/四/六/七/八/十/关联 八个章节。
内容零丢失,只重组结构并补齐模板要求的缺失章节。

三处不能丢的都逐字保留:
- 覆盖边界(本文只验到「提交」为止;TRANSFER 同步车务 outbox 恒 605905)
  在「六、边界行为」子节原样保留,文首「关键变化」只做导读不做替代
- 阳性对照注脚(两字段 fleet 恰好相同不能证明按 kind 取数生效,真正证明
  它的是全 null 对照与 id 不同)在「八」原样保留
- 809002/809009 分开处置(去补大交通 / 找后端开开关)新建对照表,两码
  各自一行,不混提示

代理顺带查实并订正三处:
- 路径参数按源码 AdjustmentAdminController 实为 {id} 而非 {orderId}
- status 枚举以 RequirementStatus 为准共 6 个;RespVO 注释里的 CLAIMED
  在源码里根本不存在,已显式点出分歧而非悄悄抹平
- 文件实际行尾是 LF 不是 CRLF,按现状保持
2026-09-20 15:35:01 +08:00
API Changelog Bot b8a079fda0 docs(changelog): 调整订单「车辆安排」页同页提交行程用车+接送机用车两类需求(#7443)
后端已合入 dev-v3(PR #8024 -> 920f29d76)并部署测试服,四条真实网关调用取证:
读口双槽(带全 null 阳性对照) / 一次 submit 同交两份落两条 active 行 /
两条 label 原文不同的调整记录 / 无大交通时 809002。
service_dates 两个 kind 分别派生成行程三天与接机送机两天,前端一个日期都不传。

覆盖边界写在正文与 status_note 里: 本文只验到「提交」为止。同一次实测观测到
TRANSFER 需求同步车务的 outbox 恒失败 605905(fleet AssignmentService:11492
取当前需求不带 kind),前端可并行开工但端到端尚未打通。
2026-09-20 15:35:01 +08:00
jw ba78f967e2 docs(changelog): #8023 需求汇总与确认预检不再只认 needs_hotel 标记位(修改接口)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-20 15:28:57 +08:00
Mimingguang ed301e0bec chore(changelog): #7932/#8016 frontend_ref 随 hl-ui 重写署名尾部同步为新哈希(5833f46f/bb1c4f8a)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-20 15:20:24 +08:00
Mimingguang 69176d8c7a chore(changelog): #8016 房型大类过滤回写 verified(mmg@3face1b0);#7991/#8016 放开池外前端实证翻 not_required
changelog-filename-gate / validate (push) Failing after 2s
2026-09-20 15:06:57 +08:00
API Changelog Bot和Claude Opus 5 584df5a90d docs(changelog): #8016 standard_double 已修掉(PR #8025)——警告改为订正
changelog-filename-gate / validate (push) Failing after 1s
原文用一句「那是过期垃圾,不要照抄」绕过 roomCategory 入参的过期 Swagger
example。该前提今天已被 PR #8025(squash 合并 dev-v3 = 819a147a2)消除:
example 现为 DELUXE,value 文案补上取值集合与过滤语义。

按「订正要留着旧编号接住 grep」:standard_double 字面量原样保留(删除线内),
仍搜到旧值的人会落到这条订正上,而不是搜不到任何东西。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 15:05:14 +08:00
Mimingguang 1628921c11 chore(changelog): #7932 核团七接口回写 verified(mmg@93b3330c);验团前置件补交付说明维持 not_required
changelog-filename-gate / validate (push) Failing after 1s
2026-09-20 14:54:23 +08:00
API Changelog Bot和Claude Opus 5 9df9dbb442 docs(changelog): #8016 团期候选酒店 roomCategory 入参真正参与房型过滤
changelog-filename-gate / validate (push) Failing after 2s
工单 #8016 追加范围,PR #8022 合并提交 7b713305e,测试服 order-v3 已部署并网关取证。
契约零增删字段,仅行为变化:matchedRoomTypeId 现在只落在同 roomCategory 的房型上,
matchedRoomTypeLabel 恒为房型真实中文名(不再回显入参 code),新增置灰文案「所选房型今日无房」,
todayAvailable 口径不变(全房型合计)。

前端行动项(mmg):第二个房型下拉需按第一个下拉选定的大类过滤,数据早已在
roomTypes[].roomCategory(工单 #4204),用现有字段即可实现,无需等后端。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 14:43:16 +08:00
API Changelog Bot和Claude Opus 5 e53008aef4 docs(changelog): 团期酒店候选放开池外 + 候选恒空修复(#7991 #8016)
changelog-filename-gate / validate (push) Failing after 1s
同一端点 GET /v3/admin/hotel-candidates 上 2026-09-20 先后上线的两次行为变更合写一份:
#7991 修复 GROUP 候选恒空(排序器以未接线的 batchRoomRemain 硬过滤,池内每家都被丢)、
#8016 放开池外(产品固定房池由硬门降级为加分项,池内恒排最前并带徽章)。

契约零增删,但 GROUP 的 isPoolMatch / poolMatchBadge / recommended / recommendSource
取值域由「恒真/恒非空」变为「可假/可 null」,前端若对 GROUP 写过恒为池内的假设必须改。
实测读数取自测试服 order-v3 @7d44ca268 经网关实调,候选 1→21。

Refs #7991 #8016

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 13:49:37 +08:00
Mimingguang 94dd7c5d49 docs(changelog): #7947 前端已交付,回写 verified(mmg,hl-ui v2.1)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-20 13:43:08 +08:00
Mimingguang 1eae62b9f4 docs(changelog): 7 条前端实证判 not_required,翻状态+补实证 status_note(#7949/#7932-验团前置/#7442-vehicle-ready/#7539/#7942/#7925/#7937)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-20 13:27:20 +08:00