提交图
3126 次代码提交
作者 SHA1 备注 提交日期
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
Mimingguang 11342ee25d docs(changelog): #8005 前端已交付,回写 verified(mmg,hl-ui v2.1) 2026-09-20 13:27:20 +08:00
jw和Claude Opus 5 dde36e4548 docs(changelog): #8005 补 AC-11 退团口径回归取证
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 13:00:28 +08:00
jw和Claude Opus 5 7aa66180af docs(changelog): #8005 退单户候选列表与提交前预览(新增接口)
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 12:58:18 +08:00
jw和Claude Opus 5 ec1d8b3c69 docs(changelog): #7937 全团需求汇总车型座位合计补车型大类中文名 vehicleTypeName(修改接口)
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 12:14:27 +08:00
API Changelog Bot和Claude Opus 5 25e77cf72e docs(7442): 修 5 处指向「从未存在过的文件名」的悬空引用,改为单号+glob
changelog-filename-gate / validate (push) Failing after 2s
#7442 的两份交接件里有 5 处引用
`19_7444_团期配车就绪门禁与同团车辆共用关系-新增接口-管理后台.md`。
该文件名在全历史零命中(阳性对照:同一条命令能找到确知已提交的
`*7442*reconfigure补登*`,所以零命中是真空不是 glob 写错)——它是起草期的
一份草稿名,该稿已并入现存的 `*_7444_*` 交接件、名字不再存在。

不改成「现存的那个文件名」,因为那会埋一次必然的再次失效:
① 那份文件还没提交(门禁按设计拦着 backend_status=pending);
② 本仓文件名带提交日前缀,它哪天被推名字就是哪天;
③ 「指向文件名」本身就是错的抽象层——文件名会变,单号不会。

改成「#7444 的交接件(按 `*_7444_*` 检索)」,这个形态不需要第二次维护。
旧名在括号里保留一句接住 grep。

Refs #7444

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 12:05:46 +08:00
API Changelog Bot和Claude Opus 5 ae069b00a9 fix: frontmatter 未转义的引号让元数据对所有消费方隐形——修 19_7443 + 给校验器补语法层
changelog-filename-gate / validate (push) Failing after 1s
现象:Gitea 上打开这份 changelog 看不到元数据表,页面表现就是「这份文件没有元数据」,
而文件里其实写着完整的 16 个键。

根因:status_note 是 YAML 双引号标量,正文里夹着未转义的 ASCII 双引号
(...请勿据此对外宣称"确认/改派已验证可用")。YAML 在第一个内部引号处截断,
整块 frontmatter 解析失败,Gitea 于是静默不渲染。

为什么一直没人发现:本仓校验器的 parseFrontmatter 是朴素行解析——按第一个冒号切开、
两端引号成对就剥掉——它对「这份 YAML 下游读不读得了」零分辨力。于是这类文件长期处于
「校验器 PASS,而 Gitea 与任何 YAML 解析器都读不到」的状态,没有任何一处报错。
校验器回答的是自己那套宽松读法,不是消费方的读法。

改动两部分:
一、修 19_7443 那两个引号。转义只改字节不改语义,验过三条:改后 yaml.safe_load 成功、
    解析出的值与作者本意逐字相同、正文一个字节没动。
二、给校验器补上它完全没有的那一层:validateFrontmatterSyntax,新错误码
    E_FRONTMATTER_SYNTAX。本仓刻意零依赖,所以不引 YAML 库,按实际出过的三类伤写
    定向判据:内部未转义双引号 / 收尾引号丢失 / 非法转义序列。语法校验排在所有按键
    取值的校验之前——frontmatter 读不了的话,后面那些校验都是在校验一份只有本脚本
    能读的东西。

自验两个方向:三种人造伤各自被拦(exit=1);全仓 1030 份逐批跑完,新增错误码
E_FRONTMATTER_SYNTAX 命中 0 次,无连带误伤;独立口径用真 YAML 解析器扫全仓,
546 份带 frontmatter 的全部可解析。

⚠️ 同一毛病另有 7 份存量文件未修(05_5530 / 08_5592 / 06_7149 / 10_7328 / 13_7625 /
15_7327 / 15_fund-account)。它们的元数据同样对 Gitea 隐形,修法已验证可行,
但每份都带着 1~3 条与本次无关的历史门禁错误(E_FRONTEND_STATE「verified 必须填写
target_release」为主,另有 E_AUTHOR / E_API_TEMPLATE / E_BACKEND_STATUS),
推不上去。补那些字段需要编造内容,不做。
🔴 值得记一笔的因果:正是门禁这个严格度让这 8 份一直坏着——谁想顺手修一下,
就会撞上一堆与自己无关的历史错误然后放弃。修复脚本留在
D:/work2/_scratch/changelog-fm-fix/,等 wx 决定是给存量文件开豁免还是补齐字段。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 11:04:32 +08:00
jw和Claude Opus 5 8d644fc8f3 docs(changelog): #7925 全团需求汇总房间合计对齐预检判定 + 补房型中文名与需房/已提交户数(修改接口)
changelog-filename-gate / validate (push) Failing after 1s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 09:52:45 +08:00
jw和Claude Opus 5 afc2699499 docs(changelog): #7942 团期看板 keyword 支持按期号「第N期」精确搜索(修复)
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 09:42:54 +08:00
jw f839961bf4 docs(changelog): #7539 团期出发推进定时任务 1041 启用与存量待出发团处置(无接口变更)
changelog-filename-gate / validate (push) Failing after 2s
Refs #7539
2026-09-20 09:29:21 +08:00
API Changelog Bot和Claude Opus 5 3b637393bc docs(changelog): #7443 TRANSFER 提交开关测试服已开启,订正 18_7443 里 frontend_status=not_required 的判定依据
changelog-filename-gate / validate (push) Failing after 2s
18_7443 判 not_required 的理由逐字是「上游写口 809009 开关关闭,产品上产不出 TRANSFER 需求,
4 个新错误码仅 kind=TRANSFER 触发、前端不可达」。

该前提已于 2026-09-19 15:33:32 CST 被本会话推翻:测试服 Nacos 开启
hl.order.requirement.transfer-kind-submit-enabled 并重启 order-v3 两实例
(承载类 RequirementService 无 @RefreshScope)。

⇒ 那 4 个错误码与 TRANSFER 派车路径在测试环境里现在可达,frontend_status 改判为 pending。
不替 mmg 拍 not_required:原判定的理由没了,但生产仍不可达、是否启动前端集成是排期问题。

边界写清三条:代码默认值仍 false / 生产未动 / 开关开了 ≠ TRANSFER 全链路可用。
18_7443 原文件未改动,保留接 grep。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-19 17:14:10 +08:00
API Changelog Bot和Claude Opus 5 fc36125695 docs(changelog): #7442 逐字段审计查出两处契约错误,修正 coverage 错误响应与 reconfigure 漏列的 5 个字段
changelog-filename-gate / validate (push) Failing after 2s
对 4 份 #7442 交接件做了逐字段契约审计(10 个端点、21 个错误码,分母从
工单正文与源码数、不从 changelog 数),端点数与错误码数均对上,查出两处:

1. coverage 端点「错误响应」节整段写错(严重)。原文写成「本团正式需求
   零分组或无需求时统一失败关闭、返 602009」,并引了一句并不存在的
   message。核 GroupDispatchService#queryCoverage 后实为三条不同路径:
   - 无活跃需求 → HTTP 200、success=true、satisfied=false,gaps 指出身份
     已变,根本不是错误
   - 有需求但零分组 → 602009,message 实为「正式用车需求未声明任何乘车
     分组(整团免车的团期不应配车)」,抛出点在 GroupDispatchCoverageCalculator
   - 基线不可达 → 600009,不是 602009
   把三条压成一条,会让调用方给一个返 200 的正常场景写错误处理分支——
   「拿不到覆盖结论」和「覆盖结论是不满足」在本端点不是同一件事。

2. reconfigure 补登漏列 5 个字段:入参 survivorPolicy(clearAll=true 且
   存在 active 共用关系时必填,缺失抛 602110)与出参 releasedShareGroupIds
   / keptSourceIds / releasedSourceIds / pendingReassignSourceIds。它们由
   #7444 追加到同一个端点,完整语义在 #7444 那份 changelog 里;本文档只补
   列字段名与出处,不重复。

   ⚠️ 这一处的机制值得记:本文档自称按端点「当前的完整契约」撰写,而
   「完整契约」这种自述会在别的工单往同一个端点加字段时静默失效——加字段
   的人写的是他自己那份 changelog,不会回头改这一份。

Refs #7442

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-19 14:35:25 +08:00
API Changelog Bot和Claude Opus 5 0eecbce1ab docs(changelog): #7442 订正两份交接件的部署顺序结论——按单算的"顺序无所谓"在并集里是错的
changelog-filename-gate / validate (push) Failing after 3s
两份文档各有一句部署顺序结论:
- reconfigure 补登:「万一要分批,order-v3 先滚风险更低」
- 就绪回写补登:「本单不强制要求特定先后顺序」

两句按各自那次改动算都是对的,分析段也都标了范围(reconfigure 那份甚至
明写「本单与 #7957 的『fleet 必须先滚』不同」)。错的是结论句把限定丢了,
读起来像是对这次部署的建议。

而 PR-C2(#7957)后来在同一个 GroupBatchDispatchBaselineDTO 上加了
reconfigureWindow,它强制 fleet 先于 order-v3:order-v3 先滚时旧 fleet
收到 dispatchable=true 直接放行重配,不读 reconfigureWindow、不校验令牌
与范围,「受控重开」当场退化成「不受控重开」——而两端日志都正常、
没有任何报错。今天要部署的人面对的是这些改动的并集,不是某一单。

⇒ 两份都补了订正框,并把实操答案写死:同批滚;必须分批时 fleet 先、
order-v3 后。同时立了一条规矩:写部署顺序结论一律带上「截至某日期/commit,
这个 DTO / 这批部署单位上还有哪些已合入的改动」这个限定——按单写的部署
结论会在下一次改动落到同一个对象上时变成陷阱,而它不报错,也没有人会
回来改它。

原分析段逐字保留,只给结论句补范围。

Refs #7442

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-19 14:30:07 +08:00
API Changelog Bot和Claude Opus 5 cad5dcd021 docs(changelog): #7442 三份交接件补真实网关实测,并订正 batchStatus 契约错误
changelog-filename-gate / validate (push) Failing after 2s
三份文档此前 front matter 写着 gateway_status: "verified",而同一文件的
status_note 与第八节都写着 pending / 「暂无网关实测数据」——头身从第一次提交
起就不一致,那三个 verified 是假状态。

2026-09-19 已完成实测,现在它们是真的:

- reconfigure 补登(1 个端点):正负各一次。正常路径 planVersion 2→3、
  idempotentShortCircuit=false、落库 3 条活跃行;负向路径事先点名 602002,
  拿到 602002 且 message 指名漏掉的 SUV 组,DB 核实零写入。
  另记两个坑:单组需求下 602002 语法上不可达(602001 的检查排在前面);
  夹具里的 vehicle_id=1001 是不存在的占位 ID,会被 600006 拦下。

- 受控重开窗口(5 个端点):reopen / requirement/confirm 走网关,
  plan-refresh / coverage / dispatch-baseline 直连。每个端点都断了至少一个
  本次改动相关字段并做 DB 交叉核实。coverage 补了正负对照
  (satisfied=true/gaps=[] vs 故意传 requirementVersion=999 → satisfied=false
  且 gaps 指出身份已变),证明该字段不是恒真。
  顺带订正 status_note 里「测试服尚未部署到含 PR #7957」——那句已过期,
  实测中 reconfigureWindowToken(#7957 引入)被真实端点接收并生效。

- 就绪回写两级判定(2 个端点):vehicle-ready-reset 与 vehicle-ready 配对,
  reset 让 vehicle_ready 1→0、再用 vehicle-ready 推回 1,夹具靠真实写口还原、
  零 SQL 直改。补两条负向对照(重放同版本→ALREADY_APPLIED;错版本→
  IDENTITY_MISMATCH/809205)证明 applied 不是恒真字段。

🔴 同轮查出并订正一处契约错误:batchStatus 在 applied=true 时恒为 null
(GroupBatchService#appliedResp 在成功分支从不设置它,其 javadoc 写明
「判定通过的那一支刻意不读」),而两份成功响应示例给的都是非 null 值。
照旧稿写的前端会读到一个永远为空的字段。示例与字段说明均已更正,
并写明想拿团期状态要另查团期详情接口。

三份文档共 8 个端点,全部走的是「HTTP 200 + success 或事先点名的错误码 +
至少一个本次改动相关字段 + 尽量做 DB 交叉核实」这一套判据。

Refs #7442

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-19 14:17:35 +08:00
API Changelog Bot 85c8443c73 docs(changelog): #7442 修一处指向别人 PR 的 merge SHA,补两处部署清单取证
changelog-filename-gate / validate (push) Failing after 1s
一、17_7442「十、相关文档」里的 Merge SHA 指向了一个完全无关的 PR
原文写 Merge: a37bd669f。实测该提交是 fix(finance): #7396 应付款四入口接团期住宿
(PR #7866,jw,09-17 11:09),其 module 清单只有 docs + hl-finance,
与本文档标题(团级确认态·需求已发车务回写)毫无关系。
正确的 #7862 merge commit 是 dcbdacd894b7d134105e2dad4dec6003fe4d3ddb
(wx,09-17 11:13,module 清单 = hl-common + hl-fleet-service + hl-order-service-v3,
新增文件含 GroupDispatchConfirmReqVO / GroupBatchResourceController,与本文档接口详情逐字对应),
恰是 a37bd669f 之后紧邻的单亲 squash 提交。

判据用的是 module 清单而不是提交信息:提交信息是作者写的(可错可抄),
文件清单是 git 算的。a37bd669f 同时满足「格式对 + 真实存在 + 在正确仓库」三条,
只有解出它改了哪些模块才看得出它是别人的。

原字面保留未删,订正以追加形式写在下方。

二、17_7442 补「部署清单」节
本单改了 hl-common-core(新增 GroupBatchVehicleRequirementDispatchedReqDTO /
RespDTO 两个全新 DTO),按 CODE_RULES §16.6 部署时 7 个部署单位须一起滚。
原文既无「同批滚」措辞也无模块清单。已补,并把算清单的命令与实测输出一并写入,
基点用 git merge-base 算而不是两点式。

三、19_7442 就绪回写那份:补「7 个部署单位」结论的取证
PR #7923 正文说「只需滚 fleet + order-v3」,本 changelog 说「7 个部署单位全滚」。
两份都是人写的,所以都不能当判据。去解那次合并的真实 diff:
module 清单含 hl-common,且新增 GroupBatchVehicleReadyReqDTO / RespDTO 两个
hl-common-core DTO ⇒ §16.6 适用 ⇒ changelog 对、PR 正文错。
本节结论本来就是对的,缺的是「命令 + 实测输出」这层取证,现已补齐。
PR #7923 正文另行订正。

四、顺手核了本家族其余 4 个 commit SHA,无第二处指错
8eb8e13cd / c6aa1224f / 6f5b1b679 / d97babc9e 逐个解出 module 清单与文档声称比对,
全部一致。其中 d97babc9e 是天然对照组——它是唯一 module 清单里不含 hl-common 的,
在同一判据下给出相反结果,证明该判据不是「逢 SHA 必判一致」的空转。

两份文件的 frontmatter 逐字未动(md5 校验一致),纯正文追加。

Refs #7442
2026-09-19 04:39:22 +08:00
API Changelog Bot 4c7d3f2773 docs(changelog): #7443 订正 PR-1 文档的错误码判定,并修掉两处发布门禁问题
changelog-filename-gate / validate (push) Failing after 2s
一、内容订正(本次的主体)
原文「三个端点对 kind=TRANSFER 必现 605041」只对其中两个成立。
POST /requirements/{id}/confirm 实际返 605905(REQUIREMENT_VERSION_EXPIRED)——
该端点有一道更早触发的版本预检 assertRequirementPreflightVersion
(AssignmentService.java:3567-3583),请求根本走不到会抛 605041 的那一层。
另两个端点(POST /{assignmentId}/confirm、POST /{assignmentId}/change)描述准确。
订正以追加形式写在三处(关键变化 / 边界行为 / 影响面),原字面全部保留接 grep。
订正自身也标了边界:基于源码、未经网关复测。

二、frontend_status=not_required 的字段清理(门禁 E_FRONTEND_STATE)
frontend_owner 与 verified_at 清空。not_required 条目不得保留前端负责人与验证时间,
mmg 的判定与实测时间本来就已写在 status_note 里。
正文里原有一句引用了 frontmatter 的 verified_at,一并改写成不依赖该字段的表述,
避免留下指向空字段的悬挂引用。

三、五处悬挂文件名引用
订正文字里五处指向「18_7443_TRANSFER派车行确认改派基线复核修复-…」,
而那份 changelog 实际以 19_ 前缀成稿,且日前缀还会随实际推送日再变
(validate-changelog-filenames.mjs 用的是 new Date(),比的是校验运行当天、不是提交当天)。
统一改成「同目录《标题》(日前缀以实际推送日为准)」这种抗改名的写法。

门禁:validate-changelog-filenames.mjs 对本次变更 PASS(修改路径不进文件名门禁视野,
只校验新增路径);validate-changelog-frontmatter.mjs 本文件零 error。

Refs #7443
2026-09-19 03:34:37 +08:00
API Changelog Bot和Claude Opus 5 1c0439c44a docs(changelog): #7442 PR-C2 受控重开窗口 + 三份补部署清单与 dispatch-baseline 条目
changelog-filename-gate / validate (push) Failing after 2s
新增 PR-C2 那份(受控重开窗口 + 计划刷新状态收口),并给三份都补了此前缺的
「部署清单」一节 —— AC-19 ③ 逐字要求部署约束写进 PR 正文与 changelog,
实测 PR 正文有、三份 changelog 全文零命中。

滚动顺序逐 PR 分别分析,没有照抄同一份危险描述:
- PR-C2:🔴 逆序会静默退化 —— order-v3 先滚,旧 fleet 收到 dispatchable=true
  直接放行重配,而它不读 reconfigureWindow、不校验令牌与范围,两端日志都正常、
  没有任何报错。所以 fleet 必须先于 order-v3。
- PR-A / PR-C1:两个方向都不静默出错(fleet 先滚会整体报 602009,是明确错误码
  不是静默放行),如实写清与 PR-C2 的区别。

同时补记 GET /v3/internal/group-batch/{id}/dispatch-baseline —— 对 origin/dev-v3
查证,该端点响应体被 #7442 改过两次(8eb8e13cd 加四字段、c6aa1224f 加
reconfigureWindow),三份 changelog 此前都漏记。

三份都带上了「别按直接 pom 依赖查消费方」的警告:grep -rl 'hl-common-core' */pom.xml
只命中 gateway 与 hl-finance,其余六个服务经 hl-common-web / hl-starter-* 传递引入,
照那份清单部署漏掉的恰恰是本单真正改了的 order-v3 与 fleet。

Refs #7442

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-19 02:42:19 +08:00
API Changelog Bot和Claude Opus 5 00a6f15b91 docs(changelog): #7442 补登 reconfigure 写口与就绪回写两级判定(PR-A / PR-C1)
changelog-filename-gate / validate (push) Failing after 2s
这两个 PR 合入时都没写交接件,是排查 #7442 AC-22(要求交接件含全部端点契约)
时发现的既有缺口:
- PR-A #7844 的 `POST /admin/fleet/group-dispatch/batches/{id}/reconfigure`
  是本单最核心的写口,此前无任何 changelog 记录
- PR-C1 #7923 的就绪回写带身份两级判定同样缺

两份都按实际合入的代码写,不照工单原文(该单正文被订正过多次)。
准入按角色门禁写:`X-Admin-Role ∈ {VEHICLE_MANAGER, SUPER_ADMIN}`
(`FleetAdminRoleGuardInterceptor`)——工单里写的权限点 `fleet:group-dispatch:write`
全仓零命中,只存在于一行 javadoc 注释里,不是落地的权限模型。

backend_status=deployed:两个提交均为 4cbccc26b 祖先,测试服七服务已回读确认。
gateway_status=verified:两份清单里的端点均已在测试服取得实测请求/响应。

Refs #7442

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-19 02:17:06 +08:00
lc和Claude Opus 5 554c11bef7 docs(changelog): #7947 餐食删除编码、关联餐厅(含全部)、增加桌/人(修改接口·管理后台)
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-19 00:08:27 +08:00
lc 81934d4957 docs(changelog): #7741 订单用餐信息与用餐模版接口(新增 7 个接口·管理后台)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-18 20:20:59 +08:00
jw d7c4a5d4bf docs(changelog): #7949 定制师可读名下团期详情与子订单名单(修改接口·管理后台)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-18 18:16:37 +08:00
jw和Claude Opus 5 8a5c34f09f docs(changelog): #7932 团期核团 7 个新增接口与验团前置核团行为变更
Refs wx/HL#7932

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 18:12:53 +08:00
Mimingguang 090ad8936f docs(changelog): #7946 前端交付回写 verified(canTransferOrder 收紧仅 RECRUITING)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-18 17:22:48 +08:00
jw和Claude Opus 5 547035c39e docs(changelog): #7946 团期转订单收紧为只允许招募中团期之间转(修改接口)
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 17:11:44 +08:00
Mimingguang d7fbbdeb1d chore(changelog): #7933 餐食单价说明回写 verified(复核发现 placeholder 旧口径已修)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-18 16:13:51 +08:00
Mimingguang 27ee86ea5f chore(changelog): 团期看板 3 条交付回写 verified(#7939 统计条提示+月份分组正序+batchNo 移除)
changelog-filename-gate / validate (push) Failing after 2s
- #7939 → 8360287a(总览条 scopeFilterHint 两口径文案,scope 已摘除只提示不切)
- 月份分组缺陷 → c19923be(默认月组倒序改升序,显式排序仍跟随行序)
- batchNo 缺陷 → c6174f2c(仅删显示,keyword 搜索数据链不动)
各自定向 spec 6/6、21/21、9/9 + scoped checkpoint 全绿,hl-admin v2.1 已推。
2026-09-18 16:10:53 +08:00
lc和Claude Opus 5 6fbcb70331 docs(changelog): #7933 餐食单价说明改为「单价(元)」,不限定每人(修改接口,前端无需改代码)
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 16:05:44 +08:00