比较提交

...
作者 SHA1 备注 提交日期
API Changelog Bot和Claude Haiku 4.5 c141592078 docs: #8006 改 base=main(hl-api-changelog 仓无 dev-v3 分支)
changelog-filename-gate / validate (push) Failing after 1s
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-21 23:22:32 +08:00
API Changelog Bot和Claude Haiku 4.5 fa06824c83 docs: #8006 补充网关实测证据,改 gateway_status=verified,删除未验证的零写入说法
- 网关实测(2026-09-21):带 scopeRoles 触发 582115、去掉后返回 200,证实透传无拦截
- 修改 gateway_status: not_required → verified
- 删除正文中「零写入」「不产生副作用」的未验证说法
- 改为「失败时前端建议重新拉取当前配置」

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-21 23:22:32 +08:00
API Changelog Bot d835d912e8 fix(#8064): status_note 删除旧的 frontend_status 取值说明,保留判据,连到 mmg 的实证
旧话「frontend_status 取 pending 而非 not_required……再由前端侧改为 not_required」已被 mmg 的实证动作推翻(frontend_status 实际为 not_required)。保留两点判据(缓存 activeShareGroupId、假设关系只能人工解除),按 mmg 的实际自查结果更新说法:这两点已由前端侧自查确认。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 23:22:32 +08:00
Mimingguang 77c5137d6e docs(changelog): #8068 前端实证 not_required(无 opType 白名单);#7988 AC-6 前端已交付 verified(hl-admin v2.1 3df2c6f8 复用)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-21 23:10:20 +08:00
API Changelog Bot和Claude Opus 5 8fa0204a43 docs: 团期 staff 保存接口新增 scopeRoles 入参与范围覆盖能力(#8006)
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 23:09:29 +08:00
API Changelog Bot 89811fdadc fix(#8064): 订正 frontmatter status_note 与正文同步——存量收敛已完成,10 行摘除+4 条释放+2 条保持 ACTIVE
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 23:08:41 +08:00
API Changelog Bot和Claude Opus 5 00ae9ffbca fix(gate): #8064 not_required 条目清空 verified_at——该字段仅在前端动作时使用
changelog-filename-gate / validate (push) Failing after 1s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 23:04:51 +08:00
API Changelog Bot和Claude Opus 5 25ee4c716f docs: 纠正 #7988 FAILED 态测试环境无法构造的成因——异步消费窗口过短,非灰度开关
原文错误引用了灰度开关,实际原因是 PENDING 在途窗口小于 2.6 秒、异步消费方
(GroupDispatchPlanRefreshOutboxListener,@Async + AFTER_COMMIT)在窗口内即完成,
导致测试环境构造不出停滞态;但生产环境可达。前端必须实现该分支。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 23:04:15 +08:00
API Changelog Bot d86979fbac fix(#8064): 订正存量收敛已完成——从 7 条孤儿关系收敛到 10 行摘除+4 条释放+2 条保持 ACTIVE
AC-8 验收项:摘除成员 10 行(AUTO_OCCUPANCY_RELEASE),释放关系 4 条(AUTO_SINGLE_MEMBER),保持 ACTIVE 2 条(设计如此,各剩 2 个成员),收敛时刻 2026-09-21 22:27:47 UTC。本轮点名执行,名单外同类数据可能仍存在,前端展示逻辑需自行兜底。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 23:03:36 +08:00
API Changelog Bot和Claude Opus 5 77e32d1654 docs: hand off API contract (团期配车需求详情响应新增观测字段 #7988 AC-6)
changelog-filename-gate / validate (push) Failing after 2s
团期配车需求详情查询接口新增七个只读观测字段,描述配车刷新状态与停滞告警。
- planRefreshState / planRefreshReplayCount / blockedStage 为库直读
- planRefreshStalled / planRefreshStalledReason / planRefreshTimeoutAt / planRefreshReplayExhausted 为动态投影

关键约束:判告警只看 planRefreshStalled 布尔值,不看 planRefreshState;FAILED 态生产可达、前端必须实现分支。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 23:00:58 +08:00
lc和Claude Opus 5 15f51502d6 docs(order-v3): #8125 用餐第几天按订单出发日算,套用模版改为在现有行后面追加
changelog-filename-gate / validate (push) Failing after 1s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 22:08:18 +08:00
API Changelog Bot和Claude Opus 5 df60de5ffd docs(changelog): #8068 车务手动软清派车行留痕 soft_cleared 交接件(1 端点)
changelog-filename-gate / validate (push) Failing after 1s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 19:29:44 +08:00
Mimingguang ac12dabe20 docs(changelog): #7443 C 车务侧+13_7439/18_7443/20_7990 前端已交付 verified(hl-admin v2.1 662310ea/6c091ef24)
changelog-filename-gate / validate (push) Failing after 2s
18_7443 挂起期回头补落地(派车弹窗 kind 切换+batch/pickup-dropoff-config 显式 kind);
20_7990 requirementIdentities 已消费;13_7439 硬契约点 A+B 已补(809008/显式 kind/reject 走 query);
20_7443 AC-24 维持 not_required 仅补 C 段实证
2026-09-21 17:52:22 +08:00
API Changelog Bot和Claude Opus 5 0ef80d0d16 docs(changelog): #7444 团期配车就绪门禁与车辆共用关系交接件(10 端点)
changelog-filename-gate / validate (push) Failing after 1s
backend_status=deployed:fleet/order-v3 于 2026-09-21 17:14:32 / 17:16:07 部署,
服务端 git sync HEAD=bb4091074,四个实例滚动重启健康 UP,两次任务 exit_code=0。

gateway_status=verified:网关面上的 8 个 /admin/fleet/** 端点逐个经
api.test.1814.love:9443 取响应信封的 code 核对;另 2 个 internal 端点按
hl-gateway JwtAuthFilter 的设计就不在网关面上(实测 403 接口不可访问),
由服务间 Feign 触发、前端不可调,故不计入该字段分母。

本轮对 19be7f21c..bb4091074 逐提交读码,补写 7 处原稿未覆盖的契约面变更
(#8004 的 cityJunctionShareCandidate 同义化与 excludeAssignmentId、
#8061 的处置范围只到本关系成员、#8051 的不跨服务日不跨团期、
#8064 的 AUTO_SINGLE_MEMBER 补 LEGACY 挂点、#8003 的跨维度改绑回读范围、
#8013 的 COST_BEARER_CHANGED 转活、接口 5 的 602013 覆盖边界)。

Refs #7444

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 17:50:54 +08:00
Mimingguang 830b8109e0 docs(changelog): #7443 A+B 订单侧已交付 verified(hl-admin v2.1 6c091ef24)
changelog-filename-gate / validate (push) Failing after 2s
调整弹窗双槽+显式 kind 写口+结算 step3 requirementKind 归属;C 车务侧属 18_7443 另起交付
2026-09-21 17:23:09 +08:00
lc和Claude Opus 5 1653a52e59 docs(order-v3): #8093 Changelog 补齐五、数据库行为与 4.2/4.4 缺失小节
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 16:52:25 +08:00
lc和Claude Opus 5 2c45b0aff7 docs(order-v3): #8093 套用用餐模版改只读返回组合结果,模版加桌数人数与创建人、模糊搜索与删除
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 16:51:54 +08:00
Mimingguang 1621336087 docs(changelog): #7105 前端已交付 verified(hl-admin v2.1 f3a22be3)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-21 16:31:15 +08:00
API Changelog Bot和Claude Opus 5 78ca3f1ee3 feat(guard): E_WAIT_LANGUAGE 补第四类——把「什么时候上线」写成派给前端的动作项
changelog-filename-gate / validate (push) Failing after 1s
今天上午装这条守卫时只想到「等/待/另发」这一种形态,当天下午就被另一种形态绕过去了:
20_7443 正文写着「上生产前请与后端确认这个开关的状态」与「生产环境未开」,
mmg 据此来问上线时间、并要求「后端把生产开关打开」——而守卫全绿,因为这两句
一个词表词都没用上。它们把不确定性包装成了「请你去确认」,语法换了,作用一样:
读者只能停在那里等一个他查不到的状态。

判据仍是那一句:这条影响他「怎么写代码」,还是只影响他「什么时候开始写」。
上线时点属后者。前端需不需要同步上线,由 frontend_action_required 与模板里
「前端是否必须同步上线」那个结构化字段承载,正文自由文本里不该再出现。

词表先对全仓 1068 份 changelog 实跑,只留零命中且零正当用法的 12 个词。剔除两个:
  「何时开」  —— 误伤「保护何时开始生效」「窗口何时开过」
  「生产上线」—— 误伤 07_5640「生产上线需配 annual-direct-plan-id」,那是真契约边界

部署时间戳没做成规则:该形态全仓 0 命中,分辨力无从验证,而必须放行的
「带时刻实测取证句」有 690 处——判据的误伤面远大于收益时,门禁只会教人绕开它。
这一类只能靠 §2.1 的条文和复盘接住,机器接不住,如实记在注释里。

测试:新增 2 条阳性 + 1 条阴性对照,阴性那条与阳性只差一个「上生产前」,
用来钉住分界线(「收到 809009 找后端确认该环境的开关」是运维处置,必须放行)。
npm test 59 项 58 绿;唯一的红是存量的 E_ALIAS_STATE(11_7510,与本次无关)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 16:23:33 +08:00
API Changelog Bot和Claude Opus 5 4fbf5ec2c0 docs(changelog): 20_7443 删掉把前端推向「问上线时间」的两处措辞
changelog-filename-gate / validate (push) Failing after 1s
「生产环境未开」暗示生产上存在这个开关、只是关着——实际 order-v3 根本没上生产
(2026-09-21 探生产网关,/v3/** 与 /admin/fleet/** 全 404,一期 /admin/order/page
与 /admin/product/page 同时 200 做阳性对照)。前端据此来问「请后端把生产开关打开」,
是照本文档做的。

「上生产前请与后端确认这个开关的状态」是一条派给前端、他查不了、且只影响
「什么时候开始写」而非「怎么写代码」的动作项,整句删除。

一并去掉两处部署时间戳(2026-09-19 15:33)——交接件不写上线/部署时间。
改后只留环境无关的契约事实:默认 false、关闭时返 809009、测试服已开。

⚠️ E_WAIT_LANGUAGE 没能拦住这两句:它按词表匹配「等/待/另发」,而这两句一个都没用上,
靠的是把不确定性包装成「请你去确认」。词表拦不住换了语法的同一件事。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 16:16:08 +08:00
jw和Claude Opus 5 59938ccf63 docs(changelog): 更正 #7105「出具门恒失败」说明——门已由 #7248 打通
changelog-filename-gate / validate (push) Failing after 2s
2026-09-07 那条 #7105 的首段写着:酒店 ready 线上无写入方(#4132),
故 issuable 恒 false、手动开/作废重开恒返 589548、团期合同保险不会自动出具。
两个前提现已都不成立:

- #7248 / PR #7249(9f47f620f)把出具门从「判团期状态」改成
  「资源准备中 + 四项 ready 全 true 即放行」,解开与 #7023 的死锁
- hotel_ready 已有三处写入方(GroupBatchRoomDayConfirmManager:457/:767、
  HouseGroupBatchAssignmentService:201)

2026-09-21 TEST 经真实网关实测:RESOURCE_PREPARING 团期 issuable=true;
issue 端点返 200 逐户结果而非整单 589548;四项配齐团期下 40 户已确认行程的
子订单合同全 SIGNED、保险全 INSURED。

接口契约零变更,前端需调整两处:按 issuable 置灰、失败改读逐户 outcome/message。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 16:00:42 +08:00
Mimingguang 83652bb0a2 docs(changelog): #7211 前端已交付 verified(hl-admin v2.1 4d092b09)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-21 15:47:38 +08:00
API Changelog Bot和Claude Opus 5 a45a079e9f docs(changelog): 20_7443 同步车务链路改写为实测肯定式结论 + 新增 21_7211 团期联系入口交接件
changelog-filename-gate / validate (push) Failing after 2s
20_7443(#7443 接送机用车双槽提交):
- 删掉「该缺陷已在修…修好后另发交接件」「只验到提交为止」等让前端停工的措辞——
  这正是 2026-09-21 wx 第二次点名的问题(mmg 因此整段时间没动工),新增的
  E_WAIT_LANGUAGE 门禁对旧版报 7 处、对本版 0 处。
- 换成带读数的肯定式结论:hl-fleet-service 已部署 dev-v3 @ c238f38c3
  (含 #7990 修复提交 53c2ff2d1 / bf4fba5a2,merge-base --is-ancestor 均 true),
  order_fleet_command_outbox 两行 RECONCILE(TRAVEL 2101937490971742210 /
  TRANSFER 2101937491068211201)均 SUCCEEDED、last_error_message 为 NULL,605905 未再出现。
- 保留契约自带的限定:单槽写口 kind 默认 TRAVEL、hasPickupTime=false 时 809002、
  生产开关 transfer-kind-submit-enabled 需独立运维动作、#8056 仍 open。
- verified_at 2026-09-20 → 2026-09-21。

21_7211(团期子订单联系入口改为联系团期管理员,前端缺陷,后端零改动):
- 判据字段 ItineraryVO.groupBatchId(非 OrderMainVO.groupBatchId),
  入口 POST /admin/message/chat/open-group 请求体只收 orderId。
- 补本轮测试服实测:团期单 2101935981273976833 → code=200/isNew=true;
  非团期单 9199000000000000002 → code=281015(反例,证明端点按团期与否分流)。

两份均通过 validate-changelog-frontmatter.mjs(含 E_WAIT_LANGUAGE)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 15:41:59 +08:00
API Changelog Bot和Claude Opus 5 455d9da1af fix(gate): E_WAIT_LANGUAGE 撤掉「暂不可用」族——实测几乎全是错误码表文案
changelog-filename-gate / validate (push) Failing after 2s
对全仓 1968 份 changelog 跑新规则做存量抽样,命中里「暂时不可用 / 暂不可用」这一族
几乎全部落在错误码表与响应示例的**文案**上,例如:

  | `584105` | 结算字典暂时不可用,请稍后重试 | 字典服务失败、空响应或无启用项 |
  | `584100` | 车辆费用暂时不可用 | 车辆费用来源调用失败…… |

这正是本规则必须放行的契约内容——它影响前端「怎么写代码」(要认这个错误码),
不影响他「什么时候开始写」。判据没有分辨力时,门禁只会教人绕开它,或者逼作者
为了过门禁把该写的错误码说明一起删掉。已在代码里写明不要加回来及其依据。

撤掉后存量命中从 54 份(2.7%)降到 29 份(1.5%),剩下的按措辞分布:
未部署 20、等待…后端 7、待部署 5、另行通知 3、后续订正 3、等待…上线 2、
后端部署后 1、等待…部署 1、以后续 1、暂不要对接 1 —— 都是真的在让前端等。
存量不回填(门禁只跑 push diff),谁编辑旧文件谁负责当场改掉。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 15:29:27 +08:00
API Changelog Bot和Claude Opus 5 047a4be4fd feat(gate): 新增 E_WAIT_LANGUAGE——交接件正文禁「让前端等我们」的措辞
changelog-filename-gate / validate (push) Failing after 2s
2026-09-21 wx 第二次点名:「不要在changelog里写让前端等待部署 这不是你第一回犯错了
工作流是你部署完测试环境推送changelog」。

§2.1 的 backend_status 门禁挡得住预告式推送,挡不住这一类:20_7443 的 frontmatter
已经是 deployed、CI 全绿,但正文 status_note 结尾写着「该缺陷已在修……修好后另发
交接件」。mmg 因此一直没动工,隔天才来问「这个是有啥问题吗 还是没做到呢」——门禁
只看 frontmatter,看不见自由文本里的这句话,所以「deployed + 校验绿」并不代表这份
交接件可执行。消费方也没有能力消解这种不确定性:他查不了我们的部署状态、看不到
dev-v3、不知道「另发」是哪天,读到「等」就只能等,而且是静默地等。

- scripts/validate-changelog-frontmatter.mjs:新增 validateNoWaitLanguage,对所有
  v2 文档逐行扫描(与 change_type 无关,前端条目同样适用)。三类措辞:部署状态对冲、
  未来交付承诺、直接叫停对接;「等待」做共现判定而非裸词匹配,避免把「前端需轮询
  等待支付回调」这类业务语义一起拦掉。前向引用(「以后续订正为准」「见后续订正」)
  一并封住——它和「修好后另发」是同一件事换个说法,实测被绕过一次。
- tests:4 个用例,含 1 个阴性对照(灰度开关状态、已知缺口工单号、业务流程里的等待
  必须放行),防止作者为了过门禁把该写的契约边界一起删掉。
- BACKEND_CHANGELOG_DELIVERY_GUIDE.md §2.1:写明规则、背景与那条分界线——这条影响
  他「怎么写代码」,还是只影响他「什么时候开始写」?后者一律删。

阳性对照:对已推送的 HEAD 版 20_7443 跑新规则,命中 2 处(第 308、451 行「修好后另发」),
即它能抓住真实发生过的那次。既有 changelog-path-aliases 测试对 11_7510 的 2 条
E_ALIAS_STATE 红是本次改动之前就存在的,与本提交无关,pre-push 钩子也不跑该用例。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 15:27:37 +08:00
Mimingguang b4fbfe6f20 docs(changelog): #8045 前端已交付 verified(hl-admin v2.1 e680cf10)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-21 15:13:53 +08:00
jw和Claude Opus 4.8 e8d53378c7 docs(changelog): order-v3 团期详情返回整团待收 unpaidAmount(#8045)
changelog-filename-gate / validate (push) Failing after 2s
团期详情端点(A2)新增响应字段 unpaidAmount,值 = max(0, receivableAmount − receivedAmount),
恒非 null 恒非负、字符串型金额;列表页 A1 早已有同名字段,本次把详情页补齐。

给前端(mmg)的三条要点:
1. 不要再自己拿应收减已收,直接读 unpaidAmount;
2. 不要与本页子订单项的 balanceAmount 混用(那是 per-order「应收 − 已退 − 已付」,
   扣退款且取消单归 0,同名不同义);
3. 有退款的团本字段按毛已付算会偏大,权威待收是财务 tab 的 items/totals ——
   ⚠️ 注意是「逐户明细与合计」,不是财务 tab 的顶层 unpaidAmount
   (顶层与本字段同源同公式,数值一致;实测差异见正文第八节)。

既有四个金额字段(receivableAmount / receivedAmount / totalReceivable / totalReceived)
的值、名称、JSON 形态逐字未变,纯增量。

Issue: #8045   PR: #8101

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-21 14:59:57 +08:00
Mimingguang b29a9f72cb docs(changelogs-v2): #7994 前端已交付回写 verified(602013 长文案常驻展示)(mmg)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-21 11:30:56 +08:00
API Changelog Bot和Claude Opus 5 043a779820 docs(changelog): #7994 受控重开窗口内无分组历史派车行可被收编
changelog-filename-gate / validate (push) Failing after 2s
团期配车重新配车接口:分组列上线前的历史派车行,此前无论被改还是被删
都判越界(602013),叠加「物资准备期不开窗口不许配车」后形成单向死路。
改后按动作分两路——被同键收编则放行,被删除仍判越界。

请求体/响应体零变化;602013 在含无分组历史行时追加自救提示,
前端需确认该文案能完整展示不截断。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 11:20:39 +08:00
Mimingguang a972180f69 docs(changelogs-v2): #8087 补记二次修复(下拉搜索默认不进全局遮罩)(mmg)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-21 11:17:57 +08:00
Mimingguang b950ceeb95 docs(changelogs-v2): #8087 补记交付后修复(餐厅变更清餐食+加载圈限定当前行)(mmg)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-21 11:10:18 +08:00
Mimingguang 57d50004af docs(changelogs-v2): #7973 前端实证 not_required(share-groups 无调用方;清空后端预填的 owner/verified_at)(mmg)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-21 10:49:46 +08:00
Mimingguang 054bde14ce docs(changelogs-v2): #8086 餐食 restaurantName null 口径前端已交付回写 verified(mmg)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-21 10:47:14 +08:00
Mimingguang 4e66eb234d docs(changelogs-v2): #8087 餐食下拉餐厅联动前端已交付回写 verified(mmg)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-21 10:41:51 +08:00
lc a968875f7f Merge branch 'main' of https://git.1814.love:8443/wx/hl-api-changelog
changelog-filename-gate / validate (push) Failing after 2s
2026-09-21 10:37:02 +08:00
lc和Claude Opus 5 d1f183115e docs(changelog): #8086 餐食不关联餐厅时餐厅名返回 null,分页按餐厅建档先后排序(修改接口·管理后台)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 10:36:19 +08:00
Mimingguang aa310a1d61 docs(changelogs-v2): #7442 PR-A reconfigure 前端增量2已交付回写 verified(mmg)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-21 10:34:40 +08:00
lc和Claude Opus 5 8e1e77e6ca docs(changelog): #8087 餐食下拉按餐厅联动,未选餐厅只给「全部」餐食(修改接口·管理后台)
changelog-filename-gate / validate (push) Failing after 1s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 10:26:27 +08:00
API Changelog Bot和Claude Opus 5 459715bae9 docs(changelogs-v2): #7973 共用关系确认 confirmCrossResident 入参补记 + 网关取证转 verified
changelog-filename-gate / validate (push) Failing after 1s
2026-09-21 10:09:15 / 10:09:17 经网关取证:两次请求体逐字相同、唯一差异是
confirmCrossResident——不传得 605036,传 true 得 200 并建出 ACTIVE 共用关系,
取证完毕按 survivorPolicy=RELEASE 清场。据此 gateway_status 由 pending 转 verified。
状态位是取证换来的,不是为过门禁改的。

同批修正正文 7 处:
- 4 处源码行号漂移(AssignmentService / AssignmentErrorCode)
- 605036 示例改用网关原文,替换此前取自单测字面量的构造示例
- 补全 messageOf 的第 3 个分支:此前只记了 2 个,且两个都漏掉后缀
  「,继续操作将形成跨常驻车派单」
- 修正张冠李戴:driverBoundToAnotherVehicle 用例被配上了车辆侧文案
- 溯源订正为 #4936 引入、#5160 扩展(git log --follow 核实)
- 关联文档路径 19_7444 更正为 21_7444
- 第七节补明 GroupDispatchShareController 的 14 行改动全在 confirm 端点的
  接口文档注释里,GET/DELETE 契约逐字未动

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 10:25:34 +08:00
Mimingguang 7c6b6d769c docs(changelogs-v2): #8002/#8064 前端实证 not_required 回写(mmg)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-21 10:12:57 +08:00
Mimingguang 2d8b287ca6 docs(changelogs-v2): #7988 与 #7442 PR-C2 前端增量1已交付回写 verified;PR-A reconfigure 注增量2待建(mmg)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-21 10:10:43 +08:00
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
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
Mimingguang 87ed9d0a3f chore(changelog): 全量清理 implemented 存量——81 条复核翻 verified + 1 条改判 not_required + #5827 补登 frontend_ref
changelog-filename-gate / validate (push) Failing after 2s
处置明细(mmg 2026-09-18):
- 68 条机械核验通过批量翻 verified:frontend_ref 均可达且为 v2.1 祖先、
  交付文件 HEAD 均在、关联 spec 批量 58 文件 891 例全绿。
- 11 条带演进史的例外逐条核后翻 verified:3 条交付自删文件(06_5610/
  07_5655/11_5810,删除即交付内容且终态保持);8 条被后续 changelog 预期
  演进(10_5784→#5810、07_5664/08_5592→#5827、07_5665→去槽位化 U1、
  01_5380/05_5356/06_5567/06_5581→settlement 族A扁平化与 mock 清理),
  status_note 均如实记录演进链。
- 05_5552 改判 not_required:frontend_ref 自述前端无需改动,grep 实证
  vehicleFeeAmount.js 直接读后端 calendarPrice/calendarPriceMissing。
- 11_5827 frontend_ref 原空,经核交付即 753503c8(向导 4 步改 3 步提交
  即派定),补登全哈希 753503c87cc635e5646b4368a8ed506746c79cf1。
另:保险域 2 条相邻条目(05_5530/06_5593)同标准复核翻 verified。
2026-07 历史月 45 条按规则不回扫,保持原状。
2026-09-18 15:56:52 +08:00
API Changelog Bot和Claude Opus 5 72e05778e2 docs(changelog): 团期看板不要显示 28 位班期编号 batchNo(前端缺陷,交接 mmg)
changelog-filename-gate / validate (push) Failing after 1s
batchNo 实际值为 Q + yyyyMMdd + 19 位雪花(28 位),窄列折行截断成
「Q20 / 26…999490」,对用户无可读意义;同行已有 batchLabel(第N期)与
batchName 足以识别,请前端移除其显示(仍保留为 keyword 匹配字段)。

连带记录:搜索框标注「期号 / 名称」,但 keyword 只匹配 batchNo/batchName
不含 batchLabel,实测「第3期」零命中、「3」因雪花数字全量返回。
后端侧已立单 #7942。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mg1eNKoacprUHNvuEKxjqq
2026-09-18 15:47:40 +08:00
jw和Claude Opus 5 f9c6ce3dd1 docs(changelog): #7939 团期看板统计条回带 effectiveScope 与 filteredOutCount(修改接口)
changelog-filename-gate / validate (push) Failing after 1s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 15:43:39 +08:00
API Changelog Bot和Claude Opus 5 cffa47bc46 docs(changelog): 团期看板月份分组倒序应按出发日正序(前端缺陷,交接 mmg)
changelog-filename-gate / validate (push) Failing after 2s
现象:班期列表按月份分组时 11 月排在 10 月之前,与原型「6 月 → 7 月」正序相反。

定位:GET /v3/admin/order/group-batch/board 测试环境实测返回 10 行,
原始次序 2026-08-20 → 2026-11-26 严格递增,与 GroupBatchQueryController:79
javadoc 承诺的「按出发日期升序」一致;该接口入参只有 productId 与 scope,
无任何排序开关。故倒序由前端分组渲染引入,后端零改动。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mg1eNKoacprUHNvuEKxjqq
2026-09-18 15:38:32 +08:00
Mimingguang 5e3affae41 chore(changelog): 保险域 6 条 implemented 复核翻 verified
changelog-filename-gate / validate (push) Failing after 2s
复核证据:mmg 2026-09-18 逐条核验——6 个 frontend_ref 提交均可达且为
v2.1 祖先;HEAD 上各项前端实现标记仍在(totalPremium 读取/source 筛选
链/plan-options 消费/policyPdfUrl 在线预览/保单 Tab+司机名筛选/insure
直投端点);5 个相关 spec 文件 36 例全绿。frontend_status 翻 verified、
verified_at 补 2026-09-18、status_note 追加复核记录;07_5640 的短哈希
ref 顺带补全为全哈希。
2026-09-18 15:26:28 +08:00
Mimingguang aea21e188c docs(changelog): #7928/#7930 前端回写 verified(mmg)
changelog-filename-gate / validate (push) Failing after 1s
#7928 资金流水 bizTypeName:ref 9917447b88cf3dfbc163e3a313f1ad30710881d7。
#7930 司导预支队列 remark 用途:ref aecb98724e7cf8f26f7cfb7dd041c8171e290086。
前端 hl-admin 按两条完成并验证,回写 frontend_status=verified + owner mmg + ref + status_note。
2026-09-18 14:57:27 +08:00
Mimingguang 59e978552a docs(changelog): #7901 司导预支支付链接通前端回写 verified(mmg)
changelog-filename-gate / validate (push) Failing after 1s
前端 hl-admin 按本条完成出纳 ADVANCE 页签接线并验证,回写 frontmatter:
frontend_status=verified + owner mmg + ref 9e65d25bf551315cc6dea35475ef9803afadc04b
+ status_note 追加实现与验证说明(verified_at 沿用 2026-09-18)。
2026-09-18 14:35:27 +08:00
yaosutu 334d84e3ff docs(changelog): #7928 资金流水分页/详情出参补 bizTypeName 中文名-管理后台
changelog-filename-gate / validate (push) Failing after 2s
ORDER_REFUND 此前因前端硬编码 map 漏配回显英文枚举码。后端两个只读接口
/admin/finance/fund-flows/page 与 /{id} 出参各新增 bizTypeName(枚举 label,
14 业务类型全覆盖),bizType 英文码不变,零入参/零DDL。已部署测试服网关实调
8 项断言全 PASS。
2026-09-18 14:06:51 +08:00
yaosutu 755c690e24 docs(changelog): #7930 司导预支出纳队列行 remark 补预支用途快照(修改接口-管理后台)
changelog-filename-gate / validate (push) Failing after 2s
ADVANCE 待支付队列 GET /admin/finance/cashier/advance/queue 出参 remark
由恒 null 改为 fin_advance.purpose(申请用途快照);纯出参补值向后兼容,
入参/路径/其余字段/错误码/付款接口均不变;历史单与未填用途单仍为 null。
PR #7931 已合并 dev-v3 尚未部署。
2026-09-18 12:44:32 +08:00
Mimingguang 514ab2cf1f docs(changelog): #7919 供应商合同主/补充合同前端回写 verified(mmg)
changelog-filename-gate / validate (push) Failing after 1s
前端 hl-admin 按本条完成破坏性表单重构并验证,回写 frontmatter:
frontend_status=verified + owner mmg + ref dde41d86ffa2a6bd2cd0ae10b96e0ab1d78821fa
+ verified_at 2026-09-18 + status_note 追加实现与验证说明。
2026-09-18 12:23:13 +08:00
Mimingguang e6be4be31d docs(changelog): #7916 团期物资 categoryName 前端已实现并验证(hl-admin 08d13de3)
changelog-filename-gate / validate (push) Failing after 1s
frontend_status pending→verified,frontend_ref=08d13de33b27948c31cb1e511ad59f342420e88c,
verified_at=2026-09-18,status_note 追加实现摘要。
2026-09-18 11:50:41 +08:00
Mimingguang 265dcd0408 docs(changelog): #7737 餐食管理前端已实现并验证(hl-admin 7d18b442)
changelog-filename-gate / validate (push) Failing after 1s
frontend_status pending→verified,frontend_owner=mmg,
frontend_ref=7d18b442071bb50db9d260cb80224f9e413f3058,status_note 追加实现摘要。
2026-09-18 11:37:47 +08:00
yaosutu 26e995a97e feat(changelog): 司导预支(司导借款)支付链接通——出纳 ADVANCE 页签 queue/pay 真实接通(Epic #7901,PR #7902/#7906/#7910 已合并 dev-v3 部署测试服 E2E 通过;原 598607 空壳下线,金额锁死 598610,新增错误码 599500-599505)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-18 11:28:02 +08:00
lc和Claude Opus 5 0119ffca67 docs(changelog): #7919 供应商合同改为主合同/补充合同,业务线改为资源并按资源选择主合同(修改接口)
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 11:14:48 +08:00
jw 4c8f93f978 docs(changelog): #7916 团期物资列表与候选补分类中文名 categoryName(修改接口)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-18 11:02:39 +08:00
lc和Claude Opus 5 4cdf3606e9 docs(changelog): #7737 餐食管理接口 1.1–1.7 与菜单(新增接口)
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 10:16:23 +08:00
Mimingguang 553aa99dd7 docs(changelog): #7443 接送机用车需求分叉 PR-1 前端判 not_required 回写 frontmatter
changelog-filename-gate / validate (push) Failing after 2s
2026-09-18 08:13:01 +08:00
API Changelog Bot和Claude Opus 5 e4fc9d1a90 docs(changelog): 补 09-17 两份的 target_release,解开 pre-push 门禁
changelog-filename-gate / validate (push) Failing after 2s
推送被拦:E_FRONTEND_STATE「verified 必须填写 target_release」
(scripts/validate-changelog-frontmatter.mjs:325-327)。

这两处不是本次改出来的,昨天就空着。门禁只看本次推送的变更集,
所以碰到哪个文件哪个文件才暴露 —— 实测全仓 frontend_status=verified 的
182 个文件 target_release 全是空的,属潜伏的不一致,不是这两份特有。
本次只修我动过的这两个,没有顺手去改另外 180 个。

取值不猜:当前惯例是 target_release = "hl-ui@" + frontend_ref 前 8 位
(2026-08-23 ~ 2026-09-13 连续 6 例;旧惯例 v2.1 在 9 月只剩 2 例),
填进去的只是复述文件里已记着的那个前端提交,不是对发布号的新声明。

⚠️ 记一句给后来人:validate-changelog-frontmatter.mjs --files <单个文件> 过了
不等于能推 —— 它只校验你点名的那些,而门禁校验的是本次推送的全部变更文件。
贴校验结果时要连「校验了几个对象」一起贴。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 08:06:47 +08:00
API Changelog Bot和Claude Opus 5 c7ce1009d6 docs(changelog): #7443 接送机用车需求分叉 PR-1;并订正 09-17 两份的错误响应信封
新增 18_7443:派车批量创建与接送机配置两个端点新增可选入参 kind(TRAVEL|TRANSFER,
不传=TRAVEL,存量请求形状不变),新增错误码 602200/602201/602202/602205。
字段表逐条对源码反向 grep,53/53 全命中。

文档里写明了两条前端必须知道的限制:
1. 上游写口还关着——PUT /v3/admin/order/{id}/vehicle-requirement 传 kind=TRANSFER
   恒返 809009(transfer-kind-submit-enabled 默认 false,无 @RefreshScope 要重启),
   即产品上目前产不出 TRANSFER 需求,前端可按契约对接但别排进本期可演示范围。
2. 已建出的 TRANSFER 派车行,确认与改派仍会 605041(三个内部命令对象不携带 kind,
   属跨服务契约缺口,已登记 #7443 AC-24)。

八、测试环境已验证写的是实测:单元层 fleet 全量 4220/0/0/4、完整性 322/322;
网关端到端 AC-6/AC-7 均通过(batch 带 kind=TRANSFER 返回 200,落库两行服务日
2026-10-11 与 2026-10-17 均在行程窗外,未出现 605041/605062/605905;改接机行后
送机行逐字段未变)。同时保留限定:那条 TRANSFER 需求行是 SQL 构造的,订单侧真实
写口不在本次证据范围内——没有写成「全链路已验证」。

订正 17_7442 与 17_7443 的错误响应示例(共 3 处):原写 {"code": 200, ...,
"errorCode": <业务码>},两处都错——Result 没有 errorCode 字段,而业务失败时
GlobalExceptionHandler 走 Result.error(e.getCode(), message) 把业务码放进 code。
前端照原文按 code == 200 判成功,会把业务失败读成成功。
⚠️ success 是真实字段没有删:Result.java:43 public boolean isSuccess() 没有
@JsonIgnore(全类只有 :142 getCheckedData 被忽略),Jackson 会序列化它——
只按 private 字段清单 grep 会误判它是编的,差点据此把一个前端正在读的字段删掉。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 08:04:03 +08:00
Mimingguang 778d618ef4 chore(changelog): #7724 核单复核出参判 not_required(前端无复核调用点)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-17 23:52:43 +08:00
yaosutu 28effce68e docs(changelog): 核单复核出参加报账字段(Issue #7724 / PR #7725)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-17 23:40:33 +08:00
Mimingguang 20f348694a chore(changelog): #7897 发票列表订单侧字段前端已接入(verified@de19fb77)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-17 22:04:10 +08:00
yaosutu a080db4c72 docs(changelog): 发票管理列表行补订单侧字段(Issue #7897 / PR #7899)
changelog-filename-gate / validate (push) Failing after 2s
GET /v3/admin/order/invoice/page 行级 records[] 纯新增 10 个订单侧字段:
teamNo/createTime/orderStatus(含文案)/flowStatus(含文案)/orderAmount/paidAmount/refundedAmount/settlementAmount。
入参/既有出参/错误码零变化,NONE tab 同样回填,前端无需同步上线。
2026-09-17 21:55:24 +08:00
Mimingguang 2f7858e815 chore(changelog): #7857 收票进项发票域前端已交付(verified@f5751df4)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-17 19:51:40 +08:00
Mimingguang a5346644a2 chore(changelog): #7883 供应商往来账页前端已交付(verified@a975f40b)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-17 19:20:15 +08:00
Mimingguang e211e9abc2 chore(changelog): #7398 应付款冲正前端已交付(verified@0fa6574f)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-17 18:59:49 +08:00
Mimingguang 88e07ea5c3 chore(changelog): #7396 应付款模块前端已交付(verified@9bf2fc3b)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-17 18:28:13 +08:00
Mimingguang d63f379f2f chore(changelog): 团期物资清单三能力前端已交付(verified@3684d137)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-17 17:19:11 +08:00
Mimingguang 9b16b408c7 chore(changelog): 团期详情5处原型缺口前端已交付(verified@e4da94a6)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-17 16:57:15 +08:00
yaosutu 16ed452d00 docs(changelog-v2): #7857 收票(进项发票)域上线——登记/编辑/核对/作废 + 关联勾选 + 供应商对账 8 端点
changelog-filename-gate / validate (push) Failing after 1s
- 新增 changelogs-v2/2026-09/17_7857 收票(进项发票)域上线-新增接口-管理后台.md
- 覆盖 Epic #7857(PR #7860/#7874/#7880 + 文档 #7891,已合并 dev-v3 并部署测试服验证通过)
- 8 端点:page/detail/create/update/verify/void/biz-candidates/supplier-recon
- 错误码 599400-599411 + 字典 fin_invoice_in_type + 菜单「收票管理」全内联自包含
2026-09-17 16:35:52 +08:00
yaosutu e8fdb57940 docs(changelog-v2): #7883 往来账·供应商往来最小闭环——账页分页 + 流水明细分页 2 个查询端点
changelog-filename-gate / validate (push) Failing after 1s
2026-09-17 16:17:21 +08:00
Mimingguang 5b5c2cac0a docs(changelog-v2): #7443 PR-B 前端已交付,回写 verified+ref(dd152af7)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-17 15:56:10 +08:00
Mimingguang 3f72bf305a docs(changelog-v2): #7442 前端已交付,回写 verified+ref(b84a5d6b)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-17 15:29:15 +08:00
jw和Claude Opus 5 dbadd1b685 docs(changelog-v2): #7398 应付款已付超额冲正(供应商退回)——申请 / 分次确认到账 / 撤销剩余额度 / 分页
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 15:26:05 +08:00
Mimingguang 2c1e6dec2d docs(changelog-v2): #7491/#7868 前端判 not_required 回写(拦截器透 message 兜底/纯建表无接口)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-17 15:03:13 +08:00
jw和Claude Opus 5 0c012ef072 docs(changelog-v2): #7868 团期核团地基——核团四表建表与错误码占号(无接口变更)
changelog-filename-gate / validate (push) Failing after 1s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 14:41:11 +08:00
jw和Claude Opus 5 36431070c1 docs(changelog-v2): #7396 应付款四入口接团期住宿 + 团期住宿付款身份金额对账 + 撤销批准
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 14:11:01 +08:00
API Changelog Bot 69118dd6ec docs(changelog-v2): #7491 所有 @Lock4j 抢锁失败统一返回 100503
changelog-filename-gate / validate (push) Failing after 2s
- 说明 code 由 500 改为 100503、message 改为「资源被占用,请稍后重试」
- HTTP 仍为 200;该分支不再返回 traceId;提示前端把可重试提示挂到 100503
- 附测试服网关实测与跨实例对照证据
2026-09-17 13:55:13 +08:00
API Changelog Bot和Claude Opus 5 125a22f36c docs(changelog-v2): #7442 团级确认态回写 + #7443 团期身份失败关闭与按团筛选
changelog-filename-gate / validate (push) Failing after 2s
两份前端交接件(consumer=admin,frontend_owner=mmg)。

订正三处事实错误:
- 派车两接口的字段表曾写入源码里不存在的字段(出参 assignmentId/
  createdAssignments/updatedAssignments/cancelledAssignments、入参把扁平的
  dailyPlan[] 写成 dailyPlan[].assignments[] 多一层),已按 origin/dev-v3 的
  CreateAssignmentReqVO / AssignmentWriteRespVO / BatchCreateAssignmentReqVO /
  BatchAssignmentWriteRespVO 全量重写,85 个字段逐个 grep 回源码命中 85/85;
  正文保留「旧版本曾写作 X,这些字段并不存在」以接住按旧名搜索的人。
- PR 号指错:#7442 实为 PR #7862(原写 #7866,那是 finance #7396 的 PR),
  #7443 实为 PR #7864(原写 #7868,那根本不是 PR 号)。
- board/orders 入参表原按「完整表」形态只列了 20 个字段中的 12 个,
  改为只列本次新增的 groupBatchId 并把覆盖范围写在标题与前言里。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 12:09:44 +08:00
Mimingguang c94fb2e12b docs(changelog-v2): #7853 导/摄芯片人员展示前端 hl-admin 已交付,回写 verified+frontend_ref(1bb8d0c8)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-17 11:32:37 +08:00
Mimingguang b7015c1ff4 docs(changelog-v2): #7842 出纳拆壳合芯前端 hl-admin 已交付,回写 verified+frontend_ref(96894dd7)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-17 11:19:18 +08:00
jw和Claude Opus 5 014a2396a1 docs(changelog): 团期原型核对的两条纯前端缺口(团期详情主报账人/流团横幅等、物资改删与手工录入)
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 11:16:55 +08:00
Mimingguang 92f074fc65 docs(changelog-v2): 修正 #7845 frontend_ref 全哈希(15e3d7dd906e5e738e70c279360caf8ac03e509d)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-17 10:50:57 +08:00
Mimingguang 51287c597a docs(changelog-v2): #7845 公司借款域前端 hl-admin 已交付,回写 verified+frontend_ref(15e3d7dd)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-17 10:50:00 +08:00
yaosutu a669350b0f docs(changelog): 出纳支付接口拆壳合芯——删3旧端点404+增18页签端点(#7842 PR #7855)
changelog-filename-gate / validate (push) Failing after 2s
- 删 GET /cashier/queue、POST /cashier/pay、POST /cashier/confirm-in(一律 404)
- 增 queue×8 + pay×8 + confirm-in×2,路径前缀 /cashier/{nonbiz,payment,prepay,expense,staff-loan,reimburse,advance,company-loan}
- 队列出参消灭 unitName/category 槽位复用,8 页签各用业务真名强类型字段
- ADVANCE 司导预支 2 端点预留空壳一律 598607,前端勿接
- 台账 GET /cashier/payments/page 不变
2026-09-17 10:43:13 +08:00
API Changelog Bot a3f2ac8fb8 docs: 更新 #7706 仅交付 dev-v3
changelog-filename-gate / validate (push) Failing after 2s
2026-09-17 10:30:52 +08:00
Mimingguang 0ccc0d9736 docs(changelog-v2): #7838 部分收款+明细指引前端 hl-admin 已交付,回写 verified+frontend_ref(76adad4b)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-17 10:28:11 +08:00
API Changelog Bot ea0c76cabc docs: 交付错误响应整数标识契约 (#7706)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-17 10:12:22 +08:00
jw fad30338a5 docs(changelog): #7853 团期配导游/配摄影逐户明细带出已配置人员(修改接口)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-17 10:08:16 +08:00
Mimingguang 8b9f8ca711 docs(changelog-v2): #7801 前端 hl-admin 已交付,回写 verified+frontend_ref(a84f2ffe)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-17 10:02:58 +08:00
Mimingguang 3fc124b0d9 chore(changelog): 回写 #7767 重开增补 not_required(前端零改动)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-17 09:17:58 +08:00
yaosutu 58c216669c feat(changelog): 公司借款域全量上线——12 接口 + 出纳 COMPANY_LOAN 新付款线(#7845 / PR #7846 #7848 #7850 #7851)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-17 08:53:33 +08:00
yaosutu 09f59e6d68 docs(changelog): 报账款查看明细页对接指引(复用现成接口拼装,零接口变更)(#7838)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-17 00:05:19 +08:00
yaosutu 0f9e87db01 feat(changelog): 报账款支持部分收款(组合还款分多次,PARTIAL_RECEIVED 中间态)(#7838 / PR #7840)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-16 23:48:14 +08:00
Mimingguang 9676e6452b chore(changelog): 回写 #7827 verified(前端 258207d2)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-16 23:36:33 +08:00
API Changelog Bot和Claude Haiku 4.5 c8f1f579b8 docs: #7767 补充第三件事——团车户成本扣减用 adjustAmount
changelog-filename-gate / validate (push) Failing after 1s
- 关键变化段新增:团车户车费按 0 计、调整用 adjustAmount
- 终止接口补 adjustAmount 入参说明与使用场景
- 业务边界详述:adjustAmount 参与 finalRefund 计算(负数表示减免)
- 补充实测数据:订单 2100132795681525761,finalRefund = max(0, 2000-176+0) = 1824

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-16 23:13:00 +08:00
API Changelog Bot和Claude Haiku 4.5 35a67a6264 docs: #7767 补充第三个接口 transition 详情
changelog-filename-gate / validate (push) Failing after 2s
添加 POST /v3/admin/order/{id}/transition (eventCode=TERMINATE) 的完整接口文档,
说明该接口同样支持 584132/584100 错误码。

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-16 23:07:30 +08:00
API Changelog Bot和Claude Haiku 4.5 5997bc722e docs: #7767 补齐接口路径与前端pending状态
更正两个接口路径为 /terminate/refund-preview 与 /terminate(原误写 /terminate-refund/preview)
参数名统一为 {id}(原误写 {orderId})
变更前端状态为 pending(原误标为 verified)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-16 23:07:30 +08:00
yaosutu 46909eba8d docs(changelog): 6 域审核记录独立查询接口(#7801 PR-2 / PR #7814,前端)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-16 22:04:56 +08:00
API Changelog Bot a78bfd7e60 docs(changelog): record group membership predicate fix (#7449)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-16 20:27:40 +08:00
jw d77b108824 docs(changelog): #7827 团期配置导游/摄影候选分页与模糊搜索(新增接口)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-16 19:15:28 +08:00
Mimingguang f63748605d chore(changelog): 回写 #7816 not_required / #7817 verified(前端 63f655ee)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-16 17:32:08 +08:00
jw和Claude Opus 5 5d97e1acb8 docs(changelog): #7816 需求审核状态中文名房车各一套 + #7817 出行人四档统一为成人/儿童/幼童/婴儿
changelog-filename-gate / validate (push) Failing after 1s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 17:03:29 +08:00
Mimingguang 273514e4ba chore(changelog): 回写 #7815 出纳队列 amount/fee frontend_status=verified(hl-admin 98f6b17e)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-16 16:38:33 +08:00
Mimingguang 85a0cdfecd chore(changelog): 回写 9/16 两条前台条目 frontend_status=verified(hl-admin d5fa3cda/55d3a040)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-16 16:30:54 +08:00
yaosutu 0bce0dd772 feat(changelog): 出纳待付款队列补 amount 与 fee 字段(#7815 / PR #7818)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-16 16:05:16 +08:00
jw和Claude Opus 5 2b0b922da3 docs(changelog): 团期列表与整团名单按测试反馈的前台调整(两条纯前端条目)
changelog-filename-gate / validate (push) Failing after 1s
- 16_frontend 列表页:删子订单房型·间数列、已订房文案改「户」、补户/人两行汇总、删班期范围下拉
- 16_frontend 整团名单:RosterTable 补「状态」与「需求审核」两列,并订正已过时的组件注释

两条均为已返回字段的展示形态调整,后端零改动。
需求审核列的中文名翻译缺陷已另开后端工单 #7816;档位中文名口径统一见 #7817。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 15:37:43 +08:00
Mimingguang 83cd836ab3 chore(changelog): 回写 #7767/#7791/#7443 frontend_status=verified(hl-admin a2a4e2dd/9c9190d0/23f6ac2f)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-16 15:19:13 +08:00
Mimingguang 652b07758a chore(changelog): 回写 #7769/#7770 团期列表增量 frontend_status=verified(hl-admin a9148fc9)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-16 14:47:30 +08:00
yaosutu 072c3f8717 docs(changelog): 报账详情补透出支出行凭证 voucherUrls + 审核流水 reviewLogs(#7790/#7791)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-16 13:40:47 +08:00
API Changelog Bot和Claude Haiku 4.5 151bfff016 docs: 2026-09-16 交接两笔接口变更(#7767 + #7443 PR-A)
changelog-filename-gate / validate (push) Failing after 1s
- #7767:团车户与免车团户可终止行程,新增错误码 584132,修改 584100 适用范围
- #7443 PR-A:派车行补团期 ID 列,看板按团期 ID 精确筛选

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-16 12:41:10 +08:00
jw和Claude Opus 5 6c78b879a4 docs(changelog): 团期列表 #7769 出参补 daysToDepart/minToForm、#7770 入参补日期区间与排序
changelog-filename-gate / validate (push) Failing after 2s
- 16_7769:GB-ADM-001 出参新增 daysToDepart / minToForm,GB-ADM-009 出参新增 minToForm / maxRooms
- 16_7770:GB-ADM-001 入参新增 departFrom / departTo / sortBy / sortOrder

两单均已合入 dev-v3(4559f35d0 / 791506985)并部署 TEST(791506985),
AC 已在 TEST 逐条取证:请求响应、SQL 对照、注入串回落日志、前后 diff 均留证。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 11:59:01 +08:00
Mimingguang 958f327b5b docs(changelog): #7721 回写复核页迁址(frontend_ref=0aa4ec7a,菜单实际配 payable/reimburse)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-16 10:02:36 +08:00
Mimingguang e9797c57de docs(finance): #7721 报账款模块前端交付回写 verified(ref 66c185ff,复核管理+出纳 REIMBURSE 线)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-16 09:47:33 +08:00
API Changelog Bot和Claude Opus 5 fee08eba33 docs(order-v3): #7621 转单端点团期需求作用域限制与 808001 文案误导说明(接口零变化)
changelog-filename-gate / validate (push) Failing after 1s
三种成因分开写:普通房务对任何团期需求恒 808650;超管对已整团认领的团恒 808650;
超管对尚未整团认领、且从未被单独抢到的团期需求恒 808001,而该文案说的是
「已被其他房务抢到」,与实情不符。历史遗留数据(并团前已被抢到)是唯一能转成功的例外。

正确路径写明整团认领 POST /v3/admin/order/grab-pool/group-batches/{groupBatchId}/claim,
并标注该路径参数是团期 ID 而非订单 ID(后端 @ApiParam 的「团期主订单 ID」标签会误导,
以 2026-09-16 测试服实测为准)。

第八节如实写明本单未部署、未做测试服端到端验证,只有仓内单测。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mg1eNKoacprUHNvuEKxjqq
2026-09-16 09:33:11 +08:00
Mimingguang effdb312c3 docs(order-v3): #7441 PR-4 前端交付回写 verified(ref a91d62f8,预检车侧清单+确认提示)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-16 09:31:17 +08:00
Mimingguang f671611af5 docs(order-v3): #7441 PR-1 前端交付回写 verified(ref b209f372,需求页正式用车编辑区)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-16 09:24:48 +08:00
Mimingguang d840271076 docs(order-v3): #7781 与 #7441 PR-2d/2e 前端核实判 not_required(584310 无字符串匹配;vehicleReady 前端零消费)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-16 09:07:44 +08:00
yaosutu 577e3a98af docs(changelog): 报账款模块整模块接入指引(复核5接口+出纳3接口,含详情明细/退回重推护栏,Epic #7721/#7764)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-16 09:00:38 +08:00
API Changelog Bot和Claude Opus 5 243ec1c164 docs(order-v3): #7781 核单分类未确认提示语补分类名 584310 changelog(已部署 dev-v3 d3d4755e9 并实测)
changelog-filename-gate / validate (push) Failing after 1s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 07:30:28 +08:00
API Changelog Bot和Claude Opus 5 51d838baf8 docs(order-v3): #7441 changelog 订正——取证出处改指工单评论、补验收口径边界与收件人
changelog-filename-gate / validate (push) Failing after 1s
- 6 份 #7441 changelog:正文与 status_note 里的内部取证目录引用(20 处)改为「见工单 #7441 验收评论」,时间戳与部署提交号保留
- 5 份管理后台分册补「验收口径边界:页面完成状态单独跟踪(前端归 mmg),不计入 #7441 验收」;3 份补「前端负责人(收件人)@mmg」
- 15_确认行程清单 / 15_结算核单:frontend_status=not_required 时 verified_at 按校验器 E_FRONTEND_STATE 规则置空(mmg 核实结论保留在 status_note)

Refs #7441

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 03:33:40 +08:00
API Changelog Bot和Claude Opus 5 4088b2e53b docs(order-v3): #7441 团期整团确认接车侧 + 整团免车户级与团级门禁联动 changelog(已合 dev-v3 f0277a14f 并部署)
changelog-filename-gate / validate (push) Failing after 2s
- 16_7441_团期整团确认接车侧:confirm-check / confirm 车侧字段、ready 语义变化、809100/809103/809108/809112/589533 实测
- 16_7441_团期整团免车户级与团级门禁联动:14 个契约不变行为变化端点,免车声明与团级 vehicleReady 联动;已实测与仅代码核对分列

Refs #7441

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 03:24:27 +08:00
Mimingguang a08369749f docs(order-v3): #7441 PR-2b/2c 与 PR-3 前端核实判 not_required(checklist 纯透传渲染;finalize warnings 不读 category,584131 拦截器透 message)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-15 21:52:58 +08:00
API Changelog Bot和Claude Opus 5 d970d37a50 docs(order-v3): #7441 团期车务已上线部分 changelog(正式用车需求四接口、确认行程清单房车短路、团车内部回调、核单车侧硬阻断)
changelog-filename-gate / validate (push) Failing after 1s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-15 21:39:47 +08:00
Mimingguang 441ff5eea3 docs(order-v3): #7746 取消成团 R10 守卫修正前端核实判 not_required(cancel-group 未接入,零命中显隐逻辑)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-15 21:20:59 +08:00
API Changelog Bot和Claude Opus 5 08e4a11c35 docs(order-v3): #7746 取消成团 R10 导游/摄影就绪位判定修正 changelog
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-15 21:14:30 +08:00
Mimingguang 89d493c7ef docs(changelog): 团期列表两条前端条目交付回写(联系人缺陷+11字段补渲染)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-15 18:00:16 +08:00
jw和Claude Opus 5 d38d8fc4bb docs(changelog): 前台团期列表两条前端条目(列表漏展示 11 字段 + 子订单联系人绑错 customerName)
changelog-filename-gate / validate (push) Failing after 1s
按团期原型逐块比对测试环境产出,后端零改动:
- 前端优化:GET /v3/admin/order/group-batch、/summary、/products 已返回的 11 个字段前台未渲染
  (productName/endDate/orderCount/enrolledPeople/maxParticipants/remainParticipants/maxRooms/
  batchNo 展示形态/subOrderCount/total/coverImageUrl+regionText),逐条附现网实测值。
- 前端缺陷:SubOrderTable.vue:25 绑 o.contactName,该接口出参只有 customerName,联系人列恒显破折号;
  同表 paidAmount/balanceAmount/orderStatusName/payStatusName 四个已返回字段也未使用。

后端确实缺的 5 项另开工单 #7769(出参 daysToDepart/minToForm)与 #7770(入参日期区间筛选与排序),不在本文范围。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-15 17:20:32 +08:00
Mimingguang 71c31c475d docs(changelog): #7428 预付款菜单路径纠错回写(advance 对齐 sys_menu)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-15 17:06:32 +08:00
Mimingguang 6777213ad1 chore(changelog): 09-15 房务团期批 5 条前端闭环(#7325/#7325b/#7326 verified,#7327/#7459 not_required)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-15 16:29:10 +08:00
Mimingguang 31aa1e3eaf chore(changelog): fund-stats 点日期下钻纠错前端已闭环(5c4852d1)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-15 15:55:20 +08:00
API Changelog Bot和Claude Opus 5 ba4ef6c376 docs(order-v3): 团期房务收口五份 changelog(#7325 越界户预检与改期出口、#7326 重判不平退回、#7327 REFUND owner 回落、#7459 取消处置 outbox 化)
changelog-filename-gate / validate (push) Failing after 1s
- 15_7325:confirm-check outOfRangeOrders[] 新增 tripNights/stayDate、按越界晚逐行;旧单户 finalize 越界拒绝(PR #7700)
- 15_7325b:管理端单户改期对团期子订单只允许改回团期出发日,错误码 587039~587042(PR #7743,测试服实测改期→重新确认→补订全链路)
- 15_7326:H10/H11 重算把重判不平的已完成户退回处理中,时间线 extra.reopenedOrderIds(PR #7689)
- 15_7327:团单取消/终止 REFUND 待办 owner 回落团级认领人,todos 字段按实测报文订正(PR #7679)
- 15_7459:订单取消的房务处置改走 outbox 耐久命令,取消后待办约 1 秒内异步产生、流团逐户 REFUND(PR #7731)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mg1eNKoacprUHNvuEKxjqq
2026-09-15 15:42:19 +08:00
yaosutu 207425a9af docs(finance): 资金统计点日期下钻前端纠错——日期走 query 不拼路径,查明细用 fund-flows/page
changelog-filename-gate / validate (push) Failing after 1s
后端契约零变更:/daily 无 /{date} 路径,前端把日期拼成路径段致 404「接口不存在」。
点日期下钻看当天流水明细应调 GET /admin/finance/fund-flows/page?flowAtStart=flowAtEnd=该日;
附两接口参数差异(flowAtStart/flowAtEnd/fundAccountId vs startDate/endDate/accountId)+ 正反例。
2026-09-15 15:34:17 +08:00
Mimingguang bd0d4f5077 chore(changelog): 资金统计日报参数纠错前端已修复回写 verified(mmg,ref 7985051b)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-15 14:26:33 +08:00
yaosutu a1c85b4061 docs(finance): 资金统计日报前端纠错——查询参数是 startDate/endDate 不是 dateFrom/dateTo
changelog-filename-gate / validate (push) Failing after 2s
后端契约零变更,仅前端对接说明:GET /admin/finance/fund-stats/daily 参数名
startDate/endDate,前端误传 dateFrom/dateTo 致 @NotNull 拦截返 400;附实测复现 +
正反例 + 400 兜底建议(勿留静态期初占位行掩盖)。
2026-09-15 14:09:02 +08:00
Mimingguang 489ed1df0c chore(changelog): #7669 核单日志归属字段前端判 not_required(通用渲染天然兼容)
changelog-filename-gate / validate (push) Failing after 3s
2026-09-15 12:21:04 +08:00
API Changelog Bot e2c6ce65a4 docs(changelog): publish #7669 vehicle fee audit ownership
changelog-filename-gate / validate (push) Failing after 2s
2026-09-15 12:09:00 +08:00
Mimingguang f53c3df9c8 chore(changelog): 资金账户 overdraftAllowed 前端纠错已修复回写 verified(mmg,ref 7a2cbaa3)
changelog-filename-gate / validate (push) Failing after 5s
2026-09-15 12:05:16 +08:00
yaosutu 50dad163a8 docs(finance): 资金账户 overdraftAllowed 前端纠错——禁传布尔须传整数 1/0
changelog-filename-gate / validate (push) Failing after 2s
后端契约零变更,仅前端对接说明:新建/编辑资金账户的 overdraftAllowed 为 Integer,
前端开关直传 true/false 会被 Jackson 反序列化拦截报「字段 [overdraftAllowed] 格式错误」,
提交前须规整为 1/0。附正反例 JSON + 回显判真建议。
2026-09-15 11:53:35 +08:00
Mimingguang e22815ce7e chore(changelog): #7428 预付款功能前端已交付回写 verified(mmg,ref e268e348)
changelog-filename-gate / validate (push) Failing after 3s
2026-09-15 10:30:48 +08:00
Mimingguang 822263565d docs(changelog): #7710 回写前端已对齐(verified,hl-admin@2d17966d)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-15 09:54:43 +08:00
Mimingguang 8cd710bd6b docs(changelog): #7695(两级校验)回写前端已对齐(verified,hl-admin@5f0d3abb)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-15 09:41:47 +08:00
Mimingguang fffa145653 docs(changelog): #7713 回写前端已对齐(verified,hl-admin@dea4a6e7)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-15 09:25:15 +08:00
Mimingguang 05beb7965d docs(changelog): #7534 回写前端已交付(verified,hl-admin@420e1a07)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-15 09:09:43 +08:00
yaosutu 053776756f feat(finance): 预付款功能 changelog(#7428)
changelog-filename-gate / validate (push) Failing after 1s
后端全链路就绪,前端需补「付款管理/预付款」菜单+页面;
应付款支付页支持 payType=PREPAY。
2026-09-15 02:55:38 +08:00
yaosutu 4917e44e6a feat(finance): 出纳付款金额锁死 changelog(598610,#7713)
changelog-filename-gate / validate (push) Failing after 2s
5 条 OUT 付款线金额须等于审批应付金额,不一致抛 598610;
前端付款弹窗金额应改只读。
2026-09-15 02:40:43 +08:00
yaosutu 8e9856fd6d docs(changelog): 出纳方式↔账户两级校验(598609) + 资金账户详情删flows走独立分页 (Issue #7695/#7710)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-15 00:15:24 +08:00
Mimingguang 2bfed6bf0f docs(changelog): #7695 回写前端已对齐(verified,hl-admin@902fe6b0)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-15 00:04:58 +08:00
yaosutu b80d3e3ca2 docs(changelog): 资金账户详情 flows 本账户流水对接说明 (Issue #7695)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-14 23:38:11 +08:00
API Changelog Bot和Claude Opus 5 523c1faf99 docs(changelog): #7666 接送机服务日回填(内部)CAS 落空按库内真实值回显(修复)
changelog-filename-gate / validate (push) Failing after 2s
POST /v3/internal/order/orders/{orderId}/requirement/transfer/service-dates/backfill:CAS 落空时按库内当前读作答,
库内仍空答 NO_TRANSPORT(不再失真答 ALREADY_PRESENT),库内有日期答 ALREADY_PRESENT + 库内真实值。
补正 13_7439 内部分册第 4 个端点的 outcome 口径。测试服 order-v3 dev-v3@79e3b9da7 直连实例实测。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015LU2ERekNLbvhsMqzFruHo
2026-09-14 22:37:38 +08:00
API Changelog Bot和Claude Opus 5 234e557852 docs(changelog): #7667 提交车务前拦截未回填服务日的接送机需求(809007,修复)
changelog-filename-gate / validate (push) Failing after 2s
POST /v3/admin/order/{id}/vehicle-requirement/dispatch 在 kind=TRANSFER 且服务日为 NULL/[] 时返回 809007,
需求停在 PENDING_REVIEW;TRAVEL 与已回填的接送机需求不变。测试服 order-v3 dev-v3@79e3b9da7 经网关实测。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015LU2ERekNLbvhsMqzFruHo
2026-09-14 22:30:35 +08:00
jw 3572fc7a0d docs(changelog): #7534 成团通知接通通知中心 + 补发端点 GB-ADM-004N(新增接口)
changelog-filename-gate / validate (push) Failing after 2s
新增补发端点 notify-formed;成团(含自动成团)后事务外投递 GROUP_BATCH_FORMED。
backend=deployed / gateway=verified(TEST 网关三组实测:补发成功 recipientCount=4 /
冷却 589593 {0} 渲染 / 成团契约 589537 未变)。错误码 589593/594/595(589592 被 #7533 占顺延)。
2026-09-14 20:03:47 +08:00
Mimingguang 0b2853224e chore(changelog): #7536 回写前端 verified(mmg,657f14dd)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-14 17:22:41 +08:00
jw 22d34c8023 changelog(7536): 团期接口返回值整改·破坏批(A3 分页信封+删5冗余字段+财务金额字符串,修改接口,管理后台)
changelog-filename-gate / validate (push) Failing after 2s
Refs #7536 PR #7688
2026-09-14 16:55:29 +08:00
Mimingguang 5fa9fdae6b chore(changelog): #7681 回写前端 verified(mmg,7ed122cb)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-14 16:21:13 +08:00
API Changelog Bot c917eadbbf docs(changelog): 回写 #7635 重开修复验收
changelog-filename-gate / validate (push) Failing after 2s
2026-09-14 16:02:16 +08:00
Mimingguang 5f85c9c626 chore(7533): frontend_ref 跟随 amend 更新为 f1319851(去署名,内容不变)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-14 15:54:21 +08:00
yaosutu 559e3da634 docs(changelog): 收付方式字典统一两维口径 前端 changelog (Issue #7681 / PR #7685)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-14 15:50:32 +08:00
Mimingguang 11e4a365ca chore(7533): 前端已交付 verified ref=028020fe
changelog-filename-gate / validate (push) Failing after 2s
2026-09-14 15:38:27 +08:00
jw和Claude Opus 5 a19ef02533 changelog(7533): 团级行程单与团期签单凭证(新增接口,管理后台)
changelog-filename-gate / validate (push) Failing after 2s
两个只读端点:print-itinerary(只出 ALL_SAME 项、差异项标「按户另见」)
与 sign-voucher(按供应商聚合、默认脱敏)。backend=deployed / gateway=verified。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-14 15:09:45 +08:00
Mimingguang e4481081ee chore(7662): 前端已交付 verified ref=c9588762
changelog-filename-gate / validate (push) Failing after 1s
2026-09-14 13:01:21 +08:00
yaosutu 6b41b5fa0f docs(finance): 业务外收入建单去掉账户/凭证字段对齐两步资金流程 changelog(#7662)
changelog-filename-gate / validate (push) Failing after 1s
入参删 fundAccountId/payMethod/voucherNo/voucherUrl,由出纳 confirm-in 采集;
出参不变、零 DDL;前端需把字段从申请页挪到确认收款弹窗。
2026-09-14 12:40:23 +08:00
Mimingguang 57a0cf6b78 chore(7529): 前端判 not_required(转期契约未改,3 新码 message 后端给全文走兜底)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-14 11:16:00 +08:00
Mimingguang 2fb3cb01a8 chore(7326): 前端批2 分房页 H9/H10/H11 已交付,#7326 全量闭环 verified(ad34c8ab)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-14 11:11:19 +08:00
Mimingguang 1e2839e03f chore(7326): 前端批1 H12 配房明细已交付,转 in_progress 待批2 分房页
changelog-filename-gate / validate (push) Failing after 2s
2026-09-14 10:42:13 +08:00
jw和Claude Opus 5 dbd1eba658 changelog(7561): 12301 合同申请补装配 v3 回调地址
changelog-filename-gate / validate (push) Failing after 1s
Refs #7561 / PR HL#7672(dev-v3 fee1faf2c)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-14 10:31:50 +08:00
Mimingguang 97bc9d2fb5 docs(changelog): #7327 月度对账并入团期行前端闭环 not_required
changelog-filename-gate / validate (push) Failing after 2s
2026-09-14 10:25:25 +08:00
Mimingguang 285f414b96 docs(changelog): #7439 终止退款 dayNumber 接送机边界前端交付 verified
changelog-filename-gate / validate (push) Failing after 2s
2026-09-14 10:22:59 +08:00
Mimingguang 192ac2d963 docs(changelog): #7528 团期七项硬门详情展示前端交付 verified
changelog-filename-gate / validate (push) Failing after 2s
2026-09-14 10:14:41 +08:00
Mimingguang 930a3379fe docs(changelog): #7635 订单列表团属性筛选前端交付 verified
changelog-filename-gate / validate (push) Failing after 2s
2026-09-14 10:00:10 +08:00
jw和Claude Opus 5 3860003084 docs(order-v3): #7529 团期转期后重排逐日行程 + 重版用车需求 + 三条 fail-fast 守卫
changelog-filename-gate / validate (push) Failing after 2s
Refs #7529

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-14 09:44:47 +08:00
Mimingguang 96dcb3fffb chore(staffloan): 回写核销归属修正前端凭证(7521/7520 ref 2a2ec01d)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-14 09:32:30 +08:00
jw和Claude Opus 5 a7dd25f5c4 docs(order-v3): #7609 审批角色守卫改 fail-closed——缺 role claim 的 token 不再绕过角色门
changelog-filename-gate / validate (push) Failing after 2s
退单审批 4 端点 + 流团审批 approve/reject 共 6 个端点。
不改请求/响应结构、不新增错误码、不改路由、无 Flyway。

TEST 真实网关前后对照:缺 role claim 由 589531/589545(绕过进业务)
变为 589530/589547(拦下);role=ADMIN(非超管)行为不变。

⚠️ 行为变更:生产库若有活跃零角色账号在做审批,上线即被拦,需运营侧知情。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-14 07:54:30 +08:00
API Changelog Bot和Claude Opus 5 899c18de84 docs(changelog): 月度对账并入团期计划行与分房行(#7327 PR-3)
changelog-filename-gate / validate (push) Failing after 3s
补 PR-3(#7645 / 0573c1a78)的接口行为变更。原 13_7327 那份只覆盖
PR-0/1/2 的 settlement/step1,月度对账三个端点一个字没提,而前端拿
changelog 当契约用。

覆盖 GET /v3/admin/house/reconciliation/monthly 及其 hotel-orders、
export 三个既有端点:字段结构未变,变的是返回数值——团期计划行与分房行
首次并入聚合(此前数据源只有 house_hotel_assignment),失效实付不再被
静默丢弃(原 continue 改 computeIfAbsent 新建桶),以及 addOrder 无条件
执行导致 orderCount 口径变化。

测试服实测(dev-v3 @ 0573c1a78 = PR-3 squash 提交,取证前后 commit 未变):
三端点经网关全部 200;2026-10 该月 house 侧 CONFIRMED 为 0 行而团期侧
3 行 9 间,响应返回 2 家酒店 5 单 —— PR-3 之前该月必然空响应。
REVOKED 实付 800 与有效实付 758 合计 1558,与响应逐字段吻合。

frontend_status 取 pending:响应结构未变但数值口径变了,需 mmg 确认
页面对「0 间夜订单行」「团期酒店行」两种新形态的展示。

Refs #7327

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-14 03:17:43 +08:00
yaosutu 3becd7f6da docs(finance): 员工借款申请与审批 changelog——Row 出参补 purpose 申请事由
changelog-filename-gate / validate (push) Failing after 2s
接口 PR #7655(Issue #7654)员工借款分页 Row 出参新增 purpose(对应 fin_staff_loan.purpose,
原型列表有事由列、接口原缺失)。出参只增不删向后兼容。已部署测试服行为级验证
(page 返回 Row 含 purpose 字段)。changelog §5.1 Row 补 purpose、§5.2 Detail 去重。
2026-09-13 23:04:13 +08:00
API Changelog Bot d2bce9b9c8 docs(changelog): #7439 dayNumber 取值域放宽,用车行可落在行程窗外
changelog-filename-gate / validate (push) Failing after 2s
Refs #7439 / PR #7639 (8c699658a)

- TerminateRefundItemVO.dayNumber 不再保证落在 [1, tripDays]:接送机服务日常在行程窗外,
  该值是服务日的无损编码,后端不再截断;原先这类订单被 581048 拒掉,现在正常返回。
- 前端凡是拿 dayNumber 直接当下标 / 做 1..N 循环的地方必须先做边界判断。
- 第八节为测试服实测:order-v3 @ dev-v3/8c699658a,经网关调 refund-preview,
  同一响应实测到 dayNumber=0(接机,出发前一天)与 dayNumber=5(送机,>tripDays=3),
  保险行仍 null,581048 未出现;取证前后 deploy-status 的 commit 一致。
2026-09-13 22:26:38 +08:00
API Changelog Bot 59bc815af4 docs(changelog): record #7635 merge
changelog-filename-gate / validate (push) Failing after 2s
2026-09-13 21:06:37 +08:00
API Changelog Bot e3700420a2 docs(changelog): publish order kind filters (#7635)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-13 20:18:39 +08:00
jw 0686db9ad5 changelog(#7528): 团期进入待出发七项硬门 + 详情 departureGates 展示 + recheck 端点
changelog-filename-gate / validate (push) Failing after 2s
2026-09-13 19:04:55 +08:00
API Changelog Bot和Claude Opus 5 0207e50800 docs(changelog): #7326 团期房务分房 H9-H11 + 团期配房明细 H12(新增接口,管理后台)
changelog-filename-gate / validate (push) Failing after 2s
面向 mmg:房务「分房」页三端点(H9 总览 / H10 人工微调 / H11 重算)
与团期详情「配房明细」只读区块(H12),四个端点全部新增。

覆盖范围写在 frontmatter 的 status_note 里,不藏在正文:
- 网关实测的是 e9855bf21;其后的 4df361bf6(days[].balanced 两端统一为纯算术)
  与 5fd39de3b(三处契约描述订正)只有单测覆盖;
- 网关实测那轮有两处前置是 SQL 直更达成的,对应的两条业务链路本轮没验过;
- 八项明确未覆盖的盲区逐条列出,这些项的契约按源码写、不按实测写。

几条前端最容易踩的,正文里逐条点名:
1. stayDate 格式错是 HTTP 200 + 响应体 code=400,不是 HTTP 400
   —— axios 那种「非 2xx 才进 catch」的拦截器不会被触发,必须在 then 里判 body.code;
   且格式提示括号不是恒有的(被拒值不像日期时只给不带括号的短句),别做 message 全等匹配。
2. days[].balanced 是纯算术口径(该日 leftover 全 0 且逐户 shortage/surplus 全 0),
   不含过时户与越界户——那两项只进根级 balanced。配了「我想知道 X 该看哪个字段」对照表。
3. H10 的 items 与 clearPlanIds 不得指向同一 planId(100001);三条上限 500/200/99。
4. 床型下拉按 bedTypeLabel 渲染,不要解析错误 message
   —— 理由不是它现在错(808131 文案已在 5fd39de3b 修对),而是错误 message 本来就不是契约。

PR 号待合并后回填(分支 feature/7326-room-allocation)。

两道校验器均通过:
- validate-changelog-frontmatter.mjs --verbose:4 个端点逐条回显、endpoint-count 4,与正文标题数对上;
- validate-changelog-filenames.mjs 的 validateChangelogPath:TARGET errors=[],
  阳性对照(日前缀改 12_)正确报 E_DAY,证明该门禁有分辨力。

Refs #7326

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-13 18:10:00 +08:00
yaosutu 9ad6178c3c docs(finance): 费用报销 changelog 冲抵勾稽自包含——内联 offsettable 用法
changelog-filename-gate / validate (push) Failing after 2s
原 §七 错误码 599107/599113 写"见 PR #7566 冲抵借款 changelog"违反自包含铁律。
本次补全:599107/599113 拆行写清触发条件 + 新增「冲抵勾稽(自包含)」段——
内联 GET /admin/finance/staff-loans/offsettable 端点用法与出参(balanceAmt 可冲上限)、
use=min(报销剩余额度,借款余额) 勾稽规则、offsetLoanAmt/payableAmt 关系,
指向员工借款申请与审批篇准确文件名。
2026-09-13 17:51:23 +08:00
yaosutu 1191b6e046 docs(finance): 员工借款 changelog 重写——按原型修正核销归属 + 审批写清
changelog-filename-gate / validate (push) Failing after 2s
按原型对齐两菜单分工:
- 员工借款申请与审批(改名,原"申请与核销"):付款管理/员工借款 = 申请 + 审批(submit/approve/reject 手工推进状态,approvalInstanceId 留空待接企微) + 核销进度只读 + 报销冲抵选借款;砍掉还款登记/红冲
- 员工借款支付出纳放款:支付管理/员工借款支付 = 出纳放款(cashier bizType=STAFF_LOAN) + 还款核销(现金/转账登记 POST /{id}/repays、红冲 DELETE、报销冲抵 offsetLoanIds) + 资金账户下拉

修正点:还款核销登记/红冲从申请篇挪到支付篇(原型 L1674 notice 明确核销在出纳侧);审批接口写清为手工推进状态、approvalInstanceId 留空。
2026-09-13 17:43:48 +08:00
Mimingguang babb9e6a89 chore(staffloan): 回写员工借款前端交付凭证(7521/7520 申请核销+出纳放款 verified eb6812c2)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-13 17:27:19 +08:00
yaosutu c91730668b docs(finance): 员工借款两菜单 changelog——申请+核销 / 出纳放款支付
changelog-filename-gate / validate (push) Failing after 2s
Epic #7520 四 PR(#7543/#7549/#7557/#7566)员工借款域已全量接通 + 菜单已挂载(PR #7642 / 迁移 V20260913_001)。

- 13_staffloan_员工借款申请与核销-新增接口:「付款管理/员工借款」/admin/finance/staff-loans 12 端点全表 + 状态机 + 错误码 599101-599113
- 13_staffloan_员工借款支付出纳放款-修改接口:「支付管理/员工借款支付」出纳放款对接(cashier bizType=STAFF_LOAN)
- 两篇均含 菜单↔功能↔接口 对照表;借款人下拉统一 GET /admin/user/employee-options;资金账户 fund-accounts/options
2026-09-13 17:01:28 +08:00
Mimingguang 890c8bd454 chore(expense): 回写费用报销前端交付凭证(7472/7486/7502 verified e5ca470a)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-13 16:49:39 +08:00
API Changelog Bot 91e38984ab docs(changelog): add #7633 revoke reason handoff
changelog-filename-gate / validate (push) Failing after 1s
2026-09-13 16:32:00 +08:00
yaosutu edab50a6a8 feat(changelog): 费用报销三件套(#7472/#7486/#7502) + 费用支付出纳对接说明
changelog-filename-gate / validate (push) Failing after 2s
- 费用报销:page 加 statuses 多状态筛选、detail 加 payRecords 付款记录、表单补 applicantId/payeeAccount/voucherUrl、透出经办人 operatorId/operatorName、598705 文案放宽;含部门组织树/员工选择器/所属公司 travel_agency/费用分类 关联接口指引
- 费用支付:出纳域对接说明(queue/pay/payments 按 EXPENSE 路由),接口无变更
2026-09-13 16:25:38 +08:00
Mimingguang 5db14d3832 chore(changelog): #7439 用车需求分家前端 not_required(等 TRANSFER 开放)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-13 15:10:28 +08:00
Mimingguang b241e8a69b chore(changelog): #7612 业务外收支 + #7625 员工选择器前端 verified
changelog-filename-gate / validate (push) Failing after 2s
2026-09-13 15:01:58 +08:00
API Changelog Bot 1c5279f327 docs(changelog): #7439 对外分册补齐 809001/809007 处置口径与「建议显式传 kind」
changelog-filename-gate / validate (push) Failing after 2s
两处是交接件自身的缺口,不是实现问题:

1. 809001(同单同 kind 重复/并发提交)此前只作为 JSON 示例出现,没有前端处置口径,
   而本文件错误码表的前提就是「每个码配一条处置口径——码本身不够,处置动作错了
   照样是线上问题」。补的处置口径关键是「不要自动重试」:只要那条活跃需求还在,
   重试永远是这个码。
2. 809007 此前只在内部分册。它确实是 fleet 消费侧的码、前端拿不到,但错误码段位
   在交接件里应当完整,且它与 809002 的分工需要说清(809002=提交时派生不出来,
   前端可引导补大交通;809007=提交时没派生、事后被消费,属存量回填,前端无动作)。
   补上之后,「交接件含 6 个错误码」在「两册之和」与「mmg 实际拿到的那一份」
   两种读法下都成立,不必再去裁哪种读法对。
3. 「不传 kind 按 TRAVEL 处理,现网代码可不改但建议显式传」此前只写在内部分册,
   而内部分册的收件人是后端与 fleet 侧、不是 mmg。已补进对外分册的影响评估与
   端点1 入参表,并写明为什么值得显式传:一旦该订单出现两类活跃需求,「不传」
   的语义就从「就是行程用车」变成「碰巧落到行程用车上」,两者在代码里长得一样。

校验:六个码(809000/809001/809002/809007/809008/809009)在对外册均为行首表格行
各 1 行;退役号 809003-809006 阴性对照各 0 命中;endpoint-count 仍为 7 / 4。
2026-09-13 15:01:15 +08:00
API Changelog Bot 1e8404a047 docs(changelog): #7439 团期车务地基——用车需求分家(对外 7 端点 + 内部 4 端点)
changelog-filename-gate / validate (push) Failing after 1s
两份分册按 BACKEND_CHANGELOG_DELIVERY_GUIDE.md 2.5 节拆分(/v3/internal 必须单独成篇)。
2026-09-13 测试环境逐端点实测:对外 7 个经网关,内部 4 个直连服务带 X-Internal-Token
(网关按设计一律 403 拦 internal,不是路由失败)。部署 HEAD a82367e15,
order-v3 / fleet / gateway 同批。

实测顺带订正两处文档与实现不符的契约,已改在 §二/§三 正文而非附注:
1. 打回·定制师 / 打回·车控 的 kind 是 @RequestParam Query 参数,不在 RejectReqVO 里。
   原文档标成 Body —— 按原文档把 kind 塞进 JSON 会被 Jackson 静默忽略、
   不报错也不返 400、服务端按默认 TRAVEL 处理,接送机的打回会落到行程需求上。
2. 提交/修改用车需求的非法 kind 实测返 400(VehicleRequirementReqVO 的 @Pattern
   先于业务代码拦截),809000 对该端点的 body 参数不可达;809000 仍可经内部接口的
   query 入口触发。同一处校验、两个入口两种表现,两条分支都要处理。
2026-09-13 14:47:04 +08:00
yaosutu d53a6f4328 docs(changelog): 业务外收支 7612 入参按 IN/OUT 两个页签分开说明
changelog-filename-gate / validate (push) Failing after 2s
把"四、入参"重构为分方向:先讲一套接口两个页签(direction 区分)怎么调,再分别给业务外收入(IN)/业务外支出(OUT)两张干净表单字段表,支出明确"只有 8 字段、不收凭证类"。前端对着自己页签抄即可。
2026-09-13 14:44:50 +08:00
Mimingguang 649eea681b chore(changelog): #7327 核单住宿失效团期行前端 verified(可删+合计剔除)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-13 14:39:53 +08:00
yaosutu 6e05bd81aa feat(changelog): 业务外收支接供应商与经办人(#7612) + 员工选择器接口(#7625)
changelog-filename-gate / validate (push) Failing after 2s
- 13_7612:业务外收支修改接口(破坏性:删 unitName/加 operatorId 必填/OUT 裁剪 6 字段;出参加 flowNo;含供应商弹窗/部门树/员工选择器/类别/收付方式字典 5 个关联接口对接指引)
- 13_7625:新增员工选择器 GET /admin/user/employee-options(不限角色,供经办人下拉)
2026-09-13 14:37:16 +08:00
Mimingguang b7855447cf docs(changelog): #7487 撤销审批语义修正实证 not_required(前端未接该端点)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-13 14:12:04 +08:00
API Changelog Bot 54cdd4dca8 docs(changelog): document supplier revoke failure (#7487)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-13 14:07:55 +08:00
API Changelog Bot和Claude Opus 5 779f70f896 docs(7327): 订正 changelog —— PR-2 把「权威消失即软删」推翻为「转 REVOKED 不删」
changelog-filename-gate / validate (push) Failing after 2s
本篇写于 PR-1(#7600, 49ce99cc8)当天,同日 09:19 合入的 PR-2(#7603, d916986de)
把其中的行为改成了相反的。mmg 手上拿到的是错的,故就地订正而非另起新篇
(另起会把同一批接口的信息分裂到两个文件)。

订正 7 处(代理只报了 4 处,第 5-7 处是收尾时按「概念」做全文残留断言抓出来的):

1. 关键变化段:GROUP_BATCH_PLAN_REVOKED「本期产生不出来」-> 本期就会出现
2. 对平规则:「权威消失即软删,返回结果里不再出现」-> 不删,就地转 REVOKED
   + remark 加前缀 [团期来源已失效] ,实付/凭证/确认状态/source_id 锚点全保留,
   权威回归时按 source_id 三段认回、不新建重复行
3. 行为对照表「团期权威消失」行
4. 用例名 listHotel_groupAuthorityGone_softDeletes... -> ...revokes...
   (真名见 SettlementServiceGroupBatchReconcileTest.java:219)
5. sourceType 取值域表里仍写着「本期产生不出来」
6. 读写混合说明里的对平三动作仍写着「权威消失的软删」
7. 「会新建、更新或软删住宿行」加限定(团期行走转 REVOKED,此处软删指其它来源)

另:正文顶部新增「2026-09-13 订正」段集中对账,PR 行补 #7603。

frontend_status: not_required -> pending。原 not_required 闭环是在
「REVOKED 本期产生不出来」这个前提下做的,前提已失效。
它引出一个需要拍板的新问题:一条权威已消失的 REVOKED 行,核单员到底能不能删?
按现有前端逻辑它是「不可删的派生行」,但上游已不存在 —— 意味着它会永久留在核单页上。
后端这么设计是故意的(保住已录实付与凭证、以及认回锚点),但前端侧怎么展现没定过。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-13 14:04:04 +08:00
Mimingguang 551c56609f docs(changelog): #7608 取消成团判权实证 not_required(前端无取消成团按钮,589507 兜底)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-13 13:11:26 +08:00
API Changelog Bot和Claude Opus 5 5a24c71fe0 feat(scripts): 校验器加 --verbose,成功路径也打印逐端点命中行
changelog-filename-gate / validate (push) Failing after 2s
背景:changelog 校验器的端点解析结果原本只在「清单与详情对不上」时才进 errors,
成功路径零输出(只有一行 PASS)。于是「每个端点都被校验过」这件事**无法取证**——
#7439 AC-19 要求「贴校验器输出里逐端点的命中行、端点数对得上」,判据字面不可达成。

改法:模块级开关 VERBOSE_ENDPOINTS,main 识别 --verbose 后从 argv 剔除再走原解析
(避免打乱 argv[0] === '--files' 的判断)。打印格式:

  [endpoint] <file> #<n> <METHOD> <path>
  [endpoint-count] <file> <n>

硬约束:**默认行为一个字节都不变**。它是提交门禁,加日志不得影响判定。
已验:同一组文件在改前/改后不带 --verbose 跑,stdout+stderr 逐字节 diff 为空;
仓内 14 条测试改前改后均 14 pass / 0 fail。

为什么值得改而不是改判据:逐端点证据对所有 changelog 都有用,
而「手工用同一条正则再枚举一遍」产出的不是校验器输出,等于用一个未经检验的
复制品去证明原件跑过了。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-13 13:04:22 +08:00
jw和Claude Opus 5 ad0c43afb1 docs(order-v3): #7608 团期取消成团接入 group-batch:manage 判权(589507)+ 三端点旁路观察
changelog-filename-gate / validate (push) Failing after 2s
批 0+1:cancel-group 接 manage 带 nacos 灰度开关;withdraw / transfer-in /
transfer-candidates 本批只加旁路观察日志,对外行为零变化。

TEST 实打:AC-2 零写入(41 列逐列一致、update_time 未变、流水 0 新增)、
AC-3 非超管 ADMIN 仍 200、AC-6 开关两态(≈7s 生效)、观察探针端到端。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-13 11:57:43 +08:00
Mimingguang d0e762ddc6 docs(changelog): #7607 审批链口径更正实证 not_required(前端纯透传 statusChangeText)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-13 11:00:37 +08:00
Mimingguang 6c7e0ef5f5 docs(changelog): #7440 团期配车只读模块回写 verified(frontend_ref 5aea88d4)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-13 10:54:55 +08:00
lc和Claude Opus 5 4ca07159ba docs(changelog): 审批记录改按审批链推进并修正或签审批人(#7607),更正 #7587 口径
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DdmjgoN68L7TUP4oRosfTu
2026-09-13 10:50:18 +08:00
Mimingguang bc84c8099c docs(changelog): #7520 资金账户所属公司多选回写 verified(frontend_ref 37454cb4)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-13 10:31:02 +08:00
Mimingguang 86b700939c chore(changelog): #7532 回写前端 verified(95518b50) 出团通知书读写模块
changelog-filename-gate / validate (push) Failing after 2s
2026-09-13 10:20:40 +08:00
Mimingguang a61586ff83 chore(changelog): #7527 回写前端 verified(a80b9670) 发起核单入口
changelog-filename-gate / validate (push) Failing after 2s
2026-09-13 10:08:51 +08:00
yaosutu 48d36a1c84 docs(changelog): 资金账户新建/编辑表单字段对接说明(管理后台 v2)
changelog-filename-gate / validate (push) Failing after 2s
非接口改动:资金账户接口字段早已齐全,前端补 5 字段(bankName/shortName/nature/feeRate/refundReserve)+ scopeCompanies 改多选。
2026-09-13 10:05:19 +08:00
Mimingguang 4b351d1c1c chore(changelog): #7587 回写前端 verified(e3ff8510) 审批记录补状态变化列
changelog-filename-gate / validate (push) Failing after 2s
2026-09-13 09:54:57 +08:00
Mimingguang 10502ccdd3 chore(changelog): 补回写漏网 8 条(7510×2/7511/7512 verified+not_required;7513/7530/7531/7535 not_required)
changelog-filename-gate / validate (push) Failing after 2s
7510/7511/7512 代码早已随供应商关系系列交付(a17a2c2a/4bedc8be),实证后回写 verified 挂 a17a2c2a;
11_7510 为正本 12_7510 的重复副本(canonical_path),标 not_required 消除 pending;
7513/7530/7531/7535 实证前端零改动 not_required。
2026-09-13 09:51:52 +08:00
Mimingguang a7a687796f chore(changelog): #7327 回写前端 not_required 核单 Step1 来源透传+584129兜底均兼容
changelog-filename-gate / validate (push) Failing after 2s
2026-09-13 09:36:00 +08:00
Mimingguang 8ddf1e5268 chore(changelog): #7537 回写前端 verified(f7699455) 协同工单补团号列,余三块 no-op
changelog-filename-gate / validate (push) Failing after 2s
2026-09-13 09:14:00 +08:00
API Changelog Bot和Claude Fable 5.1 31d9cb8b23 docs(order-v3): 团期配房行合流进住宿核单 Step1 changelog(#7327 PR-1)
changelog-filename-gate / validate (push) Successful in 2s
面向 hl-ui:核单 Step1 的 sourceType 扩取值域,团期订单首次出现团期配房派生行
GROUP_BATCH_PLAN;新增行级确认闸业务错误码 584129。
接口路径、HTTP 方法、VO 字段集合均未变化,网关无新增路由。

Refs #7327

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-13 08:53:04 +08:00
jw和Claude Opus 5 d32665518f docs(order-v3): #7513 团期转期同步回写归属两列 + 在途退单守卫 589589
changelog-filename-gate / validate (push) Successful in 2s
转订单端点请求/响应结构零改动,前端无需改造。两处需告知:

1. 转期后订单详情的团期编号/名称会正确显示为【目标期】——此前因只改了
   product_batch_id、没改 group_batch_id,展示的是源期。属修复非回归。
2. 新增拒绝码 589589:该户有在途 PENDING 退单审核时转期被拒,前端按普通
   业务错误弹 message 即可,文案已含出口指引(先在源期驳回再重提)。

历史已转期订单的存量分叉本次不修,见 #7586。

frontmatter: backend_status=deployed / gateway_status=verified / frontend_status=pending
校验:validateV2Document 0 错误;validateChangelogPath 通过。

Refs #7513
PR wx/HL#7589

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-12 17:10:02 +08:00
lc和Claude Opus 5 47544d190e docs(changelog): 供应商审批记录新增变更前后状态字段(#7587)
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DdmjgoN68L7TUP4oRosfTu
2026-09-12 16:50:43 +08:00
jw 4bea4c2d1c docs(order-v3): #7535 零破坏证据升级为真·双部署逐字段对拍
changelog-filename-gate / validate (push) Successful in 3s
2026-09-12 15:41:25 +08:00
jw 637fad2394 docs(order-v3): 团期接口返回值整改·非破坏批 changelog(#7535)
changelog-filename-gate / validate (push) Successful in 2s
19 个团期读端点纯加响应字段,47 个新 key,既有 key 的名称/类型/取值/null 语义
一行未动,前端零改动即可继续运行。零 DDL、零错误码、零网关改动。

前端要点:opsStage 直接读不要自己折桶;联系人改读 customerName;
审批中心统一列表三个新字段只在 WITHDRAW 行有值;teamNo 逐户各不相同且未付订金为 null;
staff 候选的 groupBatchId 在团期未创建时为 null,不得当必有主键用。

四组旧字段(Text/Label 后缀、contactName、batchId、total*)已标 @Deprecated,
本批不删、值不变,删除时间另行通知。
2026-09-12 15:12:28 +08:00
lc和Claude Opus 5 e315cbb6b0 docs(7512): 服务人员 Changelog 补齐模板必需章节与逐接口自包含内容 Refs #7512
changelog-filename-gate / validate (push) Successful in 3s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011t6wjBsvqsFKFSkCzsYsuS
2026-09-12 12:19:39 +08:00
lc和Claude Opus 5 3a15e3de25 docs(7512): 服务人员按景区口径接入供应商关系 Changelog(supplierFullName / 原因可省略 / 无订单门禁)Refs #7512
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011t6wjBsvqsFKFSkCzsYsuS
2026-09-12 12:15:55 +08:00
lc和Claude Opus 5 57be23bcd1 docs(7511): 额外成本按景区口径接入供应商关系 Changelog(supplierFullName / 固定 COST_ITEM 类型 / 原因可省略)Refs #7511
changelog-filename-gate / validate (push) Successful in 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UqNs52DGnGU29PN8Ey37Ms
2026-09-12 12:04:17 +08:00
jw和Claude Opus 5 1584c8ee80 docs(order-v3): #7532 团期出团通知书读写端点(GB-ADM-081 / 082)
changelog-filename-gate / validate (push) Successful in 2s
新增两个管理后台端点:
  GET / PUT /v3/admin/order/group-batch/{groupBatchId}/docs/notice
读端点在未保存过时按团期数据即时拼草稿返回(不落库),写端点整体覆盖保存到新表
group_batch_notice(Flyway V20260912_140)。

前端必接三件事:
1. expectedVersion 必填、首次传 0、收到 589585 必须【重读再提交】——直接重试一定还是 589585;
2. releasable=false 时置灰「打印 / 存 PDF」(阶段门只卡下发不卡编辑,招募期可起草);
3. 正文是纯文本语义,后端不转义也不反转义,按纯文本渲染、不要 v-html,
   也不要在前端 escape/unescape 后再提交。

另一条部署事实:新权限码 group-batch:docs 在 user-service 有 10 分钟 Redis 缓存,
上线后 ADMIN 最多 10 分钟才生效,这段窗口的 589507 不是漏配。
当前授权范围 ADMIN / SUPER_ADMIN,FINANCE 未授。

原型出入三处(contacts 单串 vs 两个输入框、完成编辑未发请求、service/bring 未接控件)
已在正文列出,口径由 mmg 对齐。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-12 11:55:44 +08:00
jw和Claude Opus 5 b4ef91e9eb docs(order-v3): #7531 下线 Mock 的行程整体保存端点 + #7530 团期 staff 去重与报账人扇出限定本团
changelog-filename-gate / validate (push) Successful in 3s
#7531(删除接口):POST /v3/admin/order/{orderId}/itinerary/save 下线。
该端点自 2026-05-12 落地起就是 Mock,只回显入参 id、从不落库;
下线前已穷举 mmg/hl-ui 全部 4 条远端分支确认零调用(每条带阳性对照),
故前端预期无需改动。整体保存的真实入口是 POST /v3/admin/order/{id}/adjustment/submit。
错误码 583030-583034 号位保留未释放。

#7530(修改接口,两个端点):
1. PUT /v3/admin/group-batch/{productBatchId}/staff 新增 589582——
   staffList 内 staffId 重复即拒绝、整批不保存,同一员工不能在同一团期占两个配置位。
   前端需提交前去重或直接透出文案。
2. PUT .../staff/{staffId}/reporter-rank 行为收敛——
   报账人等级的订单副本同步范围由「全库」收窄为「本团活跃订单」,
   响应结构与错误码不变;存量重复行不再抛裸 500。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-12 11:04:13 +08:00
lc和Claude Opus 5 3aa5242ab9 docs(7510): Changelog 路径迁移为 12_ 并登记 11_ 兼容别名 Refs #7510
changelog-filename-gate / validate (push) Successful in 3s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UqNs52DGnGU29PN8Ey37Ms
2026-09-12 10:35:51 +08:00
lc和Claude Opus 5 fb7a6af37b docs(7510): 服务按景区口径接入供应商关系 Changelog(supplierFullName / 原因可省略 / 395063)Refs #7510
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UqNs52DGnGU29PN8Ey37Ms
2026-09-12 10:29:11 +08:00
jw和Claude Opus 5 4656428473 docs(order-v3): #7527 团期发起核单端点(TRIP_FINISHED → REVIEWING)
changelog-filename-gate / validate (push) Successful in 3s
新增 POST /v3/admin/order/group-batch/{groupBatchId}/review/start。

补的是「团期卡死」的入口缺失:这一跳此前唯一入口是录共享成本的副作用,
不用大巴、没请导摄的团没有成本可录就没有触发点,永久停在「出行完毕」,
八桶看板的「核团中」桶对这类团恒为空。

面向 hl-ui 写清三件事:① 重复点击返 200 而非报错,必须看 data.alreadyStarted
区分「真的推进了」与「幂等命中」,否则会连弹两次成功;② 三个新错误码
589564/589565/589566 各对应不同的下一步动作(等团回来 / 去做验团反确认 /
这团已流团),给了逐条的前端提示建议,其中 589565 要带反确认跳转;
③ 录成本自动推进的老行为一行未改,两条入口并存,前端现有调用不需调整。

权限码复用录成本那一个(group-batch:finance:advance),按钮可见性判据可直接复用。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-12 10:26:15 +08:00
jw和Claude Opus 5 79186364b8 docs(order-v3): #7537 管理端展示订单号的响应体统一补团号(teamNo)
changelog-filename-gate / validate (push) Successful in 2s
11 个 /v3/admin/** 端点响应体纯增 teamNo:退款详情/列表、支付分页/详情/按订单、
工单分页/详情三块新增字段,订单待办 4 个写端点补上此前恒 null 的填充。

面向 hl-ui 写清四件事:teamNo 是订单团号 order_main.team_no(26-0001),不是运营
团期号 batchNo(GB-26-0001);为空一律 null 不返空串不回退订单号;生成条件是订金
支付成功、与是不是团期单无关(已付订金散客单有、未付订金团期单没有);同团每张
子订单团号各不相同,别按团号归并。

另记 4 个 /v3/internal/ 端点连带多出该字段(服务间调用,前端不对接)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-12 09:15:46 +08:00
Mimingguang a0d72720a6 chore(changelog): 7526 前端交付回写 verified
changelog-filename-gate / validate (push) Failing after 3s
团期物料门复判与兜底重扫:hl-admin 36c9064a 在团期详情页
onContractActionSuccess 补 fetchDetailSafe 重拉主详情,出具/签署触发物料门
自动推进时状态立即刷新。frontmatter 翻 verified + owner + ref + status_note。
2026-09-12 07:46:16 +08:00
jw 37904dc20f docs(changelog): 团期物料门复判与兜底重扫(#7526 / PR #7559)
changelog-filename-gate / validate (push) Successful in 2s
新增 2 个端点:
- POST /v3/admin/order/group-batch/{groupBatchId}/recheck-material-gate(运维手工复判,未推进时回执指明挡门原因)
- POST /v3/internal/jobs/group-batch-material-gate/run(服务间,Quartz sys_job 1044 经 Feign 触发,公网网关不放行)

backend deployed + gateway verified,TEST 2026-09-12 实测:
事件路径 03:37:09 管理端动作 → 03:37:10 团期推进;Job 路径 cron 03:27:00 自行触发,sys_job_log 1044 SUCCESS。
2026-09-12 07:29:45 +08:00
Mimingguang 6827c24324 chore(changelog): 7445/7446 前端核验 not_required 回写
changelog-filename-gate / validate (push) Failing after 2s
7445 团期用车结算闸(584131+VEHICLE 软预警)与 7446 住宿结算闸判团口径
(584130 判据修正),经 grep 实证 hl-admin 前端均零改动:
- 前端无按码分支,request.js 通用 bizError 兜底透传后端 message 原文,
  584131/584130 文案已含订单号+需求状态+操作指引,透传即达标。
- detail.vue warnings 渲染只取 item.message 且兼容过渡期字符串,从不读
  settlementId/dayNumber 定位明细行,category=VEHICLE 项(恒 null)正常展示。
- 7446 契约一字未变仅触发人群变化,前端对 584130 无专属处理不受影响。
frontmatter 翻 frontend_status=not_required + owner=mmg + status_note 追加,
无业务 commit,ref 留空。
2026-09-11 19:20:10 +08:00
API Changelog Bot 251748d813 docs(7445,7446): 两份交接件补网关实测结果,gateway_status 转 verified Refs #7445 Refs #7446
changelog-filename-gate / validate (push) Successful in 2s
两单的 §八「测试环境已验证」原先都写着「本节当前为空,网关实测尚未进行」,
frontmatter 的 gateway_status 卡在 pending、pre-push 校验器报 E_GATEWAY_PENDING。

2026-09-11 网关实测已完成,本次把结果写进两份交接件:

- #7445 四组(17:38 三组 + 18:36 补一组):团期单 + 用车 PENDING → 584131;
  推 DONE → 200;散客单两类需求都 PENDING → 200(两闸均不误触发);
  车费派生行全部软删 + 需求 PROCESSING → 仍 584131
- #7446 四组:方向甲 + 住宿 PENDING → 584130;推 DONE → 200;
  待回填老单(product 非空 + group 为空 + 团期存活)→ 仍 584130;散客单 → 200

两份都如实写明了两条取证边界,不许读的人误推:

1. 全部前置都是 SQL 直更造出来的(直接改需求 status),不是走真实配车/配房链路产生的
2. 取证路上绕过了三道与本单无关的通用前置闸(584310 八分类未确认、584082 待收尾款、
   车费草稿冻结确认),手段是 SQL 标 CONFIRMED / 清零应收;这三道闸自身的正确性未被验证

gateway_status pending→verified、verified_at 填 2026-09-11、status_note 改为如实描述。
frontend_status 保持 pending 未动。
2026-09-11 18:58:29 +08:00
Mimingguang 98665c3a20 chore(changelog): #7509 前端交付回写 verified(mmg,hl-admin 64573356)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-11 18:14:35 +08:00
lc和Claude Opus 5 a28a67887f docs(7509): 酒店按景区口径接入供应商关系 Changelog(supplierFullName / 原因可省略 / 395062)Refs #7509
changelog-filename-gate / validate (push) Successful in 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UqNs52DGnGU29PN8Ey37Ms
2026-09-11 18:00:02 +08:00
API Changelog Bot 5a5ca03e0f docs(7440): 交接件补 4 个改造接口 + 双侧未读取法 + 会话键不混同 Refs #7440
changelog-filename-gate / validate (push) Successful in 3s
AC-19 要求的三块内容原先在文件里 grep 零命中,校验器也只解析出 4 个端点:

- 新增「改造接口」4 节(messages 拉取/投递、read 双侧水位、biz-unread-batch
  新增 TEAM_FLEET 取值),每节含方法/路径/路径参数/请求参数/响应/错误码
- 写死「双侧未读要分别取」:车务侧传 unreadScope=TEAM_FLEET、团期管理员侧传 TEAM,
  传错不报错、会拿到对方的未读数
- 写明 GROUP_FLEET:{groupBatchId} 与「接送机沟通仍走 FLEET:{orderId}」,两个入口不混同
- 两条 internal 接口的清单编号由 *内部* 改为裸 5/6——校验器对非裸编号的端点标题
  是静默跳过的,改前它们根本没进校验
- 补错误码汇总表(281018/281019/600012-600014/809400/809401,文案逐字抄源码)
- 六.6「修改前后对比」由 N/A 换成 4 个改造端点的行为级对比

端点数 4 → 10(6 新增 + 4 改造),与工单口径一致。

另留痕一处信源冲突:biz-unread-batch 的 adminId,工单正文写「PERSONAL 时必填」,
而 ChatBizUnreadBatchReqVO.java:23-25 是 @NotNull(恒必填,与 unreadScope 无关)。
交接件按源码写,并在字段说明里标注与旧文档描述不一致、以源码为准。
2026-09-11 17:31:04 +08:00
API Changelog Bot 274f0b16c0 docs(changelog): #7440 订正六.8 节角色授予范围——ADMIN 已被 #7514 收回
changelog-filename-gate / validate (push) Successful in 3s
原文写「菜单可见性授予 SUPER_ADMIN / ADMIN / VEHICLE_MANAGER 三个角色」「权限码
授权 VEHICLE_MANAGER / ADMIN / SUPER_ADMIN」,这两句在 PR #7514 之后已经过时:
V20260911_007__fix_group_dispatch_admin_grants.sql 于 2026-09-11 14:04:26 在测试库
收回了 ADMIN 的菜单行(2 行)与权限码授权(1 行),部署后实测两项命中数均为 0。

收回的原因本文件八节末尾那条红字早就写着:/admin/fleet/** 的访问控制是 #5626 的
路径级粗粒度角色门禁,只放行 VEHICLE_MANAGER 与 SUPER_ADMIN,不看权限码。给 ADMIN
菜单等于造一个看得见、点进去必 403 的死入口。也就是说本文件自身前后矛盾——六.8 节
说 ADMIN 有菜单,八节说 ADMIN 调接口必 403。现已统一到后者。

接口契约、错误码与行为均未变,仅授权数据层的描述订正。frontmatter 补 status_note。

前端影响:不要按「ADMIN 能看到团期配车」设计任何菜单可见性或路由逻辑。
2026-09-11 15:07:07 +08:00
Mimingguang 8accfb3a61 chore(changelog): #7500 前端交付回写 verified(mmg,hl-admin 7d7cf020)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-11 14:46:14 +08:00
lc和Claude Opus 5 0c30d2c966 docs(changelog): #7500 游玩项目按景区口径接入供应商关系
changelog-filename-gate / validate (push) Successful in 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CKcJu3x9Ct9LutqH7AMjJb
2026-09-11 14:28:56 +08:00
API Changelog Bot和Claude Opus 5 78ddcae40e docs(changelog): #7440 团期车务派单只读入口——看板三端点 + GROUP_FLEET 双团会话(已部署实测 861ebff0c)
changelog-filename-gate / validate (push) Successful in 3s
6 个新接口:fleet 派单看板三个 admin 读口 + order-v3 两个 internal 读口 + user-service
open-group-fleet。本单只读,不含配车写入与派单进度回写。

错误码 7 个:809400/809401(order-v3 内部口自用,经 fleet 侧 fail-closed 统一转 600012,
**前端看不到原始码**)、600012/600013/600014(fleet 对外)、281018/281019(会话侧)。
809401 把「分页越界 / 出发日区间倒挂 / keyword 超 50 字符 / dispatchProgress 枚举非法」
合并为一个出口,前端按单码统一提示重填筛选条件。

⚠️ 访问控制口径:三个 fleet 读口由 #5626 的粗粒度角色门禁把关(必须切到 VEHICLE_MANAGER
或 SUPER_ADMIN),**不看权限码**。实测 ADMIN 角色(已被本单 Flyway 授予
fleet:group-dispatch:view)同样拿到 403,前端不能按「有该权限码就能调」设计。

测试环境已验证:三服务已部署(fleet/order-v3 @ 861ebff0c、user @ 30761683e,差异原因与
契约一致性核验见正文),6 端点逐个网关实测、每条两轮。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-11 13:24:48 +08:00
Mimingguang 6a6c167b69 chore(changelog): #7325 status_note 补 hotelReady 组合态提示前端交付(740e7941)
changelog-filename-gate / validate (push) Successful in 3s
2026-09-11 11:47:00 +08:00
API Changelog Bot和Claude Fable 5.1 67cb933c76 docs(changelog): #7325 补 808611/808612/808613 与 hotel_ready 组合态提示口径
changelog-filename-gate / validate (push) Successful in 3s
#7325 的 AC-21 字面要求 changelog 覆盖这三个码的文案与
「hotel_ready=false ∧ 有 CONFIRMED 行」的提示口径,首发时漏了:
808611/808613 全文零命中、808612 只出现在测试记录表格里。

三个码属 #7324 的段位但三个新端点都会返回(归属门在编排层前置),
前端只按本单新增的 8 个码做分支会漏掉最常见的三种拒绝。

顺带填 target_release=hl-ui@d487d2be:50c0e53 把 frontend_status 置为
verified 但 target_release 仍为空,校验器规则「verified 必须填写
target_release」会让该文件此后任何编辑都推不上去。取值来自同一份
frontmatter 的 frontend_ref,不是猜的版本号;mmg 若有正式版本号请覆盖。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-11 11:28:53 +08:00
Mimingguang 50c0e53c52 chore(changelog): 回写 #7324 接线闭环 + #7325 前端 verified(d487d2be)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-11 11:17:31 +08:00
API Changelog Bot和Claude Fable 5.1 c5b40bb83e docs: 答复前端 #7324 后端需求(后端零改动)+ 补 #7322 我的团不过滤 batch_status
changelog-filename-gate / validate (push) Successful in 2s
前端据 H1 看板过滤 CANCELLED 的行为,推断「整团释放」按钮无可达路径。
该推断的关键环节不成立:我的团(GET /v3/admin/order/grab-pool/my-claims/
group-batches)刻意不按 batch_status 过滤,H2 详情也没有阶段闸门,
CANCELLED 团期经「我的团 → H2 详情」完全可达。

根因在我方:#7322 的 changelog 从未写过这条行为,前端看不到 javadoc。
本次一并补记,并在需求单上答复 status=answered-no-backend-change。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-11 10:39:30 +08:00
API Changelog Bot和Claude Fable 5.1 65d786ea87 docs(changelog): #7325 团期房务按日订房确认 H7/H8/confirm-check(已部署实测 dfd5a8f6f)
3 个新端点、8 个新错误码、808616 删除、808602 日期上限改为 endDate-1。
已部署测试服并经网关实测,Flyway V20260910_302 success=1。

起草时「GET /confirm-check 任何后台角色都能调」写错,已更正:
读端点虽不标 @HouseWriteGuarded,但在编排层入口直接调
HouseReadGuard.assertHouseReadPermission(),非房务角色同样 808090。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-11 10:37:49 +08:00
Mimingguang 559c8da1c1 docs(changelog): #7324 status_note 补后端需求文档交叉引用(4aa3037)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-11 10:06:50 +08:00
Mimingguang 4aa3037c3c docs(backend-request): #7324 放开 H1 看板 batchStatus 对 CANCELLED 的过滤
changelog-filename-gate / validate (push) Successful in 2s
前端 #7324 已交付整团释放写口(commit 6710ad4a),但 H1 列表忽略 CANCELLED
过滤导致已流团团期进不了看板、释放按钮无可达路径。写明需求/现状/期望/
安全性供后端评估排期:放开 H1 对 CANCELLED 过滤(推荐方案 A),前端零改动等待。
2026-09-11 10:06:06 +08:00
Mimingguang 1e52ba5d26 chore(changelog): #7328 frontmatter 回写 verified(0f2f5b1a)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-11 10:01:17 +08:00
Mimingguang b0c68caa15 chore(changelog): #7324 frontmatter 回写 verified(6710ad4a)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-11 09:23:16 +08:00
Mimingguang cad8452b92 chore(changelog): #7387 前端交付 verified(ref 620754fc)
changelog-filename-gate / validate (push) Failing after 3s
2026-09-10 22:35:45 +08:00
lc 95d1789793 docs: 交接餐厅供应商关系契约(#7387)
changelog-filename-gate / validate (push) Successful in 3s
2026-09-10 22:18:14 +08:00
API Changelog Bot 70dbb833e0 docs(changelog): #7328 团期房务整团会话 GROUP_HOUSE(三端点)
changelog-filename-gate / validate (push) Successful in 2s
会话键是 GROUP_HOUSE:{groupBatchId},按团期聚合主键建键而不是子订单 id——
这是与既有 GROUP:{orderId} 的关键差异,前端拿错主键空间会静默查空
(不报错、只是永远没数据)。

三处前端按直觉写会踩的地方,都写进「关键变化」:

1. 团未被认领时的不对称:管理员侧能开会话(消息落团队池,认领后自动改判
   给认领人),房务侧开不了(281002)。

2. peerAdminId 在两个接口上语义不同——这条是部署实测才发现的。
   open-group-house 的响应直接回显 DB 占位值 0(ChatManager.buildFullResp
   无归一化);把「无认领人 → null」做归一化的是会话列表那条路
   (fillOrderSummaries + fillGroupBatchSummaries),而且只对有消息的会话
   生效——selectMyConversations 用 isNotNull(last_message_at) 把无消息的
   占位会话过滤掉了。前端照单接口响应判 null 会渲染出「管理员 #0」。

3. currentClaimerId 刻意没有 @NotNull:RELEASE 事件本来就没有新认领人,
   加了会让释放事件在参数校验阶段被拒、会话永远停在旧认领人身上。

顺带订正一条长期口口相传的错误说法:网关对 /internal/** 并非「一律 403」。
gateway 只给 /v3/internal/** 与 /internal/fleet/** 配了 Path predicate,
/internal/message/** 与 /internal/house/** 根本没有路由,请求在到达
JwtAuthFilter 之前就被路由层拒掉,返回的是 HTTP 200 + 业务体
{"code":404,"message":"接口不存在"}。净效果一致(网关不可达),呈现不同。

backend_status=deployed:两服务已滚到 dev-v3 tip 0f62fb072(PR #7490),
实例 LISTEN + Nacos healthy,三端点各打通,281002 负向用例四个角色全命中,
落库 conversation_key 已用 SQL 证实,测试数据已清理。

Refs #7328
2026-09-10 21:59:00 +08:00
API Changelog Bot d9f30eb9bf docs(changelog): #7324 订正 H1 住期筛选的区间口径(右开 → 两端闭)
changelog-filename-gate / validate (push) Successful in 3s
原文把 stayDateFrom/To 的匹配范围写成团期 `[出发日,结束日)`,右端开区间是错的。
实际谓词是 `depart_date <= stayDateTo AND end_date >= stayDateFrom`
(GroupBatchMapper.selectHouseClaimedPage:779-791),两端都闭。
实测:团期 end_date=2026-07-05 配 stayDateFrom=2026-07-05 命中。
前端照右开写日期选择器会漏掉最后一天。

同一份文档里 H4/H5 校验入住日合法性用的 `[出发日,结束日)` 是**对的**、不动
(assertStayDateInRange:568-575,`!stayDate.isBefore(endDate)`,
结束日是离店日不产生间夜)。两处口径本就不同,已在表格里写明区别,避免混用。

Refs #7324
2026-09-10 19:12:28 +08:00
API Changelog Bot fc6f223419 docs(changelog): #7324 房务团期看板与整团按日订房计划 CRUD(H1-H6 + release-all)
changelog-filename-gate / validate (push) Successful in 2s
七个新端点的前端交接件,重点写清四处「后端行为对、前端按直觉写会踩坑」的地方:

1. H1 列表 total 可能是 -1,语义是「未统计」——传 planStatus 且扫描页(500)被填满时
   走内存过滤降级路径。全仓其它分页都保证 total >= 0,直接拿它算总页数会出负页码。
2. H5 只传 version 的空提交:PENDING 行返 200 且只把 version +1(updateById 默认
   NOT_NULL 策略,null 不进 SET 子句,不清空任何业务字段),CONFIRMED 行抛 808692。
3. release-all 会返回「200 但什么都没释放」——整团都是过去的已确认行时,
   releasedPlanIds 为空、retainedPastPlanIds 非空、warnings=[PAST_STAY_RETAINED],
   与「团里根本没订房」的 808619 幂等出口是两条不同分支。
4. H4 响应恒带两个空数组 warnings / removedManualAllocIds(与 H5 共用 RespVO)。

另记两条与工单口径不一致、以源码为准的事实:
- 错误码实际新增 17 个(工单写 12 个),已按 HouseGroupBatchErrorCode 逐个列出。
- 部署顺序:hl-resource-service 必须先于 hl-order-service-v3,反序会让 order-v3 拿到
  roomCategory=null,fail-closed 房型守卫把每次 H4/H5 提交拒成 808691。

Refs #7324
2026-09-10 18:50:32 +08:00
Mimingguang 1f48714187 chore(changelog): #7456 前端 no-op 回写 not_required
changelog-filename-gate / validate (push) Failing after 2s
2026-09-10 18:21:26 +08:00
jw 6c62b1aa2b docs(changelog): #7456 团期生命周期后半段——核团开工自动推进 + 验团归档 + 反确认
changelog-filename-gate / validate (push) Successful in 2s
2026-09-10 18:10:23 +08:00
Mimingguang 6fee8114b8 chore(changelog): #7455 前端 no-op 回写 not_required
changelog-filename-gate / validate (push) Failing after 2s
2026-09-10 18:01:41 +08:00
jw 953d953bdc docs(changelog): #7455 团期十五个 admin 端点补判权(写口 manage / 详情名单 view / 列表看板 list)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-10 17:56:28 +08:00
Mimingguang 7ecd4da276 chore(changelog): #7322 前端交付 verified(ref 745cd9b8)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-10 17:19:23 +08:00
API Changelog Bot和Claude Fable 5.1 4a284f6323 docs(changelog): #7322 菜单种子已落地(PR #7467),补部署两条注意事项
changelog-filename-gate / validate (push) Successful in 3s
sys_menu 两行抢单池入口已由 V20260910_001 补上。
部署须知:#7322 部署清单本次起必须带 hl-user-service;
菜单树按 roleId 缓存 Redis(TTL 3600s),部署后需 DEL cache:menu:tree:role:*。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-10 16:06:07 +08:00
API Changelog Bot和Claude Fable 5.1 7b1601a7c2 docs(changelog): 补全 #7316 的订正——第四节仍有三处「无权限码限制」与已订正段落自相矛盾
changelog-filename-gate / validate (push) Successful in 2s
688c403 只订正了 :182 / :259 / :383 三处,同一文件里另有三处原样保留:
- :215 请求示例的 Authorization 头写「任意已登录管理端 token,无需 group-batch:view」
- :284 契约表行「✅ 任意已登录管理端角色调用」
- :288 「本端点无权限码限制」

其中 :284/:288 落在「四、契约约束与正确调用方式」——正是 mmg 据以实现判权与
589507 兜底的那一节,照它实现会完全不处理 589507,危害最大。

三处均已改为现行口径并标注订正日期,另补一条前端提醒:
FINANCE 角色持 finance:view 但不持 finance:advance,写端点按钮需单独控显隐。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-10 15:47:31 +08:00
API Changelog Bot和Claude Fable 5.1 d807fad55f docs(changelog): #7322 团期整团抢单与抢单池分流(前端契约交接件)
changelog-filename-gate / validate (push) Successful in 2s
五个新端点(抢单池列表/认领/释放/接管/我的团)+ 五个既有端点改造。
团单户不再进逐户抢单池,改以整团为单位认领;order_group_batch 新增
house_claimer_id / house_claimer_name / house_claimed_at 三列(Flyway V20260910_301 已执行)。

已部署测试服 HEAD 6d41d6148,32 条验收项中 28 条已取证,
含用 5 个真实登录账号过网关实测的归属与接管链路。

⚠️ 正文已注明一项尚缺的交付:sys_menu 的两行抢单池菜单入口尚未随迁移落库,
在补上之前新端点只能直接调用、后台菜单里点不到。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-10 15:43:36 +08:00
Mimingguang 5cdf062dd2 docs(changelog): #7232 frontmatter 回写 EXPENSE 付款字段勘误前端修复证据
changelog-filename-gate / validate (push) Failing after 2s
2026-09-10 15:42:42 +08:00
Mimingguang 41160bbfad docs(changelog): #7411 frontmatter 回写 not_required
changelog-filename-gate / validate (push) Failing after 3s
2026-09-10 15:32:32 +08:00
API Changelog Bot和Claude Fable 5.1 6cfa38b56d docs(changelog): #7411 团期核单共享成本三端点补判权(前端契约交接件)
changelog-filename-gate / validate (push) Successful in 2s
三端点权限码:
- GET  /v3/admin/order/group-batch/{groupBatchId}/settlement/summary → group-batch:finance:view
- GET  /v3/admin/order/group-batch/{groupBatchId}/settlement/cost    → group-batch:finance:view
- POST /v3/admin/order/group-batch/{groupBatchId}/settlement/cost    → group-batch:finance:advance

不持码返 589507,HTTP 恒 200,前端判 Result.code。
请求与响应结构一字未改,网关零改动(/v3/admin/** 已通配)。

已部署测试服 HEAD 6d41d6148,四档权限矩阵经真实登录态过网关实测,
无权限 POST 已用 SQL 前后对比证明零副作用。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-10 15:26:39 +08:00
yaosutu be7415b771 docs(finance): 更正 7232 changelog §10 出纳付款登记入参字段名勘误
changelog-filename-gate / validate (push) Failing after 2s
前端联调反馈 cashier/pay bizType=EXPENSE 报 400 出账账户不能为空/付款金额不能为空。
经测试服实调实证:后端 cashier/pay 为全 bizType 统一扁平入参,付款账户/金额字段名
固定为 payAccountId/amount(@NotNull 文案与前端 400 逐字一致),changelog §10 误把
输出字段名 fundAccountId/actualAmount 写进了请求入参表,前端据此调用触发校验失败。

更正内容(§10):
- 入参表 fundAccountId→payAccountId、actualAmount→amount,并补全量必填字段 payDate 等
- 变更点说明补「回写列名非入参字段」澄清
- 新增请求/成功响应示例(可直接照抄)
- 598602 错误文案对齐实测「业务单状态非已批准,不可付款」
- frontmatter status_note 追加勘误说明 + updated_at 升 2026-09-10

验证(测试服,FY-202609100001):
错误字段→复现 400;正确字段 payAccountId/amount→付款成功 LS202609100002、
余额 114894→114594、报销单回写 PAID+fundAccountId+paidAt、重复付款 598602 防重拦下。

Refs #7232
2026-09-10 15:19:23 +08:00
Mimingguang 4281aa8aca docs(changelog): #7390/#7347 frontmatter 回写 not_required
changelog-filename-gate / validate (push) Failing after 1s
2026-09-10 15:09:21 +08:00
API Changelog Bot和Claude Fable 5.1 688c403695 docs(changelog): #7347 finalize 团期住宿户级闸门 + #7390 孤儿持有行自动收敛;订正 #7316 的「无权限码是既有设计」
changelog-filename-gate / validate (push) Successful in 2s
#7347:整单核单 finalize 新增团期住宿户级硬闸门,新增错误码 584130。
存量统计 SQL 结果为 0,全量生效不做灰度。

#7390:双写扣减孤儿持有行自动收敛,解开重新提交配房恒抛 808902 的死锁。
显著标注「本单不修根因」——submitPersist 仍在 try 块外,孤儿行仍会继续产生。

#7316 订正三处:原文写「本端点无权限码要求……这是既有设计」,
那不是设计而是 #7411 要修的缺陷,已改写为发布时点的事实陈述并指向 #7411。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-10 14:56:19 +08:00
Mimingguang 3370e7a278 docs(changelog): #7389 frontmatter 回写 not_required
changelog-filename-gate / validate (push) Failing after 3s
2026-09-10 12:06:07 +08:00
API Changelog Bot和Claude Fable 5.1 9b67d6f4f0 docs(changelog): #7389 多夜配房释放改逐夜回补 + resource 库存账本告警码拆分
changelog-filename-gate / validate (push) Successful in 3s
PR #7423(合并提交 f5545b148)已合入 dev-v3,测试服 order-v3/resource-service 均已滚动部署。
本单无接口/字段/表结构变化,仅记录:1) 多夜配房释放由只补首夜改为逐夜回补;2) resource
房务库存账本内部一致性告警从共用 310404 拆分为 310417-310420 四个语义码。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-10 11:58:02 +08:00
Mimingguang b165e41337 docs(changelog): #7164/#7165/#7217/#7232 frontmatter 回写 verified
changelog-filename-gate / validate (push) Failing after 2s
2026-09-10 10:38:39 +08:00
Mimingguang 38a6cf5434 docs(changelog): #7323 frontmatter 回写 not_required
changelog-filename-gate / validate (push) Failing after 2s
2026-09-10 10:05:26 +08:00
API Changelog Bot 5eff130bf2 docs(changelog): #7323 团期房务地基——配房提交新增可选 replaceReason
changelog-filename-gate / validate (push) Successful in 2s
PR #7413(合并提交 1a3d3c43f)。本单为地基单,不新增/下线端点、网关零改动。
对前端唯一直接可见的变化是核心配房提交端点新增可选字段 items[].replaceReason,
语义为「仅记首次、不覆写」——重复提交同一配房不会更新已落库的原因文案。

另附一条实测发现的既有文档缺口:items[].arrange 实际会返回 inquiring,
而 Swagger 只列了 pending/waiting/confirmed/problem,提醒前端做兜底分支。

已部署测试服并经网关四步实测,DDL 已 SHOW CREATE TABLE 逐列比对零差异。
2026-09-10 09:40:34 +08:00
Mimingguang 92eb0956a8 docs(changelogs-v2): #7199 前端 not_required
changelog-filename-gate / validate (push) Failing after 3s
2026-09-10 09:27:08 +08:00
Mimingguang bdeaa623ed docs(changelogs-v2): #7378 前端 verified (hl-admin ref 4d016870)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-10 09:24:14 +08:00
API Changelog Bot 9ae0d869e4 docs(changelog): 修正 #7316 条目日前缀 08 -> 10(发布门禁 E_DAY)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-10 01:49:50 +08:00
API Changelog Bot cdc17540d5 docs(changelog): #7316 团期全团需求汇总补权限码与在团口径 + 结算汇总已核单数纠正
覆盖两个 PR:#7407(d951c0469)判权与 activeOrderCount 在团口径;
#7408(aafc6ae48)settledOrderCount 判据改用 settled 标志。

已部署测试服 aafc6ae48 并完成网关实测,backend_status=deployed、
gateway_status=verified 为真实态,第八节为实测证据。
2026-09-10 01:48:59 +08:00
yaosutu c74fc50926 docs(changelog): 供应商分页/列表出参补 contactPhone(#7199 / PR #7202)
changelog-filename-gate / validate (push) Failing after 2s
出参 SupplierListItemRespVO 新增 contactPhone(联系电话完整原值,管理后台授权场景)。
注:同 PR 曾新增 balance,已被 #7291 移除,changelog 内已显式标注勿消费。
2026-09-10 00:20:54 +08:00
Mimingguang 9d573b9a81 docs(changelogs-v2): #7400 前端 verified (hl-admin ref 02e17345)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-09 23:27:33 +08:00
yaosutu 19d434ef3b docs(finance): 补推期初建账/业务外收支/出纳/费用报销 changelog(#7164/#7165/#7217/#7232)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-09 23:21:35 +08:00
lc 78fe5b7a99 docs(changelogs-v2): #7400 供应商解绑免原因
changelog-filename-gate / validate (push) Successful in 3s
2026-09-09 21:39:43 +08:00
Mimingguang b4ab37a9bc docs(changelogs-v2): #7377 前端回写 not_required
changelog-filename-gate / validate (push) Failing after 2s
保存人员配置 staffList 必填、备品候选 keyword 转义、加备品行定点查三端点
行为变更,前端实查零改动:saveGroupBatchStaff 请求体恒带 staffList,备品
keyword 原样透传,加行 500 上限解除对调用方透明。
2026-09-09 18:03:10 +08:00
jw c95ab182dc docs(changelog): #7378 团期行程逐日汇总与逐户下钻(GB-ADM-018/019,新增接口)
changelog-filename-gate / validate (push) Successful in 3s
2026-09-09 17:57:34 +08:00
Mimingguang d1e45d6d2e chore(changelog): 财务域 8 篇 verified (hl-admin ref 21540997)
changelog-filename-gate / validate (push) Failing after 3s
2026-09-09 17:54:39 +08:00
Mimingguang b99b783557 chore(changelog): #7003 资金账户 verified (hl-admin ref 49359412)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-09 17:02:38 +08:00
yaosutu和Claude Opus 4.8 5025f8d69b docs(changelog): 财务域 账期/费用分类/业务外分类/收款账户/资金流水/资金互转/资金日报 7 篇入 changelogs-v2
changelog-filename-gate / validate (push) Failing after 2s
- 09_6951_财务账期设置:page/开新账期/封账 3 端点
- 09_7129_费用分类:tree/增/改/停用/启用 5 端点(DISABLED 统一+幂等)
- 09_7052_业务外收支分类:查询/增/改/停用/启用 5 端点(自动生码 NONBIZ_)
- 09_7003_收款账户:page/增/改/设默认/停用 5 端点
- 09_7003_资金流水:page/详情 2 端点(只读,含 remark)
- 09_7003_资金互转:page/发起 2 端点(双边成对记账+幂等)
- 09_7003_资金日报:daily 1 端点(closing=opening+收入−支出勾稽)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-09 16:25:37 +08:00
jw和Claude Opus 5 2b45ee9d44 docs(changelog): 团期人员配置 staffList 必填 + 备品候选关键字转义 + 加备品行改定点查(#7377)
changelog-filename-gate / validate (push) Successful in 2s
收口 2026-09-03 团期人员/备品合并后审计的余项(F-03/F-05/F-06/F-07),随 PR #7028 合入 dev-v3。

两处对外行为变更需前端注意:
- PUT /v3/admin/group-batch/:productBatchId/staff 的 staffList 改为必填,
  字段缺失或名字写错一律 400;改前会被当成「传空=清空」,静音软删整团配置还返 200。
  「显式传 [] 即清空」这条语义不变。
- 备品候选列表的 keyword 转义 LIKE 通配符,搜 % 或 _ 由「返回全库」变为「零结果」。

第三处对调用方透明:加备品行改走资源域新增的定点查,解除「备品库超 500 条后
第 501 条起加不进」的隐性上限,契约与错误码不变。

后端已部署 TEST 并经真实网关逐条实测;order-v3 全量 9303 例、resource 全量 2707 例 0 失败。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 16:25:30 +08:00
yaosutu和Claude Opus 4.8 89be26b98b docs(changelog): 财务域 参数设置(#6951)+资金账户(#7003/#7141) 2 篇入 changelogs-v2
changelog-filename-gate / validate (push) Failing after 3s
- 09_6951_财务系统参数设置:GET/PUT /admin/finance/params 2 端点
- 09_7003_资金账户:10 端点全量(含 #7141 三字段字典化 accountTypeName/natureName/channelName + /options 下拉)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-09 16:16:00 +08:00
Mimingguang 9d8e1945f4 chore(changelog): 回写 #7304 前端已验证 verified(mmg/51ca6946)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-09 13:55:49 +08:00
jw和Claude Opus 5 b22e67ca69 docs(changelog): #7304 团期时间线只读端点 GB-ADM-096(新增接口,面向 mmg)
changelog-filename-gate / validate (push) Successful in 2s
group_batch_status_log 此前只写不可读:十余条链路持续写入,全仓零生产读回方,
运营在页面上一条也看不到——#7283 那条「同步失败靠时间线让运营看见并手动去产品
后台取消班期」的唯一可见兜底入口因此实际不可见。

新增 GET /v3/admin/order/group-batch/:groupBatchId/status-logs:按 changedAt 升序
全量返回,extra 由 JSON 字符串解析成结构化对象,事件类型与前后状态的中文名由后端
给出(前端不必自建映射表),权限同码 group-batch:view。

backend_status=deployed / gateway_status=verified:已部署 TEST 并经真实网关逐条
取证 AC-1~AC-6,含读回 #7283 的 BATCH_PRODUCT_CANCEL_FAILED 兜底留痕。
frontend_status=pending(mmg 待接团期详情的「操作记录/时间线」区块)。

Refs HL#7304 (PR #7359, 合并提交 0b85f6831)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 13:45:07 +08:00
Mimingguang ce7e1fb007 chore(changelog): 回写 #7357 前端已验证 verified(mmg/15fea12f)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-09 09:55:57 +08:00
lc f03121f0f4 docs: 景区改绑供应商免原因交接(#7274 #7357)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-09 09:47:07 +08:00
API Changelog Bot 74dc7f0ede docs(changelog): 发布 #7339 库存幂等契约
changelog-filename-gate / validate (push) Successful in 2s
2026-09-08 22:30:49 +08:00
jw和Claude Opus 5 b22345d167 docs(changelog): #7294 补充 actualRefundAmount 的暂定值/定稿值口径(PR #7354)
changelog-filename-gate / validate (push) Successful in 2s
退款单在流团事务【提交之后】才建(异步),所以 approve 响应体里的
actualRefundAmount 是暂定值=退款诉求合计;随后服务端逐户回读实际建单结果,
把没建出退款单的户剔掉,改写成定稿值。要展示准确金额请重新拉一次详情。

本文原本已写「actualRefundAmount 只统计成功发起退款的户」,PR #7354 之前
实现其实是 Σ诉求、有户建单失败就对不上;现在实现与本文口径一致了。

顺带修两处当前校验器不再接受的 frontmatter:
consumer hl-ui → admin;not_required 不得保留 frontend_owner / verified_at。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 18:58:20 +08:00
Mimingguang 0081bc5682 docs(changelog): 回写 #7318 前端 verified(edefb5c4)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-08 18:17:57 +08:00
Mimingguang 3e669eefde chore(changelog): #7287 团期成团口径接真 verified(ref 7f775213)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-08 17:36:53 +08:00
lc e24d03a19c docs: 交付供应商账期与证照图片契约(#7318)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-08 17:32:41 +08:00
Mimingguang a244476a3c chore(changelog): #7344 not_required 确认(纯后端 failclosed,前端字典直显零改动)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-08 17:29:52 +08:00
jw和Claude Opus 5 9c1290d1c7 docs(changelog): #7344 取消班期活跃订单判据 fail-closed(聚合失败取保守侧 CANCELLING,出入参零变化)
changelog-filename-gate / validate (push) Successful in 2s
管理端取消班期在判「班期还有没有活跃订单」时用的是 fail-open 取数:order-v3
实时聚合一失败就退化为「无活跃订单」,班期被落成终态 CANCELLED 且全仓无路径
可自愈。改为聚合失败取保守侧 CANCELLING + WARN,与订单域内部入口口径对齐。

接口 / 字段 / 路径 / 参数 / 枚举 / 错误码零变化,batchStatus 取值集合与语义
不变,CANCELLING 与 CANCELLED 在下游四处判定中等价 → frontend_status=not_required。

backend_status=deployed / gateway_status=verified:已部署测试服,经真实网关实测
三条路径(无订单→CANCELLED、真实下单→CANCELLING、注入聚合失败→CANCELLING+WARN),
落库均以 SQL 复核。

Refs HL#7344 (PR #7348, 合并提交 2071286a1)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R2LSgt2xhmX2ae9M3rkdZg
2026-09-08 17:24:56 +08:00
Mimingguang a32b384cb1 chore(changelog): #7284/#7294 not_required 确认(出入参零变化,错误码拦截器透)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-08 16:56:42 +08:00
jw e22dbe465c docs(changelog): #7284 / #7287 / #7294 团期三单交接 mmg(均已部署测试服并实测)
changelog-filename-gate / validate (push) Failing after 2s
- #7284 团期下单校验改判实时库存:满员班期退单后能重新下单;满员时错误码由 581028
  改为 581031 / 581034;产品域库存聚合失败改 fail-closed(下单返 581027,展示链路不变)。
  前端待办:若对 581028 有特殊文案需改判;接口结构零变化。

- #7287 团期达门槛自动成团 + 未成团动作闸:新增自动成团定时任务(落地即暂停,需运营开启);
  团期详情新增 formingRooms / formingPeople / thresholdSource 且两个门槛改取实时值;
  班期表单与批量创建新增 minParticipants;未成团 / 未建团的资源动作拒 589552 / 589553。
  前端三项待办:成团弹窗「已售」改读 formingRooms、班期表单加最低成团人数、补录两个错误码。

- #7294 流团对已付款户也取消并发起退款:审批单「实退金额」不再恒为 0,改为「已发起退款金额」;
  新增 589554「团期下有出行中的子订单,不可流团」,发起与批复两个入口都会返。
  前端待办:补录 589554,并把「实退金额」文案改为「已发起退款金额」。

三份均按 v2 模板逐接口八子节撰写,本地校验器 PASS。
2026-09-08 16:47:02 +08:00
jw d795a2f0bb docs(changelog): #7159 补齐 581034 网关端到端实测证据,作废「未实跑」旧记录
changelog-filename-gate / validate (push) Successful in 3s
#7135/#7159 同 PR #7169 交付,本文档是 #7159 的口径落点。2026-09-06 记录的
「581034 线上端到端未实跑」已于 2026-09-07 09:2x 由网关实测补齐(12-01 期
maxParticipants 改 3 → adultCount=4 返 581034、=2 返 200 建单后取消复原),
原文表述已作废。同时补 Issue #7159 反链,并按前端交付实况回填 target_release。
2026-09-08 16:29:47 +08:00
Mimingguang 74abca87c9 chore(changelog): #7154 团期财务Tab verified(ref af7cc62b),修正陈旧 backend/gateway 为已部署
changelog-filename-gate / validate (push) Failing after 2s
2026-09-08 15:56:23 +08:00
Mimingguang d749d22f2b chore(changelog): 回写 #7105 verified(合同保险面板嵌芯片Tab已交付 838e77da)
changelog-filename-gate / validate (push) Failing after 3s
2026-09-08 14:48:31 +08:00
Mimingguang fc2b0f9090 chore(changelog): 回写 批次A汇总 verified(2eb27845) + #7204 not_required(chipAggState 已覆盖)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-08 14:06:12 +08:00
Mimingguang 990db59ea8 chore(changelog): 回写 #7197+#7149 verified(#7149 第二批冻结置灰已交付 22eb9b03)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-08 13:30:19 +08:00
Mimingguang 8992795688 chore(changelog): 回写 #7095 verified(团期转订单已交付 cc07a40d)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-08 13:18:09 +08:00
Mimingguang 76ba72bf81 chore(changelog): 回写 #7196 verified + #7283 not_required (#7196 流团改申请审批已交付 20905206)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-08 12:49:35 +08:00
Mimingguang beeb6d9cdd chore(changelog): 回写 #7211 前端交付验证(verified, ref 86340b24)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-08 12:16:13 +08:00
jw 627cbe1fe0 docs(changelog): #7283 流团后班期自动置为不可售 + 已流团团期下单返 589551
changelog-filename-gate / validate (push) Successful in 2s
后端已部署测试服并逐条实测(AC-1~AC-18 全过)。接口出入参零变化,
前端两项待办:补录错误码 589551、知悉班期会显示「取消中/已取消」。
上线顺序硬约束:product-v2 先、order-v3 后,回滚反序。
2026-09-08 11:35:22 +08:00
Mimingguang a4b44cedce chore(changelog): 回写 #7265 前端交付验证(verified, ref 626bc9e5)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-08 11:14:06 +08:00
Mimingguang 6d966716fb chore(changelog): 回写 #7174 前端交付验证(verified, ref 8c5574c4)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-08 10:33:14 +08:00
Mimingguang 104c31e08c chore(changelog): 回写 #7210 前端交付验证(verified, ref 96ef0c07)
changelog-filename-gate / validate (push) Failing after 3s
2026-09-08 10:23:44 +08:00
Mimingguang d2ed4973f7 chore(changelog): 回写批次A(#7188/#7189/#7190/#7250)与 #7291 前端交付验证
changelog-filename-gate / validate (push) Failing after 2s
五条均 frontend_status verified、owner mmg、verified_at 2026-09-08;批次A 四项 frontend_ref=2eb27845,#7291 frontend_ref=41f0bacc(均 hl-admin v2.1 可达)。
2026-09-08 08:02:04 +08:00
lc a7a3a0bb3e docs(changelog): publish supplier field removal (#7291)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-07 22:52:09 +08:00
Mimingguang eb7502169d docs(changelog): #7067 前端 verified,U1-U7 全落地(commit af4ad08c)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-07 21:29:21 +08:00
Mimingguang cb4262b39b docs(changelog): #7290 前端 verified(commit 87cf8ba8)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-07 20:23:24 +08:00
lc 0b86d2593f docs: 下发供应商合同必填与去原因契约(#7290)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-07 19:53:41 +08:00
Mimingguang 0c042ba736 docs(changelog): #7203 verified 回写;#7067 记 U5 已交付
changelog-filename-gate / validate (push) Failing after 2s
2026-09-07 19:02:13 +08:00
wx和Claude Opus 5 350c7a7124 docs(changelog): #7149/#7210 第二轮复审返工对外变更交接 mmg
changelog-filename-gate / validate (push) Successful in 2s
打回原因长度 512→500(逐单打回与 dispatch 此前无上限)、confirm-check 新增
NIGHTS_MISMATCH / DAY_NUMBER_INVALID 两个缺失原因与 expectedNights/actualNights 字段、
房务详情页驳回按钮改按订单判配房并新增一条 disabledReason 文案,另附冻结期被房务退回后
可重提、待出发/行程中可整团确认、需求改版配房跟随迁移三条行为变化。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-07 17:43:27 +08:00
Mimingguang 689df8b520 docs(changelog): #7274/#7244 前端 verified 回写
changelog-filename-gate / validate (push) Failing after 2s
2026-09-07 17:35:20 +08:00
lc eba4d9e7dc 景区首次设置供应商免变更原因(#7274)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-07 16:55:26 +08:00
Mimingguang 8347561971 docs(changelog): #7023 团期物资阶段门 前端 not_required 复核确认
changelog-filename-gate / validate (push) Successful in 2s
2026-09-07 16:54:29 +08:00
jw和Claude Opus 4.8 c276b2790c docs(changelog): 补 #7023 团期物资阶段门(验收补做时发现缺 changelog)
changelog-filename-gate / validate (push) Successful in 2s
#7023 三端点新增阶段门(非 MATERIAL_PREPARING 返 589520)+ 合同保险前置门,
属接口行为变更但原工单未列 changelog。走验收标准时补上。

已合入 dev-v3;2026-09-07 TEST 网关实测非物资准备态 POST supplies 返 589520。
纯服务端拒绝,前端按错误码提示(frontend not_required)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-07 16:43:53 +08:00
Mimingguang a246b25e22 docs(changelog): #7234 敏感读取判权统一到token角色 前端 not_required
changelog-filename-gate / validate (push) Failing after 1s
2026-09-07 16:37:29 +08:00
jw和Claude Opus 4.8 133955c190 docs(changelog): #7234 敏感读取判权统一到 token 当前角色(车务明文+供应商域)
changelog-filename-gate / validate (push) Successful in 2s
契约不变,仅拒绝口径与审计语义:判权依据由库默认角色改为本次请求 token 当前角色(X-Admin-Role),
撤权最迟 10 分钟生效。TEST 网关实测通过(AC-10/11/12),PR #7272 已合 dev-v3。
backend_status=deployed / gateway_status=verified。

Refs #7234

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-07 16:27:38 +08:00
Mimingguang 278730fc75 chore(changelog): #7095 转订单接真入 backlog 待统一审;#7080 前端实查判 not_required
changelog-filename-gate / validate (push) Failing after 2s
2026-09-07 15:56:09 +08:00
jw和Claude Opus 4.8 15d63f0ba2 docs(changelog): #7095 #7080 TEST 网关实测通过,回写 deployed
changelog-filename-gate / validate (push) Successful in 2s
两单 2026-09-07 部署 dev-v3 到测试服并过网关实测:
- #7095 团期转订单:候选查询、成功转期(计数守恒 2/1→0/0 与 0/0→2/1、金额重算、
  订单归属改到目标期、订单侧 GROUP_BATCH_TRANSFER timeline)、容量守卫拒绝路径全过。
  含后续修复 #7270(订单 timeline 漏实现)、#7278(容量 0=不限口径,网关实测暴露)。
- #7080 团期配人扇出:第7期55户配导游后 guide 芯片 TODO(0/55)→DONE(55/55),
  清空后回落 TODO(0)——改前扇出不同步订单侧状态、芯片恒 TODO,此为修复直接证据。

backend_status pending→deployed,gateway_status→verified,verified_at 2026-09-07。
文件名日前缀按推送日改为 07。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-07 15:49:31 +08:00
API Changelog Bot和Claude Opus 5 4c24a515cf fix(7250): 约/保异常文案改「合同异常/保险异常」+ 芯片明细编号更正
changelog-filename-gate / validate (push) Successful in 2s
后端 GroupBatchChipResolver 的 CONTRACT_FAILED 含「作废中+已作废」、INSURANCE_FAILED 含
「已取消+投保失败」,原文案「合同已作废」「投保失败」以偏概全(正在作废会被说成已作废、
主动退保会被说成投保失败)。统一改为「{error} 户合同异常」「{error} 户保险异常」,
精确原因走明细接口 GB-ADM-094(约) / GB-ADM-095(保)。房/车「已打回」保持不变。

同步更正「精确分布请点进 GB-ADM-092 / 093」的编号错误(092/093 是导/摄),
改为该芯片对应的逐户明细 GB-ADM-090~095 并列出六芯片映射。

涉及 07_7250_* 与 07_frontend_团期看板对齐后端契约待办汇总-* 两篇。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FJVi8pe9KYmLwLARnaYhhC
2026-09-07 15:48:22 +08:00
Mimingguang b16d54e89e chore(changelog): #7265 原地修改推翻 #7182 新记录式假设,入 backlog 待统一审
changelog-filename-gate / validate (push) Successful in 2s
2026-09-07 15:34:54 +08:00
API Changelog Bot和Claude Opus 5 c656b273f0 fix(#7203): 更正二轮复审返工的三个新错误码与核心口径
changelog-filename-gate / validate (push) Successful in 2s
二轮复审(PR #7275)推翻了旧口径「同步失败=订单侧未收到」的断言。实际上:
- 远端已提交成功但回执丢失时,发送端重试耗尽后也会进隔离
- 此时订单侧已是 DONE,直接排车会被 605906 拒
- 故撤销接口需回查订单侧实况后分流三个错误码

本次更新:
1. 补充新增的两个错误码(605923/605924)及其触发条件和前端处置
2. 限定「不必先撤销」仅对 605921 分支成立,605923/605924 必须走运维对账
3. 推翻行 422-425 的核心断言,澄清隔离不等于订单侧未收到
4. 更新 syncStatus 值表 FAILED 的说明文案
5. 注明测试证据表中该行是旧口径的记录
6. 更新 front-matter status_note 记录二轮复审已合并

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-07 15:31:09 +08:00
lc 0854f5753f docs: 发布供应商账户原地修改与变更明细契约 (#7265)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-07 15:28:14 +08:00
Mimingguang ec158880e4 chore(changelog): #7263 前端实查判 not_required(无兜底/反推,值由错变对自动改善)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-07 15:17:44 +08:00
jw和Claude Opus 4.8 699fc4c04e docs(changelog): #7263 大期数团期产品库存字段静默降级修复(修复,前端无需改动)
changelog-filename-gate / validate (push) Successful in 2s
分片下沉 product-v2 GroupBatchStockHelper,≥约260期 GROUP 产品的库存/已报名/
有效订单数/展示态由静默错值恢复准确;无接口/字段/路径/参数/枚举/错误码变化。
后端 PR #7268 squash f1eb72444 合入 dev-v3,测试服 313 期 AC-1~AC-13 实测通过。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T5raGi2iBzrbDwiENbpWY2
2026-09-07 15:13:58 +08:00
Mimingguang 59dd1eac9a chore(changelog): #7105 合同保险 Tab 入 backlog 待 #7067 后统一审,保持 pending
changelog-filename-gate / validate (push) Successful in 2s
2026-09-07 14:53:39 +08:00
jw和Claude Opus 5 347d5ec664 docs(changelog): 团期合同保险面板与逐户出具 #7105
changelog-filename-gate / validate (push) Successful in 2s
新增面板读、手动开、作废重开、批量催签四个端点。

如实标注三条:
1. 出具依赖房/车/导/摄四项 ready,而 hotel_ready 线上无任何写入方(#4132),
   故面板 issuable 恒 false、三个写动作恒返 589548 —— 前端可先接,
   但 #4132 落地前看不到出具效果;面板读与催签不受限制,已实测可用。
2. 出具成功的正向路径未在网关侧实测(该状态在 TEST 造不出来),
   仅单测覆盖;589549 同样未在真实环境命中。
3. 上线必须先部署 hl-user-service 再部署 order-v3,否则写动作全返 589507。

门的口径以 #7248/PR#7249 修正后为准(判四项 ready,不判团期状态)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-07 14:34:51 +08:00
Mimingguang 1c2156fbda chore(changelog): #7203 决策并入 #7067 U5 向导四步化一起做,保持 pending
changelog-filename-gate / validate (push) Successful in 2s
2026-09-07 14:14:15 +08:00
API Changelog Bot 8e77a7b30a docs(changelog): #7244 补记后端复测结论——选品页无法选班期是前端未消费 batches,非后端问题
changelog-filename-gate / validate (push) Successful in 2s
2026-09-07 14:00:36 +08:00
API Changelog Bot 9f27d9bfb8 changelog(7203): 车务显式声明「整段不用车」——声明/撤销/回显三个新增端点
changelog-filename-gate / validate (push) Successful in 2s
#7067 去槽位化后占位行退役,「车务决定整段不派车」在车管侧就是零派车行,
与「还没开始排车」在库里逐字相同、无法区分,订单侧的用车需求因此永久卡在处理中。
本单新增需求级显式动作承载这个语义(不按零行推断、不放宽常规快照门禁、不复活占位行)。

三个端点各自自包含:入参/出参/请求示例/响应示例/空数据形态/错误响应/业务边界。
另附枚举字典、正确 vs 错误 payload 对照、数据库行为、边界行为与不影响范围。

前端最要紧的三条已写在开头:
- syncStatus 不是订单状态,SYNCED 只表示「送到了」,order-v3 可能按自身规则忽略;
- declarationStatus=REVOKED 时 syncStatus 为 null,不要展示同步状态;
- 撤销按钮只在 syncStatus=SYNCED 时可点,但「只想继续排车」不必先撤销。

实测证据章节为测试服网关真实往返(HEAD 02d7e59be,fleet 双实例),
逐条核对了订单侧 status / assignment_snapshot_revision /
assignment_completion_disposition / assignment_count / assignment_no_vehicle_reason,
不是只看 HTTP 200。
2026-09-07 13:41:46 +08:00
Mimingguang 55e4c68e36 chore(changelog): #7067 记 U2 读取面已交付(ref 44dafb4d),保持 pending 待 U3-U7
changelog-filename-gate / validate (push) Successful in 2s
2026-09-07 13:29:49 +08:00
jw和Claude Opus 5 0f2c589874 docs(changelog): 前端待办汇总第 5 项解除依赖——#7250 changelog 已发布
changelog-filename-gate / validate (push) Successful in 2s
完成 #7250 AC-9 后半句:把第 5 项芯片计数 tooltip 的依赖指向本单 changelog,
并更新为「依赖已解除,可开工」。

两处过时表述:
- status_note 原写「其 changelog 已写好但待测试服实测后才发布,故本条仍挂起」
- 第 5 项正文原写「后端 #7250 的 changelog 发布后再做…该篇待测试服实测后发布」

现均改为已发布:07_7250_* 于 2026-09-07 通过测试服 AC-1~AC-9 实测后推送
(commit 16e0133),PR #7254 已合入 dev-v3 (47c9a6d29)。

注:本次提交同时带入该文件此前未提交的两行改动(指向 #7250 文件名、
status_note 补 PR #7254 说明),二者与本次更新是同一件事的前后半段,
分开提交会留下自相矛盾的中间态。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-07 12:54:16 +08:00
Mimingguang db278d432c chore(changelog): #7244 前端待办入 backlog,待 U2 后统一汇总审派发
changelog-filename-gate / validate (push) Successful in 2s
2026-09-07 12:42:36 +08:00
API Changelog Bot和Claude Opus 5 97608cfca6 docs(changelog): #7244 选品接口透出 productType 与团期班期列表
changelog-filename-gate / validate (push) Successful in 3s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7Xpgcv9nncadAXQtWhg4P
2026-09-07 12:40:28 +08:00
Mimingguang eb535dbc50 chore(changelog): #7250 补记解除汇总工单第5项挂起,并入 backlog 待 U2 后统一派发
changelog-filename-gate / validate (push) Successful in 2s
2026-09-07 12:23:00 +08:00
jw和Claude Opus 5 16e0133257 docs(changelog): #7250 团期看板芯片透出 chipStats 计数 — 实测通过,解除挂起
changelog-filename-gate / validate (push) Successful in 2s
PR #7254 合入 dev-v3(47c9a6d29)后,草稿的 status_note 写明「待部署测试服
并过网关实测后改 deployed 再推送」。2026-09-07 已部署 dev-v3 到测试服并逐条
走完 AC-1~AC-9,故回写 backend_status=deployed / gateway_status=verified /
verified_at=2026-09-07 并推送。

网关实测要点:
- chipStats 六项与 chips/{chip} 明细端点的 totalCount/doneCount 逐一相等
- error 计数与明细 items 里失败态户数相等(vehicle 芯片:55 户中 1 户
  REJECTED_TO_CONSULTANT,chipStats.vehicle.error=1)
- 跨 6 个产品 55 行普通聚合分支满足「error>0 当且仅当 chips=ERROR」,违例 0
- 54 个零户行计数全零,未建团行 chips 仍为 TODO(本单不统一零户状态)
- board / 详情 / export / chips 明细四个接口均不含 chipStats,无回归
- VO 纯新增 58 行零删除;Service 层无查询增减,aggregateAll 仍单次调用

AC-6d 原缺 listPage_notFormedRow_chipStatsAllZero(只有 zeroOrderRow 那条,
覆盖的是命中行不是未建团行),已由 PR #7258 补齐(6d3b38de7)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-07 12:17:38 +08:00
yaosutu 16c68b6b25 docs(mp): C端发票切流v3状态枚举值域变化+email必填收紧 (#7252)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-07 12:05:07 +08:00
Mimingguang a6c9a3cb00 chore(changelog): #7245 前端实查判 not_required;#7210 复审返工增量并入待办保持 pending
changelog-filename-gate / validate (push) Successful in 3s
2026-09-07 12:04:48 +08:00
API Changelog Bot ca5e4073ce changelog(7067): 补第三轮返工的契约增量九之三——requirementReopened 语义扩宽与 NO_DISPATCH_ANCHOR
changelog-filename-gate / validate (push) Successful in 2s
第二轮返工合并后的独立复审发现 2 处缺口(PR #7237 已修并部署测试服):
- 存量订单二次改派后最终方案被误判不完整(改派血缘退休),
- 接送机清空后「开关补开再重存」无法收敛(重开判据由跃迁改为补偿式)。

对前端无破坏性变更(无字段增删、无改名改类型),只有:
C1 requirementReopened 触发面变宽(跃迁 → 状态补偿),重复保存幂等;
C2 reopenBlockedReason 新增取值 NO_DISPATCH_ANCHOR(原来这种情况沉默回 null);
C3 补充九之二 B6「重存一次即可收敛」的前提——要求日上得有可配置的派车行;
C4 内部修复说明(无契约变更)。

front matter 的 status_note 同步更新为三轮返工的口径。
2026-09-07 12:01:57 +08:00
jw和Claude Opus 5 3b2883d1d3 docs(changelog): #7245 团期看板班期名去空格 + 不限容量 remain 统一 null + board 库存同源
changelog-filename-gate / validate (push) Successful in 2s
三个读端点(GB-ADM-001 分页 / board / GB-ADM-002 详情)的响应值修正,
路径、入参、响应结构均未变。

关键变化:remainRooms 与 remainParticipants 为 null 表示「不限」,前端
不要按 === 0 判满员。改前容量为 0 时返 0,而同列表未建团行返 null,
两类行语义打架,运营会看到「剩余 0 人」误判满员。

另两处:batchName 由服务端去前后空白(产品侧存量脏值经合并层实时透出,
存量列不自愈);board 未建团行已用房数改取产品侧 occupiedRooms(含线下
占位),与分页及 product schedule/list 同源——改前容量 8/占位 3/线上 0
时 board 回「剩 8」而实际剩 5。

2026-09-07 测试环境网关实测 AC-1/2/4/4b/5/6 全部通过;本地全量 8728 例
0 failures。backend_status=deployed / gateway_status=verified。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-07 11:57:10 +08:00
API Changelog Bot 800c9bbab3 Merge remote-tracking branch 'origin/main'
changelog-filename-gate / validate (push) Successful in 2s
2026-09-07 11:55:26 +08:00
API Changelog Bot和Claude Opus 5 deef7dc56f changelog: #7210 复审返工补记——权限改按 token 当前角色判权、逐单打回清团级标记(PR #7242)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XYL5S9SsBtkg7aGyFAbrrQ
2026-09-07 11:52:02 +08:00
Mimingguang 0be1a7f362 chore(changelog): 汇总工单补 c39fb8a 芯片 tooltip 口径修正说明(#7250 仍挂起)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-07 11:38:15 +08:00
API Changelog Bot c39fb8ac24 changelog(frontend): 芯片 tooltip 文案修正——done 是已完成数不是待配数、异常措辞按芯片区分、error>0 不等于红色(后端有覆盖规则)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-07 11:22:13 +08:00
Mimingguang aacc31a3da chore(changelog): 团期看板前端待办汇总标 pending 入队(#7188/7189/7190 归集,#7250 挂起)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-07 11:13:38 +08:00
API Changelog Bot ce97c51aa9 changelog(frontend): 芯片计数依赖单号更正为 #7250
changelog-filename-gate / validate (push) Successful in 2s
2026-09-07 11:08:13 +08:00
API Changelog Bot ae20c451a1 changelog(frontend): 团期看板对齐后端契约待办汇总——第N期标题 / scope 班期范围 / 出行完毕页签 / 未建团行交互 / 芯片计数(依赖后端 #7246)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-07 11:05:22 +08:00
Mimingguang ae41bbcdee chore(changelog): #7196 团期流团申请审批标 pending 入队
changelog-filename-gate / validate (push) Successful in 2s
2026-09-07 10:22:58 +08:00
jw和Claude Opus 5 da07ac2ebf docs(changelog): 团期流团改为申请与审批 #7196
changelog-filename-gate / validate (push) Successful in 3s
发起流团端点语义变更(立即执行 → 提交申请,理由改必填,新增权限与阶段限制),
新增审批中心列表 / 申请详情 / 同意 / 拒绝 4 个端点。

后端已部署 TEST 并实测 R1-R10 全过;前端待接。
如实记录三条限制:批准后无客户通知、抄送定制师只记录不推送、
已付款户流团不会被取消/退款(存量问题,本单未修,另行排期)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-07 10:14:31 +08:00
Mimingguang de56358ea8 chore(changelog): #7182 供应商账户审批前端交付标 verified(ref 326a1523)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-07 09:51:52 +08:00
API Changelog Bot和Claude Fable 5.1 bab71b6bdf changelog: #7211 定制师↔团期管理员站内会话 GROUP:{orderId}——open-group 新增、聊天/列表/已读/未读改造、itinerary 与团期名单表新增字段、SSE targetPermissionCode(新增接口·管理后台)
changelog-filename-gate / validate (push) Successful in 2s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XYL5S9SsBtkg7aGyFAbrrQ
2026-09-07 04:57:00 +08:00
wx 1548a68d4b docs(7067): 补返工二轮与端到端阻断修复的契约增量(四步向导 step 号、finalPlanPublished、门禁可为 null)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-07 04:39:11 +08:00
API Changelog Bot和Claude Fable 5.1 de167a0c1c changelog: #7210 团期管理员确认/打回改造 M1/M2——confirm-check 预检、589533/589534/589535、reject body 破坏性变更、逐单入口权限(修改接口·管理后台)
changelog-filename-gate / validate (push) Successful in 2s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XYL5S9SsBtkg7aGyFAbrrQ
2026-09-07 01:45:02 +08:00
API Changelog Bot 8af302c942 Merge remote-tracking branch 'origin/main'
changelog-filename-gate / validate (push) Successful in 2s
2026-09-07 00:57:42 +08:00
API Changelog Bot a591ff1d7a changelog(7189): chips 键名 photo、未建团行金额串口径修正 2026-09-07 00:56:12 +08:00
API Changelog Bot f53f52ca15 changelog(7189): 按门禁补齐 export/board/products 逐接口自包含段落与 TODO 反引号 2026-09-07 00:55:36 +08:00
API Changelog Bot b794316e5a changelog(7189): 团期看板以产品全班期为基底 + scope 班期范围筛选 + 页签期数 product 侧计数(PR #7219),已部署 dev-v3 网关复测 23/23 + AC-14 2026-09-07 00:54:11 +08:00
yaosutu 60e683921a docs(changelog): 定制需求管理后台接口迁移 v3 路径(Epic #7171)
changelog-filename-gate / validate (push) Failing after 2s
customize 定制需求域由 order-v2 迁往 order-v3,管理后台 5 个接口
base 路径 /admin/order/customize → /v3/admin/order/customize,
仅路径前缀变化,字段/方法/出入参契约零变更。旧 v2 路径已下线 404。

Refs #7174
2026-09-07 00:49:24 +08:00
API Changelog Bot和Claude Fable 5.1 c744e20340 changelog(7188,7190): 团期看板 batchLabel 序号透出(PR #7209)+ 团期九态/八桶与出行完毕自动推进(PR #7212),均已部署 dev-v3 网关复测
changelog-filename-gate / validate (push) Successful in 2s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7Xpgcv9nncadAXQtWhg4P
2026-09-06 21:51:08 +08:00
API Changelog Bot和Claude Fable 5.1 2a906d67f7 changelog(7197): 订单详情 data.main 透传 groupBatchStatus(修改接口·管理后台)
changelog-filename-gate / validate (push) Successful in 2s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XYL5S9SsBtkg7aGyFAbrrQ
2026-09-06 21:45:25 +08:00
API Changelog Bot和Claude Fable 5.1 375520d4bd changelog(7204): 团期看板导/摄芯片聚合态零指派 TODO(PR #7207,已部署 dev-v3 网关复测)
changelog-filename-gate / validate (push) Successful in 2s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7Xpgcv9nncadAXQtWhg4P
2026-09-06 20:33:08 +08:00
API Changelog Bot和Claude Fable 5.1 7f634e509d gate: 占位符检测忽略代码围栏与反引号内文本——接口枚举值本身可能叫 TODO(团期芯片聚合态,#7204)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7Xpgcv9nncadAXQtWhg4P
2026-09-06 20:33:05 +08:00
lc e1b80226fc docs(changelog): 发布7182供应商账户审批接口
changelog-filename-gate / validate (push) Successful in 2s
2026-09-06 19:57:03 +08:00
Mimingguang f9ff754579 chore(changelog): #5935 端点已被 #7067 删除标 not_required;#7154 后端 pending 保持挂起
changelog-filename-gate / validate (push) Failing after 2s
2026-09-06 19:32:17 +08:00
Mimingguang 35715d7ba0 chore(changelog): #7149 补 0451e4c 错误码优先级更正前端零改动说明
changelog-filename-gate / validate (push) Successful in 2s
2026-09-06 19:25:19 +08:00
Mimingguang 85dec7085f chore(changelog): #7067 记 U1 交付进度;团期看板子订单恒空缺陷单标 verified(ref 7d652bdc)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-06 19:24:54 +08:00
API Changelog Bot和Claude Fable 5.1 0451e4ceaa changelog(7149): 更正错误码优先级口径——入口结构校验先于状态校验,对外只变团单 582099 先于 582016;冻结期例外按最高版本组
changelog-filename-gate / validate (push) Successful in 2s
复审指出原文把事务内 doUpsertHotelRequirement 的校验顺序写成公开接口整体优先级,忽略了直提入口进事务前的团单/结构前置校验。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XYL5S9SsBtkg7aGyFAbrrQ
2026-09-06 19:12:17 +08:00
API Changelog Bot和Claude Fable 5.1 077845c8aa changelog(frontend): 团期看板展开行子订单列表恒空——store.currentGroupBatchId 只在详情页赋值致 PeriodRow 门控恒空;GB-ADM-003 实测正确(关联 #7204/#7188/#7189/#7190)
changelog-filename-gate / validate (push) Successful in 2s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7Xpgcv9nncadAXQtWhg4P
2026-09-06 18:57:13 +08:00
Mimingguang d80b3ee60b chore(changelog): #7149 status_note 折入 PR #7200(直提入口房数0统一582099),前端无新增改动
changelog-filename-gate / validate (push) Successful in 2s
2026-09-06 18:28:55 +08:00
API Changelog Bot和Claude Fable 5.1 0623aecfaa changelog(7149): 补 PR #7200(直提入口团单房数 0 统一 582099)
changelog-filename-gate / validate (push) Successful in 2s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01XYL5S9SsBtkg7aGyFAbrrQ
2026-09-06 17:51:06 +08:00
API Changelog Bot 79da505a41 docs(7067): 派单去槽位化按行程日配车 + 接送机独立配置四步向导交接件
changelog-filename-gate / validate (push) Successful in 2s
14 个接口的自包含契约(含 4 个删除端点与 1 个改名端点的前端迁移指引),
backend_status=deployed / gateway_status=verified,网关实测证据已回填。

Refs wx/HL#7067
2026-09-06 17:50:13 +08:00
Mimingguang 82026c2a92 chore(changelog): #7149 status_note 记冻结置灰待后端 #7197 透传 groupBatchStatus
changelog-filename-gate / validate (push) Successful in 2s
2026-09-06 17:32:13 +08:00
Mimingguang 5a74bf554c chore(changelog): #7149 记第一批前端交付(必填+入口恢复),冻结置灰待 batchStatus 数据源
changelog-filename-gate / validate (push) Successful in 2s
2026-09-06 17:22:02 +08:00
API Changelog Bot和Claude Fable 5.1 184ca5ed44 changelog(7149): PR #7184 三轮——订单详情 days[].customerSelfBooked 新增字段说明
changelog-filename-gate / validate (push) Successful in 2s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01XYL5S9SsBtkg7aGyFAbrrQ
2026-09-06 17:10:27 +08:00
API Changelog Bot和Claude Fable 5.1 fbe1de4d91 changelog(7149): PR #7184 二轮——错误码优先级变化(核心订单也受影响)、调整入口 582099 同口径、汇总不保证逐日连续、详情统计同步跳自订晚
changelog-filename-gate / validate (push) Successful in 2s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01XYL5S9SsBtkg7aGyFAbrrQ
2026-09-06 16:56:52 +08:00
jw和Claude Opus 5 41f3f69500 docs(changelog): #7060 成团驱动子订单流程推进,打通定制师配房配车待办
changelog-filename-gate / validate (push) Successful in 2s
POST /v3/admin/order/group-batch/:groupBatchId/group 新增副作用:成团时把
该团活跃子订单从 AWAITING_PROFILE 推进到 RESOURCE_PREPARING,由既有
syncFlowTodos 产生配房/配车待办派给定制师。

接口路径、入参、出参均未变,前端无需改动;变化在服务端副作用。
调用方若缓存过子订单状态需刷新。

边界:只从 AWAITING_PROFILE 推进,AWAITING_PAY 不越过支付闸门;重复成团
幂等(CAS);待办派发走独立事务,失败不回滚成团。

2026-09-06 测试环境造数补验,6 组用例通过。核心两条在真实数据上确证:
成团后子订单 flowStatus 由 AWAITING_PROFILE 变为 RESOURCE_PREPARING;
另一单成团时为 AWAITING_PAY,成团后未被推进。

backend_status=deployed / gateway_status=verified。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-06 16:41:24 +08:00
Mimingguang 473ac246ed chore(changelog): 回写 #7178 前端交付状态
changelog-filename-gate / validate (push) Failing after 2s
2026-09-06 16:40:20 +08:00
API Changelog Bot和Claude Fable 5.1 fc87e3280a changelog(7149): 复审补漏 PR #7184——汇总跳过自订晚、团单房数为空/0 统一 582099、校验顺序说明
changelog-filename-gate / validate (push) Successful in 2s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01XYL5S9SsBtkg7aGyFAbrrQ
2026-09-06 16:40:06 +08:00
Mimingguang a107bc9f18 chore(changelog): 回写 #7135/#7142/#7143/#7158/前端缺陷条前端交付状态
changelog-filename-gate / validate (push) Failing after 2s
2026-09-06 16:33:44 +08:00
jw和Claude Opus 5 70c1f44650 新增团期调整满团名额同步产品域库存接口说明(#7178)
changelog-filename-gate / validate (push) Failing after 2s
修的是「调了不生效」:调名额此前只写订单域,而库存权威在产品域,
导致加名额放不出空位、减名额停不了售,但看板数字会变。

请求体不兼容变更:{maxParticipants,maxRooms} 两个绝对值 →
{capacityDelta,reason} 净增量且只调户数;新增阶段门(仅招募中、
资源准备中可调)与 group-batch:manage 权限校验;响应改为返回
调整前后值、已报名与余量。

后端已部署 TEST 并实测:加减名额驱动满团即停/放开继续招募、
低于已报名拒绝且零写入、物料准备起阶段门、已成团加名额仍保持成团。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-06 16:21:40 +08:00
jw和Claude Opus 5 a7c44c0caa docs(changelog): 团期财务总览与预支复用订单预支(#7154 / PR #7170)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-06 16:20:04 +08:00
API Changelog Bot和Claude Fable 5.1 354d9083a7 scripts: validate-changelog-frontmatter 增加 --files 提交前自检模式(与 pre-push 门禁同规则,供作者/Agent 与 hl-workflow lint 复用)
changelog-filename-gate / validate (push) Successful in 2s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01XYL5S9SsBtkg7aGyFAbrrQ
2026-09-06 16:18:27 +08:00
API Changelog Bot和Claude Fable 5.1 7b9b60b9ac changelog(7149): 按 CHANGELOG_TEMPLATE 重写——三接口自含入参/出参/示例/错误/边界,补对比与影响评估(门禁)
changelog-filename-gate / validate (push) Successful in 2s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01XYL5S9SsBtkg7aGyFAbrrQ
2026-09-06 16:11:30 +08:00
API Changelog Bot和Claude Fable 5.1 c1d7fed7b6 changelog(7149): 按 CHANGELOG_TEMPLATE 重排章节(门禁)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01XYL5S9SsBtkg7aGyFAbrrQ
2026-09-06 16:08:18 +08:00
API Changelog Bot和Claude Fable 5.1 c5c69d10aa changelog(7149): 边界行为补「团单不接受空白占位段」与「物资准备=物料准备中」说明
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01XYL5S9SsBtkg7aGyFAbrrQ
2026-09-06 15:59:33 +08:00
API Changelog Bot和Claude Fable 5.1 c5adab6346 changelog(7149): 团期子订单支付后即可提房车需求、物资准备起冻结 589536、团单房型间数必填 582099(PR #7177,Refs #7149)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XYL5S9SsBtkg7aGyFAbrrQ
2026-09-06 15:58:44 +08:00
API Changelog Bot和Claude Opus 4.8 c4968b5233 docs(changelog): 团期创单收紧+人数预查(#7135/#7159)、判团字段(#7142)、看板productId(#7143)、前端缺陷指引
changelog-filename-gate / validate (push) Successful in 2s
- 06_7135:填 PR #7169 / 合并提交 977be08e / 折入 #7159(581034 改读 remainingParticipants)/ 修正单测计数 / 补部署 dev-v3 网关复测 15/15 证据
- 06_frontend:更正后端已加固并部署验证(不再是零改动),补 581055/581056/581057、581034 触发条件与影响范围
- 06_7142 / 06_7143:早前已随 PR #7155/#7157 合并,随本批提交

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7Xpgcv9nncadAXQtWhg4P
2026-09-06 15:23:27 +08:00
jw和Claude Opus 5 62c52b8024 新增团期手动成团门槛与提前成团留痕接口说明(#7158)
changelog-filename-gate / validate (push) Successful in 3s
成团接口新增可选请求体 formedNote、新增 group-batch:manage 权限校验、
重复成团改为语义化 589537;团期详情与产品班期两侧新增最低成团户数 minToForm。

后端已部署 TEST 并实测:带理由成团成功、重复成团 589537、
不传 body 兼容路径均通过;网关链路已验证。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-06 14:56:28 +08:00
Mimingguang 713b15a640 chore(changelog): #7148 前端停用审批已交付,回写 verified(mmg/7245780a/2026-09-06)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-06 12:59:28 +08:00
lc 293aa77f98 新增供应商账户停用审批接口说明(#7148)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-06 12:48:11 +08:00
Mimingguang 2f6a989fcf chore(changelog): 补齐 17 条消费闭环 frontmatter 回写
changelog-filename-gate / validate (push) Failing after 2s
11 条有业务交付改判 verified(#6397/6903/6904/6905/6950/6979/6986/7013/7029/7036/7066,owner=mmg+对应业务 commit ref+交付日 verified_at);
6 条实证零改动改判 not_required(#6014/6016/6140/6938/6842/7087,仅翻 frontend_status 不填 owner/ref)。
#5935 挂起待后端补字段,保持 pending 不动。sync-log 均已记账。
2026-09-06 10:43:20 +08:00
Mimingguang 54b4d7a86e chore(changelog): #7137 前端中文映射已交付,回写 verified(mmg/9d8115ed/2026-09-06)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-06 10:25:32 +08:00
lc f3f11505d4 docs: 将 #7137 调整为后端验收口径
changelog-filename-gate / validate (push) Successful in 2s
2026-09-06 10:16:22 +08:00
lc d1fe0c3bf0 docs: 说明供应商账户状态中文映射(#7137)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-06 10:04:25 +08:00
lc 4e52f26972 补充供应商账户与合同修改删除接口说明
changelog-filename-gate / validate (push) Successful in 2s
2026-09-06 10:02:59 +08:00
Mimingguang c399b3b0f1 chore(changelog): 回写 #7101 前端 verified
changelog-filename-gate / validate (push) Failing after 2s
2026-09-05 11:35:01 +08:00
Mimingguang 0dec0584f9 chore(changelog): 回写 #7100 前端 verified
changelog-filename-gate / validate (push) Failing after 2s
2026-09-05 11:20:24 +08:00
lc a269c0bc97 供应商合作中资料变更接入企微审批(#7101)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-05 09:17:56 +08:00
jw和Claude Opus 5 be5afcf30a 团期退单户改为「提交申请 + 管理员审批」,070 破坏性变更 + 072~075 新增(#7100)
changelog-filename-gate / validate (push) Successful in 2s
070 由「调用即退款」改为「只建待审申请单」,响应体 Result<Void> → 对象;
新增审批列表/详情/通过/取消退单四个端点,审批限 ADMIN/SUPER_ADMIN 角色。

金额口径写明两个数(已付 / 预计退):早期阶段退的是订金应付额、与已付无关,
后期阶段以已付额按退改政策扣减——这条是 TEST 实测暴露 #7126 缺陷后更正的说法。

已过网关真测(2026-09-05):19 项含提交/驳回后该户仍在团里/再次提交/通过后名额回落,
预估与实退一致;验证产生的两张退款单已作废,测试环境资金零变动。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-05 08:18:03 +08:00
Mimingguang 125014ac9b chore(changelog): 回写 #7094 前端 verified
changelog-filename-gate / validate (push) Failing after 2s
修改原因:#7094 前端已交付(commit 2e8ed57c,sync-log 已记 done)但 frontmatter 仍为 pending,
发布门禁前端核验状态与真实交付不符。

修改内容:frontend_status=verified、frontend_owner=mmg、frontend_ref=2e8ed57c、verified_at=2026-09-04;
target_release 与 status_note 保持原值,正文未动。

实际验证:git diff 逐字段核对仅改 frontmatter 5 字段。
2026-09-04 23:34:24 +08:00
lc 19c3abe79e 补充供应商账户驳回终态(#7094)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-04 23:19:02 +08:00
API Changelog Bot a67e24b9b9 更正 #7098 收敛:04_7070 抢单池/我的接单 productType 筛选下推 SQL,我的接单 productType 入参此前被静默忽略现生效(#7098 复审,PR #7117 合入 dev-v3 合并提交 cd21ae0)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-04 22:22:18 +08:00
Mimingguang 81139ab8c3 chore(changelog): 回写 #7090 前端 verified
changelog-filename-gate / validate (push) Failing after 2s
修改原因:#7090 前端已交付(commit 32a1a289,sync-log 已记 done)但 frontmatter 仍为 pending,
发布门禁前端核验状态与真实交付不符。

修改内容:frontend_status=verified、frontend_owner=mmg、frontend_ref=32a1a289、verified_at=2026-09-04;
target_release 与 status_note 保持原值,正文未动。

实际验证:git diff 逐字段核对仅改 frontmatter 5 字段。
2026-09-04 20:43:38 +08:00
lc 8973353356 交付供应商信用等级与公司资料字段契约(#7090)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-04 20:09:22 +08:00
Mimingguang 17490fff88 chore(changelog): 补齐6条已实现条目的前端verified回写
changelog-filename-gate / validate (push) Failing after 2s
修改原因:6 条 changelog 前端已落地并交付(sync-log 已记 done),但 frontmatter 仍为 pending,
导致发布门禁的前端核验状态与真实交付不符。

修改内容:按 hl-changelog/v2 口径回写 frontend_status=verified、frontend_owner=mmg、
frontend_ref=对应业务 commit 短哈希、verified_at=2026-09-04;target_release 与 status_note 保持原值。

- #6926 导出补 opsStage 筛选 -> ea1b9803
- #7059 设置供应商候选按资源上下文过滤 -> a1a78906
- #7069 供应商企微在途状态统一审核中 -> f6ddd94c
- #7070 房务列表/详情补产品类型标签 productType -> 7476250d
- #7078 供应商企微审核中冻结资料修改 -> f4d3e1c9
- #7087 供应商新建修改必填资料校验 -> 72d63c8e

实际验证:逐条 diff 核对仅改 frontmatter 5 字段,status_note/target_release/正文未动。
2026-09-04 20:04:16 +08:00
API Changelog Bot a97809f105 更正 #7097 收敛:04_7066 应收字段以 totalPrice 为准(totalAmount 未上线即收敛);6905 取消单 totalPrice 返 0.00 两位小数(#7097 复审)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-04 20:00:00 +08:00
lc 0a324bb6dc 更正 #7062 前端状态为无需处理
changelog-filename-gate / validate (push) Successful in 2s
2026-09-04 17:02:19 +08:00
lc 8696bbb083 补充供应商新建修改必填资料说明(#7087)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-04 16:52:18 +08:00
lc eede11917a 供应商清账归档后修改入口置灰(#7062)
changelog-filename-gate / validate (push) Successful in 1s
2026-09-04 16:16:05 +08:00
lc e3aace57c5 交付供应商审核中资料冻结联调说明(#7078)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-04 15:56:31 +08:00
API Changelog Bot 4ff1480683 补全 7070 房务 productType 标签接口文档(完整模板+网关实测)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-04 15:50:54 +08:00
API Changelog Bot 8c38fc6b89 docs(changelog): 7070 房务列表/详情补产品类型标签 productType(管理后台) 2026-09-04 15:50:54 +08:00
jw a611948477 团期人员配置位成员改由字典决定,取值域三处对齐(#7079)
changelog-filename-gate / validate (push) Successful in 3s
PR #7085 合入 dev-v3(合并提交 d1b724d59),2026-09-04 部署测试环境
并经真实网关鉴权实测 7 条用例。

核心证据:15:30:33 往 group_batch_staff_slot_guide 插一行 GUIDE_ASSISTANT,
15:35:44(301 秒后)导游位候选由 7 人变 8 人——未改代码、未重启、未重新部署。
随后连打 8 次全部返回 8 人,两个实例都已回源。演示行验证后已撤除。

2 个接口的候选池来源与落库取值变更,路径/入参/出参结构全部不变:
- GET /v3/admin/group-batch/:groupBatchId/staff/candidates  候选池成员由字典决定,582113 文案变更
- PUT /v3/admin/group-batch/:groupBatchId/staff             staffRole 落真实 staffType

含字典初始化脚本 sql/dict_group_batch_staff_slot.sql(幂等,需手工执行)。
dict_type_id 取 8071/8072——8021/8022 在本机与测试环境都已被
contract_status / contract_platform 占用。

staff_role 取值域测试环境实测三处一致(字典 = 枚举 = @Pattern,8 项)。

frontend_status=not_required:路径、入参、出参结构均未变,前端无需改动;
但不要再硬编码候选池成员,也不要沿用自己提交的 staffRole 回显。
2026-09-04 15:37:23 +08:00
jw和Claude Opus 5 db6698061b docs(changelog): #7066 团期子订单列表补应收总额 totalAmount
changelog-filename-gate / validate (push) Successful in 2s
GET /v3/admin/order/group-batch/:groupBatchId/orders 出参新增 totalAmount
应收总额,口径复用既有 OrderAmountUtil.payableForDisplay(取消单归 0),
与 calcBalance 口径一致。纯 additive,不新建端点、不改老字段语义。

关键变化:前端不要再用 paidAmount + balanceAmount 反推应收总额。
balanceAmount 被钳在 ≥0,超付/退款/取消单三种情况反推值都偏大。

2026-09-04 于测试环境网关实测 8 组用例全部通过,两处在真实数据上
命中本单要修的缺陷:
- 超付单 totalAmount=2943.00,旧反推得 3270.00,偏差 327.00
- 取消单 totalAmount=0.00 而 paidAmount=3270.00,旧算法会把已取消
  子订单显示成有应收

backend_status=deployed / gateway_status=verified。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-04 15:01:20 +08:00
jw 2096a47340 团期导游位下游按配置位归组,GUIDE 与 LEADER 一视同仁(#7063)
changelog-filename-gate / validate (push) Successful in 2s
PR #7065 合入 dev-v3(合并提交 f37b6ee0f),2026-09-04 部署测试环境
并经真实网关鉴权实测 AC-2/AC-3/AC-4/AC-5/AC-9。

4 个接口的副作用与取值口径变更,路径/入参/出参结构全部不变:
- PUT  /v3/admin/group-batch/:groupBatchId/staff      导游位配 GUIDE 也置 guide_ready
- POST /v3/admin/order/:id/staff                      GUIDE 也写 guide_status 与 GUIDE_DONE
- DELETE /v3/admin/order/:id/staff/:staffAssignmentId 按导游位整组计数,不再误置空
- GET  /v3/admin/order/:id/print-itinerary            导游栏 GUIDE 优先、缺位回退 LEADER

顺带修一处更深的缺陷:ready 回填此前用产品侧 batchId 打 order_group_batch 主键,
rows=0 只 WARN 不抛,改前不论配 GUIDE 还是 LEADER,guide_ready 从未被置位过。

frontend_status=not_required:路径、入参、出参结构均未变,前端无需改动。
2026-09-04 14:25:48 +08:00
lc e5356a65e0 供应商企微在途状态统一审核中(#7069)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-04 12:55:57 +08:00
wx 71cc52c1a3 changelog(6926): 导出补 opsStage 筛选 + 统计条自校验死代码修正(修改接口) Refs #6926
changelog-filename-gate / validate (push) Failing after 2s
2026-09-04 11:26:36 +08:00
lc 0df2c917bf docs: add supplier context handoff (#7059)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-04 11:11:05 +08:00
API Changelog Bot cf78c344a1 changelog(6905): 003 totalPrice 应收字段 + birthdayInTrip 跨年修正已实现(#6929)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-04 10:31:34 +08:00
lc a0daab2b90 更正供应商类型过滤前端状态(#7042)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-04 09:51:13 +08:00
lc 5046bce500 docs: add supplier type filter handoff for #7042
changelog-filename-gate / validate (push) Successful in 2s
2026-09-03 21:48:26 +08:00
lc c80d1975aa docs(changelog): #7036 供应商状态变更企微审批
changelog-filename-gate / validate (push) Successful in 2s
2026-09-03 20:03:18 +08:00
lc f4354d8c31 docs(changelog): #7029 供应商账户企微审批
changelog-filename-gate / validate (push) Successful in 3s
2026-09-03 15:51:47 +08:00
jw和Claude Opus 5 828d9ae2e4 docs(changelog): #6986 团期物资从备品库选择 + suppliesName 二选一校验
changelog-filename-gate / validate (push) Successful in 2s
新增 GET /v3/admin/order/group-batch/:groupBatchId/supplies/candidates,
从资源域备品库拉候选并标记本团期已加入项;资源域新增内部接口
GET /internal/supplies/list-available,两个服务需同时部署。

记录本次行为变更:POST .../supplies 的 suppliesName 由 @NotBlank
改为与 suppliesResourceId 二选一,传 resourceId 时名称从库取并覆盖入参。

新增错误码 589518 备品库查询失败、589519 所选备品不存在或已下架。

2026-09-03 于测试环境网关实测 10 条正负向用例全部通过,
写入用例已删除还原;backend_status=deployed / gateway_status=verified。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-03 15:22:10 +08:00
jw和Claude Opus 5 d2c39b6c24 docs(changelog): #6950 团期人员配置候选列表新增接口 + staffRole 白名单校验
changelog-filename-gate / validate (push) Successful in 2s
新增 GET /v3/admin/group-batch/:groupBatchId/staff/candidates,导游位并收
GUIDE/LEADER 并按 staffId 去重,摄影位只收 PHOTOGRAPHER,其余位返 582113。

同时记录本次行为变更:PUT .../staff 的 staffList[].staffRole 新增
@Pattern 白名单校验,越界值由原先原样入库改为返回 400。

2026-09-03 于测试环境网关实测 10 条正负向用例全部通过,
backend_status=deployed / gateway_status=verified。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-03 14:57:42 +08:00
lc 411a549548 docs(changelog): #7013 启用供应商清账归档
changelog-filename-gate / validate (push) Successful in 3s
2026-09-03 10:42:52 +08:00
lc f68b6d80d4 docs(changelog): #6979 供应商状态流转契约
changelog-filename-gate / validate (push) Successful in 2s
2026-09-03 08:10:43 +08:00
lc c579da759e docs(changelog): #6938 供应商注册提交可选主表字段缺席保留(管理后台)
changelog-filename-gate / validate (push) Successful in 3s
2026-09-02 11:30:39 +08:00
API Changelog Bot c66a28b43f changelog(团期看板): 6904/6905 复审补充知会-排序口径/008 opsStage预告/chips空判/demandStatus与totalPrice待补(管理后台)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-01 10:01:41 +00:00
API Changelog Bot 6c1d11d40f changelog(6921): 六芯片读端接入专用投影+车芯片车务文案修正(管理后台/修改接口)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-01 16:13:30 +08:00
API Changelog Bot 9428076c2c Merge remote-tracking branch 'origin/main'
changelog-filename-gate / validate (push) Successful in 2s
2026-09-01 15:59:00 +08:00
API Changelog Bot 95394c35fc docs(changelog): 6905 团期看板 4 接口对齐补全-补齐模板章节(使用场景/请求响应错误示例/VO 契约/清单对应) 2026-09-01 15:51:27 +08:00
API Changelog Bot edfffdf063 docs(changelog): 6905 团期看板 4 接口对齐补全-逐接口规范化 请求/响应/空数据/错误/业务边界 示例顺序 2026-09-01 15:15:47 +08:00
API Changelog Bot 06a86d488d docs(changelog): 6905 团期看板 4 接口对齐补全-逐接口补请求/响应/错误示例并规范化模板标题 2026-09-01 15:11:03 +08:00
API Changelog Bot 082f32ad3f changelog(6905): 团期看板 4 接口对齐补全 GB-ADM-000/001/002/003(管理后台/修改接口) 2026-09-01 14:56:52 +08:00
Mimingguang cfc3aa8b1e docs(changelog): #6904 补前端评估(待看板列表契约)
changelog-filename-gate / validate (push) Successful in 2s
status_note 增前端评估:看板纯 mock,统计条/导出依赖真实看板页;看板列表
契约 #6905/GB-ADM-000~003 未入仓,等契约后统一接真。frontend_status 保持 pending。
2026-09-01 14:24:09 +08:00
Mimingguang 72949d869c docs(changelog): #6903 补前端评估(待看板接真)
changelog-filename-gate / validate (push) Successful in 2s
status_note 增前端评估:团期看板纯 mock、chips 需真实 groupBatchId,先接真
看板再接下钻,形态定弹层明细。frontend_status 保持 pending。
2026-09-01 14:18:43 +08:00
API Changelog Bot a031039140 chore(6904): changelog 文件名归档 01 前缀 (2026-09-01)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-01 13:26:58 +08:00
API Changelog Bot c9efecebc5 chore(6904): 团期看板统计条与导出 GB-ADM-009/008 变更归档 (dev-v3) 2026-09-01 13:26:58 +08:00
API Changelog Bot 4c12c1db01 chore(changelog): 6903 团期看板六芯片逐户明细 GB-ADM-090~095 接口交接
changelog-filename-gate / validate (push) Successful in 2s
2026-09-01 10:16:46 +08:00
Mimingguang 937f353b41 docs(changelog): 回写 #6842 前端已交付(hl-admin f5414b12)
changelog-filename-gate / validate (push) Successful in 2s
frontend_status verified,frontend_ref f5414b12,target_release v2.1。
2026-09-01 09:52:26 +08:00
Mimingguang 43bf3936d1 docs(changelog): 回写 #6834 前端已交付(hl-admin 848cca7b)
changelog-filename-gate / validate (push) Successful in 2s
frontend_status verified,frontend_ref 848cca7b,target_release v2.1。
2026-09-01 09:31:20 +08:00
Mimingguang 33a8f7cb5b docs(changelog): 回写派单 605074 车队停用前端已消费(frontend_ref f1b861c6)
changelog-filename-gate / validate (push) Successful in 2s
2026-09-01 09:13:41 +08:00
wx 5ce53bcd47 docs: 供应商暂停合作联动停用车队与派单拦截(#6843) (#84)
changelog-filename-gate / validate (push) Successful in 1s
docs: 供应商暂停合作联动停用车队与派单拦截(#6843) (#84)
2026-08-31 14:36:14 +08:00
lc 430d825904 补充供应商余额与支付类型接口说明(#6834)
changelog-filename-gate / validate (push) Successful in 2s
2026-08-31 12:24:30 +08:00
lc 2b60fc3323 补充供应商合同字段与附件(#6842)
changelog-filename-gate / validate (push) Successful in 2s
2026-08-31 12:20:58 +08:00
Mimingguang 070c937a08 docs(changelog): 回写车队 601112 在役车辆守卫前端已消费(frontend_ref 6985f0cf)
changelog-filename-gate / validate (push) Successful in 2s
2026-08-31 10:55:41 +08:00
API Changelog Bot e28f675c8f 车队保存无供应商时自动停用与在役车辆守卫(#6811)
changelog-filename-gate / validate (push) Successful in 2s
2026-08-31 10:46:03 +08:00
Mimingguang 787b9a007b docs(changelog): 回写车队排序校验缺陷前端已修复(frontend_ref e2b2482e)
changelog-filename-gate / validate (push) Successful in 3s
2026-08-31 09:56:51 +08:00
API Changelog Bot d81fea420a docs(changelog): 车队编辑弹窗排序已填仍提示请输入排序-前端缺陷通知
changelog-filename-gate / validate (push) Successful in 2s
2026-08-31 09:45:39 +08:00
Mimingguang 0e1ab992e8 chore(changelog): 回写 #6717 前端消费状态
changelog-filename-gate / validate (push) Successful in 2s
2026-08-30 18:10:46 +08:00
wx 95212ad9a5 docs: 车队关联供应商并展示供应商全名(#6717) (#83)
changelog-filename-gate / validate (push) Successful in 2s
2026-08-30 17:54:25 +08:00
Mimingguang 2ebb4644a6 chore(changelog): 回写 #6684/#6710/#6739 前端消费状态
changelog-filename-gate / validate (push) Successful in 2s
2026-08-30 17:44:59 +08:00
lc 17bb0ef2bf 新增供应商三级地址保存与回显契约(#6739)
changelog-filename-gate / validate (push) Successful in 3s
2026-08-30 15:44:39 +08:00
lc 5c52926269 docs: 精简6710前端变更记录
changelog-filename-gate / validate (push) Successful in 2s
2026-08-30 10:24:09 +08:00
lc a45b51d8a8 docs: 更正6710为无需前端处理
changelog-filename-gate / validate (push) Successful in 2s
2026-08-30 10:16:40 +08:00
lc 73a4518181 docs: 交付供应商联系人快照版本兼容 (#6710)
changelog-filename-gate / validate (push) Successful in 2s
2026-08-30 10:08:10 +08:00
lc 8821d1df6f docs: 交付供应商草稿变更原因契约 (#6684)
changelog-filename-gate / validate (push) Successful in 1s
2026-08-30 08:18:42 +08:00
Mimingguang 51708dc7a6 chore(changelog): 回写 #6669 前端消费状态 verified(frontend_ref 6678b97f)
changelog-filename-gate / validate (push) Successful in 3s
2026-08-29 17:34:50 +08:00
lc b28bd34ceb Merge pull request 'docs(changelog): 补充草稿结算编辑契约 #6669' (#82) from chore/6669-6676-supplier-draft-settlement-changelog into main
changelog-filename-gate / validate (push) Successful in 2s
2026-08-29 17:12:56 +08:00
lc 1ba3299afa docs(changelog): 补充草稿结算编辑契约 #6669
changelog-filename-gate / validate (pull_request) Successful in 2s
2026-08-29 17:12:25 +08:00
Mimingguang bd235c2e1d chore(changelog): 回写 #6654 前端消费状态 verified(frontend_ref 5fe4e6fa)
changelog-filename-gate / validate (push) Successful in 3s
2026-08-29 16:32:05 +08:00
lc eb628f56b0 docs(changelog): 补充 #6654 供应商合同与结算契约
changelog-filename-gate / validate (push) Successful in 2s
2026-08-29 16:15:01 +08:00
Mimingguang b54c4cc8d7 chore(changelog): 回写 #6544/#6620/#6643 前端消费状态 verified
changelog-filename-gate / validate (push) Successful in 2s
修改原因:三条 changelog 前端已交付并推送 hl-admin v2.1,回写 frontmatter 消费证据。
- #6544 供应商合同独立登记 → frontend_ref 55a3a056
- #6620 主体证件号 taxNo 回显(DRAFT 可改非 DRAFT 锁定) → frontend_ref 9d5dcbab
- #6643 营业执照 licenseImageUrl 顶层权威回显 → frontend_ref bab3673b
2026-08-29 15:07:39 +08:00
lc 4621f11e36 交接供应商编辑字段回显契约(#6643)
changelog-filename-gate / validate (push) Successful in 2s
2026-08-29 14:36:10 +08:00
lc 1f608928b7 Merge pull request 'docs: 交接供应商 tax_no 表单绑定缺口 (#6620)' (#81) from changelog/6620-supplier-taxno-frontend into main
changelog-filename-gate / validate (push) Successful in 2s
2026-08-29 12:01:09 +08:00
lc a4aba37568 docs: hand off supplier tax_no binding #6620
changelog-filename-gate / validate (pull_request) Successful in 2s
2026-08-29 11:53:48 +08:00
lc 60a28339e0 Merge pull request 'docs: 纠正供应商合同独立登记交付状态 (#6544)' (#80) from changelog/6544-supplier-contract-boundary into main
changelog-filename-gate / validate (push) Successful in 2s
2026-08-29 09:40:44 +08:00
lc d3b5c0e8c9 docs: 纠正供应商合同独立登记交付状态 (#6544)
changelog-filename-gate / validate (pull_request) Successful in 1s
2026-08-29 09:40:18 +08:00
API Changelog Bot 0474e6ff78 docs: 交付供应商合同独立登记契约(#6544)
changelog-filename-gate / validate (push) Successful in 2s
2026-08-29 00:55:23 +08:00
Mimingguang 9aace47441 chore(changelog): 回写 #6474 供应商变更/审批分离 verified(199147de/v2.1)
changelog-filename-gate / validate (push) Successful in 2s
2026-08-27 17:01:30 +08:00
lc 605859b12f docs: 交付供应商历史分离契约(#6474)
changelog-filename-gate / validate (push) Successful in 2s
2026-08-27 16:44:13 +08:00
Mimingguang 734a9b1112 chore(changelog): 回写 #6518 供应商草稿即生成编号 verified(d546912c/v2.1)
changelog-filename-gate / validate (push) Successful in 2s
2026-08-27 16:38:45 +08:00
lc 20272bb706 docs: 下发供应商草稿编号契约(#6518)
changelog-filename-gate / validate (push) Successful in 2s
2026-08-27 16:28:01 +08:00
Mimingguang 59090c889b chore(changelog): 回写 #6476 供应商详情地址备注 verified(6635a2ae/v2.1)
changelog-filename-gate / validate (push) Successful in 2s
2026-08-27 16:03:03 +08:00
lc 07387e506f docs(changelog): 记录 #6476 供应商表单契约
changelog-filename-gate / validate (push) Successful in 2s
2026-08-27 15:41:38 +08:00
Mimingguang e4f7c5cb0a chore(changelog): 回写 #6436 供应商敏感字段完整回显 verified(5957c58c/v2.1)
changelog-filename-gate / validate (push) Successful in 2s
2026-08-27 12:31:26 +08:00
lc cf3fe30a0f docs: 交付 #6436 供应商完整字段契约
changelog-filename-gate / validate (push) Successful in 3s
2026-08-27 11:42:09 +08:00
Mimingguang e91101c037 docs(changelog): 回写 #6397 amount String 化前端 verified
changelog-filename-gate / validate (push) Successful in 2s
前端 002475b2 已按字符串重新集成 PR #6450 修正(响应 contracts[].amount Number→String),fillForm toContractAmount 归一 number、详情列透传、提交侧 Number 不变,补 String 回填测试。
2026-08-27 00:25:29 +08:00
API Changelog Bot ebc2fecbfd docs(changelog): #6397 全面对齐模板——逐接口自包含详情 + 五、数据库行为 + 九、相关历史PR
changelog-filename-gate / validate (push) Successful in 2s
2026-08-27 00:04:27 +08:00
API Changelog Bot e362441e9c docs(changelog): #6397 接口详情子节编号化 + 补六.6/六.7 章节 2026-08-26 23:58:34 +08:00
API Changelog Bot 81aab7abb0 docs(changelog): #6397 对齐 CHANGELOG_TEMPLATE 必备章节(二/三/四/六/七/八/十) 2026-08-26 23:56:51 +08:00
API Changelog Bot 4f81ef1cf9 fix(changelog): #6397 响应 contracts[].amount Number→String 同日修正 (PR #6450)
后端每日审查红线修复: 合同金额 BigDecimal 补 ToStringSerializer,输出字符串化与全站金额对齐;
frontend_status 回退 pending 待 mmg 按字符串重新集成,请求侧 Number 不变。
2026-08-26 23:53:04 +08:00
lc ca11783f72 Merge pull request 'fix(changelog): 按 TEST 代码修正行政区划契约 (#6438)' (#79) from docs/6438-region-changelog-code-sync into main
changelog-filename-gate / validate (push) Successful in 2s
2026-08-26 18:01:45 +08:00
共修改 393 个文件,包含 113165 行新增和 424 行删除
+6
查看文件
@@ -64,6 +64,12 @@ verified_at: ""
- 接口类条目(新增接口/修改接口/删除接口):推送前必须走完「PR 合并 → 部署测试服 → 测试服真实 API 验证」,frontmatter 必须 `backend_status: "deployed"`,并在正文「验证证据」章节贴实测结果。
- `backend_status` 为 `merged` / `pending` / `implemented` 等未部署状态的条目**禁止 push**(校验规则 E_BACKEND_PENDING 会拦)。「先给前端契约、部署随后」的预告式推送一律禁止——前端拿到 changelog 会立刻联调,接口不在等于空耗与误判。
- 🔴 **正文里不得出现任何「让前端等我们」的措辞**(2026-09-21 wx 第二次点名,校验规则 `E_WAIT_LANGUAGE` 会拦):`等部署` / `待部署` / `未部署` / `稍后另发` / `修好后另发` / `另发交接件` / `暂不可用` / `暂缓对接` / `该缺陷已在修` / `自行确认部署`,以及「等待」与「部署/后端/我们/上线/修复/另发/发版/滚动」同行共现。
- **为什么 §2.1 的 `backend_status` 门禁不够**:它是 frontmatter 字段,而这类句子活在自由文本里,门禁一个字也看不见——`deployed` + 校验器全绿**不等于**这份交接件可执行。2026-09-20 的 `20_7443` 就是这样:frontmatter 已 `deployed`、CI 绿,正文 `status_note` 结尾一句「该缺陷已在修……修好后另发交接件」,mmg 因此一直没动工,直到 09-21 才来问「这个是有啥问题吗 还是没做到呢」。
- **为什么不能交给前端自己判断**:消费方查不了我们的部署状态、看不到 `dev-v3`、不知道「另发」是哪天。我方如实写下的「未核」,到他那里只剩一个可选动作——等,而且是静默地等:文件推了、门禁绿了、日报也记了,唯一的异常信号是有人在安静空转,比压根没发更难发现(没发至少还会有人来催)。**对 wx 该说「没核」,对下游只能说「能接」,或者干脆先别发。**
- **正文只允许两类内容**:①已经就绪的契约;②前端调用时会撞上的限定(灰度开关状态、前置字段要求、会抛的错误码、已知缺口的工单号)。分界线是问一句:**这条影响他「怎么写代码」,还是只影响他「什么时候开始写」?**后者一律删掉。
- **某部分确实还没就绪时**:要么整份不发,要么把没就绪的那块**整段删掉**,只交他现在就能接的部分;绝不写成「稍后另发」。
- ⚠️ 本规则只拦我方在制品,**不拦契约边界**——「生产环境灰度开关尚未开启(属独立运维动作)」「TRANSFER-only 订单在 9 个下游消费方无产出,已记 #8056」这类必须照写,否则就撞上「交接件要把自己的覆盖范围写在脸上」那条相反的要求;`E_WAIT_LANGUAGE` 配了阴性对照用例保证不误拦这类句子。
- 纯前端条目(前端缺陷/前端优化/前端修复):`backend_status: "not_required"`,change_type 用对应前端类型;`frontend_status: "not_required"` 时不得残留 frontend_owner / frontend_ref / target_release / verified_at。
- 背景:2026-08-06~08-07 三条未部署即推送的条目(#5599/#5567/#5633)导致前端在测试环境验不到字段(2026-08-10 投诉属实);当时仓库 CI 因校验规则假阳性长期常红被忽略,规则已于 2026-08-10 修正(前端条目类型合法化、`{orderId}` 路径参数不再误判为占位符),此后 **CI 红 = 真违规,必须当场修复回填**。
@@ -0,0 +1,153 @@
---
schema: "hl-backend-request/v1"
title: "放开 H1 看板列表 batchStatus 对 CANCELLED 的过滤(让整团释放入口可达)"
consumer: "backend"
requester: "mmg(前端)"
author: "mmg"
target_service: "hl-order-service-v3"
status: "answered-no-backend-change"
related_issue: "7324"
related_frontend_commit: "6710ad4a"
created_at: "2026-09-11"
answered_at: "2026-09-11"
answered_by: "Claude(后端管理者)"
backend_verdict: "可达路径已存在,后端零改动;我方 #7322 changelog 漏写「我的团」不过滤 batch_status,前端的判断在当时信息下是合理的"
---
# 需求:放开 H1 看板列表 `batchStatus` 对 `CANCELLED` 的过滤
> **来源工单**: #7324 房务团期看板与整团按日订房计划 CRUD
> **服务**: `hl-order-service-v3`
> **提出方**: 前端(mmg),2026-09-11
> **状态**: 待后端评估 / 排期
---
## 一、一句话需求
房务团期看板列表 `GET /v3/admin/house/group-batches`(H1)当前把 `batchStatus=CANCELLED` 从过滤里**忽略**(传了被静默丢弃,回退默认四态),导致已流团团期永远进不了看板列表;而「整团释放」写口仅对 CANCELLED 团期放行,前端「整团释放」按钮因此**没有任何用户可达路径**。请放开 H1 对 CANCELLED 的过滤,让已认领的已流团团期能进入看板列表。
---
## 二、现状行为(契约原文,#7324 changelog)
`#7324` changelog 两处明确了当前过滤行为:
1. H1 `batchStatus` 入参表:「传 `CANCELLED` **被忽略**」——默认四态 = `RESOURCE_PREPARING, MATERIAL_PREPARING, PENDING_DEPARTURE, TRAVELLING`(`HouseGroupBatchBoardManager.java:60-64`)。
2. 边界行为:「`batchStatus` 若传入非法状态码或全部被过滤掉(如只传 `CANCELLED`),**静默回退为默认四态**,不报错」(`HouseGroupBatchBoardManager.java:224-236`)。
链路后果:
- 看板列表 H1 **结构性不返回** CANCELLED 团期。
- 详情弹层(H2)只能从 H1 行点开,所以永远拿不到一个 `batchStatus==='CANCELLED'` 的 detail。
- 前端「整团释放」按钮的显隐条件是 `detail.batchStatus === 'CANCELLED'`(`canReleaseAll`),恒为 false,按钮永不渲染。
- release-all 端点 `POST .../room-plans/release-all` 本身仅对 CANCELLED 放行(其它态 808618,`HouseGroupBatchPlanGate.PLAN_RELEASE_ONLY_STATUSES` 只含 CANCELLED),端点行为自洽、无 bug——**只是前端够不到一个 CANCELLED 团期去调它**。
---
## 三、期望行为
让 H1 在「按认领维度」下能返回已流团(CANCELLED)团期,二选一均可:
- **方案 A(推荐)**:`batchStatus` 入参放开 `CANCELLED`——前端显式传 `batchStatus=CANCELLED` 时后端按此过滤,不再忽略/回退。改动最小,不影响不传参时的默认四态。
- **方案 B**:新增一个独立查询参数(如 `includeCancelled=true` 或 `scope` 扩展),在认领维度下附带返回 CANCELLED 团期。
无论哪个方案,都请保持「未认领团不进本页」的既有边界(H1 业务边界第 1 条),CANCELLED 放开只作用于「已被房务认领」的团。
---
## 四、为什么安全 / 不破坏既有
- **阶段闸门已天然兜住写口**:`HouseGroupBatchPlanGate.PLAN_WRITABLE_STATUSES`(可写六态)不含 CANCELLED,H4/H5 对 CANCELLED 团期本就走 808600;H6/release-all 走更宽的 `releaseOnly` 分支(CANCELLED 放行)。放开 H1 过滤**不改变任何写口的阶段闸门判定**——只是让 CANCELLED 团期「能被看见」,写口权限仍由各端点自己的闸门控制。
- **release-all 端点无需改**:它已正确地对 CANCELLED 放行、对其它态 808618,本次只动 H1 读侧。
- **向后兼容**:不传 `batchStatus` 的既有调用方仍走默认四态,行为零变化;只有显式传 `CANCELLED` 的调用方才看到新返回。
---
## 五、前端配套(已就绪,零改动等待)
前端「整团释放」按钮与 release-all 调用**已实现并保留**(`#7324` 前端 commit `6710ad4a`),显隐条件 `canReleaseAll` 已按「`batchStatus==='CANCELLED'` 且非组长只读」写好。后端一旦放开 H1 的 CANCELLED 过滤,CANCELLED 团期进入看板 → 详情弹层 `detail.batchStatus` 即为 CANCELLED → 按钮自动出现并可点,**前端无需任何改动**。
后端部署后通知前端即可,前端会回归验证「整团释放」入口可达。
---
## 关联
- Issue: [#7324](https://git.1814.love:8443/wx/HL/issues/7324)
- 后端 PR: [#7465](https://git.1814.love:8443/wx/HL/pulls/7465)
- 前端交付 commit: `6710ad4a`(hl-admin `v2.1`)
- 相关源码: `HouseGroupBatchBoardManager.java`(H1 编排,`:60-64` 默认四态、`:224-236` batchStatus 过滤)、`HouseGroupBatchPlanGate.java`(阶段闸门,无需改)
---
## 🔧 后端答复(2026-09-11)
> **结论:本单不需要后端改动——可达路径已经存在。而你们不知道它存在,是因为我们的 #7322 changelog 漏写了一条关键行为。这个缺口在我方。**
### 一、结论先行
「整团释放按钮没有任何用户可达路径」这一判断**不成立**。已经存在的路径是:
```
GET /v3/admin/order/grab-pool/my-claims/group-batches ← 我的团(#7322 已交付且已验收)
↓ 该列表不过滤 batch_status,已流团(CANCELLED)团期就在里面
↓ 行上直接带 groupBatchId / batchStatus / batchStatusLabel
GET /v3/admin/house/group-batches/{groupBatchId} ← H2 详情(无阶段闸门)
↓ detail.batchStatus === 'CANCELLED' → canReleaseAll 成立
POST /v3/admin/house/group-batches/{groupBatchId}/room-plans/release-all
```
### 二、逐环节证据(五条,全部对源码复核过,不是从文档转述)
| # | 环节 | 证据 |
|---|---|---|
| 1 | **我的团不过滤 `batch_status`** | `HouseGroupGrabService.listMyGroups` javadoc 原话:「**不限制 batch_status**:已认领的团可能已流团 / 已结束,本单不自动释放指针,**房务仍要看得见并手动释放**」。代码 `q.setBatchStatus(req.getBatchStatus())` 原样下推,**不传就是不加这个条件**,没有 H1 那种「过滤空了回退默认四态」的逻辑 |
| 2 | **服务层也不注入状态** | `GroupBatchService.pageHouseClaimed` 直接把 query 下推 mapper,零注入 |
| 3 | **同一文件里的对照(最强证据)** | 紧挨着的 `GroupBatchService.pageHouseGrabPool` 却**强制**写死 `q.setBatchStatuses(REQUIREMENT_CONFIRMABLE_STATUSES)`。一个注入、一个不注入,**是刻意区分不是遗漏** |
| 4 | **我的团的行携带判定所需字段** | `HouseMyGroupItemRespVO extends HouseGroupGrabPoolItemRespVO`,父类有 `groupBatchId`、`batchStatus`、`batchStatusLabel` |
| 5 | **H2 详情没有阶段闸门** | `HouseGroupBatchBoardController.detail` 的门**只有归属**(未认领 808612 / 他人认领 808613),**不判 `batchStatus`**——CANCELLED 团只要是本人认领的就能打开 |
你对 release-all 端点本身的判断是对的:它只对 CANCELLED 放行、其它态 808618,端点自洽无 bug。
### 三、H1 过滤掉 CANCELLED 是刻意设计,且原注释就指明了入口在详情页
`HouseGroupBatchBoardManager.resolveBatchStatuses` 上方注释原话:
> 「为什么已流团的团不许出现在看板:本页是『要干活的团』,流团团的唯一动作是整团释放,**那个入口在详情页而不是列表页**;混在一起会让房务每天都在列表里看到一堆做不了任何事的团。」
注释写明了「详情页」,**但没写明从哪个列表进详情页**——这就是这次误判的接缝所在。
### 四、这次的根因在我方,不在你们
你们的推理链条本身是严密的:读 #7324 changelog → H1 明确写了「传 CANCELLED 被忽略」→ 详情从 H1 点开 → 因此 CANCELLED 详情不可达。**在你们掌握的信息里,这个结论是对的。**
问题出在 **#7322 的 changelog 从头到尾没有提过「我的团」不过滤 `batch_status`**(我逐行搜过那篇,零命中)。这条行为是后端刻意设计并写进 javadoc 的,却**没有进入交接件**——而 javadoc 你们看不到。
**所以这是我方的文档缺口,不是你们的疏忽。** #7322 的 changelog 我会补这一条。
### 五、前端需要做什么(如果需要)
把「我的团」列表行接到 H2 详情弹层——同一个弹层,入参就是行上已有的 `groupBatchId`。两端 API 都已交付并验收过(#7322 changelog `frontend_status: verified`),这是**接线**不是新功能。
如果「我的团」页当前打开的不是 H2 那个弹层,这一步是前端改动;**后端仍然零改动**。
补一条使用上的细节:我的团的 `batchStatus` 入参是**透传**的,所以
- 不传 → 全部已认领团(含 CANCELLED);
- 传 `CANCELLED` → **只看已流团的团**,做一个「待释放」筛选很自然。
这和 H1 的行为正好相反(H1 传 `CANCELLED` 会被丢弃并回退默认四态),**两个列表的 `batchStatus` 语义不同,别套用同一套前端逻辑**。
### 六、留给 wx 的产品判断(这一条不是 bug,是口径)
方案 A(H1 放开 CANCELLED)实现成本确实很低,你对「不破坏既有」的分析也站得住:写口闸门 `PLAN_WRITABLE_STATUSES` 不含 CANCELLED,放开读侧不影响任何写口判定——这点我复核过,属实。
**但我不建议改**,理由是它与「看板 = 要干活的团」这条既有定案直接冲突,而该定案是有成文理由的(见第三节注释)。已流团团期在看板里是纯噪声:房务对它只能做一个动作,而那个动作有专门的入口。
如果 wx 判断「房务更习惯在看板里找」,那我照做——**但那时它是一次产品口径调整,不是修 bug**,会另开工单并同步改注释里的定案说明。这个判断我交给 wx,不自行拍板。
---
**后端本单零改动。#7322 的 changelog 会补「我的团不过滤 batch_status」一条。**
+8 -1
查看文件
@@ -1,4 +1,11 @@
{
"schema": "hl-changelog-path-aliases/v1",
"aliases": []
"aliases": [
{
"ticket": 7510,
"alias": "changelogs-v2/2026-09/11_7510_服务按景区口径接入供应商关系-修改接口-管理后台.md",
"canonical": "changelogs-v2/2026-09/12_7510_服务按景区口径接入供应商关系-修改接口-管理后台.md",
"reason": "首次发布时文件名日前缀误写为 11(提交日为 2026-09-12),按 check:filenames 的 E_DAY 规则改为 12_ 作为 canonical;11_ 已发布路径保留为兼容入口,供已引用旧路径的前端继续访问。"
}
]
}
@@ -0,0 +1,156 @@
---
schema: "hl-changelog/v2"
ticket: "7252"
title: "C端发票切流 order-v3:状态枚举值域变化 + email 必填收紧"
consumer: "mp"
author: "yst(GIT)"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "pending"
frontend_owner: ""
frontend_ref: ""
target_release: ""
verified_at: "2026-09-07"
status_note: "C端发票 4 接口后端由 order-v2 切到 order-v3,路径/入参/出参字段名零变化;但状态枚举值域变化(PENDING→REQUESTED 等)+ email 必填收紧,前端需适配状态映射与表单校验。后端/网关已测试服验证,前端待消费。"
updated_at: "2026-09-07"
base: "dev-v3"
---
# 【修改接口·小程序端】C端发票切流 order-v3:状态枚举值域变化 + email 必填收紧(#7252)
## 1. 接口背景
order-v2 全量下线工程,C 端发票 invoice 由 order-v2 切流到 order-v3 发票域承接。**4 个对外接口的路径、请求方法、入参字段名、出参字段名全部不变**,前端无需改请求地址与字段名。
但后端切换带来 **2 处对外可见的行为变化**,前端需要适配:
1. **发票状态 `status` 枚举值域变化**(v2 → v3 值不同)
2. **email 由可选变为必填**(v3 服务端强制校验)
## 2. 变更清单
| 接口 | 路径 | 方法 | 变化 |
|---|---|---|---|
| 申请开票 | `/mp/invoice/apply` | POST | 出参 status 值域变化;email 必填收紧 |
| 发票详情 | `/mp/invoice/{id}` | GET | 出参 status 值域变化 |
| 按订单查发票 | `/mp/invoice/order/{orderId}` | GET | 出参 status 值域变化;未开票仍返 data=null |
| 发票换开 | `/mp/invoice/{invoiceId}/reissue` | POST | 出参 status 值域变化;email 必填收紧 |
## 3. 接口详情
路径 / 方法 / Content-Type 均不变。仅出参 `status` 的**取值集合**与入参 `email` 的**必填性**变化。
## 4. 入参
入参字段名、类型、必填性**基本不变**,唯一变化:
- `email`(申请开票 / 换开):**由可选变为必填**。前端若不传 email,v3 服务端返回 400「收件邮箱不能为空」。建议前端表单将邮箱设为必填项。
## 5. 出参
出参字段名、类型不变。**唯一变化是 `status` 字段的取值集合**:
| 维度 | v2 旧值(切流前) | v3 新值(切流后) |
|---|---|---|
| status 枚举 | `PENDING` / `ISSUED` / `CANCELLED` | `REQUESTED` / `ISSUED` / `VOIDED` / `FAILED` |
映射关系(供前端文案/样式适配参考):
- `REQUESTED` ≈ 旧 `PENDING`(已申请待开票)
- `ISSUED` = 旧 `ISSUED`(已开票,不变)
- `VOIDED` ≈ 旧 `CANCELLED`(已作废)
- `FAILED` 为 v3 新增(开票失败)
其余出参字段(id / invoiceId / orderId / invoiceTitle / taxNumber / titleType / amount / invoiceUrl / pdfUrl / fileUrl / createdAt / issuedAt)字段名与类型均不变。
## 6. 枚举/数据字典
发票状态 `status`:
- `REQUESTED` 待开票(已提交申请)
- `ISSUED` 已开票
- `VOIDED` 已作废(换开后原发票作废为此态)
- `FAILED` 开票失败
抬头类型 `titleType`(不变):`PERSONAL` 个人 / `COMPANY` 单位。
## 7. 错误码
- `600004` 订单ID格式错误(apply 时 orderId 非数字兜底)
- email 缺失:v3 服务端 Bean Validation 返 400「收件邮箱不能为空」
- `581500` 发票不存在(含归属校验:非本订单属主查询时也返此码)
## 8. 示例
### 典型:申请开票(email 必填)
```json
POST /mp/invoice/apply
{
"orderId": "2091418470443810817",
"invoiceTitle": "上海呼籁旅行科技有限公司",
"titleType": "COMPANY",
"taxNumber": "91310115MA1K48XXXX",
"email": "finance@hulalv.com",
"remark": "对公开票"
}
```
响应(status 为新值域):
```json
{
"code": 200,
"data": {
"id": "2091422818997612545",
"invoiceId": "2091422818997612545",
"orderId": "2091418470443810817",
"invoiceTitle": "上海呼籁旅行科技有限公司",
"taxNumber": "91310115MA1K48XXXX",
"titleType": "COMPANY",
"status": "REQUESTED",
"invoiceUrl": null,
"pdfUrl": null,
"fileUrl": null,
"createdAt": "2026-09-07 12:00:00",
"issuedAt": null
}
}
```
### 边界:按订单查发票(未开票)
```json
GET /mp/invoice/order/2091418470443810817
→ { "code": 200, "data": null }
```
### 异常:email 缺失
```json
POST /mp/invoice/apply (body 无 email)
→ { "code": 400, "message": "收件邮箱不能为空" }
```
## 9. 业务边界
- `invoiceUrl` / `pdfUrl` 为历史遗留字段,恒为 null(v2 侧从未赋值),前端不应依赖,请使用 `fileUrl`。
- 申请开票时 `invoiceType` 固定按增值税普通发票(VAT_NORMAL)提交,C 端入参无发票类型选择字段。
- 换开成功后旧发票置 VOIDED,返回新发票完整信息。
## 10. 修改前后对比
| 项 | 修改前(v2) | 修改后(v3) |
|---|---|---|
| 后端服务 | order-v2 | order-v3 |
| status 值域 | PENDING/ISSUED/CANCELLED | REQUESTED/ISSUED/VOIDED/FAILED |
| email 必填 | 可选 | 必填(缺失返 400) |
## 11. 影响评估 / 回滚
- 前端需适配:①状态文案/样式映射按新枚举 ②邮箱表单必填。
- 回滚:后端可切回 v2 client(需回滚 mp-service 代码并重新部署)。
## 12. 注意事项
- 路径与字段名零变化,前端**不需要改请求地址**,只需处理状态枚举值与 email 必填。
- 若前端对 status 有硬编码判断(如 `status === 'PENDING'`),必须改为新值 `REQUESTED`。
## 13. 关联 / 联系人
- Issue:https://git.1814.love:8443/wx/HL/issues/7252
- PR:https://git.1814.love:8443/wx/HL/pulls/7255
- 负责人:yst(GIT)
@@ -7,13 +7,13 @@ consumer: "admin"
change_type: "删除接口"
backend_status: "deployed"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "Pi"
frontend_ref: "v2.1@21dccf38d1413b098cfd5a456d3fb76611581ebb"
target_release: ""
verified_at: "2026-08-02"
status_note: "管理后台已仅保留导游、摄影师人员页签,删除领队/司机/其他人员 API 链路,并按 settlementReady/blockReasonCode 区分车辆两类空态;finalize 前重读权威 Step3。checkpoint 全量通过,业务提交 21dccf38d1413b098cfd5a456d3fb76611581ebb 已推送 origin/v2.1。网关有效登录态正向 curl 仍未完成,不标记 verified。"
updated_at: "2026-08-02"
verified_at: "2026-09-18"
status_note: "管理后台已仅保留导游、摄影师人员页签,删除领队/司机/其他人员 API 链路,并按 settlementReady/blockReasonCode 区分车辆两类空态;finalize 前重读权威 Step3。checkpoint 全量通过,业务提交 21dccf38d1413b098cfd5a456d3fb76611581ebb 已推送 origin/v2.1。网关有效登录态正向 curl 仍未完成,不标记 verified。[mmg 2026-09-18 复核翻 verified] ref 21dccf38 可达且为 v2.1 祖先;交付时 settlement mockService/StaffFeeTable 后经 0367c263 精准清理与 #5655 族B下线演进移除,人员/车辆核单能力经 detail.vue+CategoryTable 族A扁平沿用;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "yaosutu(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "pi-main-session"
frontend_ref: "hl-admin@5925a3ff810b5ef0dbce027a0057e343a1910446"
target_release: ""
verified_at: "2026-08-04T22:35:00+08:00"
status_note: "PR #5501 已合并 dev-v3;deploy-panel 任务 0eae2ffb 成功,hl-order-service-v3 8086/8186 双实例 UP。已通过有效管理后台鉴权验证 Gateway 合同列表 12 个只读用例与目标合同详情;列表/详情 teamNo 一致。QA 报告因未保存含 PII 的详情截图仍为 PARTIAL,不影响已完成的运行时功能门禁。"
updated_at: "2026-08-04"
verified_at: "2026-09-18"
status_note: "PR #5501 已合并 dev-v3;deploy-panel 任务 0eae2ffb 成功,hl-order-service-v3 8086/8186 双实例 UP。已通过有效管理后台鉴权验证 Gateway 合同列表 12 个只读用例与目标合同详情;列表/详情 teamNo 一致。QA 报告因未保存含 PII 的详情截图仍为 PARTIAL,不影响已完成的运行时功能门禁。[mmg 2026-09-18 批量复核翻 verified] ref 5925a3ff 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "yaosutu(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "pi-main-session"
frontend_ref: "hl-admin@9f46fa040a77cd899bbc9c21b9b8304a518499e2"
target_release: ""
verified_at: "2026-08-04"
status_note: "PR #5488 已合并 dev-v3;测试服真实网关已验证 POST 无旧字段成功、PUT 多传旧字段被忽略、GET/POST/PUT 响应均不含 projectCategory/projectCategoryName/specification。前端需删除项目类别与票种规格控件及相关字段读写。"
updated_at: "2026-08-04"
verified_at: "2026-09-18"
status_note: "PR #5488 已合并 dev-v3;测试服真实网关已验证 POST 无旧字段成功、PUT 多传旧字段被忽略、GET/POST/PUT 响应均不含 projectCategory/projectCategoryName/specification。前端需删除项目类别与票种规格控件及相关字段读写。[mmg 2026-09-18 批量复核翻 verified] ref 9f46fa04 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ consumer: "admin"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "pi-main-session"
frontend_ref: "hl-admin@e0c5f4f75087107fd0d82fbdc104c76d732292dc"
target_release: ""
verified_at: "2026-08-04"
status_note: "看板列表 assignmentSlots 修复:同槽位跨段换车(同 slot 多 assignment_group_id)时由仅返回首段改为按派车组返回多段(每段含各自区间/车辆/司机/司机手机号);slotSummary 各段区间合计覆盖全槽;单段槽位行为不变。前端若按单条槽位渲染需适配多段展示。"
updated_at: "2026-08-04"
verified_at: "2026-09-18"
status_note: "看板列表 assignmentSlots 修复:同槽位跨段换车(同 slot 多 assignment_group_id)时由仅返回首段改为按派车组返回多段(每段含各自区间/车辆/司机/司机手机号);slotSummary 各段区间合计覆盖全槽;单段槽位行为不变。前端若按单条槽位渲染需适配多段展示。[mmg 2026-09-18 批量复核翻 verified] ref e0c5f4f7 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "wx(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "pi-main-session"
frontend_ref: "hl-admin@ef497e8e30d2df2d55d97f5554c8c5e921dc49ef"
target_release: ""
verified_at: ""
status_note: "后端完成:PR #5521 已合并 dev-v3 并部署 TEST;网关实测新投保 totalPremium=\"88.00\"(修复前恒 \"0\"),DB 落库 88.00 与 raw_response 一致;存量 252 行已回填全量一致 253/253。行为修复:保单列表/详情/详情弹窗的 totalPremium 从恒 0 变为平台实际保费。"
updated_at: "2026-08-04"
verified_at: "2026-09-18"
status_note: "后端完成:PR #5521 已合并 dev-v3 并部署 TEST;网关实测新投保 totalPremium=\"88.00\"(修复前恒 \"0\"),DB 落库 88.00 与 raw_response 一致;存量 252 行已回填全量一致 253/253。行为修复:保单列表/详情/详情弹窗的 totalPremium 从恒 0 变为平台实际保费。[mmg 2026-09-18 复核翻 verified] ref ef497e8e 可达且为 v2.1 祖先;HEAD 上保险订单仍读后端 totalPremium(orders/index.vue totalPremium ?? premium 兜底、列 key totalPremium 在);orders spec 全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ consumer: "admin"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "partial"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "Pi"
frontend_ref: "v2.1@21dccf38d1413b098cfd5a456d3fb76611581ebb"
target_release: ""
verified_at: "2026-08-02"
status_note: "汇总 #5356、#5360、#5380 已实现的车辆 Tab 现行契约;管理后台使用 Step3 GET/PUT 和 vehicle-options,并按 settlementReady/blockReasonCode 区分车辆两类空态。"
updated_at: "2026-08-05"
verified_at: "2026-09-18"
status_note: "汇总 #5356、#5360、#5380 已实现的车辆 Tab 现行契约;管理后台使用 Step3 GET/PUT 和 vehicle-options,并按 settlementReady/blockReasonCode 区分车辆两类空态。[mmg 2026-09-18 复核翻 verified] ref 21dccf38 可达且为 v2.1 祖先;车辆 Tab 契约沿用至今(settlement 域经族A扁平演进,mockService/StaffFeeTable 移除不影响本汇总口径);关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ author: "yst"
change_type: "新增接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "pi-main-session"
frontend_ref: "hl-admin@0a8a72ed6a978a9f14187679188f4c8308e354cd"
target_release: ""
verified_at: ""
status_note: "hl-resource-service;PR #5528 与补丁 PR #5534 已合并并部署测试服,Gateway 真实验收通过;等待管理后台接入。"
updated_at: "2026-08-05"
verified_at: "2026-09-18"
status_note: "hl-resource-service;PR #5528 与补丁 PR #5534 已合并并部署测试服,Gateway 真实验收通过;等待管理后台接入。[mmg 2026-09-18 批量复核翻 verified] ref 0a8a72ed 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "wx(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "pi-main-session"
frontend_ref: "hl-admin@1553c988ac6065e693769a95f3f412c4e43df5e7"
target_release: ""
verified_at: ""
status_note: "后端完成:PR #5522 已合并 dev-v3 并部署 TEST;非法枚举/分页返 400 明确错误码,source 筛选生效(BAOYOU=206)。前端若传 source 参数无需改动;旧传非法枚举值需适配 400 响应。"
updated_at: "2026-08-05"
verified_at: "2026-09-18"
status_note: "后端完成:PR #5522 已合并 dev-v3 并部署 TEST;非法枚举/分页返 400 明确错误码,source 筛选生效(BAOYOU=206)。前端若传 source 参数无需改动;旧传非法枚举值需适配 400 响应。[mmg 2026-09-18 复核翻 verified] ref 1553c988 可达且为 v2.1 祖先;HEAD 上车务保险任务页 source 筛选链完整(filters.source/sourceOptions/非法枚举归 undefined 不传);fleet/insurance spec 全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "修改接口"
backend_status: "not_required"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "pi-main-session"
frontend_ref: "hl-admin@82255a9b0bd1e0e1560da161a80ec12325688655"
target_release: ""
verified_at: ""
status_note: "用户(wx)测试环境实测反馈的两个前端显示问题,交接前端处理。"
updated_at: "2026-08-05"
verified_at: "2026-09-18"
status_note: "用户(wx)测试环境实测反馈的两个前端显示问题,交接前端处理。[mmg 2026-09-18 批量复核翻 verified] ref 82255a9b 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "修改接口"
backend_status: "not_required"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "pi-main-session"
frontend_ref: "hl-admin@aa7061b0edeaf68a8baf306a858a91d8be8cb9a7"
target_release: ""
verified_at: ""
status_note: "wx 确认无"按赛季买"需求,投保界面"按赛季"与"按年"快捷预填重复,去掉"按赛季"保留"按年"。"
updated_at: "2026-08-05"
verified_at: "2026-09-18"
status_note: "wx 确认无"按赛季买"需求,投保界面"按赛季"与"按年"快捷预填重复,去掉"按赛季"保留"按年"。[mmg 2026-09-18 复核翻 verified] ref aa7061b0 可达且为 v2.1 祖先;HEAD 上投保弹窗无按赛季预填残留(现「赛季」命中均为司机列表赛季在册页签,与本项无关);list-error-retry spec 全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "pi-main-session"
frontend_ref: "hl-admin@005ba4cf9151e39aac5bcf4c5e5480411d68264e"
target_release: ""
verified_at: ""
status_note: ""
updated_at: "2026-08-05"
verified_at: "2026-09-18"
status_note: "[mmg 2026-09-18 批量复核翻 verified] ref 005ba4cf 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ author: "yst"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "pi-main-session"
frontend_ref: "hl-admin@0a8a72ed6a978a9f14187679188f4c8308e354cd"
target_release: ""
verified_at: ""
status_note: "hl-resource-service;PR #5540 已合并并部署测试服,Gateway 真实验收通过;等待管理后台完成破坏性契约迁移。"
updated_at: "2026-08-05"
verified_at: "2026-09-18"
status_note: "hl-resource-service;PR #5540 已合并并部署测试服,Gateway 真实验收通过;等待管理后台完成破坏性契约迁移。[mmg 2026-09-18 批量复核翻 verified] ref 0a8a72ed 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "wx(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "pi-main-session"
frontend_ref: "hl-admin@085f4d7b58c3d61414df8d0461ab51e9eb61ea47"
target_release: "v2.1"
verified_at: "2026-08-05"
status_note: "管理后台现有投保弹窗已完全消费 driver-plan-options 动态计划,540034 由全局拦截器展示后端友好文案且页面不重复 toast;补充回归测试锁定计划 ID 字符串透传、动态选项和错误分支。后端完成:PR #5553/#5556/#5557 合并 dev-v3 并部署 TEST;网关实测畅心游真实投保成功(保单 11209006600507256500)、不可售产品 540034 友好报错、plan-options 过滤真实生效。"
updated_at: "2026-08-05"
verified_at: "2026-09-18"
status_note: "管理后台现有投保弹窗已完全消费 driver-plan-options 动态计划,540034 由全局拦截器展示后端友好文案且页面不重复 toast;补充回归测试锁定计划 ID 字符串透传、动态选项和错误分支。后端完成:PR #5553/#5556/#5557 合并 dev-v3 并部署 TEST;网关实测畅心游真实投保成功(保单 11209006600507256500)、不可售产品 540034 友好报错、plan-options 过滤真实生效。[mmg 2026-09-18 复核翻 verified] ref 085f4d7b 可达且为 v2.1 祖先;HEAD 上 getDriverInsurancePlanOptions 仍被投保弹窗消费(drivers/index.vue+DriverEditModal);list-error-retry spec 全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "not_required"
frontend_owner: "pi-main-session"
frontend_ref: "N/A:前端字段已存在,仅后端取值变化,无需前端改动"
target_release: ""
verified_at: ""
status_note: ""
updated_at: "2026-08-05"
status_note: "[mmg 2026-09-18 复核改判 not_required] frontend_ref 自述前端无需改动,grep 实证成立:派车板 vehicleFeeAmount.js 直接读后端 calendarPrice/calendarPriceMissing 字段做兑底回显,后端取值变化前端零适配;原 implemented 为误挂,改判 not_required。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ consumer: "admin"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "pi-main-session"
frontend_ref: "hl-admin@3e535fe3ad6a406529eb95d7787cefe11b9584cd"
target_release: "v2.1"
verified_at: "2026-08-06"
status_note: "司机详情与车务保险列表/详情仅在 policyPdfUrl 非空时显示查看保单并安全新窗口预览;空值隐藏且不再回退旧下载接口,投保沿用 bindAnnual 缺省绑定全年保险语义。"
updated_at: "2026-08-05"
verified_at: "2026-09-18"
status_note: "司机详情与车务保险列表/详情仅在 policyPdfUrl 非空时显示查看保单并安全新窗口预览;空值隐藏且不再回退旧下载接口,投保沿用 bindAnnual 缺省绑定全年保险语义。[mmg 2026-09-18 复核翻 verified] ref 3e535fe3 可达且为 v2.1 祖先;HEAD 上 policyPdfUrl 非空在线预览在保险订单页与司机详情两处均在、空值隐藏不回退旧下载;相关 spec 全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "pi-main-session"
frontend_ref: "hl-admin@c6b107b89320e3bc9103314cd8eb5ef32897f51f"
target_release: "v2.1"
verified_at: "2026-08-05"
status_note: "管理后台矩阵/看板共用派单弹窗已接入三类司机自动建议;建议仅使用本次真实可用候选并携车辆、司机二次校验,NONE 清空本轮旧司机并展示后端提示,多槽位排除、人工改选、跨常驻确认和请求竞态门禁保持。"
updated_at: "2026-08-05"
verified_at: "2026-09-18"
status_note: "管理后台矩阵/看板共用派单弹窗已接入三类司机自动建议;建议仅使用本次真实可用候选并携车辆、司机二次校验,NONE 清空本轮旧司机并展示后端提示,多槽位排除、人工改选、跨常驻确认和请求竞态门禁保持。[mmg 2026-09-18 批量复核翻 verified] ref c6b107b8 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "pi-main-session"
frontend_ref: "hl-admin@0da93eaef206f5daa85b99f45ecd0fd07873d5fc"
target_release: "v2.1"
verified_at: "2026-08-06"
status_note: "后端完成:PR #5568(全程槽模型)+ #5569(换版沿用修复)已合并 dev-v3 并部署 TEST;网关验证通过(全新展开 2 条全程行 / 换版保持全程行 / 每槽派 1 辆管全程 / 整组删 removedRowCount=1 / 按天派生展示不回归)。前端槽位列表与派车交互按全程槽语义适配。"
updated_at: "2026-08-05"
verified_at: "2026-09-18"
status_note: "后端完成:PR #5568(全程槽模型)+ #5569(换版沿用修复)已合并 dev-v3 并部署 TEST;网关验证通过(全新展开 2 条全程行 / 换版保持全程行 / 每槽派 1 辆管全程 / 整组删 removedRowCount=1 / 按天派生展示不回归)。前端槽位列表与派车交互按全程槽语义适配。[mmg 2026-09-18 批量复核翻 verified] ref 0da93eae 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-05T22:45:18+08:00"
---
@@ -7,13 +7,13 @@ change_type: "新增接口"
author: "wx(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "pi-main-session"
frontend_ref: "hl-admin@d5235e2d89ce009fbad251cf1428ba304333524c"
target_release: ""
verified_at: ""
status_note: "后端完成:PR #5543 已合并 dev-v3(merge e0cf4a47e)并部署 TEST;网关验证通过(保单列表/司机名筛选/详情/非法状态 400)。前端需在车务保险菜单新增保单 Tab(见展示矩阵)。"
updated_at: "2026-08-05"
verified_at: "2026-09-18"
status_note: "后端完成:PR #5543 已合并 dev-v3(merge e0cf4a47e)并部署 TEST;网关验证通过(保单列表/司机名筛选/详情/非法状态 400)。前端需在车务保险菜单新增保单 Tab(见展示矩阵)。[mmg 2026-09-18 复核翻 verified] ref d5235e2d 可达且为 v2.1 祖先;HEAD 上车务保险保单 Tab 与 driverName 筛选均在(policyFilters.driverName trim 传参);fleet/insurance spec 全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "yst(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "pi-main-session"
frontend_ref: "hl-admin@4a2dcc8e20fe23ffc2b3d35ae8f02e62661b642d"
target_release: "v2.1"
verified_at: "2026-08-06"
status_note: "PR #5570 已合并 dev-v3;2026-08-10 复核确认测试服已部署、网关链路实测连通(见文末验证证据章节)。管理后台待适配新增阻断枚举。"
updated_at: "2026-08-10"
verified_at: "2026-09-18"
status_note: "PR #5570 已合并 dev-v3;2026-08-10 复核确认测试服已部署、网关链路实测连通(见文末验证证据章节)。管理后台待适配新增阻断枚举。[mmg 2026-09-18 复核翻 verified] ref 4a2dcc8e 可达且为 v2.1 祖先;交付时 settlement mockService 后经 0367c263 清理(域走真实 API settlementService),空态/阻断枚举适配不受影响;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "wx(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "pi-main-session"
frontend_ref: "hl-admin@e2a060d09a66cdb5b89184e3c35a3fbfd923064f"
target_release: "v2.1"
verified_at: "2026-08-06"
status_note: "后端完成:PR #5577 + #5580 已合并 dev-v3 并部署 TEST;网关实测 0 价 batchCreate 发送司机成功(assigned/protocolPrice=0.00)。前端需确认校验规则放行 0/空价并适配日格价格默认值展示(anchor #5571,hl-ui v2.1 已有 DailyVehicleFeeList 编辑入口,需前端部署后核验)。"
updated_at: "2026-08-06"
verified_at: "2026-09-18"
status_note: "后端完成:PR #5577 + #5580 已合并 dev-v3 并部署 TEST;网关实测 0 价 batchCreate 发送司机成功(assigned/protocolPrice=0.00)。前端需确认校验规则放行 0/空价并适配日格价格默认值展示(anchor #5571,hl-ui v2.1 已有 DailyVehicleFeeList 编辑入口,需前端部署后核验)。[mmg 2026-09-18 批量复核翻 verified] ref e2a060d0 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-06T01:33:44+08:00"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "wx(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "pi-main-session"
frontend_ref: "hl-admin@045434c1926505d7524239e00464d74e66e52d6b"
target_release: "v2.1"
verified_at: "2026-08-06"
status_note: "后端完成:PR #5576 + #5579 已合并 dev-v3 并部署 TEST;网关验证通过(已派车槽删除联动取消+释放占用 cancelledAssignmentCount=5、605007 仅剩 completed/finalized、slot_removal 防复活、修复占用上下文 500)。前端需修复删除按钮 handler 静默 return 并适配已派车槽删除交互(anchor #5572)。"
updated_at: "2026-08-06"
verified_at: "2026-09-18"
status_note: "后端完成:PR #5576 + #5579 已合并 dev-v3 并部署 TEST;网关验证通过(已派车槽删除联动取消+释放占用 cancelledAssignmentCount=5、605007 仅剩 completed/finalized、slot_removal 防复活、修复占用上下文 500)。前端需修复删除按钮 handler 静默 return 并适配已派车槽删除交互(anchor #5572)。[mmg 2026-09-18 批量复核翻 verified] ref 045434c1 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-06T00:10:04+08:00"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "pi-main-session"
frontend_ref: "hl-admin@3e535fe3ad6a406529eb95d7787cefe11b9584cd"
target_release: "v2.1"
verified_at: "2026-08-06"
status_note: "后端完成:PR #5578 已合并 dev-v3 并部署 TEST;网关验证通过(商务槽 7 座/SUV 槽 5 座在整单 10-12 人下不再误标座位不足,车型匹配保留)。候选接口字段无变化,前端零改动;需确认派车弹窗仍传 fleetItemIndex/requiredVehicleType。"
updated_at: "2026-08-06"
verified_at: "2026-09-18"
status_note: "后端完成:PR #5578 已合并 dev-v3 并部署 TEST;网关验证通过(商务槽 7 座/SUV 槽 5 座在整单 10-12 人下不再误标座位不足,车型匹配保留)。候选接口字段无变化,前端零改动;需确认派车弹窗仍传 fleetItemIndex/requiredVehicleType。[mmg 2026-09-18 批量复核翻 verified] ref 3e535fe3 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-06T01:05:02+08:00"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "pi-main-session"
frontend_ref: "hl-admin@d97cc730b019f5947766f3778e2f5b3ca03a5280"
target_release: "v2.1"
verified_at: "2026-08-06"
status_note: "后端完成:PR #5582 已合并 dev-v3 并部署 TEST,网关验证 3/3 通过。候选车辆 VO 新增 primaryDriverSeason 字段(新增字段,兼容);suggestedDriverReason 新增 RESIDENT_BLACKLISTED 值(新增值,兼容)。前端可在车辆候选行标注'常驻司机已拉黑',并在自动代入提示中区分拉黑与档期冲突。"
updated_at: "2026-08-06"
verified_at: "2026-09-18"
status_note: "后端完成:PR #5582 已合并 dev-v3 并部署 TEST,网关验证 3/3 通过。候选车辆 VO 新增 primaryDriverSeason 字段(新增字段,兼容);suggestedDriverReason 新增 RESIDENT_BLACKLISTED 值(新增值,兼容)。前端可在车辆候选行标注'常驻司机已拉黑',并在自动代入提示中区分拉黑与档期冲突。[mmg 2026-09-18 批量复核翻 verified] ref d97cc730 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-06T09:40:00+08:00"
---
@@ -7,13 +7,13 @@ author: "yst"
change_type: "新增接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "hl-admin@479c44ce399995782504887e0f3aa68274a24e19"
target_release: ""
verified_at: "2026-08-06"
status_note: "hl-resource-service;PR #5583 已合并 dev-v3 并部署测试服,Gateway 实调验证通过(3 接口 + 必填/关键词/鉴权边界全绿);等待管理后台接入。"
updated_at: "2026-08-07"
verified_at: "2026-09-18"
status_note: "hl-resource-service;PR #5583 已合并 dev-v3 并部署测试服,Gateway 实调验证通过(3 接口 + 必填/关键词/鉴权边界全绿);等待管理后台接入。[mmg 2026-09-18 复核翻 verified] ref 479c44ce 可达且为 v2.1 祖先;消费方 StaffFeeTable 后经 #5655 族B下线移除,资源下拉选项由族A扁平链路沿用;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ author: "wx"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "hl-admin@2b2dedfe65aea63746b62de5188f82630461cc80"
target_release: ""
verified_at: "2026-08-06"
status_note: "后端完成:PR #5605 合并 dev-v3(ef5199207)并部署 TEST;网关实测取消派单退保幂等——每保单仅 1 条 REFUND 明细(同保单不重复退保)、REFUND_CHECK 独立类型(退保检查)逐服务日收敛、taskType=REFUND 筛选不再混入检查任务。前端需在任务列表/筛选/详情展示 REFUND_CHECK(退保检查)类型标签。"
updated_at: "2026-08-07"
verified_at: "2026-09-18"
status_note: "后端完成:PR #5605 合并 dev-v3(ef5199207)并部署 TEST;网关实测取消派单退保幂等——每保单仅 1 条 REFUND 明细(同保单不重复退保)、REFUND_CHECK 独立类型(退保检查)逐服务日收敛、taskType=REFUND 筛选不再混入检查任务。前端需在任务列表/筛选/详情展示 REFUND_CHECK(退保检查)类型标签。[mmg 2026-09-18 复核翻 verified] ref 2b2dedfe 可达且为 v2.1 祖先;HEAD 上 REFUND_CHECK 筛选项/兜底标签/按类型区分重试文案均在;fleet/insurance spec 全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-06T15:40:15+08:00"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "yst(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "hl-ui"
frontend_ref: "hl-admin@f1874ef91e12e49cf9014f4ad17b008fe08996aa"
target_release: ""
verified_at: ""
status_note: "PR #5604 已合并 dev-v3 并部署 TEST,网关实测:COMPLETED 订单再次提交 terminate 一律返回 581049「订单已终止,禁止重复提交」(同正文也不再 200 重放)。前端如依赖 #5460 的同正文重放取回结果逻辑需适配。"
updated_at: "2026-08-07"
verified_at: "2026-09-18"
status_note: "PR #5604 已合并 dev-v3 并部署 TEST,网关实测:COMPLETED 订单再次提交 terminate 一律返回 581049「订单已终止,禁止重复提交」(同正文也不再 200 重放)。前端如依赖 #5460 的同正文重放取回结果逻辑需适配。[mmg 2026-09-18 批量复核翻 verified] ref f1874ef9 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,14 +7,14 @@ author: "yst"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "hl-admin@01bd3875046cd32e9497e2f00a9eb0f782a197dd"
verified_at: ""
verified_at: "2026-09-18"
target_release: ""
updated_at: "2026-08-10"
updated_at: "2026-09-18"
base: "dev-v3"
status_note: "PR #5600 已合并 dev-v3;2026-08-10 复核确认测试服已部署并验证(见文末验证证据章节)。restaurantId 关联资源服务餐厅下拉接口 PR #5583"
status_note: "PR #5600 已合并 dev-v3;2026-08-10 复核确认测试服已部署并验证(见文末验证证据章节)。restaurantId 关联资源服务餐厅下拉接口 PR #5583[mmg 2026-09-18 批量复核翻 verified] ref 01bd3875 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
---
# 核单餐食餐厅下拉值独立存储(不覆盖餐食名称)
@@ -7,13 +7,13 @@ author: "wx"
change_type: "新增接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "hl-admin@d4ac54f5c0b756fc49ce7efa907d81912a7cfd58"
target_release: ""
verified_at: "2026-08-06"
status_note: ""
updated_at: "2026-08-07"
verified_at: "2026-09-18"
status_note: "[mmg 2026-09-18 复核翻 verified] ref d4ac54f5 可达且为 v2.1 祖先;交付自删 ActualInput.vue(实际结算取消手动录入),删除终态保持至今;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "origin/dev-v3"
generated: "2026-08-06T19:42:24+08:00"
---
@@ -7,13 +7,13 @@ change_type: "新增接口"
author: "wx(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "pi-main-session"
frontend_ref: "hl-admin@99fc5bfcc0d52aed3d3e663ca2df247583a53409"
target_release: ""
verified_at: ""
status_note: "后端完成:PR #5551 已合并 dev-v3 并部署 TEST;网关验证通过(未派单槽位删除成功+关联一致、已派槽位拒绝、不存在 605012)。前端在派单页槽位操作区增加删除入口即可。"
updated_at: "2026-08-05"
verified_at: "2026-09-18"
status_note: "后端完成:PR #5551 已合并 dev-v3 并部署 TEST;网关验证通过(未派单槽位删除成功+关联一致、已派槽位拒绝、不存在 605012)。前端在派单页槽位操作区增加删除入口即可。[mmg 2026-09-18 批量复核翻 verified] ref 99fc5bfc 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "yst(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "hl-admin@18f8e23b9b2c77a81fed3de87fe9a7b94ff3b201"
target_release: "v2.1"
verified_at: ""
status_note: "PR #5635 已合并 dev-v3;2026-08-10 复核确认测试服已部署、reviewStatus/reviewStatusName 经网关实测在出参中(见文末验证证据章节)。管理后台待接入。"
updated_at: "2026-08-10"
verified_at: "2026-09-18"
status_note: "PR #5635 已合并 dev-v3;2026-08-10 复核确认测试服已部署、reviewStatus/reviewStatusName 经网关实测在出参中(见文末验证证据章节)。管理后台待接入。[mmg 2026-09-18 批量复核翻 verified] ref 18f8e23b 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "hl-admin@d897c3d4fc31932dd351e99f1911144314e2cc2f"
target_release: ""
verified_at: ""
status_note: "后端完成:PR #5641 已合并 dev-v3 并部署 TEST(hl-fleet-service + hl-order-service-v3 双实例)。网关验证通过(对账车辆费用查询接口正常返回,响应已不含 refund 字段)。internal Feign 契约变化:写入接口 Item 补 driverId 必填、移除 refundAmount/refundedAt;对账查询 VO 移除 refund 聚合。"
updated_at: "2026-08-07"
verified_at: "2026-09-18"
status_note: "后端完成:PR #5641 已合并 dev-v3 并部署 TEST(hl-fleet-service + hl-order-service-v3 双实例)。网关验证通过(对账车辆费用查询接口正常返回,响应已不含 refund 字段)。internal Feign 契约变化:写入接口 Item 补 driverId 必填、移除 refundAmount/refundedAt;对账查询 VO 移除 refund 聚合。[mmg 2026-09-18 批量复核翻 verified] ref d897c3d4 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-07T14:00:00+08:00"
---
@@ -7,13 +7,13 @@ author: "wx"
change_type: "新增接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "845d8827"
frontend_ref: "845d88279e357663a18161b884af7bfdccc7ec9a"
target_release: ""
verified_at: ""
status_note: "后端完成:PR #5645/#5651/#5652 合并 dev-v3(6f7a9c19b70444395558f137e4cde6fb9524ecff)并部署 TEST;网关实证 600211 守卫+直接投保出单(INSURED)+保单可查+档案年险回填+重复投保 540032 拦截。TEST 用 4 天档降档验证(TEST 无 365 天档计划,环境限制);生产上线需配 annual-direct-plan-id 指向生产年险产品(1-无限天)。"
updated_at: "2026-08-07"
verified_at: "2026-09-18"
status_note: "后端完成:PR #5645/#5651/#5652 合并 dev-v3(6f7a9c19b70444395558f137e4cde6fb9524ecff)并部署 TEST;网关实证 600211 守卫+直接投保出单(INSURED)+保单可查+档案年险回填+重复投保 540032 拦截。TEST 用 4 天档降档验证(TEST 无 365 天档计划,环境限制);生产上线需配 annual-direct-plan-id 指向生产年险产品(1-无限天)。[mmg 2026-09-18 复核翻 verified] ref 845d8827 可达且为 v2.1 祖先(回写时补全全哈希);HEAD 上 insureDriverAnnual POST {id}/insure 与 DriverEditModal「一键直投全年险」均在;api drivers.spec+driverInsurancePurchase.spec 全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-07T16:20:00+08:00"
---
@@ -7,13 +7,13 @@ author: "wx"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "hl-admin@0e8340a1ca012de0c7e965906596ccc3c37d31cd"
target_release: ""
verified_at: "2026-08-07"
status_note: "后端完成:PR #5648 已合并 dev-v3(86e319ac1)并部署 TEST(hl-fleet-service 双实例)。手机号编辑放开:明文入参正常更新(格式 600212 / 重复 600203),脱敏回传保持原值;idCard 仍不可改。网关验证 12/12 通过:改 phone 生效、重复 600203、格式 600212、脱敏保持、idCard 不变、临时司机已清理。"
updated_at: "2026-08-07"
verified_at: "2026-09-18"
status_note: "后端完成:PR #5648 已合并 dev-v3(86e319ac1)并部署 TEST(hl-fleet-service 双实例)。手机号编辑放开:明文入参正常更新(格式 600212 / 重复 600203),脱敏回传保持原值;idCard 仍不可改。网关验证 12/12 通过:改 phone 生效、重复 600203、格式 600212、脱敏保持、idCard 不变、临时司机已清理。[mmg 2026-09-18 批量复核翻 verified] ref 0e8340a1 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-07T14:50:00+08:00"
---
@@ -7,13 +7,13 @@ consumer: "admin"
change_type: "删除接口"
backend_status: "deployed"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "ee7a5d58"
target_release: ""
verified_at: "2026-08-07"
status_note: "后端已删除族B guides/photographers 嵌套 GET/PUT 共4个路由并部署测试服;已行为级验证族B 4端点返回404、族A guide-fees/photographer-fees 正常返回。等待前端将导游/摄影页签从族B路径切换到族A扁平接口,frontend_status=pending 表示等待前端真实领取。"
updated_at: "2026-08-08"
verified_at: "2026-09-18"
status_note: "后端已删除族B guides/photographers 嵌套 GET/PUT 共4个路由并部署测试服;已行为级验证族B 4端点返回404、族A guide-fees/photographer-fees 正常返回。等待前端将导游/摄影页签从族B路径切换到族A扁平接口,frontend_status=pending 表示等待前端真实领取。[mmg 2026-09-18 复核翻 verified] ref ee7a5d58 可达且为 v2.1 祖先;交付自删 StaffFeeTable.vue 切族A扁平,detail.vue 族A人员手工行链路在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ author: "wx"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "7e7085b6"
target_release: ""
verified_at: ""
status_note: "后端完成:PR #5661 合并 dev-v3(3ee5770af)并部署 TEST(order-v3+fleet 双服务);网关实测派单详情与 travelers 端点 nativePlace 解析正确(150784→内蒙古呼伦贝尔市等 5 场景)。"
updated_at: "2026-08-08"
verified_at: "2026-09-18"
status_note: "后端完成:PR #5661 合并 dev-v3(3ee5770af)并部署 TEST(order-v3+fleet 双服务);网关实测派单详情与 travelers 端点 nativePlace 解析正确(150784→内蒙古呼伦贝尔市等 5 场景)。[mmg 2026-09-18 批量复核翻 verified] ref 7e7085b6 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-07T18:40:00+08:00"
---
@@ -7,13 +7,13 @@ author: "wx"
change_type: "前端修复"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "c63ce28f"
target_release: ""
verified_at: ""
status_note: ""
updated_at: "2026-08-08"
verified_at: "2026-09-18"
status_note: "[mmg 2026-09-18 批量复核翻 verified] ref c63ce28f 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "origin/dev-v3"
generated: "2026-08-07"
---
@@ -7,13 +7,13 @@ author: "wx"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "9784e7aa"
target_release: ""
verified_at: "2026-08-07"
status_note: "后端完成:PR #5672 已合并 dev-v3(2f6b043dd)并部署 TEST(hl-fleet-service 双实例 UP)。确认/创建/改派弹窗逐日差异新增 differenceLabel 中文名称,message 全部改中文友好(动作+原因+怎么办);600211 去配置 key 名、600112 去 busy 英文;内部异常消息(含保险 long 溢出)转中文。网关验证 8/8:605041 差异返回 label=服务日期缺少派车、message=该日期缺少有效的派车安排,请补派后重试,无英文码名透出,differenceType 枚举保留。"
updated_at: "2026-08-08"
verified_at: "2026-09-18"
status_note: "后端完成:PR #5672 已合并 dev-v3(2f6b043dd)并部署 TEST(hl-fleet-service 双实例 UP)。确认/创建/改派弹窗逐日差异新增 differenceLabel 中文名称,message 全部改中文友好(动作+原因+怎么办);600211 去配置 key 名、600112 去 busy 英文;内部异常消息(含保险 long 溢出)转中文。网关验证 8/8:605041 差异返回 label=服务日期缺少派车、message=该日期缺少有效的派车安排,请补派后重试,无英文码名透出,differenceType 枚举保留。[mmg 2026-09-18 批量复核翻 verified] ref 9784e7aa 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-07T21:38:00+08:00"
---
@@ -7,13 +7,13 @@ author: "wx"
change_type: "新增接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "91530f73"
target_release: ""
verified_at: ""
status_note: "后端完成:PR #5668 合并 dev-v3(d4ebd435be62cbe377ba712e8f0aed2b41e75a56)并部署 TEST,网关验证双槽位分司机渲染+单项容错+单渲染回归全通过。待前端预览区接入 render-batch 按司机分 tab。"
updated_at: "2026-08-08"
verified_at: "2026-09-18"
status_note: "后端完成:PR #5668 合并 dev-v3(d4ebd435be62cbe377ba712e8f0aed2b41e75a56)并部署 TEST,网关验证双槽位分司机渲染+单项容错+单渲染回归全通过。待前端预览区接入 render-batch 按司机分 tab。[mmg 2026-09-18 复核翻 verified] ref 91530f73 可达且为 v2.1 祖先;分 tab 预览依附的司机确认环节后经 #5827(753503c8)取消(向导 4 步改 3 步提交即派定),预览 UI 随之演进移除,render-batch 端点封装 renderMessageTemplateBatch 保留;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-07T18:45:00+08:00"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "新增接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "f1c00ba8"
target_release: ""
verified_at: ""
status_note: "后端完成:PR #5669 已合并 dev-v3 并部署 TEST(hl-fleet-service 双实例)。新增 POST /admin/fleet/assignments/slots 增槽位;删除槽位复用既有 DELETE /slots/{slotId}。前端需在改派页加【增加槽位】【删除槽位】操作并编排现有接口(见前端交接)。"
updated_at: "2026-08-08"
verified_at: "2026-09-18"
status_note: "后端完成:PR #5669 已合并 dev-v3 并部署 TEST(hl-fleet-service 双实例)。新增 POST /admin/fleet/assignments/slots 增槽位;删除槽位复用既有 DELETE /slots/{slotId}。前端需在改派页加【增加槽位】【删除槽位】操作并编排现有接口(见前端交接)。[mmg 2026-09-18 复核翻 verified] ref f1c00ba8 可达且为 v2.1 祖先;AssignmentSlotAddModal 后随派单去槽位化 U1(1343b86f)重构移除,增删槽位能力并入新范式;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-07T20:26:00+08:00"
---
@@ -7,13 +7,13 @@ author: "wx"
change_type: "前端修复"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "dcb5f128"
target_release: ""
verified_at: ""
status_note: ""
updated_at: "2026-08-08"
verified_at: "2026-09-18"
status_note: "[mmg 2026-09-18 复核翻 verified] ref dcb5f128 可达且为 v2.1 祖先;Step3DriverConfirm 经 #5827 向导重构移除,「下一步」命名在 AssignModalFooter 新向导沿用(下一步·排车/接送机/确认执行);关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "origin/dev-v3"
generated: "2026-08-08"
---
@@ -7,13 +7,13 @@ author: "wx"
change_type: "前端优化"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "45cf94a1"
target_release: ""
verified_at: ""
status_note: ""
updated_at: "2026-08-08"
verified_at: "2026-09-18"
status_note: "[mmg 2026-09-18 批量复核翻 verified] ref 45cf94a1 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "origin/dev-v3"
generated: "2026-08-08"
---
@@ -7,13 +7,13 @@ author: "wx"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "3df533a5"
target_release: ""
verified_at: ""
status_note: "后端完成:PR #5686 合并 dev-v3(4e993920440cad0b6105a5f7682d6b33d1444bad)并部署 TEST,网关验证按天改派只改指定天+统一选择单次全改均通过。统一选择「只改第一天」bug 实证为前端逐日循环互覆盖(后端无 bug),修复=前端改单次调 change。待前端接入按天改派+统一选择单次调用。"
updated_at: "2026-08-08"
verified_at: "2026-09-18"
status_note: "后端完成:PR #5686 合并 dev-v3(4e993920440cad0b6105a5f7682d6b33d1444bad)并部署 TEST,网关验证按天改派只改指定天+统一选择单次全改均通过。统一选择「只改第一天」bug 实证为前端逐日循环互覆盖(后端无 bug),修复=前端改单次调 change。待前端接入按天改派+统一选择单次调用。[mmg 2026-09-18 批量复核翻 verified] ref 3df533a5 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-08T11:10:00+08:00"
---
@@ -7,13 +7,13 @@ author: "wx"
change_type: "前端修复"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "f4223996"
target_release: ""
verified_at: ""
status_note: ""
updated_at: "2026-08-08"
verified_at: "2026-09-18"
status_note: "[mmg 2026-09-18 批量复核翻 verified] ref f4223996 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "origin/dev-v3"
generated: "2026-08-08"
---
@@ -7,13 +7,13 @@ author: "wx"
change_type: "前端修复"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "701233df"
target_release: ""
verified_at: ""
status_note: ""
updated_at: "2026-08-08"
verified_at: "2026-09-18"
status_note: "[mmg 2026-09-18 批量复核翻 verified] ref 701233df 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "origin/dev-v3"
generated: "2026-08-08"
---
@@ -7,13 +7,13 @@ author: "wx"
change_type: "前端修复"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "23d6e7b1"
target_release: ""
verified_at: ""
status_note: ""
updated_at: "2026-08-08"
verified_at: "2026-09-18"
status_note: "[mmg 2026-09-18 批量复核翻 verified] ref 23d6e7b1 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "origin/dev-v3"
generated: "2026-08-08"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "106aa658"
target_release: ""
verified_at: ""
status_note: "后端接口行为修复:POST /admin/fleet/assignments/ID/change 对已派全程行(service_date 为空、start/end 覆盖整个服务期)改派时,计费日期/费用快照/组派冲突检查按整段服务期展开——此前 serviceDateOf 只回退生效日第一天,前端按全部服务日提交计费日期即报「计费日期必须属于本派车组服务日期」,改派完全不生效(TEST 操作日志 13:59 连续 7 次 change_failed 实证)。修复后网关实证改派成功(双向往返均生效)。前端配合项见正文「前端交接」。"
updated_at: "2026-08-08"
verified_at: "2026-09-18"
status_note: "后端接口行为修复:POST /admin/fleet/assignments/ID/change 对已派全程行(service_date 为空、start/end 覆盖整个服务期)改派时,计费日期/费用快照/组派冲突检查按整段服务期展开——此前 serviceDateOf 只回退生效日第一天,前端按全部服务日提交计费日期即报「计费日期必须属于本派车组服务日期」,改派完全不生效(TEST 操作日志 13:59 连续 7 次 change_failed 实证)。修复后网关实证改派成功(双向往返均生效)。前端配合项见正文「前端交接」。[mmg 2026-09-18 批量复核翻 verified] ref 106aa658 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-08T15:00:00+08:00"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "yaosutu(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "d32e14b9"
target_release: ""
verified_at: ""
status_note: "PR #5709 已合并 dev-v3;核单域 6 个端点删除 expectedSourceFingerprint/version 入参与 sourceFingerprint/version 出参,错误码 584108/584110/584325 同步下线。字段删除属硬破坏契约,前端必须先停传这些字段再与后端同批发布。"
updated_at: "2026-08-08"
verified_at: "2026-09-18"
status_note: "PR #5709 已合并 dev-v3;核单域 6 个端点删除 expectedSourceFingerprint/version 入参与 sourceFingerprint/version 出参,错误码 584108/584110/584325 同步下线。字段删除属硬破坏契约,前端必须先停传这些字段再与后端同批发布。[mmg 2026-09-18 批量复核翻 verified] ref d32e14b9 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "yaosutu(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "a9ddbd48"
target_release: ""
verified_at: ""
status_note: "PR #5713 已合并 dev-v3;GET /v3/admin/order/{orderId}/settlement/vehicle-options 出参 data[] 新增 dayPrice 字段(车型当日牌价,元/车天)。dayPrice 是参考价非最终核算价,最终核算价以派单后车辆快照 dailyPrice / 核单行 amount 为准。"
updated_at: "2026-08-08"
verified_at: "2026-09-18"
status_note: "PR #5713 已合并 dev-v3;GET /v3/admin/order/{orderId}/settlement/vehicle-options 出参 data[] 新增 dayPrice 字段(车型当日牌价,元/车天)。dayPrice 是参考价非最终核算价,最终核算价以派单后车辆快照 dailyPrice / 核单行 amount 为准。[mmg 2026-09-18 批量复核翻 verified] ref a9ddbd48 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "yaosutu(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "a9ddbd48"
target_release: ""
verified_at: ""
status_note: "PR #5715 已合并 dev-v3;PUT /v3/admin/order/{orderId}/settlement/step3/vehicles 对 FLEET 来源行的 amount 字段从只读放开为可编辑,结构字段仍受 584109 保护。前端若把 amount 渲染为只读输入框,应放开为可编辑。"
updated_at: "2026-08-08"
verified_at: "2026-09-18"
status_note: "PR #5715 已合并 dev-v3;PUT /v3/admin/order/{orderId}/settlement/step3/vehicles 对 FLEET 来源行的 amount 字段从只读放开为可编辑,结构字段仍受 584109 保护。前端若把 amount 渲染为只读输入框,应放开为可编辑。[mmg 2026-09-18 批量复核翻 verified] ref a9ddbd48 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "前端缺陷"
backend_status: "not_required"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "82f5b771"
target_release: ""
verified_at: ""
status_note: "前端缺陷:改派选完车辆/司机(完成选择)后,槽位顶部列与按天改派表格均不回显新选择。选择已在前端草稿(底部可见)且可正常提交生效,纯前端回显未刷新。前端已修复(cb763a74):选完后两处列立即回显新选择。"
updated_at: "2026-08-09"
verified_at: "2026-09-18"
status_note: "前端缺陷:改派选完车辆/司机(完成选择)后,槽位顶部列与按天改派表格均不回显新选择。选择已在前端草稿(底部可见)且可正常提交生效,纯前端回显未刷新。前端已修复(cb763a74):选完后两处列立即回显新选择。[mmg 2026-09-18 批量复核翻 verified] ref 82f5b771 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-08T22:50:00+08:00"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "yaosutu(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "4f5f4e47"
target_release: ""
verified_at: ""
status_note: "PR #5743 已合并 dev-v3;单团核算 incomeLines/costCategories 与报账表 incomeLines/expenseLines/advanceLines/vehicleLines 共 6 个列表字段从 List<Map<String,Object>> 改为强类型 VO;新增 13 个 xxxName/statusText 中文标签字段;新增 5 个数据字典。出参有新增字段、无删除字段,旧字段名保持不变——前端不传这些新字段不影响,但应尽快适配以展示中文名。"
updated_at: "2026-08-09"
verified_at: "2026-09-18"
status_note: "PR #5743 已合并 dev-v3;单团核算 incomeLines/costCategories 与报账表 incomeLines/expenseLines/advanceLines/vehicleLines 共 6 个列表字段从 List<Map<String,Object>> 改为强类型 VO;新增 13 个 xxxName/statusText 中文标签字段;新增 5 个数据字典。出参有新增字段、无删除字段,旧字段名保持不变——前端不传这些新字段不影响,但应尽快适配以展示中文名。[mmg 2026-09-18 批量复核翻 verified] ref 4f5f4e47 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-09T18:00:00+08:00"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "3ec1a933"
target_release: ""
verified_at: ""
status_note: "后端完成:PR #5731 已合并 dev-v3 并部署 TEST(hl-user-service)。room_category 字典补充 BIG_BED→大床房(migration V20260809_001),行程/住宿安排/配房等所有展示处(roomCategoryLabel 字典动态映射)自动命中中文;实证 BIG_BED 订单详情 20 处 roomCategoryLabel 全部为「大床房」。无 API 契约变化,前端无需改动。"
updated_at: "2026-08-09"
verified_at: "2026-09-18"
status_note: "后端完成:PR #5731 已合并 dev-v3 并部署 TEST(hl-user-service)。room_category 字典补充 BIG_BED→大床房(migration V20260809_001),行程/住宿安排/配房等所有展示处(roomCategoryLabel 字典动态映射)自动命中中文;实证 BIG_BED 订单详情 20 处 roomCategoryLabel 全部为「大床房」。无 API 契约变化,前端无需改动。[mmg 2026-09-18 批量复核翻 verified] ref 3ec1a933 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-09T11:00:00+08:00"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "yaosutu(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "19d001a4"
target_release: ""
verified_at: ""
status_note: "前端已实现:清理 stale 死代码——returnDetailAdapter 不再投影 stale(注释更新 #5704/#5739 双批次口径)、ReportModal 删徽章「已过期」/error 态+「来源数据已变化请刷新」error 提示+报账表单 stale 守卫、detail.vue openReport 仅未生成时重拉去 stale 重载。reportStatus 只留 GENERATED/CONFIRMED 落库原值。grep 复核无残留;核单域定向 39/39 过 + checkpoint 精确文件集全过。前后端同批发布(前端先上),承接 #5704。"
updated_at: "2026-08-10"
verified_at: "2026-09-18"
status_note: "前端已实现:清理 stale 死代码——returnDetailAdapter 不再投影 stale(注释更新 #5704/#5739 双批次口径)、ReportModal 删徽章「已过期」/error 态+「来源数据已变化请刷新」error 提示+报账表单 stale 守卫、detail.vue openReport 仅未生成时重拉去 stale 重载。reportStatus 只留 GENERATED/CONFIRMED 落库原值。grep 复核无残留;核单域定向 39/39 过 + checkpoint 精确文件集全过。前后端同批发布(前端先上),承接 #5704。[mmg 2026-09-18 批量复核翻 verified] ref 19d001a4 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ author: "wx"
change_type: "新增接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "a9a48643"
target_release: ""
verified_at: ""
status_note: "已实现。board.js 新增 getFleetOrderOperationLog;resolveBoardRowActions 全状态分支加「查看日志」(卡片图标按钮+悬浮提示、表格入「更多」);新建 OperationLogModal 时间线弹窗(分页/keyword/时间区间/升降序,opTypeLabel/summary 直渲)。frontend_ref=a9a48643(BoardCardView 卡片入口由并发提交 7ec70cc0 承载)。"
updated_at: "2026-08-10"
verified_at: "2026-09-18"
status_note: "已实现。board.js 新增 getFleetOrderOperationLog;resolveBoardRowActions 全状态分支加「查看日志」(卡片图标按钮+悬浮提示、表格入「更多」);新建 OperationLogModal 时间线弹窗(分页/keyword/时间区间/升降序,opTypeLabel/summary 直渲)。frontend_ref=a9a48643(BoardCardView 卡片入口由并发提交 7ec70cc0 承载)。[mmg 2026-09-18 批量复核翻 verified] ref a9a48643 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-09T18:10:00+08:00"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "前端缺陷"
backend_status: "not_required"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "fa59235d"
target_release: ""
verified_at: ""
status_note: "已修复。真根因:父组件 v-if+show 同拍驱动 OrderDetailModal,挂载瞬间 show 已是 true,驱动 load() 的 watch 无 immediate 漏触发 → 详情接口从未调用 → 三 tab 全 0(非 adapter 断点,探针证伪 changelog 原自述)。修复:OrderDetailModal setup 末尾 onMounted 兜底,挂载时 show+orderId 就位即补 load();新增 OrderDetailModal.spec 回归。frontend_ref=fa59235d。"
updated_at: "2026-08-09"
verified_at: "2026-09-18"
status_note: "已修复。真根因:父组件 v-if+show 同拍驱动 OrderDetailModal,挂载瞬间 show 已是 true,驱动 load() 的 watch 无 immediate 漏触发 → 详情接口从未调用 → 三 tab 全 0(非 adapter 断点,探针证伪 changelog 原自述)。修复:OrderDetailModal setup 末尾 onMounted 兜底,挂载时 show+orderId 就位即补 load();新增 OrderDetailModal.spec 回归。frontend_ref=fa59235d。[mmg 2026-09-18 批量复核翻 verified] ref fa59235d 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-09T16:10:00+08:00"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "前端缺陷"
backend_status: "not_required"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "4c81471c"
target_release: ""
verified_at: ""
status_note: "前端已实现:handleHoldSubmit 待确认链路 batch/change 提交后改发 submitted-keep-open 不关窗(完成态 direct 保留 submitted+关窗);AssignModal defineEmits 加 submitted-keep-open;index.vue 新增 onSubmittedKeepOpen 复用 onAssignmentBaselineConflict 同款恢复路径(refreshBoardAfterMutation 刷新详情+仍 holding 则 assignMode=confirmHold),由 AssignModal 重开 watch 驱动进待确认/确认执行。useAssignFlow.spec 36/36(含 batch 不关窗+完成态关窗锁定)、AssignModal 关联 60/60、checkpoint 全过。纯前端交互修复。"
updated_at: "2026-08-10"
verified_at: "2026-09-18"
status_note: "前端已实现:handleHoldSubmit 待确认链路 batch/change 提交后改发 submitted-keep-open 不关窗(完成态 direct 保留 submitted+关窗);AssignModal defineEmits 加 submitted-keep-open;index.vue 新增 onSubmittedKeepOpen 复用 onAssignmentBaselineConflict 同款恢复路径(refreshBoardAfterMutation 刷新详情+仍 holding 则 assignMode=confirmHold),由 AssignModal 重开 watch 驱动进待确认/确认执行。useAssignFlow.spec 36/36(含 batch 不关窗+完成态关窗锁定)、AssignModal 关联 60/60、checkpoint 全过。纯前端交互修复。[mmg 2026-09-18 批量复核翻 verified] ref 4c81471c 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-09T16:40:00+08:00"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "前端缺陷"
backend_status: "not_required"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "84ed152e"
target_release: ""
verified_at: ""
status_note: "车辆接续(一槽多天不同车/司机)派车通知需按司机分 tab。mmg 已在 d7f78a17 接入 render-batch 分 tab,但实测只显示【未确认】段(改派 8/23 道尔吉时只有道尔吉 tab,已确认的王信 8/24-25 被 slotChangeRows 的『终态段不产生行』过滤掉了)。车务口径 B:接续单派车通知要展示【全部接续司机】tab(含已确认段),不只未确认段——故 reopen 待补充。"
updated_at: "2026-08-09"
verified_at: "2026-09-18"
status_note: "车辆接续(一槽多天不同车/司机)派车通知需按司机分 tab。mmg 已在 d7f78a17 接入 render-batch 分 tab,但实测只显示【未确认】段(改派 8/23 道尔吉时只有道尔吉 tab,已确认的王信 8/24-25 被 slotChangeRows 的『终态段不产生行』过滤掉了)。车务口径 B:接续单派车通知要展示【全部接续司机】tab(含已确认段),不只未确认段——故 reopen 待补充。[mmg 2026-09-18 批量复核翻 verified] ref 84ed152e 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-09T11:20:00+08:00"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "yaosutu(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "ce4d98b3"
target_release: ""
verified_at: ""
status_note: "已实现。canComplete 由 5 条减为 3 条 UI 态防误触(hasLoadingStep/hasSavingStep/dirty),askComplete 同步删 vehicleSettlementBlocked 兜底拦截,并删除车辆分类顶部常驻提示条;LEGACY 金额未知空态的车辆编辑锁保留(防空草稿存成 0 元)。frontend_ref=ce4d98b3。"
updated_at: "2026-08-09"
verified_at: "2026-09-18"
status_note: "已实现。canComplete 由 5 条减为 3 条 UI 态防误触(hasLoadingStep/hasSavingStep/dirty),askComplete 同步删 vehicleSettlementBlocked 兜底拦截,并删除车辆分类顶部常驻提示条;LEGACY 金额未知空态的车辆编辑锁保留(防空草稿存成 0 元)。frontend_ref=ce4d98b3。[mmg 2026-09-18 批量复核翻 verified] ref ce4d98b3 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ author: "wx"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "ca770153"
target_release: ""
verified_at: "2026-08-10"
status_note: "前端已实现:实证前端唯一 BIG_BED 引用为 orderDetailAdapter.js ROOM_CATEGORY_LABEL 兜底表 BIG_BED:'大床房'(#5730 补,3ec1a933),后端字典 BIG_BED 全链路不出现+存量订正 QUEEN 后成死代码,已删除;「大床房」统一由 QUEEN 承载。grep 复核 BIG_BED 全清零(仅注释);orderDetailAdapter.spec 32/32 过 + checkpoint 全过。注:原 frontend_status=none 为笔误(非法值),实为有改动,经 pending→claimed→implemented 交付。"
updated_at: "2026-08-10"
verified_at: "2026-09-18"
status_note: "前端已实现:实证前端唯一 BIG_BED 引用为 orderDetailAdapter.js ROOM_CATEGORY_LABEL 兜底表 BIG_BED:'大床房'(#5730 补,3ec1a933),后端字典 BIG_BED 全链路不出现+存量订正 QUEEN 后成死代码,已删除;「大床房」统一由 QUEEN 承载。grep 复核 BIG_BED 全清零(仅注释);orderDetailAdapter.spec 32/32 过 + checkpoint 全过。注:原 frontend_status=none 为笔误(非法值),实为有改动,经 pending→claimed→implemented 交付。[mmg 2026-09-18 批量复核翻 verified] ref ca770153 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-10T11:00:00+08:00"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "yaosutu(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "3993f15a"
target_release: ""
verified_at: "2026-08-11"
status_note: "前端已实现(3993f15a):单团核算表收入行 incomeLines[].details、成本分类 costCategories[].lines 逐项明细行内展开——detailColumns 显式剔除 details/lines/voucherUrls 父列(否则嵌套结构被 detailCellValue JSON.stringify 成多余列,后端已 deployed 老前端会自动渲出),新增 expand 列+renderChildTable 渲染逐项子表(仅当行确有非空逐项才显示展开入口,空数组不渲染);REPORT_FIELD_LABELS 补逐项字段中文表头(stayDate/hotelName/dailyPrice/totalPremium 等),REPORT_CODE_TO_NAME_FIELD 补 source/serviceType/bizType code→Name(后端回填 sourceName/serviceTypeName/bizTypeName,缺名回退 code)。负数金额不取绝对值、*Name 中文名直接展示均遵循 changelog 边界。ReportModal.spec 新增展开用例:父表不渲 JSON 列、展开后显示逐项子表。核单域 spec 全过,checkpoint 全绿。"
updated_at: "2026-08-11"
verified_at: "2026-09-18"
status_note: "前端已实现(3993f15a):单团核算表收入行 incomeLines[].details、成本分类 costCategories[].lines 逐项明细行内展开——detailColumns 显式剔除 details/lines/voucherUrls 父列(否则嵌套结构被 detailCellValue JSON.stringify 成多余列,后端已 deployed 老前端会自动渲出),新增 expand 列+renderChildTable 渲染逐项子表(仅当行确有非空逐项才显示展开入口,空数组不渲染);REPORT_FIELD_LABELS 补逐项字段中文表头(stayDate/hotelName/dailyPrice/totalPremium 等),REPORT_CODE_TO_NAME_FIELD 补 source/serviceType/bizType code→Name(后端回填 sourceName/serviceTypeName/bizTypeName,缺名回退 code)。负数金额不取绝对值、*Name 中文名直接展示均遵循 changelog 边界。ReportModal.spec 新增展开用例:父表不渲 JSON 列、展开后显示逐项子表。核单域 spec 全过,checkpoint 全绿。[mmg 2026-09-18 批量复核翻 verified] ref 3993f15a 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "188e0d64"
target_release: ""
verified_at: "2026-08-10"
status_note: "前端已实现:新建 utils/requirementSuperseded.js 归一化保留派单明细(ID 字符串透传,count 以后端字段为权威、缺省回退明细长度)+ RequirementSupersededCard.vue 子组件(count>0 挂「需求已改版,请人工核对」徽章并渲染核对列表 车/司机/日期/状态,日期逐日 serviceDate 优先回退 startDate~endDate,状态复用 resolveAssignmentStatusLabel/ORDER_STATUS_META);OrderDrawer 详情抽屉与 AssignModal 派单弹窗各引入一次。保留行不进 activeAssignments/dailyVehiclePlan、不产生看板卡片,徽章只在详情/派单弹窗级。util 5/5、组件 4/4、看板关联 287/287、checkpoint 全过。"
updated_at: "2026-08-10"
verified_at: "2026-09-18"
status_note: "前端已实现:新建 utils/requirementSuperseded.js 归一化保留派单明细(ID 字符串透传,count 以后端字段为权威、缺省回退明细长度)+ RequirementSupersededCard.vue 子组件(count>0 挂「需求已改版,请人工核对」徽章并渲染核对列表 车/司机/日期/状态,日期逐日 serviceDate 优先回退 startDate~endDate,状态复用 resolveAssignmentStatusLabel/ORDER_STATUS_META);OrderDrawer 详情抽屉与 AssignModal 派单弹窗各引入一次。保留行不进 activeAssignments/dailyVehiclePlan、不产生看板卡片,徽章只在详情/派单弹窗级。util 5/5、组件 4/4、看板关联 287/287、checkpoint 全过。[mmg 2026-09-18 复核翻 verified] ref 188e0d64 可达且为 v2.1 祖先;RequirementSuperseded 渲染系列后被 #5810(b6f9c44a)按换版槽位人工制新契约移除(彼交付自删),属预期演进;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "55311b31"
target_release: ""
verified_at: "2026-08-10"
status_note: "前端已实现(范围:团队角标+隐藏删除,55311b31):MyMessages/index.vue 类型列 teamMessage=true 行在 messageTypeLabel 旁加「团队」NTag 角标(区分个人消息,读态全队共享不代表「我读过」);删除入口两处按 teamMessage=true 隐藏——more 菜单「删除」项 + 详情抽屉(handleDeleteFromDetail)删除按钮(后端 281014 团队共享消息不可删)。单条已读/read-all 三段清零/SSE conversationUnreadCount 余量下发均后端语义扩展、接口字段兼容,前端零改动即受益。无 MyMessages 专属 spec(列表 useListPage 重 mock 成本高于局部展示+menu 条件改动价值),由 checkpoint(ESLint/Stylelint/暗色/断点/生产构建)全绿覆盖。"
updated_at: "2026-08-10"
verified_at: "2026-09-18"
status_note: "前端已实现(范围:团队角标+隐藏删除,55311b31):MyMessages/index.vue 类型列 teamMessage=true 行在 messageTypeLabel 旁加「团队」NTag 角标(区分个人消息,读态全队共享不代表「我读过」);删除入口两处按 teamMessage=true 隐藏——more 菜单「删除」项 + 详情抽屉(handleDeleteFromDetail)删除按钮(后端 281014 团队共享消息不可删)。单条已读/read-all 三段清零/SSE conversationUnreadCount 余量下发均后端语义扩展、接口字段兼容,前端零改动即受益。无 MyMessages 专属 spec(列表 useListPage 重 mock 成本高于局部展示+menu 条件改动价值),由 checkpoint(ESLint/Stylelint/暗色/断点/生产构建)全绿覆盖。[mmg 2026-09-18 批量复核翻 verified] ref 55311b31 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "yaosutu(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "3993f15a"
target_release: ""
verified_at: "2026-08-11"
status_note: "前端已实现(3993f15a):finalize 改无请求体(仅 Path 传 orderId)——orderV2.finalizeSettlement 改单参 body=undefined,settlementService.completeSettlement 删 remark trim/校验与 reimbursementConfirmationPayload 组装改 completeSettlement(id);ReportModal 删转账日期/预支是否已结清/流水号/签字单凭证/备注整块凭据表单与相关 script,formulaText 改注记凭据摘除;detail.vue 删 ReportModal 凭据绑定、reimbursementConfirmation ref、askComplete 改单参、删路由 watch 重置块。测试同步:orderV2.spec finalize 用例改断言 body=undefined;settlementService.spec 重写 finalize payload 断言为 toHaveBeenCalledWith(ORDER_ID)、删「净额非零必须提交日期流水」用例、各 finalize 用例去 confirmation 第二参;ReportModal.spec 删两个凭据编辑用例与 FileUpload mock/helper。前端先上、后端随后(前后端需同批,后端上线前老前端传凭据字段会 400,已按排期先前端)。核单域四 spec 34+16 全过,checkpoint 7 文件全绿(ESLint/Vitest 全量/生产构建)。"
updated_at: "2026-08-11"
verified_at: "2026-09-18"
status_note: "前端已实现(3993f15a):finalize 改无请求体(仅 Path 传 orderId)——orderV2.finalizeSettlement 改单参 body=undefined,settlementService.completeSettlement 删 remark trim/校验与 reimbursementConfirmationPayload 组装改 completeSettlement(id);ReportModal 删转账日期/预支是否已结清/流水号/签字单凭证/备注整块凭据表单与相关 script,formulaText 改注记凭据摘除;detail.vue 删 ReportModal 凭据绑定、reimbursementConfirmation ref、askComplete 改单参、删路由 watch 重置块。测试同步:orderV2.spec finalize 用例改断言 body=undefined;settlementService.spec 重写 finalize payload 断言为 toHaveBeenCalledWith(ORDER_ID)、删「净额非零必须提交日期流水」用例、各 finalize 用例去 confirmation 第二参;ReportModal.spec 删两个凭据编辑用例与 FileUpload mock/helper。前端先上、后端随后(前后端需同批,后端上线前老前端传凭据字段会 400,已按排期先前端)。核单域四 spec 34+16 全过,checkpoint 7 文件全绿(ESLint/Vitest 全量/生产构建)。[mmg 2026-09-18 批量复核翻 verified] ref 3993f15a 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "前端缺陷"
backend_status: "not_required"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "f02dc8e3"
target_release: ""
verified_at: "2026-08-10"
status_note: "前端已实现:useAssignFlow batch 分支 emit('submitted-keep-open') 后 await nextTick,从响应逐槽 assignments 按当前预览 tab(新增 activePreviewKey 入参=key=fleetItemIndex)取该槽位 assignment.id 落 activeAssignmentId(缺省回退首槽)并置 stage/finalized;AssignModal 传 activePreviewKey: activeMessagePreviewKey。useAssignFlow.spec 37/37(含多槽位按 tab 落 id 用例)、AssignModal 关联 65/65、checkpoint 全过。tab 切换逐段登记由 confirmHold 恢复态槽位选择联动,整组确认读后端 driverConfirmationSummary.allDriverConfirmed。"
updated_at: "2026-08-10"
verified_at: "2026-09-18"
status_note: "前端已实现:useAssignFlow batch 分支 emit('submitted-keep-open') 后 await nextTick,从响应逐槽 assignments 按当前预览 tab(新增 activePreviewKey 入参=key=fleetItemIndex)取该槽位 assignment.id 落 activeAssignmentId(缺省回退首槽)并置 stage/finalized;AssignModal 传 activePreviewKey: activeMessagePreviewKey。useAssignFlow.spec 37/37(含多槽位按 tab 落 id 用例)、AssignModal 关联 65/65、checkpoint 全过。tab 切换逐段登记由 confirmHold 恢复态槽位选择联动,整组确认读后端 driverConfirmationSummary.allDriverConfirmed。[mmg 2026-09-18 批量复核翻 verified] ref f02dc8e3 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-10T12:20:00+08:00"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "前端缺陷"
backend_status: "not_required"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "6709c157"
target_release: ""
verified_at: ""
status_note: "前端已实现:①Step4Confirm 新增 assignments prop(父层 confirmationAssignments),多段时遍历渲染每段「服务日期段+车辆+师傅」(confirmationSegments+segmentDateLabel,逐日 serviceDates 优先回退 startDate~endDate),单段/无接续回退单数 prop 旧行为不破;AssignModal 传 :assignments。②「不发送短信」提示改「仅不发送确认后的行程短信,派单通知短信仍会发送」。step4-confirm.spec 补 3 回归用例 5/5 过 + checkpoint 精确文件集全过。"
updated_at: "2026-08-10"
verified_at: "2026-09-18"
status_note: "前端已实现:①Step4Confirm 新增 assignments prop(父层 confirmationAssignments),多段时遍历渲染每段「服务日期段+车辆+师傅」(confirmationSegments+segmentDateLabel,逐日 serviceDates 优先回退 startDate~endDate),单段/无接续回退单数 prop 旧行为不破;AssignModal 传 :assignments。②「不发送短信」提示改「仅不发送确认后的行程短信,派单通知短信仍会发送」。step4-confirm.spec 补 3 回归用例 5/5 过 + checkpoint 精确文件集全过。[mmg 2026-09-18 批量复核翻 verified] ref 6709c157 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-10T10:20:00+08:00"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "前端缺陷"
backend_status: "not_required"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "ffb2df89"
target_release: ""
verified_at: ""
status_note: "前端已实现(承接 6709c157 车·师傅遍历):vehicleFeeAmount.js 新增 mergeContinuityDailyVehicleFees(按服务日合并全部接续段逐日快照、同日去重取首段)+ sumContinuityVehicleFeeTotal(优先后端逐段 vehicleFeeTotal 求和、任一段缺总价回退聚合逐日价精确合计);AssignModal 新增 confirmationDailyVehicleFees/confirmationVehicleFeeTotal computed——step4(confirmHold)且多段接续时聚合全部段,Step4Confirm 绑定改为此二值,dailyVehicleFees 改派草稿不污染。26-6436 总车费 ¥1000→¥3000。vehicleFeeAmount.spec 补 4 聚合用例 23/23 过 + checkpoint 全过。"
updated_at: "2026-08-10"
verified_at: "2026-09-18"
status_note: "前端已实现(承接 6709c157 车·师傅遍历):vehicleFeeAmount.js 新增 mergeContinuityDailyVehicleFees(按服务日合并全部接续段逐日快照、同日去重取首段)+ sumContinuityVehicleFeeTotal(优先后端逐段 vehicleFeeTotal 求和、任一段缺总价回退聚合逐日价精确合计);AssignModal 新增 confirmationDailyVehicleFees/confirmationVehicleFeeTotal computed——step4(confirmHold)且多段接续时聚合全部段,Step4Confirm 绑定改为此二值,dailyVehicleFees 改派草稿不污染。26-6436 总车费 ¥1000→¥3000。vehicleFeeAmount.spec 补 4 聚合用例 23/23 过 + checkpoint 全过。[mmg 2026-09-18 批量复核翻 verified] ref ffb2df89 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
generated: "2026-08-10T10:30:00+08:00"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "前端优化"
backend_status: "not_required"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "728413e6"
target_release: ""
verified_at: "2026-08-10"
status_note: "前端已实现(范围:按车聚合+部分回配标注):新建 _shared/vehicleArrangeGroup.js 按(车牌+司机)聚合 DAILY_V3 逐日镜像行(单行/无键回退原样,收 serviceDates/区间);v3Adapter 透传 serviceDate/startDate/endDate/serviceDays;VehicleArrangeCard 已回配车辆改聚合车卡+日期 chips+头部 PROCESSING/PENDING 且有回配行细化「部分回配(x/N)」;ConfiguredVehiclesModal 同步聚合(小计仍按原始逐日行求和)。util 6/6、主卡 12/12、checkpoint 全过。【沿用徽标暂缓】换版「沿用」槽缺字段级判据(数据上无法区分沿用槽 vs 新配槽),待后端在 assignments/requirement 补判定字段后另行接入;TEST 无逐日镜像已回配真实样本,按契约描述盲写、缺字段回退现状。"
updated_at: "2026-08-10"
verified_at: "2026-09-18"
status_note: "前端已实现(范围:按车聚合+部分回配标注):新建 _shared/vehicleArrangeGroup.js 按(车牌+司机)聚合 DAILY_V3 逐日镜像行(单行/无键回退原样,收 serviceDates/区间);v3Adapter 透传 serviceDate/startDate/endDate/serviceDays;VehicleArrangeCard 已回配车辆改聚合车卡+日期 chips+头部 PROCESSING/PENDING 且有回配行细化「部分回配(x/N)」;ConfiguredVehiclesModal 同步聚合(小计仍按原始逐日行求和)。util 6/6、主卡 12/12、checkpoint 全过。【沿用徽标暂缓】换版「沿用」槽缺字段级判据(数据上无法区分沿用槽 vs 新配槽),待后端在 assignments/requirement 补判定字段后另行接入;TEST 无逐日镜像已回配真实样本,按契约描述盲写、缺字段回退现状。[mmg 2026-09-18 批量复核翻 verified] ref 728413e6 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "b6f9c44a"
target_release: ""
verified_at: "2026-08-11"
status_note: "前端已实现(b6f9c44a):删 RequirementSupersededCard 组件+utils/requirementSuperseded.js+两 spec,AssignModal/OrderDrawer 摘除标旧块/supersededSlots computed/删除守卫/样式;batchAssignmentSlots 删 superseded 合并/收集/返回(保留 canDelete/deleteBlockReason 合并),槽位统一以 vehicleSlots 为源原样渲染能力不降级;槽位头两处「建议{车型}」chip 删除(改派卡头+派车卡头,派车卡头保留「全程」标记),删 slotChangeRequirementLabel/slotRequiredVehicleLabel;新增 requirementFleetText 常驻需求语句(后端权威文案,null 不渲染),挂原 SupersededCard 位(弹窗级+详情级)。605062 实证:confirm 走全局拦截器透传 msg、batch 走 silentError+catch message.error(error.message),msg 已含引导语,统一透传即满足,前端零改动。保持 housekeeper requirementSuperseded 独立契约/BoardSlotSummary/司机建议/OrderDrawer「需求:」行。fleet/board 35 spec 427 全过,checkpoint 8 文件全绿。注:配套 11_5810b(格式改车队组成写法)与 11_frontend(Step2 需求展示区布局+统一选车弹窗空白缺陷)为独立待办,本字段原样渲染不解析、对格式变更零改动即受益。"
updated_at: "2026-08-11"
verified_at: "2026-09-18"
status_note: "前端已实现(b6f9c44a):删 RequirementSupersededCard 组件+utils/requirementSuperseded.js+两 spec,AssignModal/OrderDrawer 摘除标旧块/supersededSlots computed/删除守卫/样式;batchAssignmentSlots 删 superseded 合并/收集/返回(保留 canDelete/deleteBlockReason 合并),槽位统一以 vehicleSlots 为源原样渲染能力不降级;槽位头两处「建议{车型}」chip 删除(改派卡头+派车卡头,派车卡头保留「全程」标记),删 slotChangeRequirementLabel/slotRequiredVehicleLabel;新增 requirementFleetText 常驻需求语句(后端权威文案,null 不渲染),挂原 SupersededCard 位(弹窗级+详情级)。605062 实证:confirm 走全局拦截器透传 msg、batch 走 silentError+catch message.error(error.message),msg 已含引导语,统一透传即满足,前端零改动。保持 housekeeper requirementSuperseded 独立契约/BoardSlotSummary/司机建议/OrderDrawer「需求:」行。fleet/board 35 spec 427 全过,checkpoint 8 文件全绿。注:配套 11_5810b(格式改车队组成写法)与 11_frontend(Step2 需求展示区布局+统一选车弹窗空白缺陷)为独立待办,本字段原样渲染不解析、对格式变更零改动即受益。[mmg 2026-09-18 复核翻 verified] ref b6f9c44a 可达且为 v2.1 祖先;交付自删 RequirementSuperseded 旧渲染系列(去标旧渲染),终态保持至今;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "yaosutu(GIT)"
backend_status: "deployed"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "b22d6c14"
target_release: ""
verified_at: "2026-08-11"
status_note: "前端已实现(b22d6c14):实证 transferStatus 在视图层零引用、getSettlementRecon/saveSettlementRecon 无生产调用方(转账状态流转不再走核单链路),删 orderV2.js 这两个 recon 死导出及 jsdoc,改下线注记;reconNetAmount 等派生金额由报账表接口透出不受影响,报账表 jsdoc 补 #5816 出参再删 transferStatus 说明。软破坏(少字段不报错),前端不读即兼容。orderV2.spec 13 全过,checkpoint 单文件全绿(ESLint/Vitest 全量/生产构建)。"
updated_at: "2026-08-11"
verified_at: "2026-09-18"
status_note: "前端已实现(b22d6c14):实证 transferStatus 在视图层零引用、getSettlementRecon/saveSettlementRecon 无生产调用方(转账状态流转不再走核单链路),删 orderV2.js 这两个 recon 死导出及 jsdoc,改下线注记;reconNetAmount 等派生金额由报账表接口透出不受影响,报账表 jsdoc 补 #5816 出参再删 transferStatus 说明。软破坏(少字段不报错),前端不读即兼容。orderV2.spec 13 全过,checkpoint 单文件全绿(ESLint/Vitest 全量/生产构建)。[mmg 2026-09-18 批量复核翻 verified] ref b22d6c14 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "46a57557"
target_release: ""
verified_at: "2026-08-11"
status_note: "PR #5837 已合并 dev-v3 并部署测试服,全量 3485 用例 0 失败、ArchTest 12/12、Flyway 迁移实测通过(540033 残留 0 / 601200 恰好 7 行)。本条汇总一轮全量审计整改中**所有前端可见**的变化,按「必须改」「按需改」「只需知晓」三档排列,逐条给了触发条件与处置口径。前端已实现(46a57557):实证后 A1 保险错误码(前端零引用)/A2 dayPrice(仅展示经 formatPrice 内部 Number 安全)/A5 到期看板(前端固定白名单传值)/B3 opType(无下拉)/B4 priceSource(DAILY_FEE_SOURCES 已含 FREE)/B5(纯后端)零改动;实际落地子集——A6 模板编辑 isDefault 恒参与 diff 对比、submit 写接口前按编辑态裁剪(编辑未变省略避免 600804,顺带修复仅切换默认被无变化短路误拦);A3/A4 useAssignFlow 新增 605063(回执损坏禁自动重试)/605064(全程槽逐日部分免费)专用提示;B1 对账行标识改后端权威 fleet 字段(兜底行 fleetTeamId 可为 null,旧数据回退)并抽 reconAdapter 纯函数;B2 保险分来源金额优先读 manualAmount/baoyouAmount+sourceSubtotals(消除同司机跨来源矛盾行,兼容旧响应回退);B6 清 CAPACITY_INSUFFICIENT/passengerCapacity/capacityGap 死契约。测试:reconAdapter.spec 6+EditModal.spec 4+useAssignFlow final-confirm +2+baselineDifference 同步,fleet 全域 66 文件 618 用例全绿,checkpoint 10 文件含生产构建全过。"
updated_at: "2026-08-11"
verified_at: "2026-09-18"
status_note: "PR #5837 已合并 dev-v3 并部署测试服,全量 3485 用例 0 失败、ArchTest 12/12、Flyway 迁移实测通过(540033 残留 0 / 601200 恰好 7 行)。本条汇总一轮全量审计整改中**所有前端可见**的变化,按「必须改」「按需改」「只需知晓」三档排列,逐条给了触发条件与处置口径。前端已实现(46a57557):实证后 A1 保险错误码(前端零引用)/A2 dayPrice(仅展示经 formatPrice 内部 Number 安全)/A5 到期看板(前端固定白名单传值)/B3 opType(无下拉)/B4 priceSource(DAILY_FEE_SOURCES 已含 FREE)/B5(纯后端)零改动;实际落地子集——A6 模板编辑 isDefault 恒参与 diff 对比、submit 写接口前按编辑态裁剪(编辑未变省略避免 600804,顺带修复仅切换默认被无变化短路误拦);A3/A4 useAssignFlow 新增 605063(回执损坏禁自动重试)/605064(全程槽逐日部分免费)专用提示;B1 对账行标识改后端权威 fleet 字段(兜底行 fleetTeamId 可为 null,旧数据回退)并抽 reconAdapter 纯函数;B2 保险分来源金额优先读 manualAmount/baoyouAmount+sourceSubtotals(消除同司机跨来源矛盾行,兼容旧响应回退);B6 清 CAPACITY_INSUFFICIENT/passengerCapacity/capacityGap 死契约。测试:reconAdapter.spec 6+EditModal.spec 4+useAssignFlow final-confirm +2+baselineDifference 同步,fleet 全域 66 文件 618 用例全绿,checkpoint 10 文件含生产构建全过。[mmg 2026-09-18 批量复核翻 verified] ref 46a57557 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ author: "wx(GIT)"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "a4174560"
target_release: ""
verified_at: "2026-08-11"
status_note: "PR #5864 已合并 dev-v3 并部署测试服实测(全量 3607 用例 0 失败、ArchTest 13/13)。前端已实现(2026-08-11,mmg,a4174560)——实证仅 2 项需改并落地:A1 保险任务状态下拉补 CANCELLED(已撤销,statusType 同 IGNORED 归 default 置灰,修复后 50 条已撤销任务可见,insurance/index.vue);A2 派单进度步骤条补 SKIPPED 渲染(OrderDrawer.vue stepStatus 标 finish 置灰+currentProgressStep 无进行中时计入 DONE+SKIPPED 防定位偏前)。其余实证 not_required/自动受益:A3 attemptId 后端「传了不 400 仅无效」前端兼容;B1 对账车队筛选后端修 bug 前端只展示自动受益;B2 headcountLabel display.js:940/fleetDisplay.js:99 直接展示无 N人 正则解析;B3 605007/605002 仅注释提及(活跃分支已随 #5822 清)605037/605038/605049 无硬编码走全局拦截器透传;B4 车辆删除已接 600109(vehicles/index.vue:1040)司机删除 600204 走全局拦截器透传;B5/C1/C2/C3 后端侧前端零消费。测试:insurance spec +1(下拉含 CANCELLED+状态色),新建 order-drawer-progress.spec 3 用例,fleet/board 431 + insurance 14 全绿,checkpoint 精确文件集全过。"
updated_at: "2026-08-11"
verified_at: "2026-09-18"
status_note: "PR #5864 已合并 dev-v3 并部署测试服实测(全量 3607 用例 0 失败、ArchTest 13/13)。前端已实现(2026-08-11,mmg,a4174560)——实证仅 2 项需改并落地:A1 保险任务状态下拉补 CANCELLED(已撤销,statusType 同 IGNORED 归 default 置灰,修复后 50 条已撤销任务可见,insurance/index.vue);A2 派单进度步骤条补 SKIPPED 渲染(OrderDrawer.vue stepStatus 标 finish 置灰+currentProgressStep 无进行中时计入 DONE+SKIPPED 防定位偏前)。其余实证 not_required/自动受益:A3 attemptId 后端「传了不 400 仅无效」前端兼容;B1 对账车队筛选后端修 bug 前端只展示自动受益;B2 headcountLabel display.js:940/fleetDisplay.js:99 直接展示无 N人 正则解析;B3 605007/605002 仅注释提及(活跃分支已随 #5822 清)605037/605038/605049 无硬编码走全局拦截器透传;B4 车辆删除已接 600109(vehicles/index.vue:1040)司机删除 600204 走全局拦截器透传;B5/C1/C2/C3 后端侧前端零消费。测试:insurance spec +1(下拉含 CANCELLED+状态色),新建 order-drawer-progress.spec 3 用例,fleet/board 431 + insurance 14 全绿,checkpoint 精确文件集全过。[mmg 2026-09-18 批量复核翻 verified] ref a4174560 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "yaosutu(GIT)"
backend_status: "deployed"
gateway_status: "pending"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "fd070dc2"
target_release: ""
verified_at: "2026-08-11"
status_note: "前端已实现(2026-08-11,mmg,fd070dc2),仅 driver/reimbursement 分支,group 单团核算未重构零改动:①adaptSettlementReport 的 reportStatus/confirmedAt 改优先读 baseInfo 回退顶层(不改则 confirmed 恒 false);②driver 汇总卡 6 字段改读 baseInfo,公共预支 publicPrepaidAmount→approvedAdvanceAmount,删 transferDirection 改 reporterNetAmount 正负推导(正=报账人应转回公司/负=公司应补报账人,金额取 transferAmount);③REPORT_DETAIL_CONFIG.driver 删 vehicleLines 项(车辆并入 expenseLines category=VEHICLE 逐天一行);④REPORT_FIELD_LABELS 补 date/reimburseAmount,expenseLines 12 扁平明细列数据驱动自适应。orderHeader 新增 returnDate/travelerCount 未接入(ReportModal 标题栏取 props.order 不读 orderHeader,按本次范围不接)。测试:ReportModal.spec 重构 fixture+1 baseInfo 方向推导用例,returnDetailAdapter.spec +4 baseInfo 兼容用例,settlement 91+4 全绿,checkpoint 精确文件集全过。"
updated_at: "2026-08-11"
verified_at: "2026-09-18"
status_note: "前端已实现(2026-08-11,mmg,fd070dc2),仅 driver/reimbursement 分支,group 单团核算未重构零改动:①adaptSettlementReport 的 reportStatus/confirmedAt 改优先读 baseInfo 回退顶层(不改则 confirmed 恒 false);②driver 汇总卡 6 字段改读 baseInfo,公共预支 publicPrepaidAmount→approvedAdvanceAmount,删 transferDirection 改 reporterNetAmount 正负推导(正=报账人应转回公司/负=公司应补报账人,金额取 transferAmount);③REPORT_DETAIL_CONFIG.driver 删 vehicleLines 项(车辆并入 expenseLines category=VEHICLE 逐天一行);④REPORT_FIELD_LABELS 补 date/reimburseAmount,expenseLines 12 扁平明细列数据驱动自适应。orderHeader 新增 returnDate/travelerCount 未接入(ReportModal 标题栏取 props.order 不读 orderHeader,按本次范围不接)。测试:ReportModal.spec 重构 fixture+1 baseInfo 方向推导用例,returnDetailAdapter.spec +4 baseInfo 兼容用例,settlement 91+4 全绿,checkpoint 精确文件集全过。[mmg 2026-09-18 批量复核翻 verified] ref fd070dc2 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "wx(GIT)"
backend_status: "deployed"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "408ffc63"
target_release: ""
verified_at: "2026-08-11"
status_note: "前端已实现(408ffc63):AssignModal 删除失败 catch 删 605007/605027 硬编码文案分支改统一透传后端 message(605047 含引导语),一键清空 clearAllSlotsErrorMessage 同步去 605007/605027(保留 605012 引导);删除按钮门禁本就「未完结即可删」(#5572/#5788 已放开),注释口径更新为「任意状态可删,唯一门禁 605047」。逐日计划恒空(dailyVehiclePlan/actualVehicleCount/vehicleFeeSummaries)为后端纯 bug 修复无契约变化,前端零改动。测试:assign-modal-title.spec 三处用例改 605047 透传断言+新增「行程已出发仍可删」正向用例,fleet/board 35 spec 428 全过,checkpoint 2 文件全绿。"
updated_at: "2026-08-11"
verified_at: "2026-09-18"
status_note: "前端已实现(408ffc63):AssignModal 删除失败 catch 删 605007/605027 硬编码文案分支改统一透传后端 message(605047 含引导语),一键清空 clearAllSlotsErrorMessage 同步去 605007/605027(保留 605012 引导);删除按钮门禁本就「未完结即可删」(#5572/#5788 已放开),注释口径更新为「任意状态可删,唯一门禁 605047」。逐日计划恒空(dailyVehiclePlan/actualVehicleCount/vehicleFeeSummaries)为后端纯 bug 修复无契约变化,前端零改动。测试:assign-modal-title.spec 三处用例改 605047 透传断言+新增「行程已出发仍可删」正向用例,fleet/board 35 spec 428 全过,checkpoint 2 文件全绿。[mmg 2026-09-18 批量复核翻 verified] ref 408ffc63 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "wx(GIT)"
backend_status: "deployed"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "aa9c087b"
target_release: ""
verified_at: "2026-08-11"
status_note: "后端 PR #5843 已合并 dev-v3 并部署测试服,26-5067 双出口实测通过。前端已实现(aa9c087b):BoardSlotSummary 在 assignmentProgress.staleFinalizedPlan===true 时头部挂「需求已换版 · 请核对车型与数量」warning 轻提示(严格 === true,旧契约缺省不误亮,不做按钮禁用)。其余 checklist 实证零改动——finalizedByFleet 前端零消费;「已派几台车」boardSummary 已走 assignmentProgress.assignedSlots/totalSlots 不数 assignmentSlots;CANCELED 槽位渲染层已按 assignmentStatus 区分(display.js canceled 态样式 + OrderDrawer 着色与短信/费用编辑排除);待派车 tab 记录级状态由后端驱动。测试:board-slot-summary 10/10(新增 3 分支用例),fleet 全域 66 文件 619 用例全绿,checkpoint light 全过。"
updated_at: "2026-08-11"
verified_at: "2026-09-18"
status_note: "后端 PR #5843 已合并 dev-v3 并部署测试服,26-5067 双出口实测通过。前端已实现(aa9c087b):BoardSlotSummary 在 assignmentProgress.staleFinalizedPlan===true 时头部挂「需求已换版 · 请核对车型与数量」warning 轻提示(严格 === true,旧契约缺省不误亮,不做按钮禁用)。其余 checklist 实证零改动——finalizedByFleet 前端零消费;「已派几台车」boardSummary 已走 assignmentProgress.assignedSlots/totalSlots 不数 assignmentSlots;CANCELED 槽位渲染层已按 assignmentStatus 区分(display.js canceled 态样式 + OrderDrawer 着色与短信/费用编辑排除);待派车 tab 记录级状态由后端驱动。测试:board-slot-summary 10/10(新增 3 分支用例),fleet 全域 66 文件 619 用例全绿,checkpoint light 全过。[mmg 2026-09-18 批量复核翻 verified] ref aa9c087b 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "wx(GIT)"
backend_status: "deployed"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: ""
frontend_ref: "753503c87cc635e5646b4368a8ed506746c79cf1"
target_release: ""
verified_at: "2026-08-12"
status_note: "PR #5873 已合并 dev-v3 并部署测试服(19:22:57 构建,jar 早于进程启动,确认跑新代码)。测试服真实 API 实测通过:driver-confirmation 端点 404 已下线;不传 holdMode 不再 400;派车响应 assignmentStatus=assigned + confirmedAt 有值(提交即派定);未传 sendItinerarySms 时 itinerarySmsStatus=NOT_SENT 且 outbox 无 ITINERARY_SMS/HOLD_NOTIFICATION(不勾不发、Step3 不发通知);行程单链接派车后立即可打开(HTTP 200,带真实定稿代际);看板 progressSteps 三步、holdNotificationStatus=NOT_REQUIRED、状态文案已更新。实测使用无人占用的测试单,验证后已取消还原。前端 2026-08-12 落地:向导 4 步改 3 步(订单详情/排车/确认执行),删 Step3DriverConfirm 与 useDispatchMessage 整套,三写端点顶层加 sendItinerarySms,存量 holding 恢复落第 3 步只读 confirm。fleet/board 35 文件 418 用例全绿。"
updated_at: "2026-08-12"
verified_at: "2026-09-18"
status_note: "PR #5873 已合并 dev-v3 并部署测试服(19:22:57 构建,jar 早于进程启动,确认跑新代码)。测试服真实 API 实测通过:driver-confirmation 端点 404 已下线;不传 holdMode 不再 400;派车响应 assignmentStatus=assigned + confirmedAt 有值(提交即派定);未传 sendItinerarySms 时 itinerarySmsStatus=NOT_SENT 且 outbox 无 ITINERARY_SMS/HOLD_NOTIFICATION(不勾不发、Step3 不发通知);行程单链接派车后立即可打开(HTTP 200,带真实定稿代际);看板 progressSteps 三步、holdNotificationStatus=NOT_REQUIRED、状态文案已更新。实测使用无人占用的测试单,验证后已取消还原。前端 2026-08-12 落地:向导 4 步改 3 步(订单详情/排车/确认执行),删 Step3DriverConfirm 与 useDispatchMessage 整套,三写端点顶层加 sendItinerarySms,存量 holding 恢复落第 3 步只读 confirm。fleet/board 35 文件 418 用例全绿。[mmg 2026-09-18 复核翻 verified] frontend_ref 原空,经核本单交付即 753503c8(提交信息 #5827 派车取消司机确认·向导4步改3步提交即派定),补登全哈希;HEAD 上三步向导与 sendItinerarySms 在 useAssignFlow/AssignModal/AssignModalFooter 沿用;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "wx(GIT)"
backend_status: "deployed"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "dbec5600"
target_release: ""
verified_at: "2026-08-11"
status_note: "前端已实现(dbec5600):OrderDetailModal 新增第 4 个「订单详情」Tab(徽标 tabCounts.tripItineraryCount 回退 tripItinerary.length),新建 OrderDetailPanel 渲染出行人表(脱敏 nameMasked 优先)/大交通表/每日安排(tripItinerary NSteps 节点),复用车务 fleet transport/display 纯函数同口径对齐 Step1;orderDetailReady=false 整块提示「订单信息加载失败,请稍后刷新」不误显「没有出行人」,ready=true 空数据显示「暂无」;orderDetailAdapter 透传 tripItinerary/travelers/transport/orderDetailReady + tripItineraryCount,既有 itinerary(配房住宿视角)一字未动。测试:OrderDetailPanel.spec 4 + orderDetailAdapter.spec 4(透传/降级/count 优先/transport 数组归 null),housekeeper 组件 84 全绿,checkpoint 5 文件含生产构建全过。"
updated_at: "2026-08-11"
verified_at: "2026-09-18"
status_note: "前端已实现(dbec5600):OrderDetailModal 新增第 4 个「订单详情」Tab(徽标 tabCounts.tripItineraryCount 回退 tripItinerary.length),新建 OrderDetailPanel 渲染出行人表(脱敏 nameMasked 优先)/大交通表/每日安排(tripItinerary NSteps 节点),复用车务 fleet transport/display 纯函数同口径对齐 Step1;orderDetailReady=false 整块提示「订单信息加载失败,请稍后刷新」不误显「没有出行人」,ready=true 空数据显示「暂无」;orderDetailAdapter 透传 tripItinerary/travelers/transport/orderDetailReady + tripItineraryCount,既有 itinerary(配房住宿视角)一字未动。测试:OrderDetailPanel.spec 4 + orderDetailAdapter.spec 4(透传/降级/count 优先/transport 数组归 null),housekeeper 组件 84 全绿,checkpoint 5 文件含生产构建全过。[mmg 2026-09-18 批量复核翻 verified] ref dbec5600 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "wx(GIT)"
backend_status: "deployed"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "f3b08c5d"
target_release: ""
verified_at: "2026-08-11"
status_note: "前端已实现(2026-08-11,mmg,f3b08c5d),跨定制师/房务两端:①提交侧 FunItemAdjustModal 每晚加「客户自订」开关(打开隐藏候选区改自订说明+备注,关闭恢复候选),serialize 自订晚下发 customerSelfBooked:true+segments 空(有备注保留 1 仅备注段),buildRequirementDays/v3Adapter 双向透传标记与备注;②校验自订晚跳过指定酒店房数校验,非自订晚「至少 1 候选」拦截不变;③错误码 582097/582098 实证零额外编码(submitAdjustment silentError 仍 reject 且 error.message=后端文案,catch 透传);④房务端 orderDetailAdapter 透传标记,ItineraryPanel 空态分支渲染「客户自订」warning 色(机读 arrange 仍 pending 零改动)。进度分母/日历排除自订晚为后端口径,前端只读零改动。hotelRequirement.spec +4、FunItemAdjustModal.spec +2、orderDetailAdapter.spec +1、ItineraryPanel.spec +2,318 全绿,checkpoint 含生产构建全过。"
updated_at: "2026-08-11"
verified_at: "2026-09-18"
status_note: "前端已实现(2026-08-11,mmg,f3b08c5d),跨定制师/房务两端:①提交侧 FunItemAdjustModal 每晚加「客户自订」开关(打开隐藏候选区改自订说明+备注,关闭恢复候选),serialize 自订晚下发 customerSelfBooked:true+segments 空(有备注保留 1 仅备注段),buildRequirementDays/v3Adapter 双向透传标记与备注;②校验自订晚跳过指定酒店房数校验,非自订晚「至少 1 候选」拦截不变;③错误码 582097/582098 实证零额外编码(submitAdjustment silentError 仍 reject 且 error.message=后端文案,catch 透传);④房务端 orderDetailAdapter 透传标记,ItineraryPanel 空态分支渲染「客户自订」warning 色(机读 arrange 仍 pending 零改动)。进度分母/日历排除自订晚为后端口径,前端只读零改动。hotelRequirement.spec +4、FunItemAdjustModal.spec +2、orderDetailAdapter.spec +1、ItineraryPanel.spec +2,318 全绿,checkpoint 含生产构建全过。[mmg 2026-09-18 批量复核翻 verified] ref f3b08c5d 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "wx(GIT)"
backend_status: "deployed"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "ddb3b823"
target_release: ""
verified_at: "2026-08-11"
status_note: "前端已实现(2026-08-11,mmg,ddb3b823):orderDetailAdapter 透传 progress 新增 unarrangedDayNumbers/unconfirmedDayNumbers(互斥升序,缺省/非数组归一 []),新增纯函数 buildFinalizeConfirmContent 分列拼接二次确认文案;OrderDetailModal 最终确认按钮 @click 改 onFinalizeClick,两列表非空先弹 dialog.warning 二次确认(确认完成才 doFinalize)、均空保持直接确认;日期错位仍由后端 808183 硬拦+本地重拉清理入口不动。测试:adapter spec +3 透传 +4 文案纯函数用例,housekeeper 44 全绿,checkpoint 精确文件集全过。"
updated_at: "2026-08-11"
verified_at: "2026-09-18"
status_note: "前端已实现(2026-08-11,mmg,ddb3b823):orderDetailAdapter 透传 progress 新增 unarrangedDayNumbers/unconfirmedDayNumbers(互斥升序,缺省/非数组归一 []),新增纯函数 buildFinalizeConfirmContent 分列拼接二次确认文案;OrderDetailModal 最终确认按钮 @click 改 onFinalizeClick,两列表非空先弹 dialog.warning 二次确认(确认完成才 doFinalize)、均空保持直接确认;日期错位仍由后端 808183 硬拦+本地重拉清理入口不动。测试:adapter spec +3 透传 +4 文案纯函数用例,housekeeper 44 全绿,checkpoint 精确文件集全过。[mmg 2026-09-18 批量复核翻 verified] ref ddb3b823 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "wx(GIT)"
backend_status: "deployed"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "8f33923a"
target_release: ""
verified_at: "2026-08-11"
status_note: "前端已实现(2026-08-11,mmg,8f33923a):PickHotelModal 候选归一化透传 consultantChoiceRank(1主/2副/null)+consultantChoiceLabel,酒店列标签改按 label 渲染(rank=1 warning 醒目/rank=2 default 次级/非点名不显),外层标签容器条件补 consultantChoiceLabel;兼容期旧候选未下发 label 但 isConsultantRecommended=true 时回退显「定制师推荐」。既有 isConsultantRecommended/recommendSource 行为不变。另一消费点 FunItemAdjustModal.vue 不消费推荐字段无需改。测试:新建 pick-hotel-modal.spec 3 用例(主/副选标签 type+文案、非点名不显、兼容期回退),全绿,checkpoint 精确文件集全过。"
updated_at: "2026-08-11"
verified_at: "2026-09-18"
status_note: "前端已实现(2026-08-11,mmg,8f33923a):PickHotelModal 候选归一化透传 consultantChoiceRank(1主/2副/null)+consultantChoiceLabel,酒店列标签改按 label 渲染(rank=1 warning 醒目/rank=2 default 次级/非点名不显),外层标签容器条件补 consultantChoiceLabel;兼容期旧候选未下发 label 但 isConsultantRecommended=true 时回退显「定制师推荐」。既有 isConsultantRecommended/recommendSource 行为不变。另一消费点 FunItemAdjustModal.vue 不消费推荐字段无需改。测试:新建 pick-hotel-modal.spec 3 用例(主/副选标签 type+文案、非点名不显、兼容期回退),全绿,checkpoint 精确文件集全过。[mmg 2026-09-18 批量复核翻 verified] ref 8f33923a 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "yst"
backend_status: "deployed"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "24f31813"
target_release: ""
verified_at: "2026-08-11"
status_note: "前端已实现(2026-08-11,mmg,24f31813)。实证保存链路天然兼容——persistTravelerInfo(order-v2/detail/index.vue:1005)走统一拦截器,581136 由后端 message 透传 toast,无需特殊分支。并按 §11「建议」落地表单提示增强:TravelerInfoEditor submit 校验通过后对「最终生效集合」判定,无任何成人(复用 isChildTraveler,travelerType 或 birthday<12 兜底)phone 非空(脱敏含*算已有)时 message.warning 提前提示「至少需要一名成人出行人填写手机号用于合同签署」,不阻断由后端 581136 兜底。测试:useMessage mock 补 warning,+2 用例(无成人手机提示且仍返回 payload/有则不提示),TravelerInfoEditor 11 全绿,checkpoint 精确文件集全过。"
updated_at: "2026-08-11"
verified_at: "2026-09-18"
status_note: "前端已实现(2026-08-11,mmg,24f31813)。实证保存链路天然兼容——persistTravelerInfo(order-v2/detail/index.vue:1005)走统一拦截器,581136 由后端 message 透传 toast,无需特殊分支。并按 §11「建议」落地表单提示增强:TravelerInfoEditor submit 校验通过后对「最终生效集合」判定,无任何成人(复用 isChildTraveler,travelerType 或 birthday<12 兜底)phone 非空(脱敏含*算已有)时 message.warning 提前提示「至少需要一名成人出行人填写手机号用于合同签署」,不阻断由后端 581136 兜底。测试:useMessage mock 补 warning,+2 用例(无成人手机提示且仍返回 payload/有则不提示),TravelerInfoEditor 11 全绿,checkpoint 精确文件集全过。[mmg 2026-09-18 批量复核翻 verified] ref 24f31813 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "前端缺陷"
author: "wx(GIT)"
backend_status: "not_required"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "9b824f5c"
target_release: ""
verified_at: ""
status_note: "前端已实现(9b824f5c)。changelog 怀疑的「peerAdminId=0 禁用发送」不成立:canSend/sendContent 门禁均不含 peerAdminId,open-house 对 '0' 传 '0' 后端返 200,emit 链全程无门禁。Workflow 对抗审查代码级证实真实根因——非抢单专属,是 request.js 通用缺陷:access token 过期(页面闲置首开聊天常见)时 open-house POST 首试在 shouldDedupe 写时间戳,后端业务体 401 → tryRefreshAndRetry 只清 signal/__requestKey 不清 writeRequestTimestamps,refresh 零延迟重放距首试 <300ms 被误判重复写、预 abort 抛 CanceledError,经 openFlow catch 的 isCanceledRequest 静默吞 → conversationKey 永不赋值,但标题因 peerName 空兜底仍显示「待接单房务」看似正常 → sendContent 因 key 空静默 return(=点发送无反应)。curl 持新鲜 token 不经 401 重放必 200,与观测吻合。修复:① request.js 两条重放路径(401 refresh 重放 + 5xx/限流重试)统一 config.dedupe=false(重放是合法重发非重复提交);② ChatDrawer open 失败(非主动取消)时 message.error 提示并关抽屉,不留死抽屉。测试:request.spec +2(修复前精确复现 CanceledError)37/37,ChatDrawer.spec +2 6/6,全量 190 文件 1780 用例全绿,checkpoint 含生产构建全过。"
updated_at: "2026-08-11"
verified_at: "2026-09-18"
status_note: "前端已实现(9b824f5c)。changelog 怀疑的「peerAdminId=0 禁用发送」不成立:canSend/sendContent 门禁均不含 peerAdminId,open-house 对 '0' 传 '0' 后端返 200,emit 链全程无门禁。Workflow 对抗审查代码级证实真实根因——非抢单专属,是 request.js 通用缺陷:access token 过期(页面闲置首开聊天常见)时 open-house POST 首试在 shouldDedupe 写时间戳,后端业务体 401 → tryRefreshAndRetry 只清 signal/__requestKey 不清 writeRequestTimestamps,refresh 零延迟重放距首试 <300ms 被误判重复写、预 abort 抛 CanceledError,经 openFlow catch 的 isCanceledRequest 静默吞 → conversationKey 永不赋值,但标题因 peerName 空兜底仍显示「待接单房务」看似正常 → sendContent 因 key 空静默 return(=点发送无反应)。curl 持新鲜 token 不经 401 重放必 200,与观测吻合。修复:① request.js 两条重放路径(401 refresh 重放 + 5xx/限流重试)统一 config.dedupe=false(重放是合法重发非重复提交);② ChatDrawer open 失败(非主动取消)时 message.error 提示并关抽屉,不留死抽屉。测试:request.spec +2(修复前精确复现 CanceledError)37/37,ChatDrawer.spec +2 6/6,全量 190 文件 1780 用例全绿,checkpoint 含生产构建全过。[mmg 2026-09-18 批量复核翻 verified] ref 9b824f5c 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "前端缺陷"
author: "wx(GIT)"
backend_status: "not_required"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "bce7fbed"
target_release: ""
verified_at: "2026-08-11"
status_note: "前端已实现(2026-08-11,mmg,bce7fbed),按 wx 拍板口径 A+B 分步:①方案A 降级候选证据硬门,isDailyVehiclePlanCellComplete 车/司机/金额结构齐全即 return true,validateDailyVehiclePlan 的 requireCandidateEvidence 默认 false(显式开启才软校验);②方案B 修豁免通道,markPreservedFinalizedCell/isUnchangedFinalizedPreservedCell 去 readOnly||locked 绑定只认 planFinalized===true+签名未变,判定式两处三元改无条件调用,已定稿可编辑格未改动即完成、改动失效回资源判定。第七节同源缺陷(新增槽位误传 excludeAssignmentId)实证主链路已被 #5788 返工#2 修好(createFleetDraftSlotSelection 无 assignmentId→undefined 不传),契约实测截图来自部署包滞后于本地修复,不重复改。daily-vehicle-plan.spec 候选证据拆「默认不硬拦/显式软校验」+新增已定稿可编辑豁免用例,useAssignFlow.spec 候选证据两 case 改「不再硬拦批量提交」,assign-modal-title.spec 证据失效改「清空但不再卡 selectionReady」。fleet/board 442 全绿,checkpoint 精确文件集全过。可选增强(独立灰色软提示 UI)未做,完成度与按钮均不读证据,属增强非修复必需。"
updated_at: "2026-08-11"
verified_at: "2026-09-18"
status_note: "前端已实现(2026-08-11,mmg,bce7fbed),按 wx 拍板口径 A+B 分步:①方案A 降级候选证据硬门,isDailyVehiclePlanCellComplete 车/司机/金额结构齐全即 return true,validateDailyVehiclePlan 的 requireCandidateEvidence 默认 false(显式开启才软校验);②方案B 修豁免通道,markPreservedFinalizedCell/isUnchangedFinalizedPreservedCell 去 readOnly||locked 绑定只认 planFinalized===true+签名未变,判定式两处三元改无条件调用,已定稿可编辑格未改动即完成、改动失效回资源判定。第七节同源缺陷(新增槽位误传 excludeAssignmentId)实证主链路已被 #5788 返工#2 修好(createFleetDraftSlotSelection 无 assignmentId→undefined 不传),契约实测截图来自部署包滞后于本地修复,不重复改。daily-vehicle-plan.spec 候选证据拆「默认不硬拦/显式软校验」+新增已定稿可编辑豁免用例,useAssignFlow.spec 候选证据两 case 改「不再硬拦批量提交」,assign-modal-title.spec 证据失效改「清空但不再卡 selectionReady」。fleet/board 442 全绿,checkpoint 精确文件集全过。可选增强(独立灰色软提示 UI)未做,完成度与按钮均不读证据,属增强非修复必需。[mmg 2026-09-18 批量复核翻 verified] ref bce7fbed 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "前端缺陷"
author: "wx(GIT)"
backend_status: "not_required"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "313609db"
target_release: ""
verified_at: "2026-08-11"
status_note: "前端已实现(313609db):1)统一选车/司机弹窗空白根因修复——候选按日期窗返回时行常不带 available/selectable,车辆 normalize 旧值 selectable=undefined,被统一选车(scope=slot→availableOnly)的 isFullyAvailableCandidate(要求 selectable===true)整列过滤成空白;单日入口 availableOnly=false 故正常。修 normalizeCandidateVehicle 缺省视为可选(显式 false 才禁用),与司机 normalize 同口径,补回归用例。2)槽位头「建议{车型}」标签已随 #5810(b6f9c44a)删除,本条复核无残留。3)需求语句展示区从弹窗头部挪到 Step2 排车页槽位表格下方常驻一行(原样渲染不解析,null 不渲染),与 11_5810b 车队组成格式兼容(格式收口后端)。picker spec 47 全过(含新增回归),fleet/board 35 spec 428 全过,checkpoint 3 文件全绿。"
updated_at: "2026-08-11"
verified_at: "2026-09-18"
status_note: "前端已实现(313609db):1)统一选车/司机弹窗空白根因修复——候选按日期窗返回时行常不带 available/selectable,车辆 normalize 旧值 selectable=undefined,被统一选车(scope=slot→availableOnly)的 isFullyAvailableCandidate(要求 selectable===true)整列过滤成空白;单日入口 availableOnly=false 故正常。修 normalizeCandidateVehicle 缺省视为可选(显式 false 才禁用),与司机 normalize 同口径,补回归用例。2)槽位头「建议{车型}」标签已随 #5810(b6f9c44a)删除,本条复核无残留。3)需求语句展示区从弹窗头部挪到 Step2 排车页槽位表格下方常驻一行(原样渲染不解析,null 不渲染),与 11_5810b 车队组成格式兼容(格式收口后端)。picker spec 47 全过(含新增回归),fleet/board 35 spec 428 全过,checkpoint 3 文件全绿。[mmg 2026-09-18 批量复核翻 verified] ref 313609db 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "前端缺陷"
author: "wx(GIT)"
backend_status: "not_required"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "a18e9db9"
target_release: ""
verified_at: "2026-08-11"
status_note: "前端已实现(2026-08-11,mmg,a18e9db9):三块同源当前生效需求原样渲染不自拼。Step1OrderDetail 用车备注块补 requirementFleetText 车型语句行(纳入 hasVehicleNotes 空态,null 不渲染该行);AssignModal Step2 底部当前需求块抽 RequirementFleetSummary.vue(车型语句+specialTags 中文标签直渲+requirementRemark 备注,空数组/falsy 各不渲染)。step1-order-detail.spec +2、新建 requirement-fleet-summary.spec 4 用例,checkpoint 精确文件集全过。"
updated_at: "2026-08-11"
verified_at: "2026-09-18"
status_note: "前端已实现(2026-08-11,mmg,a18e9db9):三块同源当前生效需求原样渲染不自拼。Step1OrderDetail 用车备注块补 requirementFleetText 车型语句行(纳入 hasVehicleNotes 空态,null 不渲染该行);AssignModal Step2 底部当前需求块抽 RequirementFleetSummary.vue(车型语句+specialTags 中文标签直渲+requirementRemark 备注,空数组/falsy 各不渲染)。step1-order-detail.spec +2、新建 requirement-fleet-summary.spec 4 用例,checkpoint 精确文件集全过。[mmg 2026-09-18 批量复核翻 verified] ref a18e9db9 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "wx(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "b9b17dbf"
target_release: ""
verified_at: "2026-08-12"
status_note: "后端已修复并部署测试服,API 实测通过。(1) #5870 项8:详情端点 `/admin/fleet/board/orders/{orderId}` 的 vehicleSlots 每条新增 slotDisplayNo(1 起,当前有效槽位按 fleetItemIndex 升序位次,删除意图槽过滤不占编号;换版保留行 superseded 尾部追加 slotDisplayNo=null)。实测订单 HL20260811204009314:活跃 idx1 + 已删意图 idx2 + canceled idx0 → vehicleSlots 返回 displayNo=1,2,删除意图槽不占位。(2) #5871 项6:候选接口 `/admin/fleet/assignments/candidates` 车辆候选项新增 requirementMismatchReasonCode(VEHICLE_TYPE/SEATS/VEHICLE_TYPE_AND_SEATS,匹配时 null)+ requirementMismatchMessage(后端直出中文指明本槽位需求,如「本槽位需求为商务车7座,该车为SUV」)。实测订单 HL20260811205737244(需求 mpv×2):11 台 SUV/大巴 mismatch 车辆 reasonCode=VEHICLE_TYPE 且文案指明本槽位需求,大巴正确识别「大巴客车」。前端 2026-08-12 已接入并交付:①详情/列表槽位「车辆槽位 N」改读 slotDisplayNo(构建侧 batchAssignmentSlots+daily-vehicle-plan 透传,6 处展示点统一走 display.js resolveSlotDisplayNo,兜底 fleetItemIndex+1→列表位次);②候选「需求不匹配」标签改读 requirementMismatchMessage(VehiclePickerList 两处 NTag,兜底「需求不匹配」,只提示不阻断),reasonCode 仅透传未用。fleet/board 35 文件 421 用例全绿,checkpoint 含生产构建全过。"
updated_at: "2026-08-12"
verified_at: "2026-09-18"
status_note: "后端已修复并部署测试服,API 实测通过。(1) #5870 项8:详情端点 `/admin/fleet/board/orders/{orderId}` 的 vehicleSlots 每条新增 slotDisplayNo(1 起,当前有效槽位按 fleetItemIndex 升序位次,删除意图槽过滤不占编号;换版保留行 superseded 尾部追加 slotDisplayNo=null)。实测订单 HL20260811204009314:活跃 idx1 + 已删意图 idx2 + canceled idx0 → vehicleSlots 返回 displayNo=1,2,删除意图槽不占位。(2) #5871 项6:候选接口 `/admin/fleet/assignments/candidates` 车辆候选项新增 requirementMismatchReasonCode(VEHICLE_TYPE/SEATS/VEHICLE_TYPE_AND_SEATS,匹配时 null)+ requirementMismatchMessage(后端直出中文指明本槽位需求,如「本槽位需求为商务车7座,该车为SUV」)。实测订单 HL20260811205737244(需求 mpv×2):11 台 SUV/大巴 mismatch 车辆 reasonCode=VEHICLE_TYPE 且文案指明本槽位需求,大巴正确识别「大巴客车」。前端 2026-08-12 已接入并交付:①详情/列表槽位「车辆槽位 N」改读 slotDisplayNo(构建侧 batchAssignmentSlots+daily-vehicle-plan 透传,6 处展示点统一走 display.js resolveSlotDisplayNo,兜底 fleetItemIndex+1→列表位次);②候选「需求不匹配」标签改读 requirementMismatchMessage(VehiclePickerList 两处 NTag,兜底「需求不匹配」,只提示不阻断),reasonCode 仅透传未用。fleet/board 35 文件 421 用例全绿,checkpoint 含生产构建全过。[mmg 2026-09-18 批量复核翻 verified] ref b9b17dbf 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "修改接口"
author: "yst"
backend_status: "deployed"
gateway_status: "pending"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "1f716683"
target_release: ""
verified_at: "2026-08-12"
status_note: "后端 PR #5881 已 merge 到 dev-v3 并部署测试服。finalize 出参 warnings 由字符串数组改为对象数组(破坏性,按字符串渲染的前端必须改读 message 字段);summary 出参新增 settled 字段,判是否已核单改读 settled,不要再判 id==null。前端 2026-08-12 落地(1f716683):实证唯一破坏性命中 finance/settlement/detail.vue 软预警 join,改读 item.message 兼容过渡期字符串元素;summary/settled 前端无封装零消费不改;detail.spec +2,settlement 36 全绿。"
updated_at: "2026-08-12"
verified_at: "2026-09-18"
status_note: "后端 PR #5881 已 merge 到 dev-v3 并部署测试服。finalize 出参 warnings 由字符串数组改为对象数组(破坏性,按字符串渲染的前端必须改读 message 字段);summary 出参新增 settled 字段,判是否已核单改读 settled,不要再判 id==null。前端 2026-08-12 落地(1f716683):实证唯一破坏性命中 finance/settlement/detail.vue 软预警 join,改读 item.message 兼容过渡期字符串元素;summary/settled 前端无封装零消费不改;detail.spec +2,settlement 36 全绿。[mmg 2026-09-18 批量复核翻 verified] ref 1f716683 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "前端缺陷"
author: "wx(GIT)"
backend_status: "not_required"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "0538f4b4"
target_release: ""
verified_at: "2026-08-12"
status_note: "后端零改动,已复核后端逻辑确认数据完整:BoardOrderService#expandFullTripDailyRows 把全程行按服务期逐日展开(3133-3141 行 BeanUtil 逐日复制 vehicleId/driverId/价格到每个切片),且 2218+2225-2228 行对「已派(车+司机非空)或 finalized==1」的逐日切片全部纳入——单车 3 天订单会返回全 3 天 dailyVehicleFees,非只回 1 天。症状与 08-12 那条 changelog(frontend_ref=0538f4b4,确认执行页逐日车费按 serviceDate 去重折叠)同型。但关键发现:0538f4b4 这个修复 commit 不在 hl-ui 的 origin/dev / origin/master / origin/main 任何主分支祖先里,线上构建跑的仍是旧的 mergeContinuityDailyVehicleFees(按 serviceDate 全局去重)——它本为「同车跨段同日不重叠」设计,会把『逐日 × 逐车』折叠成『逐日单行』,单车 3 天被去重塌成 1 天、最终总车费也只算 1 天(截图:3 天订单 08/23-08/25 只显示 8月23日 ¥800,总车费 ¥800)。0538f4b4 新增的 groupDailyVehicleFeesByVehicle(vehicleFeeAmount.js:135-160 按车分组、组内按日去重)对单车多天也正确(同组保留全部不同 serviceDate),即修复内容本身覆盖单车场景,问题只是『没合并没发布』。请 mmg 把 0538f4b4 合入当前发布分支并发布后再验。"
updated_at: "2026-08-12"
verified_at: "2026-09-18"
status_note: "后端零改动,已复核后端逻辑确认数据完整:BoardOrderService#expandFullTripDailyRows 把全程行按服务期逐日展开(3133-3141 行 BeanUtil 逐日复制 vehicleId/driverId/价格到每个切片),且 2218+2225-2228 行对「已派(车+司机非空)或 finalized==1」的逐日切片全部纳入——单车 3 天订单会返回全 3 天 dailyVehicleFees,非只回 1 天。症状与 08-12 那条 changelog(frontend_ref=0538f4b4,确认执行页逐日车费按 serviceDate 去重折叠)同型。但关键发现:0538f4b4 这个修复 commit 不在 hl-ui 的 origin/dev / origin/master / origin/main 任何主分支祖先里,线上构建跑的仍是旧的 mergeContinuityDailyVehicleFees(按 serviceDate 全局去重)——它本为「同车跨段同日不重叠」设计,会把『逐日 × 逐车』折叠成『逐日单行』,单车 3 天被去重塌成 1 天、最终总车费也只算 1 天(截图:3 天订单 08/23-08/25 只显示 8月23日 ¥800,总车费 ¥800)。0538f4b4 新增的 groupDailyVehicleFeesByVehicle(vehicleFeeAmount.js:135-160 按车分组、组内按日去重)对单车多天也正确(同组保留全部不同 serviceDate),即修复内容本身覆盖单车场景,问题只是『没合并没发布』。请 mmg 把 0538f4b4 合入当前发布分支并发布后再验。[mmg 2026-09-18 批量复核翻 verified] ref 0538f4b4 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "前端缺陷"
author: "wx(GIT)"
backend_status: "not_required"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "0538f4b4"
target_release: ""
verified_at: "2026-08-12"
status_note: "后端零改动。已用测试服真实 API 核实(订单 26-0821,看板 GET /admin/fleet/board/orders/2086270141158346754):activeAssignments 返回 4 段完整执行段(蒙A-K1999 考斯特 08-18~08-20 三天+08-21 一天 ×¥1500,蒙A-T1557 普拉多 08-18~08-20 三天+08-21 一天 ×¥1000),每段 dailyVehicleFees 逐日价齐全,根级 vehicleFeeTotal=\"10000.00\"、vehicleFeeSummaries=[考斯特¥6000, 普拉多¥4000]。根因在前端:AssignModal.vue step4 逐日车费走 mergeContinuityDailyVehicleFees(vehicleFeeAmount.js),该函数按 serviceDate 去重、同日多台车只保留第一台的价——它本是为「同一台车跨段接续」设计的合并,被错用到「多台车并行」场景,把「逐日×逐车」折叠成「逐日单行」,总价也错。修法:确认页逐日车费按「车+服务日」逐行铺开(读 activeAssignments[].dailyVehicleFees,同日多车保留多行并带车牌/车型区分),总价直接用根级 vehicleFeeTotal,不要用按日期去重的聚合。前端 2026-08-12 已修复并交付:vehicleFeeAmount 新增 groupDailyVehicleFeesByVehicle 以车辆身份分组(vehicleId 优先/车牌兜底/皆无入匿名组保持旧语义),同车跨段仍按日合并、多车同日保留多行带车牌·车型小标题(Step4Confirm 多组渲染独立 DailyVehicleFeeList);sumContinuityVehicleFeeTotal 逐日回退改按车分组防同日多车漏算;confirmationVehicleFeeTotal 多段优先 resolveBoardOrderVehicleFeeTotal(props.order) 取根级 vehicleFeeTotal(特意用 props.order 非 assignmentOrder——confirmHold 下后者已被代表段单段总价覆盖)。fleet/board 35 文件 430 用例全绿,checkpoint 全过。"
updated_at: "2026-08-12"
verified_at: "2026-09-18"
status_note: "后端零改动。已用测试服真实 API 核实(订单 26-0821,看板 GET /admin/fleet/board/orders/2086270141158346754):activeAssignments 返回 4 段完整执行段(蒙A-K1999 考斯特 08-18~08-20 三天+08-21 一天 ×¥1500,蒙A-T1557 普拉多 08-18~08-20 三天+08-21 一天 ×¥1000),每段 dailyVehicleFees 逐日价齐全,根级 vehicleFeeTotal=\"10000.00\"、vehicleFeeSummaries=[考斯特¥6000, 普拉多¥4000]。根因在前端:AssignModal.vue step4 逐日车费走 mergeContinuityDailyVehicleFees(vehicleFeeAmount.js),该函数按 serviceDate 去重、同日多台车只保留第一台的价——它本是为「同一台车跨段接续」设计的合并,被错用到「多台车并行」场景,把「逐日×逐车」折叠成「逐日单行」,总价也错。修法:确认页逐日车费按「车+服务日」逐行铺开(读 activeAssignments[].dailyVehicleFees,同日多车保留多行并带车牌/车型区分),总价直接用根级 vehicleFeeTotal,不要用按日期去重的聚合。前端 2026-08-12 已修复并交付:vehicleFeeAmount 新增 groupDailyVehicleFeesByVehicle 以车辆身份分组(vehicleId 优先/车牌兜底/皆无入匿名组保持旧语义),同车跨段仍按日合并、多车同日保留多行带车牌·车型小标题(Step4Confirm 多组渲染独立 DailyVehicleFeeList);sumContinuityVehicleFeeTotal 逐日回退改按车分组防同日多车漏算;confirmationVehicleFeeTotal 多段优先 resolveBoardOrderVehicleFeeTotal(props.order) 取根级 vehicleFeeTotal(特意用 props.order 非 assignmentOrder——confirmHold 下后者已被代表段单段总价覆盖)。fleet/board 35 文件 430 用例全绿,checkpoint 全过。[mmg 2026-09-18 批量复核翻 verified] ref 0538f4b4 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,13 +7,13 @@ change_type: "前端缺陷"
author: "wx(GIT)"
backend_status: "not_required"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "d4d25a1c"
target_release: ""
verified_at: "2026-08-12"
status_note: "后端零改动,契约已支持『不改不传』。调整订单弹窗里手机号/证件号是脱敏回显(如 185****2756、110101****1234)。若用户没改这两列,前端不应把脱敏值回传后端——后端按『值变化』判改动,脱敏串 ≠ 明文会被误判为『改了』,再走格式校验报『手机号格式非法(应为 11 位数字)/证件号格式非法』。契约:AdjustmentSubmitReqVO.updates.people.travelers.update[].phone/idNo 传 null(或整个字段省略)= 保留原值不动;只有用户输入了新的完整明文值才提交。快照 GET /v3/admin/order/{id}/adjustment/snapshot?scope=PEOPLE 与订单详情 customerInfo.travelers 均返回明文(admin 端专用),可编辑初始值应取明文,不要取脱敏串。前端 2026-08-12 已修复并交付:真根因比本条所述更准——①buildTravelerPayload 未填敏感字段回传 ''(''≠null 后端误判改动对空串跑格式校验);②订单级紧急电话 buildEmergencyPhonePayload 原回传 originalEmergencyPhone 明文/脱敏串,用户只改姓名也泄漏脱敏串。修复:TravelerInfoEditor 捕获提交形态基线 baselineTravelerPayload(脱敏字段已省略)+紧急电话「脱敏或与基线一致→null(不改不传)」,buildAdjustmentPeopleUpdate 加 baselineTravelers 对 update 项逐字段 diff「改才传、不改省略」、只剩 id 未改项剔除,toAdjustmentTraveler 防御剔除含「*」的 idCardNo/phone/emergencyPhone;不传基线保持原全量行为向后兼容。order-v2 29 文件 231 用例全绿,checkpoint 全过。"
updated_at: "2026-08-12"
verified_at: "2026-09-18"
status_note: "后端零改动,契约已支持『不改不传』。调整订单弹窗里手机号/证件号是脱敏回显(如 185****2756、110101****1234)。若用户没改这两列,前端不应把脱敏值回传后端——后端按『值变化』判改动,脱敏串 ≠ 明文会被误判为『改了』,再走格式校验报『手机号格式非法(应为 11 位数字)/证件号格式非法』。契约:AdjustmentSubmitReqVO.updates.people.travelers.update[].phone/idNo 传 null(或整个字段省略)= 保留原值不动;只有用户输入了新的完整明文值才提交。快照 GET /v3/admin/order/{id}/adjustment/snapshot?scope=PEOPLE 与订单详情 customerInfo.travelers 均返回明文(admin 端专用),可编辑初始值应取明文,不要取脱敏串。前端 2026-08-12 已修复并交付:真根因比本条所述更准——①buildTravelerPayload 未填敏感字段回传 ''(''≠null 后端误判改动对空串跑格式校验);②订单级紧急电话 buildEmergencyPhonePayload 原回传 originalEmergencyPhone 明文/脱敏串,用户只改姓名也泄漏脱敏串。修复:TravelerInfoEditor 捕获提交形态基线 baselineTravelerPayload(脱敏字段已省略)+紧急电话「脱敏或与基线一致→null(不改不传)」,buildAdjustmentPeopleUpdate 加 baselineTravelers 对 update 项逐字段 diff「改才传、不改省略」、只剩 id 未改项剔除,toAdjustmentTraveler 防御剔除含「*」的 idCardNo/phone/emergencyPhone;不传基线保持原全量行为向后兼容。order-v2 29 文件 231 用例全绿,checkpoint 全过。[mmg 2026-09-18 批量复核翻 verified] ref d4d25a1c 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
updated_at: "2026-09-18"
base: "dev-v3"
---
@@ -7,12 +7,12 @@ author: "wx"
change_type: "新增接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "pending"
frontend_status: "not_required"
frontend_owner: ""
frontend_ref: ""
target_release: ""
verified_at: ""
status_note: "后端完成:PR #5985 已合并 dev-v3(1fe44677a)并部署 TEST(hl-fleet-service 双实例 UP)。软取消语义/范围隔离/拆行引擎复用/Step2 快照收敛/占用按子集重算由 7 个新增单测覆盖(AssignmentServiceTest 506/506 全绿)。"
status_note: "本端点 POST /slots/{slotId}/clear-residue-dates 已被 #7067 去槽位化整体删除(404),无前端落地对象。前端在 #7067 U1 已随死端点拆除清掉其全部调用链,无需实现。本条 not_required(被后续单取代),残留清理语义由 POST /batch 整批 diff 覆盖。"
updated_at: "2026-08-16"
base: "dev-v3"
generated: "2026-08-16T00:35:00+08:00"
@@ -7,7 +7,7 @@ author: "wx"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "pending"
frontend_status: "not_required"
frontend_owner: "mmg"
frontend_ref: ""
target_release: ""
@@ -7,7 +7,7 @@ author: "wx"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "pending"
frontend_status: "not_required"
frontend_owner: "mmg"
frontend_ref: ""
target_release: ""
@@ -7,7 +7,7 @@ author: "wx"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "pending"
frontend_status: "not_required"
frontend_owner: "mmg"
frontend_ref: ""
target_release: ""
@@ -1,7 +1,7 @@
---
schema: "hl-changelog/v2"
ticket: "6397"
title: "供应商注册合同聚合信息"
title: "供应商注册合同聚合信息(已废弃)"
consumer: "admin"
author: "lc(GIT)"
change_type: "修改接口"
@@ -10,32 +10,44 @@ gateway_status: "verified"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "f2a4200d"
target_release: ""
verified_at: "2026-08-26"
status_note: "PR #6405 已合并 dev-v3;Deploy Panel 任务 af3f205b 成功发布 Resource 双实例,合同接口已完成 23 项真实 Gateway 验收。TEST 工作副本存在服务器本地提交导致精确提交回读仍被阻塞,后端工单保持开启;本条只交接已经实测存在的接口契约。"
updated_at: "2026-08-26"
target_release: "v2.1"
verified_at: "2026-08-29"
status_note: "本条记录的 #6405 合同随供应商草稿/注册聚合写入语义已被业务纠正并废弃,不再是当前可联调契约。当前后端以 #6544 为准:add/update/submit 对旧 contracts 输入兼容忽略,合同只在已有 supplierId 后通过三个独立接口维护,不进入建档审批;详情继续只读返回 contracts。最终 Resource 已通过任务 ca2fe4d7 部署提交 c579c87014f56452fea2fce5075b31ae6fd12a35。旧前端 002475b2 仅作为历史记录,当前消费状态恢复 pending。"
updated_at: "2026-08-29"
base: "dev-v3"
---
# 🔧 供应商注册合同聚合信息
# ⚠️ 供应商注册合同聚合信息(已废弃)
供应商创建草稿、提交注册和基础信息详情现统一支持合同完整快照。管理端应把“合同信息”放在“资质证照”之后、现有账户区域之前,并把原“初始账户”展示标题改为“结算信息”。
> **2026-08-29 纠正:本文以下聚合写入说明仅保留为历史,不得继续用于联调或实现。** 当前契约见 [#6544 供应商合同独立登记](../2026-08/29_6544_供应商合同独立登记-新增接口-管理后台.md):供应商草稿、资料更新和注册提交对旧 `contracts` 输入兼容接收但完全忽略;合同必须在取得 `supplierId` 后,通过独立 add/update/del 接口和独立事务维护,且不进入建档审批。`basic-info/view` 仍只读返回未软删合同,`initialAccounts` 字段保持不变。
原前端提交 `002475b2` 消费的是已撤销的聚合写语义,只作为历史事实保留,当前状态为待按独立接口重新接入。
展示名调整不改变接口字段:原请求字段仍为 `initialAccounts`,不得改成 `settlementInfo` 或其他名称。
## 变更接口清单
## 二、变更接口清单(历史,禁止用于当前联调)
| # | 接口 | 方法 | 路径 | 变化 |
|---:|---|---|---|---|
| 1 | 创建供应商注册草稿 | POST | `/admin/supplier/items/add` | 请求可选增加 `contracts` 完整集合 |
| 2 | 提交供应商注册 | POST | `/admin/supplier/items/{supplierId}/submit` | 请求可选增加 `contracts` 完整快照 |
| 3 | 查询供应商基本信息 | GET | `/admin/supplier/items/{supplierId}/basic-info/view` | 响应增加 `contracts` 列表 |
| # | 接口 | 方法 | 路径 | 变更类型 | 说明 |
|---:|---|---|---|---|---|
| 1 | 创建供应商注册草稿 | POST | `/admin/supplier/items/add` | 请求体新增可选字段 | 可选增加 `contracts` 完整集合 |
| 2 | 提交供应商注册 | POST | `/admin/supplier/items/{supplierId}/submit` | 请求体新增可选字段 | 可选增加 `contracts` 完整快照 |
| 3 | 查询供应商基本信息 | GET | `/admin/supplier/items/{supplierId}/basic-info/view` | 响应新增字段 | 响应增加 `contracts` 列表 |
统一响应均为 `Result<T>`。业务失败可能仍为 HTTP 200,调用方必须同时判断 `code`、`success`、`message` 和 `data`。
## 公共合同字段
## ⚠️ 关键变化(2026-08-26 晚,PR #6450 同日修正)
### 请求字段 `contracts[]`
- **响应 `contracts[].amount` 由 Number 改为 String**:此前(f2a4200d 验收时)响应示例为 `"amount": 1200.50`,现实际输出 `"amount": "1200.50"`,与全站金额字段(`contractId` 之外的金额一律字符串)对齐,防 JavaScript 浮点精度丢失。
- **请求侧不变**:`contracts[].amount` 请求仍按 Number 传(字符串同值也可被兼容解析),无需改表单提交。
- 前端处理:详情/列表展示处把 amount 当字符串渲染即可,参与运算前 `Number(...)` 转换。
## 三、接口详情
三个接口的合同字段完全一致,先在「公共合同字段」统一约定;各接口再分节给出自包含的使用场景、入参、出参、示例与错误。
### 公共合同字段
#### 请求字段 `contracts[]`
| 字段 | 类型 | 创建必填 | 提交既有项必填 | 约束与说明 |
|---|---|---:|---:|---|
@@ -53,7 +65,7 @@ base: "dev-v3"
| `scanFileUrl` | String | 否 | 否 | 合同扫描件永久地址,最长 1000 字符 |
| `remark` | String | 否 | 否 | 最长 500 字符 |
### 响应字段 `contracts[]`
#### 响应字段 `contracts[]`
详情返回上述全部业务字段,并额外返回:
@@ -62,20 +74,40 @@ base: "dev-v3"
| `contractId` | String | 合同 ID,始终按字符串处理,不得转 JavaScript Number |
| `updateTime` | String | 合同当前版本,格式 `yyyy-MM-dd HH:mm:ss` |
响应中的 `amount` 为 String(如 `"1200.50"`,PR #6450 起),请求中的 `amount` 仍按 Number 传。
历史数据可能返回只读状态 `TERMINATED`;创建和提交请求不得发送该状态。
## 1. 创建供应商注册草稿
### 1. 创建供应商注册草稿 `POST /admin/supplier/items/add`
`POST /admin/supplier/items/add`
**VO**: `SupplierDraftSaveReqVO`(请求;响应 data 字段见下表)
### 使用场景与边界
#### 使用场景
- `contracts` 可省略、为 `null` 或空数组,旧客户端行为不变。
- 非空时最多 100 项,合同与供应商主体、资质和 `initialAccounts` 一起成功或一起失败。
- 创建请求中的每个合同都是新合同,禁止携带 `contractId`。
- 写入仍要求现有供应商创建权限;仅可信 `FINANCE`、`SUPER_ADMIN` 且拥有对应平台权限的身份可执行。
供应商注册第一步:创建草稿。`contracts` 为本次新增的可选完整集合,随草稿与供应商主体、资质、`initialAccounts` 一起成功或一起失败;旧客户端省略该字段时行为完全不变。
### 典型请求
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|---|---|---|---|---|---|
| `fullName` | Body | String | 是 | 非空白 | 供应商全称(本次未变更,列此定位) |
| `taxNo` | Body | String | 是 | 统一社会信用代码 | 本次未变更,列此定位 |
| `qualifications` | Body | Array | 否 | - | 资质证照集合(本次未变更) |
| `contracts` | Body | Array | 否 | 非空时最多 100 项 | 本次新增:合同完整集合,单项字段见「公共合同字段」;创建时每项禁止携带 `contractId` |
| `initialAccounts` | Body | Array | 否 | - | 结算账户集合,字段名不得改(本次未变更) |
#### 出参
| 字段 | 类型 | 说明 |
|---|---|---|
| `supplierId` | String | 供应商 ID,字符串 |
| `supplierNo` | String/null | 供应商编号,草稿期可为 null |
| `status` | String | 固定 `DRAFT` |
| `onboardingStage` | String | 入驻阶段,草稿为 `PROFILE_DRAFT` |
| `initialAccounts` | Array | 结算账户回显 |
| `updateTime` | String | 聚合版本时间,`yyyy-MM-dd HH:mm:ss` |
#### 请求示例
```http
POST /admin/supplier/items/add
@@ -123,7 +155,7 @@ Content-Type: application/json
}
```
### 成功响应
#### 响应示例
```json
{
@@ -141,7 +173,13 @@ Content-Type: application/json
}
```
### 失败响应:创建携带合同 ID
#### 空数据 / 降级响应
`contracts` 省略、为 `null` 或空数组均可正常创建,旧客户端行为不变;创建响应不返回合同明细(合同通过详情接口回显)。草稿无结算账户时 `initialAccounts` 返回空数组 `[]`,不返回 `null`。
#### 错误响应
创建请求携带合同 ID(创建时每个合同都是新项,禁止 `contractId`):
```json
{
@@ -154,20 +192,44 @@ Content-Type: application/json
失败时不会留下供应商主体或部分合同。
## 2. 提交供应商注册
#### 业务边界
`POST /admin/supplier/items/{supplierId}/submit`
- 非空时最多 100 项,合同与供应商主体、资质和 `initialAccounts` 一起成功或一起失败。
- 创建请求中的每个合同都是新合同,禁止携带 `contractId`。
- 写入仍要求现有供应商创建权限;仅可信 `FINANCE`、`SUPER_ADMIN` 且拥有对应平台权限的身份可执行。
- `endDate` 早于 `startDate` 直接校验失败,零写入。
### 使用场景与快照语义
### 2. 提交供应商注册 `POST /admin/supplier/items/{supplierId}/submit`
- `contracts` 省略或为 `null`:本次不处理合同,保留草稿当前合同。
- `contracts: []`:明确清空当前全部合同。
- 非空数组:作为完整快照;带 `contractId` 的项覆盖当前合同,不带 ID 的项新增,当前已有但数组中遗漏的合同删除。
- 带 ID 的合同必须属于路径中的供应商;不属于当前供应商、重复 ID、非法枚举、负金额或日期逆序均失败。
- `expectedUpdateTime` 仍是供应商聚合并发版本;发生并发修改时调用方应刷新详情后重新组装完整表单。
- 合同快照会进入本次审批资料,但提交注册不会自动改写合同自身的 `status`。
**VO**: `SupplierDraftSaveReqVO`(请求,含 `expectedUpdateTime` 版本;响应 data 字段见下表)
### 典型请求
#### 使用场景
注册第二步:把草稿完整表单(含合同快照)提交审批。`contracts` 按完整快照语义处理:省略/`null` = 本次不处理合同;`[]` = 明确清空;非空数组 = 全量覆盖(带 ID 覆盖、无 ID 新增、遗漏删除)。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|---|---|---|---|---|---|
| `supplierId` | Path | String | 是 | 必须存在且未删除 | 目标供应商 |
| `fullName` | Body | String | 是 | 非空白 | 完整表单字段(本次未变更,列此定位) |
| `contracts` | Body | Array | 否 | 非空时最多 100 项 | 本次新增:合同完整快照,单项字段见「公共合同字段」;既有项必须带回字符串 `contractId` |
| `initialAccounts` | Body | Array | 否 | - | 结算账户集合(本次未变更) |
| `expectedUpdateTime` | Body | String | 是 | `yyyy-MM-dd HH:mm:ss` | 聚合并发版本,须取详情最新值 |
#### 出参
| 字段 | 类型 | 说明 |
|---|---|---|
| `approvalLogId` | String | 审批日志 ID,字符串 |
| `requestNo` | String | 审批请求号 |
| `provider` | String | 审批通道,如 `LOCAL_AUTO` |
| `approvalStatus` | String | 审批结果,如 `APPROVED` |
| `spNo` / `spStatus` | String/null | 外部审批单号/状态,本地通道为 null |
| `syncStatus` | String | 结果应用状态,如 `APPLIED` |
| `submittedAt` / `finishedAt` | String | 提交/完成时间 |
#### 请求示例
```http
POST /admin/supplier/items/2090300000000063970/submit
@@ -204,7 +266,7 @@ Content-Type: application/json
"signDate": "2026-08-26",
"startDate": "2026-09-01",
"endDate": "2027-08-31",
"amount": 1200.50,
"amount": "1200.50",
"pricingMode": "按团结算",
"settleCycle": "MONTHLY",
"status": "ACTIVE",
@@ -217,7 +279,7 @@ Content-Type: application/json
}
```
### 成功响应
#### 响应示例
```json
{
@@ -238,7 +300,13 @@ Content-Type: application/json
}
```
### 失败响应:合同不属于当前供应商
#### 空数据 / 降级响应
`contracts` 省略或为 `null` 时保留草稿当前合同,走既有审批流程,无降级差异;`contracts: []` 为明确清空(不是省略),会删除当前全部合同。草稿本身无合同时按无合同提交,不报错。
#### 错误响应
合同不属于当前供应商(或重复 ID、非法枚举、负金额、日期逆序等同族校验失败):
```json
{
@@ -251,20 +319,50 @@ Content-Type: application/json
该失败会回滚本次提交表单中的主体、资质、合同和审计变化,供应商仍保持原状态和原版本。
## 3. 查询供应商基本信息
#### 业务边界
`GET /admin/supplier/items/{supplierId}/basic-info/view`
- 带 ID 的合同必须属于路径中的供应商;不属于当前供应商、重复 ID、非法枚举、负金额或日期逆序均失败。
- `expectedUpdateTime` 仍是供应商聚合并发版本;发生并发修改时调用方应刷新详情后重新组装完整表单。
- 合同快照会进入本次审批资料,但提交注册不会自动改写合同自身的 `status`。
- 快照语义易错点:用户明确删除全部合同时发送 `contracts: []`;未加载合同或不处理合同时省略字段,不要误发空数组。
### 请求
### 3. 查询供应商基本信息 `GET /admin/supplier/items/{supplierId}/basic-info/view`
**VO**: `SupplierBasicInfoRespVO`
#### 使用场景
供应商详情首屏:返回主体信息、资质、合同列表(本次新增 `contracts`)与聚合版本。管理端据此渲染「资质证照 → 合同信息 → 结算信息」区块。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|---|---|---|---|---|---|
| `supplierId` | Path | String | 是 | 必须存在且未删除 | 目标供应商 |
无请求体、无查询参数。读取继续要求可信读角色和 `supplier:view` 平台权限。
#### 出参
| 字段 | 类型 | 说明 |
|---|---|---|
| `supplierId` | String | 供应商 ID,字符串 |
| `fullName` / `shortName` | String | 供应商名称 |
| `tax_no` | String | 脱敏税号 |
| `types` | Array | 供应商类型,`typeCode`/`typeName` |
| `qualifications` | Array | 资质证照列表(本次未变更) |
| `contracts` | Array | 本次新增:合同列表,字段见「公共合同字段」;`amount` 为 String |
| `status` | String | 供应商状态 |
| `updateTime` | String | 聚合版本时间,提交表单时回传 `expectedUpdateTime` |
#### 请求示例
```http
GET /admin/supplier/items/2090300000000063970/basic-info/view
Authorization: Bearer <admin-token>
```
无请求体。读取继续要求可信读角色和 `supplier:view` 平台权限。
### 成功响应
#### 响应示例
```json
{
@@ -322,7 +420,7 @@ Authorization: Bearer <admin-token>
"signDate": "2026-08-26",
"startDate": "2026-09-01",
"endDate": "2027-08-31",
"amount": 1200.50,
"amount": "1200.50",
"pricingMode": "按团结算",
"settleCycle": "MONTHLY",
"status": "DRAFT",
@@ -337,9 +435,22 @@ Authorization: Bearer <admin-token>
}
```
合同按 `contractId` 升序返回,只包含当前有效合同。没有合同时返回空数组 `[]`,不返回 `null`。
#### 空数据 / 降级响应
### 常见失败
没有合同时返回空数组 `"contracts": []`,不返回 `null`;合同按 `contractId` 升序返回,只包含当前有效合同。
#### 错误响应
常见失败(统一 `Result` 包装,HTTP 200):
```json
{
"code": 395001,
"message": "供应商不存在",
"data": null,
"success": false
}
```
| 场景 | `code` | 前端处理 |
|---|---:|---|
@@ -347,17 +458,13 @@ Authorization: Bearer <admin-token>
| 可信角色或 `supplier:view` 平台权限不足 | `403` | 展示无权限状态 |
| 供应商不存在或已删除 | `395001` | 返回列表并刷新 |
## 修改前后对比
#### 业务边界
| 场景 | 修改前 | 修改后 |
|---|---|---|
| 创建草稿 | 请求不能携带合同 | 可选携带完整 `contracts`,与草稿一起成功或失败 |
| 提交注册 | 提交表单不能维护合同 | 可省略保留、空数组清空或提交完整合同快照 |
| 基础信息 | 不返回合同列表 | 返回完整 `contracts[]` 及字符串 ID、版本 |
| 账户区域标题 | 页面显示“初始账户” | 页面应显示“结算信息”,接口字段仍为 `initialAccounts` |
| 页面区块顺序 | 资质后直接进入账户区域 | 资质证照 → 合同信息 → 结算信息 |
- 读取要求可信读角色(`ADMIN`/`FINANCE`/`SUPER_ADMIN`)和 `supplier:view` 平台权限。
- 敏感字段(税号、证件号、手机号)一律脱敏返回,前端不得期待明文。
- `updateTime` 是后续提交表单的并发版本,必须原样缓存回传。
## 兼容性与管理端接入事项
## 四、契约约束与正确调用方式
1. 在“资质证照”区域之后新增“合同信息”表格,在合同之后显示原账户表格。
2. 原账户表格标题改为“结算信息”;所有请求和响应继续使用 `initialAccounts`,不要改字段名。
@@ -367,15 +474,65 @@ Authorization: Bearer <admin-token>
6. 本次不新增接口路径、权限点或业务错误码;旧客户端省略 `contracts` 时继续可用。
7. 管理端源码不在本后端工单中修改,前端状态保持 `pending`,直至完成页签、标题和表格接入并提供前端引用。
## TEST 验证证据
## 五、数据库行为
- 创建草稿与提交注册均为聚合级单事务写入:供应商主体、资质、合同快照、结算账户与审计记录一起成功或一起失败,任一校验失败零写入。
- 合同快照随供应商聚合版本(`expectedUpdateTime` 乐观并发控制)持久化;并发修改时提交失败,调用方须刷新详情后重试。
- 审计留痕:创建/删除等不可逆操作保留审计记录;测试环境临时数据已通过业务删除接口软删除。
- 查询供应商基本信息为只读,无写库行为。
- 本次无 DDL、无 Flyway 迁移、无 Redis/MQ 行为变化。
## 六、边界行为
- `contracts` 省略、`null` 与空数组语义不同:省略/传 `null` = 不处理合同(旧客户端兼容);`[]` = 明确清空全部合同。
- 合同非空时单请求最多 100 项;合同与供应商主体、资质、`initialAccounts` 同事务,一起成功或一起失败。
- 创建草稿禁止携带 `contractId`(每个合同都是新项);提交既有合同必须原样带回字符串 `contractId`,外部/他人合同 ID 触发整体回滚零写入。
- `endDate` 早于 `startDate` 直接校验失败,零写入。
- `amount` 边界:大于等于 0,最多 10 位整数和 2 位小数;响应按字符串输出(PR #6450 起)。
- 历史只读状态 `TERMINATED` 仅可返回,创建/提交发送该状态会被拒绝。
- 越权:仅可信 `FINANCE`、`SUPER_ADMIN` 且拥有对应平台权限可写;普通 ADMIN 调用写接口返回越权错误。
## 六.6、修改前后对比
| 场景 | 修改前 | 修改后 |
|---|---|---|
| 创建草稿 | 请求不能携带合同 | 可选携带完整 `contracts`,与草稿一起成功或失败 |
| 提交注册 | 提交表单不能维护合同 | 可省略保留、空数组清空或提交完整合同快照 |
| 基础信息 | 不返回合同列表 | 返回完整 `contracts[]` 及字符串 ID、版本 |
| 账户区域标题 | 页面显示“初始账户” | 页面应显示“结算信息”,接口字段仍为 `initialAccounts` |
| 页面区块顺序 | 资质后直接进入账户区域 | 资质证照 → 合同信息 → 结算信息 |
| 响应 `contracts[].amount`(PR #6450) | Number(如 `1200.50`) | String(如 `"1200.50"`) |
## 六.7、影响评估
- **管理端(admin)**:供应商注册/编辑页需新增「合同信息」表格并调整区块顺序;既有合同必须缓存并原样回传字符串 `contractId`,否则提交会整单回滚。
- **同日修正(PR #6450)**:响应 `contracts[].amount` 由 Number 改为 String,前端 f2a4200d 按 Number 集成的解析处需改为字符串处理(展示直接渲染、运算前 `Number(...)`),影响面限于合同金额展示/计算处,请求提交不受影响。
- **C 端(mp)**:不涉及,无影响。
- **QA 排查面**:问题定位优先看「契约约束与正确调用方式」第 3、4 条(快照回传与空数组语义)与「关键变化」(amount 字符串化)。
## 七、不影响范围
- 不新增接口路径、权限点或业务错误码;旧客户端省略 `contracts` 时行为完全不变。
- `initialAccounts` 字段名、类型与语义不变(仅页面展示标题由「初始账户」改「结算信息」,属前端文案)。
- 请求侧 `contracts[].amount` 仍按 Number 传,PR #6450 只改响应输出,不改请求解析。
- 供应商其余模块(资源信息、审批记录、账户证明)的接口与字段不受影响。
- 数据库结构无变更(复用既有快照列),无 Redis/MQ 行为变化。
## 八、测试环境已验证
- 自动化:供应商定向测试 115 项通过;`hl-resource-service` 全量 2,111 项,0 失败、0 错误,38 项条件跳过;`hl-verify` 与差异检查通过。
- 部署:Deploy Panel API 任务 `af3f205b` 终态 `success`、退出码 0、`has_build_error=false`,未发现 Maven、编译或滚动发布错误。
- 健康:`hl-resource-service` 的 8082、8182 双实例运行;Nacos `test` 命名空间两实例均 `healthy=true`、`enabled=true`。
- 真实 Gateway:23 项断言通过,覆盖合同随草稿创建、详情完整回显、字符串 ID、创建携带 ID 失败、普通 ADMIN 越权、提交外部合同 ID 完整回滚、日期逆序零写入和旧客户端省略 `contracts`。
- 同日修正复验(PR #6450):`hl-resource-service` 于 2026-08-26 23:44 滚动发布双实例 UP,jar 构建时间戳与合并提交一致;供应商定向测试 330 项通过;空原因/超长原因的状态变更请求仍由请求校验层返回 400(对外契约不变)。
- 清理:两个临时 DRAFT 均通过业务删除接口软删除并回读为不存在;仅保留不可逆的 CREATE/DELETE 操作审计。
- 环境限制:部署前锁定 `origin/dev-v3=1a16a5aec7d0b95ec87e6fb222581060a3135984`,但面板 Git API 回读到服务器本地短提交 `6f7d3ca78`,Gitea 无法解析该对象。接口行为已真实验证,后端工单仍等待测试环境恢复精确远端提交后复验,不能据此宣称最终交付完成。
## 九、相关历史 PR
- [#6405](https://git.1814.love:8443/wx/HL/pulls/6405):本功能原始落地(合同聚合信息)。
- [#6450](https://git.1814.love:8443/wx/HL/pulls/6450):同日每日审查修正——响应 `contracts[].amount` Number→String(金额序列化红线)、状态变更原因错误码段位化(395043/395044,仅内部防御路径,对外契约不变)。
## 撤回
1. 从最新 `dev-v3` 创建回退分支,执行 `git revert -m 1 --no-edit 1a16a5aec7d0b95ec87e6fb222581060a3135984`,经独立 PR 合入。
@@ -384,6 +541,12 @@ Authorization: Bearer <admin-token>
4. 已保存的合同资料保留,不做破坏性批量清理;回退后旧客户端继续按省略 `contracts` 的路径工作。
5. 经 Gateway 复测创建、提交、基础信息、未认证、越权、非法合同 ID、失败零写入和旧客户端兼容,并确认双实例与 Nacos 健康。
## 十、相关文档
- 设计/API 说明:仓库 `docs/supplier/API-CHANGE-6397.html`
- 同日修正 PR:[#6450](https://git.1814.love:8443/wx/HL/pulls/6450)(响应 `contracts[].amount` Number→String,每日审查红线修复)
- 供应商暂停/拉黑原因必填(同属供应商状态域):`changelogs-v2/2026-08/26_6392_供应商暂停合作与拉黑原因必填接口-新增接口-管理后台.md`
## 关联 / 联系人
- **Issue**: [#6397](https://git.1814.love:8443/wx/HL/issues/6397)
@@ -0,0 +1,777 @@
---
schema: "hl-changelog/v2"
ticket: "6436"
title: "供应商敏感字段完整回显与主类型"
consumer: "admin"
author: "lc(GIT)"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "5957c58c"
target_release: "v2.1"
verified_at: "2026-08-27"
status_note: "PR #6478、补充 PR #6483/#6486 已合并 dev-v3,最终提交 aa735fb8 已由 Deploy Panel 任务 7a48028c 发布 TEST;真实 TEST 身份已验证完整值、权限投影、失败零写入及测试数据清理。"
updated_at: "2026-08-27"
base: "dev-v3"
---
# 🔧 供应商敏感字段完整回显与主类型
供应商管理接口不再用掩码替代已授权管理员需要处理的业务原值,并补齐唯一主类型和注册账户摘要。证明附件仍受独立权限保护,不能因为本次完整值调整而绕过授权或同步读取审计。
## 一、背景
此前详情、账户和审批记录混用了原值、掩码与历史密文回退,草稿类型也缺少稳定的主类型回显,导致管理端无法可靠编辑、审核或回填表单。本次统一以下消费口径:
- 通过既有供应商读取权限后,税号、法人证件、电话、证照号和银行账号返回完整业务值。
- `proofFileUrls` 继续要求 `supplier:account:proof:read`,且只有同步读取审计成功后才返回;无权限时字段不序列化。
- `types[].isPrimary` 与根对象 `primaryTypeCode`、`primaryTypeName` 成为主类型权威回显。
- `*Mask` 字段保留兼容但已废弃,兼容期内与对应完整值字段同值;新代码应使用无 `Mask` 的字段。
## 二、变更接口清单
| # | 接口 | 方法 | 路径 | 变更类型 | 说明 |
|---:|---|---|---|---|---|
| 1 | 查询供应商基本信息 | GET | `/admin/supplier/items/{supplierId}/basic-info/view` | 响应修改 | 返回完整主体、联系人、资质字段及主类型 |
| 2 | 查询供应商账户信息 | GET | `/admin/supplier/items/{supplierId}/account-info/list` | 响应修改 | 返回可读账户完整账号,按权限决定附件字段 |
| 3 | 查询收款账户详情 | GET | `/admin/supplier/bank-accounts/{accountId}/view` | 响应修改 | 返回完整账号,按权限决定附件字段 |
| 4 | 查询供应商审批记录 | GET | `/admin/supplier/items/{supplierId}/approval-records/page` | 请求与响应修改 | 增加目标筛选及完整前后值可用性 |
| 5 | 创建供应商注册草稿 | POST | `/admin/supplier/items/add` | 响应修改 | `initialAccounts` 回显完整账号摘要 |
| 6 | 更新供应商 | PUT | `/admin/supplier/items/{supplierId}/update` | 响应修改 | 稳定回显主类型及完整初始账号摘要 |
| 7 | 提交供应商注册 | POST | `/admin/supplier/items/{supplierId}/submit` | 响应修改 | 审批结果增加完整初始账号摘要 |
## 三、接口详情
### 1. 查询供应商基本信息 `GET /admin/supplier/items/{supplierId}/basic-info/view`
**VO**: `SupplierBasicInfoRespVO`
#### 使用场景
供应商详情和编辑表单初始化。管理端可直接使用完整字段,并用主类型字段初始化单选控件。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|---|---|---|---:|---|---|
| `supplierId` | Path | String | 是 | 正整数 ID 字符串 | 目标供应商 |
#### 出参
| 字段 | 类型 | 说明 |
|---|---|---|
| `supplierId` | String | 供应商 ID |
| `tax_no` | String | 完整主体证件号,JSON 名保持既有口径 |
| `legalRepresentativeIdNo` | String/null | 完整法人居民身份证号 |
| `legalRepresentativeIdCardFrontUrl` / `legalRepresentativeIdCardBackUrl` | String/null | 完整永久文件地址 |
| `contactPhone` | String/null | 完整公司联系电话 |
| `contacts[].contactPhone` | String | 完整联系人电话 |
| `qualifications[].certNo` | String/null | 完整证照编号 |
| `types[].isPrimary` | Boolean | 当前类型是否为主类型 |
| `primaryTypeCode` / `primaryTypeName` | String/null | 主类型值和展示名称;无类型草稿为 null |
| `legalRepresentativeIdNoMask` / `contactPhoneMask` | String/null | 废弃兼容别名,与完整值字段同值 |
#### 请求示例
```http
GET /admin/supplier/items/2092800000000000001/basic-info/view
Authorization: Bearer <admin-token>
```
#### 响应示例
```json
{
"code": 200,
"message": "成功",
"success": true,
"data": {
"supplierId": "2092800000000000001",
"fullName": "示例旅行服务有限公司",
"tax_no": "91350211M000100Y46",
"legalRepresentativeIdNo": "11010519491231002X",
"legalRepresentativeIdNoMask": "11010519491231002X",
"legalRepresentativeIdCardFrontUrl": "https://files.example.com/supplier/front.jpg",
"legalRepresentativeIdCardBackUrl": "https://files.example.com/supplier/back.jpg",
"contactPhone": "13800138000",
"contactPhoneMask": "13800138000",
"types": [{"typeCode": "HOTEL", "typeName": "酒店", "isPrimary": true}],
"primaryTypeCode": "HOTEL",
"primaryTypeName": "酒店",
"contacts": [{"contactName": "示例联系人", "contactPhone": "13900139000", "contactPhoneMask": "13900139000"}],
"qualifications": [{"qualType": "BUSINESS_LICENSE", "certNo": "LIC-2026-001", "certNoMask": "LIC-2026-001"}],
"updateTime": "2026-08-27 11:30:00"
}
}
```
#### 空数据 / 降级响应
无类型草稿返回 `types: []`、`primaryTypeCode: null`、`primaryTypeName: null`。联系人或资质为空时返回空数组;历史停用类型的名称无法从字典解析时,名称回退为类型值,不阻断详情。
#### 错误响应
```json
{
"code": 395001,
"message": "供应商不存在",
"data": null,
"success": false
}
```
#### 业务边界
- 要求既有 `supplier:view` 和数据范围校验,登录态不能替代业务权限。
- 普通应用日志、异常和 Trace 不记录上述完整值。
- `*Mask` 仅用于旧客户端兼容,新代码不得继续依赖掩码语义。
### 2. 查询供应商账户信息 `GET /admin/supplier/items/{supplierId}/account-info/list`
**VO**: `SupplierAccountInfoRespVO`
#### 使用场景
在供应商结算信息区域展示已进入 PENDING、ACTIVE 或 DISABLED 的管理端可读账户。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|---|---|---|---:|---|---|
| `supplierId` | Path | String | 是 | 正整数 ID 字符串 | 目标供应商 |
#### 出参
| 字段 | 类型 | 说明 |
|---|---|---|
| `supplierId` | String | 供应商 ID |
| `bankAccounts` | Array | 可读账户,默认账户优先 |
| `bankAccounts[].accountNo` | String | 完整银行账号 |
| `bankAccounts[].accountNoMask` | String | 废弃兼容别名,与 `accountNo` 同值 |
| `bankAccounts[].proofFileUrls` | Array | 有独立权限且审计成功时出现;无权限时整个字段省略 |
| `bankAccounts[].status` | String | `PENDING`、`ACTIVE` 或 `DISABLED` |
#### 请求示例
```http
GET /admin/supplier/items/2092800000000000001/account-info/list
Authorization: Bearer <admin-token>
```
#### 响应示例
```json
{
"code": 200,
"message": "成功",
"success": true,
"data": {
"supplierId": "2092800000000000001",
"bankAccounts": [{
"accountId": "2092800000000000011",
"accountName": "示例旅行服务有限公司",
"bankName": "示例银行",
"accountNo": "6222021234567890",
"accountNoMask": "6222021234567890",
"proofFileUrls": ["https://files.example.com/supplier/account-proof.pdf"],
"status": "ACTIVE",
"isDefault": "YES"
}],
"updateTime": "2026-08-27 11:31:00"
}
}
```
#### 空数据 / 降级响应
仅有 DRAFT 账户或没有账户时返回 `bankAccounts: []`。无 `supplier:account:proof:read` 时账号仍为完整值,但每个账户均省略 `proofFileUrls`,不是返回空数组。
#### 错误响应
证明附件同步审计不可用时失败关闭,不返回任何附件:
```json
{
"code": 395039,
"message": "暂时无法校验资源,请稍后重试",
"data": null,
"success": false
}
```
#### 业务边界
- 要求 `supplier:view`;附件另需 `supplier:account:proof:read`。
- 每次获准的附件读取都会先同步写安全审计,失败时整个请求失败。
- DRAFT 初始账户不会出现在该读取接口中,应使用创建/更新响应的 `initialAccounts` 展示草稿摘要。
### 3. 查询收款账户详情 `GET /admin/supplier/bank-accounts/{accountId}/view`
**VO**: `SupplierBankAccountDetailRespVO`
#### 使用场景
查看单个已进入可读状态的收款账户完整信息。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|---|---|---|---:|---|---|
| `accountId` | Path | String | 是 | 正整数 ID 字符串 | 账户 ID |
#### 出参
| 字段 | 类型 | 说明 |
|---|---|---|
| `accountId` | String | 账户 ID |
| `accountName` | String | 收款户名 |
| `accountNo` | String | 完整银行账号 |
| `accountNoMask` | String | 废弃兼容别名,与完整账号同值 |
| `proofFileUrls` | Array | 有独立权限且同步审计成功时出现,否则省略 |
| `status` / `isDefault` | String | 账户状态与默认标记 |
#### 请求示例
```http
GET /admin/supplier/bank-accounts/2092800000000000011/view
Authorization: Bearer <admin-token>
```
#### 响应示例
```json
{
"code": 200,
"message": "成功",
"success": true,
"data": {
"accountId": "2092800000000000011",
"accountName": "示例旅行服务有限公司",
"accountType": "CORPORATE",
"bankName": "示例银行",
"accountNo": "6222021234567890",
"accountNoMask": "6222021234567890",
"proofFileUrls": ["https://files.example.com/supplier/account-proof.pdf"],
"settleMode": "PREPAY",
"invoiceType": "NONE",
"status": "ACTIVE",
"isDefault": "YES",
"updateTime": "2026-08-27 11:31:00"
}
}
```
#### 空数据 / 降级响应
无附件权限时响应省略 `proofFileUrls`;DRAFT、已删除或不存在的账户按不可读处理,不返回草稿详情。
#### 错误响应
```json
{
"code": 395001,
"message": "供应商不存在",
"data": null,
"success": false
}
```
#### 业务边界
- 完整账号沿用基础查看权限,证明附件使用独立权限和同步审计。
- 账户必须属于未删除供应商且状态为 PENDING、ACTIVE 或 DISABLED。
- 无附件权限时后端读取阶段即排除附件字段,不是先读取后隐藏。
### 4. 查询供应商审批记录 `GET /admin/supplier/items/{supplierId}/approval-records/page`
**VO**: `SupplierApprovalRecordPageReqVO / PageResult<SupplierApprovalRecordRespVO>`
#### 使用场景
统一查看供应商主体与收款账户的变更历史,并区分完整新记录和不可恢复的历史掩码记录。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|---|---|---|---:|---|---|
| `supplierId` | Path | String | 是 | 正整数 ID 字符串 | 目标供应商 |
| `page` / `limit` | Query | Integer | 否 | 正整数,`limit` 不超过 200 | 分页参数 |
| `approvalLogId` | Query | String | 否 | 正整数 ID 字符串 | 精确筛选审批 |
| `operationType` | Query | String | 否 | `CREATE/UPDATE/ENABLE/DISABLE/DELETE` | 操作类型 |
| `targetType` | Query | String | 否 | `SUPPLIER/ACCOUNT` | 本次增加的目标筛选 |
| `fieldName` / `status` | Query | String | 否 | 当前接口枚举 | 字段或状态筛选 |
| `from` / `to` | Query | String | 否 | 必须成对,`yyyy-MM-dd HH:mm:ss` | 时间范围 |
#### 出参
| 字段 | 类型 | 说明 |
|---|---|---|
| `records[].targetType` | String | `SUPPLIER` 或 `ACCOUNT` |
| `records[].targetId` | String/null | 主体记录为 null,账户记录为账户 ID |
| `records[].oldValue` / `newValue` | String/null | 完整中文业务摘要,附件仍按独立权限投影 |
| `records[].valueAvailability` | String | `FULL` 或 `LEGACY_MASKED_UNRECOVERABLE` |
| `records[].oldValueMasked` / `newValueMasked` | String/null | 废弃兼容别名 |
| `total` / `page` / `pageSize` | Integer | 分页元数据 |
#### 请求示例
```http
GET /admin/supplier/items/2092800000000000001/approval-records/page?page=1&limit=20&targetType=ACCOUNT
Authorization: Bearer <admin-token>
```
#### 响应示例
```json
{
"code": 200,
"message": "成功",
"success": true,
"data": {
"records": [{
"supplierId": "2092800000000000001",
"operationType": "ENABLE",
"targetType": "ACCOUNT",
"targetId": "2092800000000000011",
"oldValue": "账户状态:待审批;收款账号:6222021234567890",
"newValue": "账户状态:已生效;收款账号:6222021234567890",
"valueAvailability": "FULL",
"status": "已生效",
"operatorName": "测试管理员",
"operatorRole": "超级管理员",
"createTime": "2026-08-27 11:32:00"
}],
"total": 1,
"page": 1,
"pageSize": 20
}
}
```
#### 空数据 / 降级响应
无匹配记录返回 `records: []` 和 `total: 0`。历史记录只保存掩码且无法恢复原值时,`valueAvailability` 返回 `LEGACY_MASKED_UNRECOVERABLE`,不会猜测或拼造完整值。
#### 错误响应
```json
{
"code": 400,
"message": "目标类型仅支持SUPPLIER或ACCOUNT",
"data": null,
"success": false
}
```
#### 业务边界
- 要求 `supplier:approval:read` 及供应商数据范围权限。
- 证明附件只有独立权限存在且同步审计成功时才进入完整摘要。
- 分页内主体记录和账户记录按创建时间、记录 ID 稳定排序。
### 5. 创建供应商注册草稿 `POST /admin/supplier/items/add`
**VO**: `SupplierDraftSaveReqVO / SupplierWriteRespVO`
#### 使用场景
创建供应商草稿并可同时保存一个初始收款账户;成功响应直接回显该账户的完整账号摘要。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|---|---|---|---:|---|---|
| `fullName` | Body | String | 是 | 非空白,最长 500 字符 | 供应商全称 |
| `taxNo` | Body | String | 是 | 6 至 64 字符 | 主体证件号 |
| `types` | Body | Array | 否 | 草稿可为空,非空不得重复 | 供应商类型,首项成为主类型 |
| `mainCooperation` | Body | String | 是 | 非空白 | 主要合作内容 |
| `initialAccounts` | Body | Array | 否 | 最多 1 项 | 初始收款账户完整输入 |
#### 出参
| 字段 | 类型 | 说明 |
|---|---|---|
| `supplierId` | String | 新供应商 ID |
| `status` | String | `DRAFT` |
| `initialAccounts[].accountId` | String | 初始账户 ID |
| `initialAccounts[].accountNo` | String | 完整银行账号 |
| `initialAccounts[].accountNoMask` | String | 废弃兼容别名,与完整账号同值 |
| `initialAccounts[].status` | String | 创建时为 `DRAFT` |
| `updateTime` | String | 并发版本时间 |
#### 请求示例
```json
{
"fullName": "示例旅行服务有限公司",
"taxNo": "91350211M000100Y46",
"types": [{"typeCode": "HOTEL"}],
"mainCooperation": "酒店资源合作",
"initialAccounts": [{
"accountType": "CORPORATE",
"bankName": "示例银行",
"accountNo": "6222021234567890",
"proofFileUrls": ["https://files.example.com/supplier/account-proof.pdf"],
"settleMode": "PREPAY",
"invoiceType": "NONE"
}]
}
```
#### 响应示例
```json
{
"code": 200,
"message": "成功",
"success": true,
"data": {
"supplierId": "2092800000000000001",
"supplierNo": null,
"status": "DRAFT",
"onboardingStage": "PROFILE_DRAFT",
"initialAccounts": [{
"accountId": "2092800000000000011",
"accountNo": "6222021234567890",
"accountNoMask": "6222021234567890",
"status": "DRAFT"
}],
"updateTime": "2026-08-27 11:30:00"
}
}
```
#### 空数据 / 降级响应
省略 `initialAccounts` 或传空数组时成功创建并返回 `initialAccounts: []`。草稿可传 `types: []`,此时详情的主类型字段为 null。
#### 错误响应
```json
{
"code": 395002,
"message": "无权执行该供应商写操作",
"data": null,
"success": false
}
```
#### 业务边界
- 仅可信 `FINANCE`、`SUPER_ADMIN` 且拥有 `supplier:create` 的身份可写;`ADMIN` 明确拒绝。
- 初始账户最多一项,完整请求原子成功或失败,失败不留下主体或子项。
- 新写入和新审计使用完整业务值,但普通日志、异常、Trace 和跨服务消息不得携带这些值。
### 6. 更新供应商 `PUT /admin/supplier/items/{supplierId}/update`
**VO**: `SupplierUpdateReqVO / SupplierWriteRespVO`
#### 使用场景
增量更新供应商草稿或可变字段,并获得稳定的主类型与初始账户摘要回显。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|---|---|---|---:|---|---|
| `supplierId` | Path | String | 是 | 正整数 ID 字符串 | 目标供应商 |
| `types` | Body | Array | 否 | 省略表示不改;空数组表示清空草稿类型 | 类型完整快照 |
| `changeReason` | Body | String | 是 | 非空白 | 变更原因 |
| `expectedUpdateTime` | Body | String | 是 | `yyyy-MM-dd HH:mm:ss` | 乐观并发版本 |
#### 出参
| 字段 | 类型 | 说明 |
|---|---|---|
| `supplierId` / `status` | String | 供应商 ID 和当前状态 |
| `initialAccounts[].accountNo` | String | 既有初始账户完整账号 |
| `initialAccounts[].accountNoMask` | String | 废弃兼容别名 |
| `updateTime` | String | 更新后的并发版本 |
#### 请求示例
```json
{
"types": [{"typeCode": "HOTEL", "isPrimary": true}],
"changeReason": "调整主合作类型",
"expectedUpdateTime": "2026-08-27 11:30:00"
}
```
#### 响应示例
```json
{
"code": 200,
"message": "成功",
"success": true,
"data": {
"supplierId": "2092800000000000001",
"status": "DRAFT",
"onboardingStage": "PROFILE_DRAFT",
"initialAccounts": [{
"accountId": "2092800000000000011",
"accountNo": "6222021234567890",
"accountNoMask": "6222021234567890",
"status": "DRAFT"
}],
"updateTime": "2026-08-27 11:35:00"
}
}
```
#### 空数据 / 降级响应
省略 `types` 保持现有类型;草稿传 `types: []` 会清空类型并在详情返回 null 主类型。响应没有初始账户时固定返回空数组。
#### 错误响应
```json
{
"code": 395014,
"message": "数据已被他人修改,请刷新后重试",
"data": null,
"success": false
}
```
#### 业务边界
- 仅可信 `FINANCE`、`SUPER_ADMIN` 且拥有 `supplier:update` 的身份可写。
- 非空类型集合稳定保留且恰有一个主类型;提交审批时仍要求至少一个类型。
- 并发版本、状态或权限不满足时失败且零写入。
### 7. 提交供应商注册 `POST /admin/supplier/items/{supplierId}/submit`
**VO**: `SupplierSubmitReqVO / SupplierApprovalCommandRespVO`
#### 使用场景
提交完整注册表单并进入审批;审批响应直接携带本次注册初始账户的完整摘要。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|---|---|---|---:|---|---|
| `supplierId` | Path | String | 是 | 正整数 ID 字符串 | 草稿供应商 |
| `fullName` / `taxNo` | Body | String | 是 | 完整注册表单约束 | 主体信息 |
| `types` | Body | Array | 是 | 至少一项且不得重复 | 第一项为主类型 |
| `initialAccounts` | Body | Array | 否 | 最多一项;省略可保留既有草稿账户 | 初始账户完整快照 |
| `expectedUpdateTime` | Body | String | 是 | 必须等于当前版本 | 并发围栏 |
#### 出参
| 字段 | 类型 | 说明 |
|---|---|---|
| `approvalLogId` / `requestNo` | String | 审批记录与幂等请求号 |
| `provider` / `approvalStatus` / `syncStatus` | String | 审批通道、结果与本地应用状态 |
| `initialAccounts[].accountId` | String | 本次注册关联账户 ID |
| `initialAccounts[].accountNo` | String | 完整银行账号 |
| `initialAccounts[].accountNoMask` | String | 废弃兼容别名 |
| `initialAccounts[].status` | String | 审批通过后为 `ACTIVE` |
#### 请求示例
```json
{
"fullName": "示例旅行服务有限公司",
"taxNo": "91350211M000100Y46",
"types": [{"typeCode": "HOTEL"}],
"mainCooperation": "酒店资源合作",
"licenseImageUrl": "https://files.example.com/supplier/license.jpg",
"qualifications": [{
"qualType": "BUSINESS_LICENSE",
"certNo": "LIC-2026-001",
"imageUrl": "https://files.example.com/supplier/license.jpg",
"permanentValid": true
}],
"expectedUpdateTime": "2026-08-27 11:35:00"
}
```
#### 响应示例
```json
{
"code": 200,
"message": "成功",
"success": true,
"data": {
"approvalLogId": "2092800000000000021",
"requestNo": "SUP-REQ-EXAMPLE",
"provider": "LOCAL_AUTO",
"approvalStatus": "APPROVED",
"syncStatus": "APPLIED",
"initialAccounts": [{
"accountId": "2092800000000000011",
"accountNo": "6222021234567890",
"accountNoMask": "6222021234567890",
"status": "ACTIVE"
}],
"submittedAt": "2026-08-27 11:36:00",
"finishedAt": "2026-08-27 11:36:00"
}
}
```
#### 空数据 / 降级响应
没有初始账户时返回 `initialAccounts: []`。提交仍必须包含非空类型和当前完整注册资料,不因草稿阶段允许空类型而放宽。
#### 错误响应
```json
{
"code": 395008,
"message": "请至少选择一个类型并设置唯一主类型",
"data": null,
"success": false
}
```
#### 业务边界
- 仅可信 `FINANCE`、`SUPER_ADMIN` 且同时拥有更新和提交权限的身份可执行。
- 审批准备、结果应用、主体状态、账户状态和完整审计保持原有事务与幂等语义。
- 权限、状态、摘要或并发围栏失败时不允许部分写入。
## 四、契约约束与正确调用方式
| 场景 | 正确处理 |
|---|---|
| 主类型绑定 | 使用 `primaryTypeCode`;类型列表使用 `types[].isPrimary`,不要自行取第一项猜测 |
| 完整字段 | 使用 `tax_no`、`legalRepresentativeIdNo`、`contactPhone`、`certNo`、`accountNo` |
| 废弃别名 | `legalRepresentativeIdNoMask`、`contactPhoneMask`、`certNoMask`、`accountNoMask` 仅作旧客户端兼容 |
| 证明附件无权限 | `proofFileUrls` 字段不存在;不要把缺字段当接口异常或空附件 |
| 草稿账户 | 从写响应 `initialAccounts` 获取;账户读取接口只返回 PENDING/ACTIVE/DISABLED |
| 业务失败 | HTTP 状态之外必须检查 `code`、`success`、`message` 和 `data` |
管理端不得把业务请求体中的身份或角色作为授权依据,也不得缓存其他管理员读取到的完整敏感值供当前会话复用。
## 五、数据库行为
| 外部动作 | 可观察结果 |
|---|---|
| 创建/更新供应商 | 主体、联系人、资质、类型和初始账户在同一业务事务中成功或失败 |
| 注册提交 | 审批结果成功应用后主体和初始账户进入可读生效状态,响应返回完整账户摘要 |
| 新增或变更敏感值 | 后续授权读取返回与提交一致的完整业务值,唯一冲突或非法值整次失败 |
| 失败请求 | 未认证、无权、缺参、非法状态、并发冲突和审计失败均不留下部分业务写入 |
| 历史数据 | 可恢复历史值继续读取;只剩不可逆掩码的审批历史显式标记为不可恢复 |
这些是接口可观察行为;调用方不依赖具体存储结构,也不应自行维护明文/密文兼容状态。
## 六、边界行为
- 未登录经 Gateway 返回 `401`。
- `ADMIN` 可在既有查看权限与数据范围内读取完整业务值,但写入返回 `395002`。
- `FINANCE`、`SUPER_ADMIN` 仍需同时拥有对应平台权限才能写,角色名称本身不是唯一授权条件。
- 附件独立权限不足时字段省略;同步审计失败时请求失败,不降级泄露附件。
- 列表 `limit=201`、缺少必填字段或非法状态返回业务失败,并保持零写入。
- Snowflake ID 继续按字符串处理;时间格式继续为 `yyyy-MM-dd HH:mm:ss`。
## 六.5、枚举 / 数据字典
### `targetType` / `valueAvailability`
| 字段 | 值 | 中文与说明 |
|---|---|---|
| `targetType` | `SUPPLIER` | 供应商主体变更,`targetId` 为 null |
| `targetType` | `ACCOUNT` | 收款账户变更,`targetId` 为账户 ID |
| `valueAvailability` | `FULL` | 完整业务前后值可用 |
| `valueAvailability` | `LEGACY_MASKED_UNRECOVERABLE` | 历史只剩不可逆掩码,不推测原值 |
### 账户可读状态
| 值 | 中文 | 说明 |
|---|---|---|
| `PENDING` | 待审批 | 账户可在管理端读取 |
| `ACTIVE` | 已生效 | 正常可用账户 |
| `DISABLED` | 已停用 | 保留只读历史信息 |
| `DRAFT` | 草稿 | 不进入账户列表和账户详情 |
## 六.6、修改前后对比
### 字段级对比
| 字段 | 改前 | 改后 |
|---|---|---|
| 税号、法人证件号、电话、证照号 | 主要返回掩码或混合口径 | 授权读取返回完整值 |
| `accountNo` | 可能为空或仅依赖 `accountNoMask` | 返回完整账号 |
| `*Mask` | 表示掩码 | 废弃兼容别名,暂与完整值同值 |
| `proofFileUrls` | 权限语义分散 | 独立权限 + 同步审计;无权时字段省略 |
| `types[].isPrimary` | 主类型回显不稳定 | 明确 Boolean 标记 |
| `primaryTypeCode/Name` | 不存在 | 根对象直接返回,空类型草稿为 null |
| `initialAccounts` | 写/提交响应摘要不完整 | 返回账户 ID、完整账号和状态 |
| 审批记录 | 主体与账户口径分散 | 统一目标类型、目标 ID、完整值和可用性 |
### 行为级对比
| 行为 | 改前 | 改后 |
|---|---|---|
| 编辑页初始化 | 可能需要用掩码字段或猜测主类型 | 可直接绑定完整值与权威主类型 |
| 附件读取 | 容易把空值与无权混淆 | 无权省略字段,审计失败整体失败 |
| 草稿账户展示 | 读取接口与草稿状态语义不清 | 写响应展示草稿摘要,读取接口只展示可读状态 |
| 历史审批 | 无法区分完整值与不可逆掩码 | 通过 `valueAvailability` 明确区分 |
## 六.7、影响评估
- **是否破坏向后兼容**: 否。既有字段名保留,废弃别名在兼容窗口内继续返回。
- **前端是否必须同步上线**: 建议尽快。应切换到无 `Mask` 字段、接入主类型字段,并正确处理 `proofFileUrls` 缺失。
- **前端 workaround 清理点**: 删除自行猜主类型、对 `accountNoMask` 二次掩码、把附件缺字段强制转空数组等兼容逻辑。
- **敏感展示责任**: 完整值只在已授权业务页面按最小必要范围展示,不写入前端日志、埋点、错误上报或持久缓存。
## 七、不影响范围
- **仅影响**: 管理后台供应商基本信息、结算账户、注册提交与审批记录消费契约。
- **零影响**:
- 不新增或修改 Gateway 路由。
- 不修改角色、菜单、按钮或数据范围定义。
- 不修改小程序、C 端、订单、产品、车队接口。
- 不修改文件上传接口、Redis、MQ 或跨服务 DTO。
- 不允许 DRAFT 账户通过账户查询接口提前暴露。
## 八、测试环境已验证
最终后端提交 `aa735fb8531a3463b2b460965245e07ed8697775` 已通过 Deploy Panel 任务 `7a48028c` 发布 `hl-resource-service` 双实例,真实 TEST 身份经 Gateway 验证:
```text
历史兼容:完整值与数据库一致,税号关键字搜索命中 ✓
SUPER_ADMIN:创建草稿、详情完整值、注册审批、账号及附件审计读取 ✓
ADMIN:详情与完整账号可读,proofFileUrls 省略,写入拒绝 395002 ✓
未认证 401、缺参 400、limit=201 为 400、非法状态 400 ✓
新写主体/联系人/资质/账户及新审计均为完整值,失败请求零写入 ✓
合成供应商完成精确清理:17 张相关表检查、业务残留 0、失败标记残留 0 ✓
验收会话主动失效,敏感读取操作审计按审计规则保留 ✓
```
获批真实账号没有 `FINANCE` 角色,因此没有伪造该身份;`FINANCE` 与 `SUPER_ADMIN` 的服务端写权限同构由后端自动化测试覆盖,真实 TEST 写入使用 `SUPER_ADMIN`,并用真实 `ADMIN` 验证拒绝路径。
## 九、相关历史 PR
| PR | Issue | 说明 | 是否仍有效 |
|---|---|---|---|
| #6478 | #6436 | 完整字段、主类型、权限、迁移与兼容读写 | ✅ 主交付 |
| #6483 | #6481 | 修复 TEST 排序规则下回填精确比较 | ✅ 补充修复 |
| #6486 | #6484 | 支持历史 Unicode 税号回填 | ✅ 补充修复 |
## 十、相关文档
- [主工单 #6436](https://git.1814.love:8443/wx/HL/issues/6436)
- [主 PR #6478](https://git.1814.love:8443/wx/HL/pulls/6478)
- [补充工单 #6481](https://git.1814.love:8443/wx/HL/issues/6481) / [PR #6483](https://git.1814.love:8443/wx/HL/pulls/6483)
- [补充工单 #6484](https://git.1814.love:8443/wx/HL/issues/6484) / [PR #6486](https://git.1814.love:8443/wx/HL/pulls/6486)
- 后端详细 API 说明:`docs/supplier/API-CHANGE-6436.html`
## 关联 / 联系人
### 链接
- **Issue**: [#6436](https://git.1814.love:8443/wx/HL/issues/6436)
- **PR**: [#6478](https://git.1814.love:8443/wx/HL/pulls/6478)
- **最终 TEST 提交**: [aa735fb8](https://git.1814.love:8443/wx/HL/commit/aa735fb8531a3463b2b460965245e07ed8697775)
### 联系人
- **后端负责人**: @lc
@@ -0,0 +1,499 @@
---
schema: "hl-changelog/v2"
ticket: "6474"
title: "供应商详情分离变更记录与审批流水"
consumer: "admin"
author: "lc(GIT)"
change_type: "新增接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "199147de"
target_release: "v2.1"
verified_at: "2026-08-27"
status_note: "PR #6519 已合并 dev-v3;补充缺陷 PR #6534 已恢复旧兼容查询。hl-resource-service 已由 Deploy Panel 任务 9e69fd2c 精确发布提交 aec1de2d 至 TEST,并以真实 SUPER_ADMIN、ADMIN 和受限 CUSTOMIZER 身份完成 Gateway 只读验收。"
updated_at: "2026-08-27"
base: "dev-v3"
---
# 供应商管理:详情分离变更记录与审批流水
供应商详情新增两个相互独立的只读分页接口:“变更记录”只返回供应商主体发生过的业务变化,“审批记录”只返回供应商主体审批事实。两个列表独立计数、独立筛选、独立排序,收款账户记录不会混入。
旧 `/admin/supplier/items/{supplierId}/approval-records/page` 继续保留,用于仍需主体与账户变更混合列表的兼容场景;本次不删除、不改名,也不要求现有调用方同步切换。
## 一、背景
旧审批记录接口承载的是主体与收款账户变更的兼容混合列表,不能同时满足详情页“业务变更”和“审批过程”两种独立展示语义。若管理端在本地拆分或二次计数,会出现分页总数不准确、账户记录混入主体历史、审批技术字段误展示等问题。
本次由后端直接提供两个稳定的业务白名单视图:
- “变更记录”展示操作类型、变更前后业务摘要、原因、生命周期状态、操作人、历史角色和发生时间。
- “审批记录”展示审批业务、申请人、状态、动作、审批人安全展示值、意见、提交时间和完成时间。
- 两个接口都在查询前校验可信管理身份、角色和 `supplier:approval:read` 权限。
## 二、变更接口清单
| # | 接口 | 方法 | 路径 | 变更类型 | 说明 |
|---:|---|---|---|---|---|
| 1 | 查询供应商主体变更记录 | GET | `/admin/supplier/items/{supplierId}/change-records/page` | 新增只读接口 | 独立分页返回主体变更业务摘要 |
| 2 | 查询供应商主体审批流水 | GET | `/admin/supplier/items/{supplierId}/approval-history/page` | 新增只读接口 | 独立分页返回主体审批过程与结果 |
## 三、接口详情
### 1. 查询供应商主体变更记录 `GET /admin/supplier/items/{supplierId}/change-records/page`
**VO**: `SupplierChangeRecordPageReqVO` / `SupplierChangeRecordRespVO`
#### 使用场景
管理端进入供应商详情的“变更记录”页签时调用。服务端完成主体记录筛选、分页和业务摘要投影;前端不要从旧混合列表中再次筛选主体记录,也不要自行拼接前后值摘要。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|---|---|---|---:|---|---|
| `supplierId` | Path | String | 是 | 正整数 ID 字符串 | 目标供应商;不得转为 JavaScript Number |
| `page` | Query | Integer | 否 | 默认 `1`,最小 `1` | 当前页;兼容别名 `pageNo` |
| `pageSize` | Query | Integer | 否 | 默认 `20`,范围 `1..100` | 每页条数 |
| `operationType` | Query | String | 否 | `CREATE`、`UPDATE`、`ENABLE`、`DISABLE`、`DELETE` | 操作类型精确筛选 |
| `fieldName` | Query | String | 否 | 非空白,最长 64 字符 | 发生变化的业务字段精确筛选 |
| `status` | Query | String | 否 | 生命周期编码 | 按变更后的供应商状态筛选 |
| `from` | Query | String | 条件必填 | `yyyy-MM-dd HH:mm:ss` | 与 `to` 成对传入,按发生时间筛选,含边界 |
| `to` | Query | String | 条件必填 | `yyyy-MM-dd HH:mm:ss`,不得早于 `from` | 与 `from` 成对传入,含边界 |
| `sortBy` | Query | String | 否 | `occurredAt` 或 `changeLogId`,默认 `occurredAt` | 服务端白名单排序字段 |
| `sortDirection` | Query | String | 否 | `ASC` 或 `DESC`,不区分大小写,默认 `DESC` | 排序方向 |
#### 出参 `Result<PageResult<SupplierChangeRecordRespVO>>`
分页对象固定包含 `records`、`total`、`page`、`pageSize`。
| 字段 | 类型 | 说明 |
|---|---|---|
| `records` | Array | 当前页主体变更记录;无数据时为 `[]` |
| `total` | Integer | 符合筛选条件的主体变更总数,不包含账户记录 |
| `page` | Integer | 当前页码 |
| `pageSize` | Integer | 当前页容量 |
| `records[].operationType` | String | 操作类型编码 |
| `records[].oldValue` | String | 变更前中文业务摘要;空值使用明确占位 |
| `records[].newValue` | String | 变更后中文业务摘要;空值使用明确占位 |
| `records[].valueAvailability` | String | `FULL` 或 `LEGACY_MASKED_UNRECOVERABLE` |
| `records[].changeReason` | String | 业务变更原因或稳定占位 |
| `records[].status` | String/null | 变更后的供应商生命周期中文名 |
| `records[].operatorName` | String | 操作人展示名;系统操作为“系统”,依赖降级为“未知管理员” |
| `records[].operatorRole` | String | 操作发生时的角色快照中文名 |
| `records[].occurredAt` | String | 变更发生时间,格式 `yyyy-MM-dd HH:mm:ss` |
响应不会返回变更日志 ID、管理员内部 ID、原始审计 JSON、TraceId、账户 ID、证明附件或其他主体敏感快照字段。
#### 请求示例
```http
GET /admin/supplier/items/2092800000000000001/change-records/page?page=1&pageSize=20&operationType=UPDATE&sortBy=occurredAt&sortDirection=DESC
Authorization: Bearer <admin-token>
```
GET 请求无请求体。
#### 响应示例
```json
{
"code": 200,
"message": "成功",
"success": true,
"data": {
"records": [
{
"operationType": "UPDATE",
"oldValue": "供应商全称:示例旅行服务公司",
"newValue": "供应商全称:示例旅行服务有限公司",
"valueAvailability": "FULL",
"changeReason": "修正供应商主体名称",
"status": "合作中",
"operatorName": "示例管理员",
"operatorRole": "超级管理员",
"occurredAt": "2026-08-27 15:20:00"
}
],
"total": 1,
"page": 1,
"pageSize": 20
}
}
```
#### 空数据 / 降级响应
筛选结果为空仍返回成功分页,不回退到旧混合列表:
```json
{
"code": 200,
"message": "成功",
"success": true,
"data": {
"records": [],
"total": 0,
"page": 1,
"pageSize": 20
}
}
```
历史记录无法恢复完整原值时,仍返回已有安全摘要,并明确标记:
```json
{
"operationType": "UPDATE",
"oldValue": "138****8000",
"newValue": "139****9000",
"valueAvailability": "LEGACY_MASKED_UNRECOVERABLE",
"changeReason": "历史记录",
"status": "合作中",
"operatorName": "未知管理员",
"operatorRole": "管理员",
"occurredAt": "2026-07-01 10:00:00"
}
```
#### 错误响应
非法筛选、分页、排序或时间范围返回参数错误,例如只传 `from`:
```json
{
"code": 400,
"message": "from和to必须同时传入",
"success": false,
"data": null
}
```
供应商不存在或已删除:
```json
{
"code": 395001,
"message": "供应商不存在",
"success": false,
"data": null
}
```
#### 业务边界
- 要求 Gateway 登录态、可信管理员身份、允许的读角色以及 `supplier:approval:read` 平台权限;任一门禁失败时不查询历史数据。
- 代码角色矩阵沿用 `ADMIN`、`FINANCE`、`SUPER_ADMIN`;角色允许不等于拥有平台权限,两项必须同时满足。
- 只读取供应商主体变更,不包含收款账户变更或审批流水。
- `oldValue`、`newValue` 是后端形成的中文业务摘要,不是可回填编辑表单的结构化快照。
- User 姓名依赖异常只影响 `operatorName`,分页仍成功且不会以管理员内部 ID 降级。
- 接口只读,成功、空数据和失败场景均不修改供应商、审批、缓存或消息状态。
### 2. 查询供应商主体审批流水 `GET /admin/supplier/items/{supplierId}/approval-history/page`
**VO**: `SupplierApprovalHistoryPageReqVO` / `SupplierApprovalHistoryRespVO`
#### 使用场景
管理端进入供应商详情的“审批记录”页签时调用。该列表只表达主体审批申请、过程和结果,不包含主体字段变更摘要,也不包含收款账户审批。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|---|---|---|---:|---|---|
| `supplierId` | Path | String | 是 | 正整数 ID 字符串 | 目标供应商;不得转为 JavaScript Number |
| `page` | Query | Integer | 否 | 默认 `1`,最小 `1` | 当前页;兼容别名 `pageNo` |
| `pageSize` | Query | Integer | 否 | 默认 `20`,范围 `1..100` | 每页条数 |
| `bizType` | Query | String | 否 | 大写字母开头,仅大写字母、数字、下划线,最长 32 字符 | 审批业务类型精确筛选 |
| `approvalStatus` | Query | String | 否 | 大写字母开头,仅大写字母、数字、下划线,最长 20 字符 | 审批状态精确筛选 |
| `action` | Query | String | 否 | 大写字母开头,仅大写字母、数字、下划线,最长 32 字符 | 审批动作或结果精确筛选 |
| `from` | Query | String | 条件必填 | `yyyy-MM-dd HH:mm:ss` | 与 `to` 成对传入,按提交时间筛选,含边界 |
| `to` | Query | String | 条件必填 | `yyyy-MM-dd HH:mm:ss`,不得早于 `from` | 与 `from` 成对传入,含边界 |
| `sortBy` | Query | String | 否 | `submittedAt` 或 `finishedAt`,默认 `submittedAt` | 服务端白名单排序字段 |
| `sortDirection` | Query | String | 否 | `ASC` 或 `DESC`,不区分大小写,默认 `DESC` | 排序方向 |
#### 出参 `Result<PageResult<SupplierApprovalHistoryRespVO>>`
分页对象固定包含 `records`、`total`、`page`、`pageSize`。
| 字段 | 类型 | 说明 |
|---|---|---|
| `records` | Array | 当前页主体审批记录;无数据时为 `[]` |
| `total` | Integer | 符合筛选条件的主体审批总数,不包含账户审批 |
| `page` | Integer | 当前页码 |
| `pageSize` | Integer | 当前页容量 |
| `records[].bizType` | String | 审批业务类型编码 |
| `records[].bizTypeName` | String | 审批业务类型中文名;未知编码显示“其他供应商审批” |
| `records[].applicantName` | String | 申请人展示名;系统申请为“系统”,依赖降级为“未知申请人” |
| `records[].approvalStatus` | String | 审批状态编码 |
| `records[].approvalStatusName` | String | 审批状态中文名;未知编码显示“未知状态” |
| `records[].action` | String/null | 审批动作或结果编码 |
| `records[].actionName` | String | 审批动作中文名;未知编码显示“其他动作” |
| `records[].approverName` | String | 安全展示值:“系统”“待审批”或“外部审批人” |
| `records[].opinion` | String | 审批意见;无意见时为 `—` |
| `records[].submittedAt` | String | 提交时间;历史缺失时使用该审批事实的创建时间,格式 `yyyy-MM-dd HH:mm:ss` |
| `records[].finishedAt` | String/null | 完成时间;审批中为 `null`,格式 `yyyy-MM-dd HH:mm:ss` |
响应不会返回审批日志 ID、申请人内部 ID、requestNo、spNo、审批模板 ID、企微用户 ID、候选或详情摘要、候选或详情 JSON/密文、apply/sync 技术状态。
#### 请求示例
```http
GET /admin/supplier/items/2092800000000000001/approval-history/page?page=1&pageSize=20&approvalStatus=APPROVED&sortBy=submittedAt&sortDirection=DESC
Authorization: Bearer <admin-token>
```
GET 请求无请求体。
#### 响应示例
```json
{
"code": 200,
"message": "成功",
"success": true,
"data": {
"records": [
{
"bizType": "PROFILE_CREATE",
"bizTypeName": "供应商建档审批",
"applicantName": "示例管理员",
"approvalStatus": "APPROVED",
"approvalStatusName": "已通过",
"action": "SYSTEM_AUTO_APPROVE",
"actionName": "系统自动通过",
"approverName": "系统",
"opinion": "—",
"submittedAt": "2026-08-27 14:00:00",
"finishedAt": "2026-08-27 14:00:01"
}
],
"total": 1,
"page": 1,
"pageSize": 20
}
}
```
#### 空数据 / 降级响应
不存在符合条件的审批事实时返回成功空分页:
```json
{
"code": 200,
"message": "成功",
"success": true,
"data": {
"records": [],
"total": 0,
"page": 1,
"pageSize": 20
}
}
```
申请人姓名依赖不可用时,该记录仍正常返回,`applicantName` 为 `未知申请人`;不会回退为内部管理员 ID。
#### 错误响应
非法枚举、分页、排序或反向时间范围返回参数错误,例如:
```json
{
"code": 400,
"message": "from不能晚于to",
"success": false,
"data": null
}
```
无业务读取权限时返回拒绝结果,且不查询审批历史:
```json
{
"code": 403,
"message": "无权访问供应商数据",
"success": false,
"data": null
}
```
#### 业务边界
- 权限条件与变更记录接口相同:可信管理身份、`ADMIN`/`FINANCE`/`SUPER_ADMIN` 读角色和 `supplier:approval:read` 平台权限缺一不可。
- 只读取供应商主体审批,不包含收款账户审批或主体字段变更记录。
- 时间筛选基于提交时间;历史提交时间为空时使用该审批事实的创建时间。
- 申请人名称每页最多批量补全一次;User 服务异常、空响应或缺失用户时安全降级,整页不返回 500。
- 审批人只返回业务安全展示值,不暴露企微或外部审批系统标识。
- 接口只读,不推进审批状态,不触发审批回调,也不产生缓存、消息或配置副作用。
## 四、契约约束与正确调用方式
### 详情页接入映射
| 页面区域 | 正确接口 | 数据范围 |
|---|---|---|
| 变更记录 | `GET /admin/supplier/items/{supplierId}/change-records/page` | 仅主体变更 |
| 审批记录 | `GET /admin/supplier/items/{supplierId}/approval-history/page` | 仅主体审批 |
| 旧兼容混合列表 | `GET /admin/supplier/items/{supplierId}/approval-records/page` | 主体与账户变更,契约不变 |
### ✅ 正确 / ❌ 错误调用对照
| 场景 | 调用 / 结果 |
|---|---|
| ✅ 分别加载两个页签 | 两条新接口分别维护自己的 `page`、`pageSize`、筛选和 `total` |
| ✅ 查询完整时间区间 | 同时传 `from=2026-08-01 00:00:00` 与 `to=2026-08-31 23:59:59` |
| ✅ 兼容旧页面 | 继续调用旧 `approval-records/page`,无需因本次新增接口修改 |
| ❌ 在前端拆旧混合列表 | 分页后再过滤会得到错误总数,也不能生成审批流水 |
| ❌ 只传一侧时间 | 返回 `400`,不执行历史查询 |
| ❌ 把 `supplierId` 转为 Number | 可能丢失精度;ID 必须始终按 String 传输和比较 |
调用方必须同时检查 `code`、`message`、`success` 和 `data`,不能只用 HTTP 状态判断业务成功。
## 六、边界行为
- 未登录或登录态失效:统一结果业务码 `401`,不进入供应商查询。
- 已登录但角色或平台权限不满足:业务码 `403`,不读取历史。
- `supplierId<=0`、`page<1`、`pageSize` 不在 `1..100`、非法筛选或排序:业务码 `400`。
- 供应商不存在或已软删除:业务码 `395001`。
- `from`、`to` 必须同时传入,且 `from<=to`;时间边界包含起止时刻。
- 请求超过最后一页:返回原请求页码、空 `records` 和真实 `total`,不自动改页。
- 两个新接口的 `total` 分别统计自己的数据集,互不借用;账户变更和账户审批都不进入。
- 旧 `approval-records/page` 的路径、请求、响应及主体/账户混合语义保持兼容。
## 六.5、枚举 / 数据字典
### `operationType`(变更记录操作类型)
**所属字段**: `SupplierChangeRecordPageReqVO.operationType` / `SupplierChangeRecordRespVO.operationType` | **类型**: `String`
| 值 | 中文 | 说明 |
|---|---|---|
| `CREATE` | 创建 | 创建供应商主体 |
| `UPDATE` | 更新 | 更新主体业务字段 |
| `ENABLE` | 启用 | 恢复可用状态 |
| `DISABLE` | 停用 | 暂停或禁用合作 |
| `DELETE` | 删除 | 软删除业务事实 |
### `status`(变更后的供应商生命周期)
**所属字段**: `SupplierChangeRecordPageReqVO.status` | **类型**: `String`
| 值 | 中文展示 |
|---|---|
| `DRAFT` | 草稿 |
| `VETTING` | 注册审核中 |
| `ACTIVE` | 合作中 |
| `SUSPENDED` | 暂停合作 |
| `FROZEN` | 已冻结 |
| `BLACKLIST` | 黑名单 |
| `ARCHIVED` | 已归档 |
### `valueAvailability`(变更摘要可用性)
**所属字段**: `SupplierChangeRecordRespVO.valueAvailability` | **类型**: `String`
| 值 | 中文 | 调用方处理 |
|---|---|---|
| `FULL` | 完整业务摘要可用 | 正常展示 `oldValue` / `newValue` |
| `LEGACY_MASKED_UNRECOVERABLE` | 历史原值不可恢复 | 展示现有摘要,并标注其为历史脱敏值;不要提示用户重试 |
### `bizType`(主体审批业务类型)
**所属字段**: `SupplierApprovalHistoryPageReqVO.bizType` / `SupplierApprovalHistoryRespVO.bizType` | **类型**: `String`
| 值 | 中文展示 | 说明 |
|---|---|---|
| `PROFILE_CREATE` | 供应商建档审批 | 注册或建档审批 |
| `STATUS_CHANGE` | 供应商状态变更审批 | 生命周期状态变更审批 |
| 其他合法大写编码 | 其他供应商审批 | 为历史及后续业务保留兼容 |
### `approvalStatus`(主体审批状态)
**所属字段**: `SupplierApprovalHistoryPageReqVO.approvalStatus` / `SupplierApprovalHistoryRespVO.approvalStatus` | **类型**: `String`
| 值 | 中文展示 |
|---|---|
| `PENDING` | 审批中 |
| `APPROVED` | 已通过 |
| `REJECTED` | 已驳回 |
| `CANCELED` / `CANCELLED` | 已撤销 |
| `FAILED` | 失败 |
| 其他合法大写编码 | 未知状态 |
### `action`(主体审批动作或结果)
**所属字段**: `SupplierApprovalHistoryPageReqVO.action` / `SupplierApprovalHistoryRespVO.action` | **类型**: `String`
| 值 | 中文展示 |
|---|---|
| `SUBMIT` | 已提交 |
| `SYSTEM_AUTO_APPROVE` | 系统自动通过 |
| `APPLY_FAIL` | 结果应用失败 |
| `APPROVE` | 通过 |
| `REJECT` | 驳回 |
| `REVOKE` | 撤销 |
| `CANCEL` | 取消 |
| 其他合法大写编码 | 其他动作 |
## 七、不影响范围
- **仅新增**:供应商详情的两个管理端只读分页契约。
- **保持兼容**:旧 `approval-records/page` 继续返回主体与账户变更混合列表。
- **零影响**:供应商详情、创建、更新、提交、归档、暂停合作、拉黑、删除及收款账户管理接口。
- **零影响**:供应商写权限、数据范围、状态机、审批提交/结果应用、事务、锁、幂等、审计与软删除语义。
- **零影响**:数据库结构与历史数据;本次无 migration、数据回填或破坏性数据操作。
- **零影响**:Gateway 顶级路由、Nacos 配置、Redis、MQ 和跨服务写链路。
- 后端仓库未修改任何管理端前端源码;管理端接入状态保持 `pending`。
## 八、测试环境已验证
- 本地自动化:主功能定向测试 79 项零失败;补充空上下文兼容测试套件 51 项零失败;最终 `hl-resource-service` 全量 2158 项零失败、零错误(38 项条件跳过);`GatewayRouteAuditTest` 4 项零失败。
- 合并:主 PR #6519 合并提交 `3dc80ad69630127d91fa973a682051b2ef5c41d8`;验收发现旧兼容接口空上下文缺陷后,补充工单 #6532 / PR #6534 以最小修复合入,最新合并提交为 `aec1de2db2b4ed07d78877c1ccd4e532919bdaf3`。
- TEST 精确部署:Deploy Panel 任务 `9e69fd2c` 成功发布 `aec1de2db2b4ed07d78877c1ccd4e532919bdaf3`;构建退出码 0,任务期 10 次有效采样均至少 2 个运行进程、2 个健康启用 Nacos 实例,零不可用采样,部署窗日志无失败标记。
- 真实 Gateway:使用现有真实 `SUPER_ADMIN` 与同账号可切换的 `ADMIN` 身份,两条新接口的成功分页、字段白名单、独立总数、筛选、排序、边界参数和旧接口兼容均通过;`CUSTOMIZER` 返回 `403`,未认证返回 `401`。
- TEST 数据覆盖:目标供应商存在 18 条主体变更事实和 1 条主体审批事实;对应账户变更、账户审批均为 0,验证两个新接口没有跨域混页。审批样本为 `APPROVED` / `SYSTEM_AUTO_APPROVE`;环境没有外部审批人样本,未伪造业务数据。
- 身份说明:代码角色矩阵仍包含 `ADMIN`、`FINANCE`、`SUPER_ADMIN`。TEST 角色目录存在 `FINANCE`,但当前获批真实账号不能切换到该角色;按工单确认使用现有 `SUPER_ADMIN`(并覆盖 `ADMIN`)替代 FINANCE 实测,不创建、不修改、不伪造财务账号。
- 清理:验收全程只读,供应商数据指纹前后一致,业务测试数据创建数为 0;真实会话均已失效处理,无数据库、Redis、MQ 或临时配置需要清理。
## 九、相关历史 PR
| PR | Issue | 说明 | 是否仍有效 |
|---|---|---|---|
| #6486 | #6436 | 冻结供应商授权完整值与历史摘要语义 | ✅ 有效,本次沿用 |
| #6519 | #6474 | 新增主体变更记录与主体审批流水独立分页 | ✅ 本次主功能 |
| #6534 | #6532 | 修复旧兼容接口投影空上下文时的空指针 | ✅ 有效,保障历史兼容 |
## 十、相关文档
- 关联 Issue:[#6474](https://git.1814.love:8443/wx/HL/issues/6474)
- 关联 PR:[#6519](https://git.1814.love:8443/wx/HL/pulls/6519)
- 补充缺陷 Issue:[#6532](https://git.1814.love:8443/wx/HL/issues/6532)
- 补充缺陷 PR:[#6534](https://git.1814.love:8443/wx/HL/pulls/6534)
- 管理端接入:将“变更记录”“审批记录”分别切换到两条新接口;前端引用待回填。
## 撤回
1. 管理端先停止请求两个新路径,并恢复使用旧 `approval-records/page`,避免代码回退窗口产生请求失败。
2. 从最新 `dev-v3` 创建独立回退分支,对主功能合并执行 `git revert -m 1 --no-edit 3dc80ad69630127d91fa973a682051b2ef5c41d8`,验证后经独立 PR 合入。
3. #6532 的空上下文修复可独立保留,它修复的是旧兼容接口且不依赖两个新路径。若明确要求连同该修复一起撤回,再按从新到旧顺序执行 `git revert -m 1 --no-edit aec1de2db2b4ed07d78877c1ccd4e532919bdaf3`;这样会重新引入旧兼容接口在特定记录上的 500 风险,不作为推荐方案。
4. 使用 Deploy Panel 两阶段客户端,仅滚动部署 `hl-resource-service`;本次无数据库、配置、Redis 或 MQ 恢复步骤,也无不可逆数据影响。
5. 撤回后经 Gateway 验证两个新路径不可用、旧兼容接口按选定回退范围正常,复测未认证和越权,并确认 Resource 双实例、Nacos、日志及零写入。
6. 同步发布本 Changelog 的撤回说明;不得仅改文件名表达状态。
## 关联 / 联系人
### 链接
- **Issue**: [#6474](https://git.1814.love:8443/wx/HL/issues/6474)
- **PR**: [#6519](https://git.1814.love:8443/wx/HL/pulls/6519)
- **Merge commit**: [`3dc80ad6`](https://git.1814.love:8443/wx/HL/commit/3dc80ad69630127d91fa973a682051b2ef5c41d8)
- **补充 PR**: [#6534](https://git.1814.love:8443/wx/HL/pulls/6534)
- **TEST 目标提交**: [`aec1de2d`](https://git.1814.love:8443/wx/HL/commit/aec1de2db2b4ed07d78877c1ccd4e532919bdaf3)
### 联系人
- **后端负责人**: @lc

某些文件未显示,因为此 diff 中更改的文件太多 显示更多