比较提交
456
次代码提交
| 作者 | SHA1 | 提交日期 | |
|---|---|---|---|
|
|
d7c4a5d4bf | ||
|
|
8a5c34f09f | ||
|
|
090ad8936f | ||
|
|
547035c39e | ||
|
|
d7fbbdeb1d | ||
|
|
27ee86ea5f | ||
|
|
6fbcb70331 | ||
|
|
87ed9d0a3f | ||
|
|
72e05778e2 | ||
|
|
f9c6ce3dd1 | ||
|
|
cffa47bc46 | ||
|
|
5e3affae41 | ||
|
|
aea21e188c | ||
|
|
59e978552a | ||
|
|
334d84e3ff | ||
|
|
755c690e24 | ||
|
|
514ab2cf1f | ||
|
|
e6be4be31d | ||
|
|
265dcd0408 | ||
|
|
26e995a97e | ||
|
|
0119ffca67 | ||
|
|
4c8f93f978 | ||
|
|
4cdf3606e9 | ||
|
|
553aa99dd7 | ||
|
|
e4fc9d1a90 | ||
|
|
c7ce1009d6 | ||
|
|
778d618ef4 | ||
|
|
28effce68e | ||
|
|
20f348694a | ||
|
|
a080db4c72 | ||
|
|
2f7858e815 | ||
|
|
a5346644a2 | ||
|
|
e211e9abc2 | ||
|
|
88e07ea5c3 | ||
|
|
d63f379f2f | ||
|
|
9b16b408c7 | ||
|
|
16ed452d00 | ||
|
|
e8fdb57940 | ||
|
|
5b5c2cac0a | ||
|
|
3f72bf305a | ||
|
|
dbadd1b685 | ||
|
|
2c1e6dec2d | ||
|
|
0c012ef072 | ||
|
|
36431070c1 | ||
|
|
69118dd6ec | ||
|
|
125a22f36c | ||
|
|
c94fb2e12b | ||
|
|
b7015c1ff4 | ||
|
|
014a2396a1 | ||
|
|
92f074fc65 | ||
|
|
51287c597a | ||
|
|
a669350b0f | ||
|
|
a3f2ac8fb8 | ||
|
|
0ccc0d9736 | ||
|
|
ea0c76cabc | ||
|
|
fad30338a5 | ||
|
|
8b9f8ca711 | ||
|
|
3fc124b0d9 | ||
|
|
58c216669c | ||
|
|
09f59e6d68 | ||
|
|
0f9e87db01 | ||
|
|
9676e6452b | ||
|
|
c8f1f579b8 | ||
|
|
35a67a6264 | ||
|
|
5997bc722e | ||
|
|
46909eba8d | ||
|
|
a78bfd7e60 | ||
|
|
d77b108824 | ||
|
|
f63748605d | ||
|
|
5d97e1acb8 | ||
|
|
273514e4ba | ||
|
|
85a0cdfecd | ||
|
|
0bce0dd772 | ||
|
|
2b0b922da3 | ||
|
|
83cd836ab3 | ||
|
|
652b07758a | ||
|
|
072c3f8717 | ||
|
|
151bfff016 | ||
|
|
6c78b879a4 | ||
|
|
958f327b5b | ||
|
|
e9797c57de | ||
|
|
fee08eba33 | ||
|
|
effdb312c3 | ||
|
|
f671611af5 | ||
|
|
d840271076 | ||
|
|
577e3a98af | ||
|
|
243ec1c164 | ||
|
|
51d838baf8 | ||
|
|
4088b2e53b | ||
|
|
a08369749f | ||
|
|
d970d37a50 | ||
|
|
441ff5eea3 | ||
|
|
08e4a11c35 | ||
|
|
89d493c7ef | ||
|
|
d38d8fc4bb | ||
|
|
71c31c475d | ||
|
|
6777213ad1 | ||
|
|
31aa1e3eaf | ||
|
|
ba4ef6c376 | ||
|
|
207425a9af | ||
|
|
bd0d4f5077 | ||
|
|
a1c85b4061 | ||
|
|
489ed1df0c | ||
|
|
e2c6ce65a4 | ||
|
|
f53c3df9c8 | ||
|
|
50dad163a8 | ||
|
|
e22815ce7e | ||
|
|
822263565d | ||
|
|
8cd710bd6b | ||
|
|
fffa145653 | ||
|
|
05beb7965d | ||
|
|
053776756f | ||
|
|
4917e44e6a | ||
|
|
8e9856fd6d | ||
|
|
2bfed6bf0f | ||
|
|
b80d3e3ca2 | ||
|
|
523c1faf99 | ||
|
|
234e557852 | ||
|
|
3572fc7a0d | ||
|
|
0b2853224e | ||
|
|
22d34c8023 | ||
|
|
5fa9fdae6b | ||
|
|
c917eadbbf | ||
|
|
5f85c9c626 | ||
|
|
559e3da634 | ||
|
|
11e4a365ca | ||
|
|
a19ef02533 | ||
|
|
e4481081ee | ||
|
|
6b41b5fa0f | ||
|
|
57a0cf6b78 | ||
|
|
2fb3cb01a8 | ||
|
|
1e2839e03f | ||
|
|
dbd1eba658 | ||
|
|
97bc9d2fb5 | ||
|
|
285f414b96 | ||
|
|
192ac2d963 | ||
|
|
930a3379fe | ||
|
|
3860003084 | ||
|
|
96dcb3fffb | ||
|
|
a7dd25f5c4 | ||
|
|
899c18de84 | ||
|
|
3becd7f6da | ||
|
|
d2bce9b9c8 | ||
|
|
59bc815af4 | ||
|
|
e3700420a2 | ||
|
|
0686db9ad5 | ||
|
|
0207e50800 | ||
|
|
9ad6178c3c | ||
|
|
1191b6e046 | ||
|
|
babb9e6a89 | ||
|
|
c91730668b | ||
|
|
890c8bd454 | ||
|
|
91e38984ab | ||
|
|
edab50a6a8 | ||
|
|
5db14d3832 | ||
|
|
b241e8a69b | ||
|
|
1c5279f327 | ||
|
|
1e8404a047 | ||
|
|
d53a6f4328 | ||
|
|
649eea681b | ||
|
|
6e05bd81aa | ||
|
|
b7855447cf | ||
|
|
54cdd4dca8 | ||
|
|
779f70f896 | ||
|
|
551c56609f | ||
|
|
5a24c71fe0 | ||
|
|
ad0c43afb1 | ||
|
|
d0e762ddc6 | ||
|
|
6c7e0ef5f5 | ||
|
|
4ca07159ba | ||
|
|
bc84c8099c | ||
|
|
86b700939c | ||
|
|
a61586ff83 | ||
|
|
48d36a1c84 | ||
|
|
4b351d1c1c | ||
|
|
10502ccdd3 | ||
|
|
a7a687796f | ||
|
|
8ddf1e5268 | ||
|
|
31d9cb8b23 | ||
|
|
d32665518f | ||
|
|
47544d190e | ||
|
|
4bea4c2d1c | ||
|
|
637fad2394 | ||
|
|
e315cbb6b0 | ||
|
|
3a15e3de25 | ||
|
|
57be23bcd1 | ||
|
|
1584c8ee80 | ||
|
|
b4ef91e9eb | ||
|
|
3aa5242ab9 | ||
|
|
fb7a6af37b | ||
|
|
4656428473 | ||
|
|
79186364b8 | ||
|
|
a0d72720a6 | ||
|
|
37904dc20f | ||
|
|
6827c24324 | ||
|
|
251748d813 | ||
|
|
98665c3a20 | ||
|
|
a28a67887f | ||
|
|
5a5ca03e0f | ||
|
|
274f0b16c0 | ||
|
|
8accfb3a61 | ||
|
|
0c30d2c966 | ||
|
|
78ddcae40e | ||
|
|
6a6c167b69 | ||
|
|
67cb933c76 | ||
|
|
50c0e53c52 | ||
|
|
c5b40bb83e | ||
|
|
65d786ea87 | ||
|
|
559c8da1c1 | ||
|
|
4aa3037c3c | ||
|
|
1e52ba5d26 | ||
|
|
b0c68caa15 | ||
|
|
cad8452b92 | ||
|
|
95d1789793 | ||
|
|
70dbb833e0 | ||
|
|
d9f30eb9bf | ||
|
|
fc6f223419 | ||
|
|
1f48714187 | ||
|
|
6c62b1aa2b | ||
|
|
6fee8114b8 | ||
|
|
953d953bdc | ||
|
|
7ecd4da276 | ||
|
|
4a284f6323 | ||
|
|
7b1601a7c2 | ||
|
|
d807fad55f | ||
|
|
5cdf062dd2 | ||
|
|
41160bbfad | ||
|
|
6cfa38b56d | ||
|
|
be7415b771 | ||
|
|
4281aa8aca | ||
|
|
688c403695 | ||
|
|
3370e7a278 | ||
|
|
9b67d6f4f0 | ||
|
|
b165e41337 | ||
|
|
38a6cf5434 | ||
|
|
5eff130bf2 | ||
|
|
92eb0956a8 | ||
|
|
bdeaa623ed | ||
|
|
9ae0d869e4 | ||
|
|
cdc17540d5 | ||
|
|
c74fc50926 | ||
|
|
9d573b9a81 | ||
|
|
19d434ef3b | ||
|
|
78fe5b7a99 | ||
|
|
b4ab37a9bc | ||
|
|
c95ab182dc | ||
|
|
d1e45d6d2e | ||
|
|
b99b783557 | ||
|
|
5025f8d69b | ||
|
|
2b45ee9d44 | ||
|
|
89be26b98b | ||
|
|
9d8e1945f4 | ||
|
|
b22e67ca69 | ||
|
|
ce7e1fb007 | ||
|
|
f03121f0f4 | ||
|
|
74dc7f0ede | ||
|
|
b22345d167 | ||
|
|
0081bc5682 | ||
|
|
3e669eefde | ||
|
|
e24d03a19c | ||
|
|
a244476a3c | ||
|
|
9c1290d1c7 | ||
|
|
a32b384cb1 | ||
|
|
e22dbe465c | ||
|
|
d795a2f0bb | ||
|
|
74abca87c9 | ||
|
|
d749d22f2b | ||
|
|
fc2b0f9090 | ||
|
|
990db59ea8 | ||
|
|
8992795688 | ||
|
|
76ba72bf81 | ||
|
|
beeb6d9cdd | ||
|
|
627cbe1fe0 | ||
|
|
a4b44cedce | ||
|
|
6d966716fb | ||
|
|
104c31e08c | ||
|
|
d2ed4973f7 | ||
|
|
a7a3a0bb3e | ||
|
|
eb7502169d | ||
|
|
cb4262b39b | ||
|
|
0b86d2593f | ||
|
|
0c042ba736 | ||
|
|
350c7a7124 | ||
|
|
689df8b520 | ||
|
|
eba4d9e7dc | ||
|
|
8347561971 | ||
|
|
c276b2790c | ||
|
|
a246b25e22 | ||
|
|
133955c190 | ||
|
|
278730fc75 | ||
|
|
15d63f0ba2 | ||
|
|
4c24a515cf | ||
|
|
b16d54e89e | ||
|
|
c656b273f0 | ||
|
|
0854f5753f | ||
|
|
ec158880e4 | ||
|
|
699fc4c04e | ||
|
|
59dd1eac9a | ||
|
|
347d5ec664 | ||
|
|
1c2156fbda | ||
|
|
8e77a7b30a | ||
|
|
9f27d9bfb8 | ||
|
|
55e4c68e36 | ||
|
|
0f2c589874 | ||
|
|
db278d432c | ||
|
|
97608cfca6 | ||
|
|
eb535dbc50 | ||
|
|
16e0133257 | ||
|
|
16c68b6b25 | ||
|
|
a6c9a3cb00 | ||
|
|
ca5e4073ce | ||
|
|
3b2883d1d3 | ||
|
|
800c9bbab3 | ||
|
|
deef7dc56f | ||
|
|
0be1a7f362 | ||
|
|
c39fb8ac24 | ||
|
|
aacc31a3da | ||
|
|
ce97c51aa9 | ||
|
|
ae20c451a1 | ||
|
|
ae41bbcdee | ||
|
|
da07ac2ebf | ||
|
|
de56358ea8 | ||
|
|
bab71b6bdf | ||
|
|
1548a68d4b | ||
|
|
de167a0c1c | ||
|
|
8af302c942 | ||
|
|
a591ff1d7a | ||
|
|
f53f52ca15 | ||
|
|
b794316e5a | ||
|
|
60e683921a | ||
|
|
c744e20340 | ||
|
|
2a906d67f7 | ||
|
|
375520d4bd | ||
|
|
7f634e509d | ||
|
|
e1b80226fc | ||
|
|
f9ff754579 | ||
|
|
35715d7ba0 | ||
|
|
85dec7085f | ||
|
|
0451e4ceaa | ||
|
|
077845c8aa | ||
|
|
d80b3ee60b | ||
|
|
0623aecfaa | ||
|
|
79da505a41 | ||
|
|
82026c2a92 | ||
|
|
5a74bf554c | ||
|
|
184ca5ed44 | ||
|
|
fbe1de4d91 | ||
|
|
41f3f69500 | ||
|
|
473ac246ed | ||
|
|
fc87e3280a | ||
|
|
a107bc9f18 | ||
|
|
70c1f44650 | ||
|
|
a7c44c0caa | ||
|
|
354d9083a7 | ||
|
|
7b9b60b9ac | ||
|
|
c1d7fed7b6 | ||
|
|
c5c69d10aa | ||
|
|
c5adab6346 | ||
|
|
c4968b5233 | ||
|
|
62c52b8024 | ||
|
|
713b15a640 | ||
|
|
293aa77f98 | ||
|
|
2f6a989fcf | ||
|
|
54b4d7a86e | ||
|
|
f3f11505d4 | ||
|
|
d1fe0c3bf0 | ||
|
|
4e52f26972 | ||
|
|
c399b3b0f1 | ||
|
|
0dec0584f9 | ||
|
|
a269c0bc97 | ||
|
|
be5afcf30a | ||
|
|
125014ac9b | ||
|
|
19c3abe79e | ||
|
|
a67e24b9b9 | ||
|
|
81139ab8c3 | ||
|
|
8973353356 | ||
|
|
17490fff88 | ||
|
|
a97809f105 | ||
|
|
0a324bb6dc | ||
|
|
8696bbb083 | ||
|
|
eede11917a | ||
|
|
e3aace57c5 | ||
|
|
4ff1480683 | ||
|
|
8c38fc6b89 | ||
|
|
a611948477 | ||
|
|
db6698061b | ||
|
|
2096a47340 | ||
|
|
e5356a65e0 | ||
|
|
71cc52c1a3 | ||
|
|
0df2c917bf | ||
|
|
cf78c344a1 | ||
|
|
a0daab2b90 | ||
|
|
5046bce500 | ||
|
|
c80d1975aa | ||
|
|
f4354d8c31 | ||
|
|
828d9ae2e4 | ||
|
|
d2c39b6c24 | ||
|
|
411a549548 | ||
|
|
f68b6d80d4 | ||
|
|
c579da759e | ||
|
|
c66a28b43f | ||
|
|
6c1d11d40f | ||
|
|
9428076c2c | ||
|
|
95394c35fc | ||
|
|
edfffdf063 | ||
|
|
06a86d488d | ||
|
|
082f32ad3f | ||
|
|
cfc3aa8b1e | ||
|
|
72949d869c | ||
|
|
a031039140 | ||
|
|
c9efecebc5 | ||
|
|
4c12c1db01 | ||
|
|
937f353b41 | ||
|
|
43bf3936d1 | ||
|
|
33a8f7cb5b | ||
|
|
5ce53bcd47 | ||
|
|
430d825904 | ||
|
|
2b60fc3323 | ||
|
|
070c937a08 | ||
|
|
e28f675c8f | ||
|
|
787b9a007b | ||
|
|
d81fea420a | ||
|
|
0e1ab992e8 | ||
|
|
95212ad9a5 | ||
|
|
2ebb4644a6 | ||
|
|
17bb0ef2bf | ||
|
|
5c52926269 | ||
|
|
a45b51d8a8 | ||
|
|
73a4518181 | ||
|
|
8821d1df6f | ||
|
|
51708dc7a6 | ||
|
|
b28bd34ceb | ||
|
|
1ba3299afa | ||
|
|
bd235c2e1d | ||
|
|
eb628f56b0 | ||
|
|
b54c4cc8d7 | ||
|
|
4621f11e36 | ||
|
|
1f608928b7 | ||
|
|
a4aba37568 | ||
|
|
60a28339e0 | ||
|
|
d3b5c0e8c9 | ||
|
|
0474e6ff78 | ||
|
|
9aace47441 | ||
|
|
605859b12f | ||
|
|
734a9b1112 | ||
|
|
20272bb706 | ||
|
|
59090c889b | ||
|
|
07387e506f | ||
|
|
e4f7c5cb0a | ||
|
|
cf3fe30a0f | ||
|
|
e91101c037 | ||
|
|
ebc2fecbfd | ||
|
|
e362441e9c | ||
|
|
81aab7abb0 | ||
|
|
4f81ef1cf9 | ||
|
|
ca11783f72 |
@@ -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」一条。**
|
||||||
@@ -1,4 +1,11 @@
|
|||||||
{
|
{
|
||||||
"schema": "hl-changelog-path-aliases/v1",
|
"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: "删除接口"
|
change_type: "删除接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "Pi"
|
frontend_owner: "Pi"
|
||||||
frontend_ref: "v2.1@21dccf38d1413b098cfd5a456d3fb76611581ebb"
|
frontend_ref: "v2.1@21dccf38d1413b098cfd5a456d3fb76611581ebb"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: "2026-08-02"
|
verified_at: "2026-09-18"
|
||||||
status_note: "管理后台已仅保留导游、摄影师人员页签,删除领队/司机/其他人员 API 链路,并按 settlementReady/blockReasonCode 区分车辆两类空态;finalize 前重读权威 Step3。checkpoint 全量通过,业务提交 21dccf38d1413b098cfd5a456d3fb76611581ebb 已推送 origin/v2.1。网关有效登录态正向 curl 仍未完成,不标记 verified。"
|
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-08-02"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "yaosutu(GIT)"
|
author: "yaosutu(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "pi-main-session"
|
frontend_owner: "pi-main-session"
|
||||||
frontend_ref: "hl-admin@5925a3ff810b5ef0dbce027a0057e343a1910446"
|
frontend_ref: "hl-admin@5925a3ff810b5ef0dbce027a0057e343a1910446"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: "2026-08-04T22:35:00+08:00"
|
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,不影响已完成的运行时功能门禁。"
|
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-08-04"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "yaosutu(GIT)"
|
author: "yaosutu(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "pi-main-session"
|
frontend_owner: "pi-main-session"
|
||||||
frontend_ref: "hl-admin@9f46fa040a77cd899bbc9c21b9b8304a518499e2"
|
frontend_ref: "hl-admin@9f46fa040a77cd899bbc9c21b9b8304a518499e2"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: "2026-08-04"
|
verified_at: "2026-09-18"
|
||||||
status_note: "PR #5488 已合并 dev-v3;测试服真实网关已验证 POST 无旧字段成功、PUT 多传旧字段被忽略、GET/POST/PUT 响应均不含 projectCategory/projectCategoryName/specification。前端需删除项目类别与票种规格控件及相关字段读写。"
|
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-08-04"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ consumer: "admin"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "pi-main-session"
|
frontend_owner: "pi-main-session"
|
||||||
frontend_ref: "hl-admin@e0c5f4f75087107fd0d82fbdc104c76d732292dc"
|
frontend_ref: "hl-admin@e0c5f4f75087107fd0d82fbdc104c76d732292dc"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: "2026-08-04"
|
verified_at: "2026-09-18"
|
||||||
status_note: "看板列表 assignmentSlots 修复:同槽位跨段换车(同 slot 多 assignment_group_id)时由仅返回首段改为按派车组返回多段(每段含各自区间/车辆/司机/司机手机号);slotSummary 各段区间合计覆盖全槽;单段槽位行为不变。前端若按单条槽位渲染需适配多段展示。"
|
status_note: "看板列表 assignmentSlots 修复:同槽位跨段换车(同 slot 多 assignment_group_id)时由仅返回首段改为按派车组返回多段(每段含各自区间/车辆/司机/司机手机号);slotSummary 各段区间合计覆盖全槽;单段槽位行为不变。前端若按单条槽位渲染需适配多段展示。[mmg 2026-09-18 批量复核翻 verified] ref e0c5f4f7 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
|
||||||
updated_at: "2026-08-04"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "wx(GIT)"
|
author: "wx(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "pi-main-session"
|
frontend_owner: "pi-main-session"
|
||||||
frontend_ref: "hl-admin@ef497e8e30d2df2d55d97f5554c8c5e921dc49ef"
|
frontend_ref: "hl-admin@ef497e8e30d2df2d55d97f5554c8c5e921dc49ef"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
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 变为平台实际保费。"
|
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-08-04"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ consumer: "admin"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "partial"
|
gateway_status: "partial"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "Pi"
|
frontend_owner: "Pi"
|
||||||
frontend_ref: "v2.1@21dccf38d1413b098cfd5a456d3fb76611581ebb"
|
frontend_ref: "v2.1@21dccf38d1413b098cfd5a456d3fb76611581ebb"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: "2026-08-02"
|
verified_at: "2026-09-18"
|
||||||
status_note: "汇总 #5356、#5360、#5380 已实现的车辆 Tab 现行契约;管理后台使用 Step3 GET/PUT 和 vehicle-options,并按 settlementReady/blockReasonCode 区分车辆两类空态。"
|
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-08-05"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "yst"
|
|||||||
change_type: "新增接口"
|
change_type: "新增接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "pi-main-session"
|
frontend_owner: "pi-main-session"
|
||||||
frontend_ref: "hl-admin@0a8a72ed6a978a9f14187679188f4c8308e354cd"
|
frontend_ref: "hl-admin@0a8a72ed6a978a9f14187679188f4c8308e354cd"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: "hl-resource-service;PR #5528 与补丁 PR #5534 已合并并部署测试服,Gateway 真实验收通过;等待管理后台接入。"
|
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-08-05"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "wx(GIT)"
|
author: "wx(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "pi-main-session"
|
frontend_owner: "pi-main-session"
|
||||||
frontend_ref: "hl-admin@1553c988ac6065e693769a95f3f412c4e43df5e7"
|
frontend_ref: "hl-admin@1553c988ac6065e693769a95f3f412c4e43df5e7"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: "后端完成:PR #5522 已合并 dev-v3 并部署 TEST;非法枚举/分页返 400 明确错误码,source 筛选生效(BAOYOU=206)。前端若传 source 参数无需改动;旧传非法枚举值需适配 400 响应。"
|
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-08-05"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "not_required"
|
backend_status: "not_required"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "pi-main-session"
|
frontend_owner: "pi-main-session"
|
||||||
frontend_ref: "hl-admin@82255a9b0bd1e0e1560da161a80ec12325688655"
|
frontend_ref: "hl-admin@82255a9b0bd1e0e1560da161a80ec12325688655"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: "用户(wx)测试环境实测反馈的两个前端显示问题,交接前端处理。"
|
status_note: "用户(wx)测试环境实测反馈的两个前端显示问题,交接前端处理。[mmg 2026-09-18 批量复核翻 verified] ref 82255a9b 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
|
||||||
updated_at: "2026-08-05"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "not_required"
|
backend_status: "not_required"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "pi-main-session"
|
frontend_owner: "pi-main-session"
|
||||||
frontend_ref: "hl-admin@aa7061b0edeaf68a8baf306a858a91d8be8cb9a7"
|
frontend_ref: "hl-admin@aa7061b0edeaf68a8baf306a858a91d8be8cb9a7"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: "wx 确认无"按赛季买"需求,投保界面"按赛季"与"按年"快捷预填重复,去掉"按赛季"保留"按年"。"
|
status_note: "wx 确认无"按赛季买"需求,投保界面"按赛季"与"按年"快捷预填重复,去掉"按赛季"保留"按年"。[mmg 2026-09-18 复核翻 verified] ref aa7061b0 可达且为 v2.1 祖先;HEAD 上投保弹窗无按赛季预填残留(现「赛季」命中均为司机列表赛季在册页签,与本项无关);list-error-retry spec 全绿。"
|
||||||
updated_at: "2026-08-05"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "pi-main-session"
|
frontend_owner: "pi-main-session"
|
||||||
frontend_ref: "hl-admin@005ba4cf9151e39aac5bcf4c5e5480411d68264e"
|
frontend_ref: "hl-admin@005ba4cf9151e39aac5bcf4c5e5480411d68264e"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: ""
|
status_note: "[mmg 2026-09-18 批量复核翻 verified] ref 005ba4cf 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
|
||||||
updated_at: "2026-08-05"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "yst"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "pi-main-session"
|
frontend_owner: "pi-main-session"
|
||||||
frontend_ref: "hl-admin@0a8a72ed6a978a9f14187679188f4c8308e354cd"
|
frontend_ref: "hl-admin@0a8a72ed6a978a9f14187679188f4c8308e354cd"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: "hl-resource-service;PR #5540 已合并并部署测试服,Gateway 真实验收通过;等待管理后台完成破坏性契约迁移。"
|
status_note: "hl-resource-service;PR #5540 已合并并部署测试服,Gateway 真实验收通过;等待管理后台完成破坏性契约迁移。[mmg 2026-09-18 批量复核翻 verified] ref 0a8a72ed 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
|
||||||
updated_at: "2026-08-05"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "wx(GIT)"
|
author: "wx(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "pi-main-session"
|
frontend_owner: "pi-main-session"
|
||||||
frontend_ref: "hl-admin@085f4d7b58c3d61414df8d0461ab51e9eb61ea47"
|
frontend_ref: "hl-admin@085f4d7b58c3d61414df8d0461ab51e9eb61ea47"
|
||||||
target_release: "v2.1"
|
target_release: "v2.1"
|
||||||
verified_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 过滤真实生效。"
|
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-08-05"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "not_required"
|
||||||
frontend_owner: "pi-main-session"
|
frontend_owner: "pi-main-session"
|
||||||
frontend_ref: "N/A:前端字段已存在,仅后端取值变化,无需前端改动"
|
frontend_ref: "N/A:前端字段已存在,仅后端取值变化,无需前端改动"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: ""
|
||||||
status_note: ""
|
status_note: "[mmg 2026-09-18 复核改判 not_required] frontend_ref 自述前端无需改动,grep 实证成立:派车板 vehicleFeeAmount.js 直接读后端 calendarPrice/calendarPriceMissing 字段做兑底回显,后端取值变化前端零适配;原 implemented 为误挂,改判 not_required。"
|
||||||
updated_at: "2026-08-05"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ consumer: "admin"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "pi-main-session"
|
frontend_owner: "pi-main-session"
|
||||||
frontend_ref: "hl-admin@3e535fe3ad6a406529eb95d7787cefe11b9584cd"
|
frontend_ref: "hl-admin@3e535fe3ad6a406529eb95d7787cefe11b9584cd"
|
||||||
target_release: "v2.1"
|
target_release: "v2.1"
|
||||||
verified_at: "2026-08-06"
|
verified_at: "2026-09-18"
|
||||||
status_note: "司机详情与车务保险列表/详情仅在 policyPdfUrl 非空时显示查看保单并安全新窗口预览;空值隐藏且不再回退旧下载接口,投保沿用 bindAnnual 缺省绑定全年保险语义。"
|
status_note: "司机详情与车务保险列表/详情仅在 policyPdfUrl 非空时显示查看保单并安全新窗口预览;空值隐藏且不再回退旧下载接口,投保沿用 bindAnnual 缺省绑定全年保险语义。[mmg 2026-09-18 复核翻 verified] ref 3e535fe3 可达且为 v2.1 祖先;HEAD 上 policyPdfUrl 非空在线预览在保险订单页与司机详情两处均在、空值隐藏不回退旧下载;相关 spec 全绿。"
|
||||||
updated_at: "2026-08-05"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "pi-main-session"
|
frontend_owner: "pi-main-session"
|
||||||
frontend_ref: "hl-admin@c6b107b89320e3bc9103314cd8eb5ef32897f51f"
|
frontend_ref: "hl-admin@c6b107b89320e3bc9103314cd8eb5ef32897f51f"
|
||||||
target_release: "v2.1"
|
target_release: "v2.1"
|
||||||
verified_at: "2026-08-05"
|
verified_at: "2026-09-18"
|
||||||
status_note: "管理后台矩阵/看板共用派单弹窗已接入三类司机自动建议;建议仅使用本次真实可用候选并携车辆、司机二次校验,NONE 清空本轮旧司机并展示后端提示,多槽位排除、人工改选、跨常驻确认和请求竞态门禁保持。"
|
status_note: "管理后台矩阵/看板共用派单弹窗已接入三类司机自动建议;建议仅使用本次真实可用候选并携车辆、司机二次校验,NONE 清空本轮旧司机并展示后端提示,多槽位排除、人工改选、跨常驻确认和请求竞态门禁保持。[mmg 2026-09-18 批量复核翻 verified] ref c6b107b8 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
|
||||||
updated_at: "2026-08-05"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "pi-main-session"
|
frontend_owner: "pi-main-session"
|
||||||
frontend_ref: "hl-admin@0da93eaef206f5daa85b99f45ecd0fd07873d5fc"
|
frontend_ref: "hl-admin@0da93eaef206f5daa85b99f45ecd0fd07873d5fc"
|
||||||
target_release: "v2.1"
|
target_release: "v2.1"
|
||||||
verified_at: "2026-08-06"
|
verified_at: "2026-09-18"
|
||||||
status_note: "后端完成:PR #5568(全程槽模型)+ #5569(换版沿用修复)已合并 dev-v3 并部署 TEST;网关验证通过(全新展开 2 条全程行 / 换版保持全程行 / 每槽派 1 辆管全程 / 整组删 removedRowCount=1 / 按天派生展示不回归)。前端槽位列表与派车交互按全程槽语义适配。"
|
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-08-05"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-05T22:45:18+08:00"
|
generated: "2026-08-05T22:45:18+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "新增接口"
|
|||||||
author: "wx(GIT)"
|
author: "wx(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "pi-main-session"
|
frontend_owner: "pi-main-session"
|
||||||
frontend_ref: "hl-admin@d5235e2d89ce009fbad251cf1428ba304333524c"
|
frontend_ref: "hl-admin@d5235e2d89ce009fbad251cf1428ba304333524c"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: "后端完成:PR #5543 已合并 dev-v3(merge e0cf4a47e)并部署 TEST;网关验证通过(保单列表/司机名筛选/详情/非法状态 400)。前端需在车务保险菜单新增保单 Tab(见展示矩阵)。"
|
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-08-05"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "yst(GIT)"
|
author: "yst(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "pi-main-session"
|
frontend_owner: "pi-main-session"
|
||||||
frontend_ref: "hl-admin@4a2dcc8e20fe23ffc2b3d35ae8f02e62661b642d"
|
frontend_ref: "hl-admin@4a2dcc8e20fe23ffc2b3d35ae8f02e62661b642d"
|
||||||
target_release: "v2.1"
|
target_release: "v2.1"
|
||||||
verified_at: "2026-08-06"
|
verified_at: "2026-09-18"
|
||||||
status_note: "PR #5570 已合并 dev-v3;2026-08-10 复核确认测试服已部署、网关链路实测连通(见文末验证证据章节)。管理后台待适配新增阻断枚举。"
|
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-08-10"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "wx(GIT)"
|
author: "wx(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "pi-main-session"
|
frontend_owner: "pi-main-session"
|
||||||
frontend_ref: "hl-admin@e2a060d09a66cdb5b89184e3c35a3fbfd923064f"
|
frontend_ref: "hl-admin@e2a060d09a66cdb5b89184e3c35a3fbfd923064f"
|
||||||
target_release: "v2.1"
|
target_release: "v2.1"
|
||||||
verified_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 编辑入口,需前端部署后核验)。"
|
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-08-06"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-06T01:33:44+08:00"
|
generated: "2026-08-06T01:33:44+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "wx(GIT)"
|
author: "wx(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "pi-main-session"
|
frontend_owner: "pi-main-session"
|
||||||
frontend_ref: "hl-admin@045434c1926505d7524239e00464d74e66e52d6b"
|
frontend_ref: "hl-admin@045434c1926505d7524239e00464d74e66e52d6b"
|
||||||
target_release: "v2.1"
|
target_release: "v2.1"
|
||||||
verified_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)。"
|
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-08-06"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-06T00:10:04+08:00"
|
generated: "2026-08-06T00:10:04+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "pi-main-session"
|
frontend_owner: "pi-main-session"
|
||||||
frontend_ref: "hl-admin@3e535fe3ad6a406529eb95d7787cefe11b9584cd"
|
frontend_ref: "hl-admin@3e535fe3ad6a406529eb95d7787cefe11b9584cd"
|
||||||
target_release: "v2.1"
|
target_release: "v2.1"
|
||||||
verified_at: "2026-08-06"
|
verified_at: "2026-09-18"
|
||||||
status_note: "后端完成:PR #5578 已合并 dev-v3 并部署 TEST;网关验证通过(商务槽 7 座/SUV 槽 5 座在整单 10-12 人下不再误标座位不足,车型匹配保留)。候选接口字段无变化,前端零改动;需确认派车弹窗仍传 fleetItemIndex/requiredVehicleType。"
|
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-08-06"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-06T01:05:02+08:00"
|
generated: "2026-08-06T01:05:02+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "pi-main-session"
|
frontend_owner: "pi-main-session"
|
||||||
frontend_ref: "hl-admin@d97cc730b019f5947766f3778e2f5b3ca03a5280"
|
frontend_ref: "hl-admin@d97cc730b019f5947766f3778e2f5b3ca03a5280"
|
||||||
target_release: "v2.1"
|
target_release: "v2.1"
|
||||||
verified_at: "2026-08-06"
|
verified_at: "2026-09-18"
|
||||||
status_note: "后端完成:PR #5582 已合并 dev-v3 并部署 TEST,网关验证 3/3 通过。候选车辆 VO 新增 primaryDriverSeason 字段(新增字段,兼容);suggestedDriverReason 新增 RESIDENT_BLACKLISTED 值(新增值,兼容)。前端可在车辆候选行标注'常驻司机已拉黑',并在自动代入提示中区分拉黑与档期冲突。"
|
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-08-06"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-06T09:40:00+08:00"
|
generated: "2026-08-06T09:40:00+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "yst"
|
|||||||
change_type: "新增接口"
|
change_type: "新增接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "hl-admin@479c44ce399995782504887e0f3aa68274a24e19"
|
frontend_ref: "hl-admin@479c44ce399995782504887e0f3aa68274a24e19"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: "2026-08-06"
|
verified_at: "2026-09-18"
|
||||||
status_note: "hl-resource-service;PR #5583 已合并 dev-v3 并部署测试服,Gateway 实调验证通过(3 接口 + 必填/关键词/鉴权边界全绿);等待管理后台接入。"
|
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-08-07"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "hl-admin@2b2dedfe65aea63746b62de5188f82630461cc80"
|
frontend_ref: "hl-admin@2b2dedfe65aea63746b62de5188f82630461cc80"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: "2026-08-06"
|
verified_at: "2026-09-18"
|
||||||
status_note: "后端完成:PR #5605 合并 dev-v3(ef5199207)并部署 TEST;网关实测取消派单退保幂等——每保单仅 1 条 REFUND 明细(同保单不重复退保)、REFUND_CHECK 独立类型(退保检查)逐服务日收敛、taskType=REFUND 筛选不再混入检查任务。前端需在任务列表/筛选/详情展示 REFUND_CHECK(退保检查)类型标签。"
|
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-08-07"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-06T15:40:15+08:00"
|
generated: "2026-08-06T15:40:15+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "yst(GIT)"
|
author: "yst(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "hl-ui"
|
frontend_owner: "hl-ui"
|
||||||
frontend_ref: "hl-admin@f1874ef91e12e49cf9014f4ad17b008fe08996aa"
|
frontend_ref: "hl-admin@f1874ef91e12e49cf9014f4ad17b008fe08996aa"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: "PR #5604 已合并 dev-v3 并部署 TEST,网关实测:COMPLETED 订单再次提交 terminate 一律返回 581049「订单已终止,禁止重复提交」(同正文也不再 200 重放)。前端如依赖 #5460 的同正文重放取回结果逻辑需适配。"
|
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-08-07"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,14 +7,14 @@ author: "yst"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "hl-admin@01bd3875046cd32e9497e2f00a9eb0f782a197dd"
|
frontend_ref: "hl-admin@01bd3875046cd32e9497e2f00a9eb0f782a197dd"
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
updated_at: "2026-08-10"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
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: "新增接口"
|
change_type: "新增接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "hl-admin@d4ac54f5c0b756fc49ce7efa907d81912a7cfd58"
|
frontend_ref: "hl-admin@d4ac54f5c0b756fc49ce7efa907d81912a7cfd58"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: "2026-08-06"
|
verified_at: "2026-09-18"
|
||||||
status_note: ""
|
status_note: "[mmg 2026-09-18 复核翻 verified] ref d4ac54f5 可达且为 v2.1 祖先;交付自删 ActualInput.vue(实际结算取消手动录入),删除终态保持至今;关联 spec 批量 891 例全绿。"
|
||||||
updated_at: "2026-08-07"
|
updated_at: "2026-09-18"
|
||||||
base: "origin/dev-v3"
|
base: "origin/dev-v3"
|
||||||
generated: "2026-08-06T19:42:24+08:00"
|
generated: "2026-08-06T19:42:24+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "新增接口"
|
|||||||
author: "wx(GIT)"
|
author: "wx(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "pi-main-session"
|
frontend_owner: "pi-main-session"
|
||||||
frontend_ref: "hl-admin@99fc5bfcc0d52aed3d3e663ca2df247583a53409"
|
frontend_ref: "hl-admin@99fc5bfcc0d52aed3d3e663ca2df247583a53409"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: "后端完成:PR #5551 已合并 dev-v3 并部署 TEST;网关验证通过(未派单槽位删除成功+关联一致、已派槽位拒绝、不存在 605012)。前端在派单页槽位操作区增加删除入口即可。"
|
status_note: "后端完成:PR #5551 已合并 dev-v3 并部署 TEST;网关验证通过(未派单槽位删除成功+关联一致、已派槽位拒绝、不存在 605012)。前端在派单页槽位操作区增加删除入口即可。[mmg 2026-09-18 批量复核翻 verified] ref 99fc5bfc 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
|
||||||
updated_at: "2026-08-05"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "yst(GIT)"
|
author: "yst(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "hl-admin@18f8e23b9b2c77a81fed3de87fe9a7b94ff3b201"
|
frontend_ref: "hl-admin@18f8e23b9b2c77a81fed3de87fe9a7b94ff3b201"
|
||||||
target_release: "v2.1"
|
target_release: "v2.1"
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: "PR #5635 已合并 dev-v3;2026-08-10 复核确认测试服已部署、reviewStatus/reviewStatusName 经网关实测在出参中(见文末验证证据章节)。管理后台待接入。"
|
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-08-10"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "hl-admin@d897c3d4fc31932dd351e99f1911144314e2cc2f"
|
frontend_ref: "hl-admin@d897c3d4fc31932dd351e99f1911144314e2cc2f"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
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 聚合。"
|
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-08-07"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-07T14:00:00+08:00"
|
generated: "2026-08-07T14:00:00+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx"
|
|||||||
change_type: "新增接口"
|
change_type: "新增接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "845d8827"
|
frontend_ref: "845d88279e357663a18161b884af7bfdccc7ec9a"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
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-无限天)。"
|
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-08-07"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-07T16:20:00+08:00"
|
generated: "2026-08-07T16:20:00+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "hl-admin@0e8340a1ca012de0c7e965906596ccc3c37d31cd"
|
frontend_ref: "hl-admin@0e8340a1ca012de0c7e965906596ccc3c37d31cd"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 不变、临时司机已清理。"
|
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-08-07"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-07T14:50:00+08:00"
|
generated: "2026-08-07T14:50:00+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ consumer: "admin"
|
|||||||
change_type: "删除接口"
|
change_type: "删除接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "ee7a5d58"
|
frontend_ref: "ee7a5d58"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: "2026-08-07"
|
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 表示等待前端真实领取。"
|
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-08-08"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "7e7085b6"
|
frontend_ref: "7e7085b6"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: "后端完成:PR #5661 合并 dev-v3(3ee5770af)并部署 TEST(order-v3+fleet 双服务);网关实测派单详情与 travelers 端点 nativePlace 解析正确(150784→内蒙古呼伦贝尔市等 5 场景)。"
|
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-08-08"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-07T18:40:00+08:00"
|
generated: "2026-08-07T18:40:00+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx"
|
|||||||
change_type: "前端修复"
|
change_type: "前端修复"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "c63ce28f"
|
frontend_ref: "c63ce28f"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: ""
|
status_note: "[mmg 2026-09-18 批量复核翻 verified] ref c63ce28f 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
|
||||||
updated_at: "2026-08-08"
|
updated_at: "2026-09-18"
|
||||||
base: "origin/dev-v3"
|
base: "origin/dev-v3"
|
||||||
generated: "2026-08-07"
|
generated: "2026-08-07"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "9784e7aa"
|
frontend_ref: "9784e7aa"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: "2026-08-07"
|
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 枚举保留。"
|
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-08-08"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-07T21:38:00+08:00"
|
generated: "2026-08-07T21:38:00+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx"
|
|||||||
change_type: "新增接口"
|
change_type: "新增接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "91530f73"
|
frontend_ref: "91530f73"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: "后端完成:PR #5668 合并 dev-v3(d4ebd435be62cbe377ba712e8f0aed2b41e75a56)并部署 TEST,网关验证双槽位分司机渲染+单项容错+单渲染回归全通过。待前端预览区接入 render-batch 按司机分 tab。"
|
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-08-08"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-07T18:45:00+08:00"
|
generated: "2026-08-07T18:45:00+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "新增接口"
|
change_type: "新增接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "f1c00ba8"
|
frontend_ref: "f1c00ba8"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: "后端完成:PR #5669 已合并 dev-v3 并部署 TEST(hl-fleet-service 双实例)。新增 POST /admin/fleet/assignments/slots 增槽位;删除槽位复用既有 DELETE /slots/{slotId}。前端需在改派页加【增加槽位】【删除槽位】操作并编排现有接口(见前端交接)。"
|
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-08-08"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-07T20:26:00+08:00"
|
generated: "2026-08-07T20:26:00+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx"
|
|||||||
change_type: "前端修复"
|
change_type: "前端修复"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "dcb5f128"
|
frontend_ref: "dcb5f128"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: ""
|
status_note: "[mmg 2026-09-18 复核翻 verified] ref dcb5f128 可达且为 v2.1 祖先;Step3DriverConfirm 经 #5827 向导重构移除,「下一步」命名在 AssignModalFooter 新向导沿用(下一步·排车/接送机/确认执行);关联 spec 批量 891 例全绿。"
|
||||||
updated_at: "2026-08-08"
|
updated_at: "2026-09-18"
|
||||||
base: "origin/dev-v3"
|
base: "origin/dev-v3"
|
||||||
generated: "2026-08-08"
|
generated: "2026-08-08"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx"
|
|||||||
change_type: "前端优化"
|
change_type: "前端优化"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "45cf94a1"
|
frontend_ref: "45cf94a1"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: ""
|
status_note: "[mmg 2026-09-18 批量复核翻 verified] ref 45cf94a1 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
|
||||||
updated_at: "2026-08-08"
|
updated_at: "2026-09-18"
|
||||||
base: "origin/dev-v3"
|
base: "origin/dev-v3"
|
||||||
generated: "2026-08-08"
|
generated: "2026-08-08"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "3df533a5"
|
frontend_ref: "3df533a5"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: "后端完成:PR #5686 合并 dev-v3(4e993920440cad0b6105a5f7682d6b33d1444bad)并部署 TEST,网关验证按天改派只改指定天+统一选择单次全改均通过。统一选择「只改第一天」bug 实证为前端逐日循环互覆盖(后端无 bug),修复=前端改单次调 change。待前端接入按天改派+统一选择单次调用。"
|
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-08-08"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-08T11:10:00+08:00"
|
generated: "2026-08-08T11:10:00+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx"
|
|||||||
change_type: "前端修复"
|
change_type: "前端修复"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "f4223996"
|
frontend_ref: "f4223996"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: ""
|
status_note: "[mmg 2026-09-18 批量复核翻 verified] ref f4223996 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
|
||||||
updated_at: "2026-08-08"
|
updated_at: "2026-09-18"
|
||||||
base: "origin/dev-v3"
|
base: "origin/dev-v3"
|
||||||
generated: "2026-08-08"
|
generated: "2026-08-08"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx"
|
|||||||
change_type: "前端修复"
|
change_type: "前端修复"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "701233df"
|
frontend_ref: "701233df"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: ""
|
status_note: "[mmg 2026-09-18 批量复核翻 verified] ref 701233df 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
|
||||||
updated_at: "2026-08-08"
|
updated_at: "2026-09-18"
|
||||||
base: "origin/dev-v3"
|
base: "origin/dev-v3"
|
||||||
generated: "2026-08-08"
|
generated: "2026-08-08"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx"
|
|||||||
change_type: "前端修复"
|
change_type: "前端修复"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "23d6e7b1"
|
frontend_ref: "23d6e7b1"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: ""
|
status_note: "[mmg 2026-09-18 批量复核翻 verified] ref 23d6e7b1 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
|
||||||
updated_at: "2026-08-08"
|
updated_at: "2026-09-18"
|
||||||
base: "origin/dev-v3"
|
base: "origin/dev-v3"
|
||||||
generated: "2026-08-08"
|
generated: "2026-08-08"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "106aa658"
|
frontend_ref: "106aa658"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: "后端接口行为修复:POST /admin/fleet/assignments/ID/change 对已派全程行(service_date 为空、start/end 覆盖整个服务期)改派时,计费日期/费用快照/组派冲突检查按整段服务期展开——此前 serviceDateOf 只回退生效日第一天,前端按全部服务日提交计费日期即报「计费日期必须属于本派车组服务日期」,改派完全不生效(TEST 操作日志 13:59 连续 7 次 change_failed 实证)。修复后网关实证改派成功(双向往返均生效)。前端配合项见正文「前端交接」。"
|
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-08-08"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-08T15:00:00+08:00"
|
generated: "2026-08-08T15:00:00+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "yaosutu(GIT)"
|
author: "yaosutu(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "d32e14b9"
|
frontend_ref: "d32e14b9"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: "PR #5709 已合并 dev-v3;核单域 6 个端点删除 expectedSourceFingerprint/version 入参与 sourceFingerprint/version 出参,错误码 584108/584110/584325 同步下线。字段删除属硬破坏契约,前端必须先停传这些字段再与后端同批发布。"
|
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-08-08"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "yaosutu(GIT)"
|
author: "yaosutu(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "a9ddbd48"
|
frontend_ref: "a9ddbd48"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: "PR #5713 已合并 dev-v3;GET /v3/admin/order/{orderId}/settlement/vehicle-options 出参 data[] 新增 dayPrice 字段(车型当日牌价,元/车天)。dayPrice 是参考价非最终核算价,最终核算价以派单后车辆快照 dailyPrice / 核单行 amount 为准。"
|
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-08-08"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "yaosutu(GIT)"
|
author: "yaosutu(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "a9ddbd48"
|
frontend_ref: "a9ddbd48"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: "PR #5715 已合并 dev-v3;PUT /v3/admin/order/{orderId}/settlement/step3/vehicles 对 FLEET 来源行的 amount 字段从只读放开为可编辑,结构字段仍受 584109 保护。前端若把 amount 渲染为只读输入框,应放开为可编辑。"
|
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-08-08"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "前端缺陷"
|
change_type: "前端缺陷"
|
||||||
backend_status: "not_required"
|
backend_status: "not_required"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "82f5b771"
|
frontend_ref: "82f5b771"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: "前端缺陷:改派选完车辆/司机(完成选择)后,槽位顶部列与按天改派表格均不回显新选择。选择已在前端草稿(底部可见)且可正常提交生效,纯前端回显未刷新。前端已修复(cb763a74):选完后两处列立即回显新选择。"
|
status_note: "前端缺陷:改派选完车辆/司机(完成选择)后,槽位顶部列与按天改派表格均不回显新选择。选择已在前端草稿(底部可见)且可正常提交生效,纯前端回显未刷新。前端已修复(cb763a74):选完后两处列立即回显新选择。[mmg 2026-09-18 批量复核翻 verified] ref 82f5b771 可达且为 v2.1 祖先;交付文件 HEAD 均在;关联 spec 批量 891 例全绿。"
|
||||||
updated_at: "2026-08-09"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-08T22:50:00+08:00"
|
generated: "2026-08-08T22:50:00+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "yaosutu(GIT)"
|
author: "yaosutu(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "4f5f4e47"
|
frontend_ref: "4f5f4e47"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
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 个数据字典。出参有新增字段、无删除字段,旧字段名保持不变——前端不传这些新字段不影响,但应尽快适配以展示中文名。"
|
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-08-09"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-09T18:00:00+08:00"
|
generated: "2026-08-09T18:00:00+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "3ec1a933"
|
frontend_ref: "3ec1a933"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
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 契约变化,前端无需改动。"
|
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-08-09"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-09T11:00:00+08:00"
|
generated: "2026-08-09T11:00:00+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "yaosutu(GIT)"
|
author: "yaosutu(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "19d001a4"
|
frontend_ref: "19d001a4"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
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。"
|
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-08-10"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx"
|
|||||||
change_type: "新增接口"
|
change_type: "新增接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "a9a48643"
|
frontend_ref: "a9a48643"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: "已实现。board.js 新增 getFleetOrderOperationLog;resolveBoardRowActions 全状态分支加「查看日志」(卡片图标按钮+悬浮提示、表格入「更多」);新建 OperationLogModal 时间线弹窗(分页/keyword/时间区间/升降序,opTypeLabel/summary 直渲)。frontend_ref=a9a48643(BoardCardView 卡片入口由并发提交 7ec70cc0 承载)。"
|
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-08-10"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-09T18:10:00+08:00"
|
generated: "2026-08-09T18:10:00+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "前端缺陷"
|
change_type: "前端缺陷"
|
||||||
backend_status: "not_required"
|
backend_status: "not_required"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "fa59235d"
|
frontend_ref: "fa59235d"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
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。"
|
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-08-09"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-09T16:10:00+08:00"
|
generated: "2026-08-09T16:10:00+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "前端缺陷"
|
change_type: "前端缺陷"
|
||||||
backend_status: "not_required"
|
backend_status: "not_required"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "4c81471c"
|
frontend_ref: "4c81471c"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
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 全过。纯前端交互修复。"
|
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-08-10"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-09T16:40:00+08:00"
|
generated: "2026-08-09T16:40:00+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "前端缺陷"
|
change_type: "前端缺陷"
|
||||||
backend_status: "not_required"
|
backend_status: "not_required"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "84ed152e"
|
frontend_ref: "84ed152e"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: "车辆接续(一槽多天不同车/司机)派车通知需按司机分 tab。mmg 已在 d7f78a17 接入 render-batch 分 tab,但实测只显示【未确认】段(改派 8/23 道尔吉时只有道尔吉 tab,已确认的王信 8/24-25 被 slotChangeRows 的『终态段不产生行』过滤掉了)。车务口径 B:接续单派车通知要展示【全部接续司机】tab(含已确认段),不只未确认段——故 reopen 待补充。"
|
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-08-09"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-09T11:20:00+08:00"
|
generated: "2026-08-09T11:20:00+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "yaosutu(GIT)"
|
author: "yaosutu(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "ce4d98b3"
|
frontend_ref: "ce4d98b3"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
verified_at: "2026-09-18"
|
||||||
status_note: "已实现。canComplete 由 5 条减为 3 条 UI 态防误触(hasLoadingStep/hasSavingStep/dirty),askComplete 同步删 vehicleSettlementBlocked 兜底拦截,并删除车辆分类顶部常驻提示条;LEGACY 金额未知空态的车辆编辑锁保留(防空草稿存成 0 元)。frontend_ref=ce4d98b3。"
|
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-08-09"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "ca770153"
|
frontend_ref: "ca770153"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 交付。"
|
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-08-10"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-10T11:00:00+08:00"
|
generated: "2026-08-10T11:00:00+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "yaosutu(GIT)"
|
author: "yaosutu(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "3993f15a"
|
frontend_ref: "3993f15a"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 全绿。"
|
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-08-11"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "188e0d64"
|
frontend_ref: "188e0d64"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 全过。"
|
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-08-10"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "55311b31"
|
frontend_ref: "55311b31"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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/暗色/断点/生产构建)全绿覆盖。"
|
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-08-10"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "yaosutu(GIT)"
|
author: "yaosutu(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "3993f15a"
|
frontend_ref: "3993f15a"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 全量/生产构建)。"
|
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-08-11"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "前端缺陷"
|
change_type: "前端缺陷"
|
||||||
backend_status: "not_required"
|
backend_status: "not_required"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "f02dc8e3"
|
frontend_ref: "f02dc8e3"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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。"
|
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-08-10"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-10T12:20:00+08:00"
|
generated: "2026-08-10T12:20:00+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "前端缺陷"
|
change_type: "前端缺陷"
|
||||||
backend_status: "not_required"
|
backend_status: "not_required"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "6709c157"
|
frontend_ref: "6709c157"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
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 精确文件集全过。"
|
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-08-10"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-10T10:20:00+08:00"
|
generated: "2026-08-10T10:20:00+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "前端缺陷"
|
change_type: "前端缺陷"
|
||||||
backend_status: "not_required"
|
backend_status: "not_required"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "ffb2df89"
|
frontend_ref: "ffb2df89"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
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 全过。"
|
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-08-10"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-10T10:30:00+08:00"
|
generated: "2026-08-10T10:30:00+08:00"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "前端优化"
|
change_type: "前端优化"
|
||||||
backend_status: "not_required"
|
backend_status: "not_required"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "728413e6"
|
frontend_ref: "728413e6"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 无逐日镜像已回配真实样本,按契约描述盲写、缺字段回退现状。"
|
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-08-10"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "b6f9c44a"
|
frontend_ref: "b6f9c44a"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 需求展示区布局+统一选车弹窗空白缺陷)为独立待办,本字段原样渲染不解析、对格式变更零改动即受益。"
|
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-08-11"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "yaosutu(GIT)"
|
author: "yaosutu(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "b22d6c14"
|
frontend_ref: "b22d6c14"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 全量/生产构建)。"
|
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-08-11"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "46a57557"
|
frontend_ref: "46a57557"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 文件含生产构建全过。"
|
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-08-11"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ author: "wx(GIT)"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "a4174560"
|
frontend_ref: "a4174560"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 精确文件集全过。"
|
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-08-11"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "yaosutu(GIT)"
|
author: "yaosutu(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "pending"
|
gateway_status: "pending"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "fd070dc2"
|
frontend_ref: "fd070dc2"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 精确文件集全过。"
|
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-08-11"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "wx(GIT)"
|
author: "wx(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "408ffc63"
|
frontend_ref: "408ffc63"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 文件全绿。"
|
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-08-11"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "wx(GIT)"
|
author: "wx(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "aa9c087b"
|
frontend_ref: "aa9c087b"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 全过。"
|
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-08-11"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "wx(GIT)"
|
author: "wx(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: ""
|
frontend_ref: "753503c87cc635e5646b4368a8ed506746c79cf1"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 用例全绿。"
|
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-08-12"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "wx(GIT)"
|
author: "wx(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "dbec5600"
|
frontend_ref: "dbec5600"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 文件含生产构建全过。"
|
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-08-11"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "wx(GIT)"
|
author: "wx(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "f3b08c5d"
|
frontend_ref: "f3b08c5d"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 含生产构建全过。"
|
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-08-11"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "wx(GIT)"
|
author: "wx(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "ddb3b823"
|
frontend_ref: "ddb3b823"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 精确文件集全过。"
|
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-08-11"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "wx(GIT)"
|
author: "wx(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "8f33923a"
|
frontend_ref: "8f33923a"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 精确文件集全过。"
|
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-08-11"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "yst"
|
author: "yst"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "24f31813"
|
frontend_ref: "24f31813"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 精确文件集全过。"
|
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-08-11"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "前端缺陷"
|
|||||||
author: "wx(GIT)"
|
author: "wx(GIT)"
|
||||||
backend_status: "not_required"
|
backend_status: "not_required"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "9b824f5c"
|
frontend_ref: "9b824f5c"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
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 含生产构建全过。"
|
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-08-11"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "前端缺陷"
|
|||||||
author: "wx(GIT)"
|
author: "wx(GIT)"
|
||||||
backend_status: "not_required"
|
backend_status: "not_required"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "bce7fbed"
|
frontend_ref: "bce7fbed"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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)未做,完成度与按钮均不读证据,属增强非修复必需。"
|
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-08-11"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "前端缺陷"
|
|||||||
author: "wx(GIT)"
|
author: "wx(GIT)"
|
||||||
backend_status: "not_required"
|
backend_status: "not_required"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "313609db"
|
frontend_ref: "313609db"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 文件全绿。"
|
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-08-11"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "前端缺陷"
|
|||||||
author: "wx(GIT)"
|
author: "wx(GIT)"
|
||||||
backend_status: "not_required"
|
backend_status: "not_required"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "a18e9db9"
|
frontend_ref: "a18e9db9"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 精确文件集全过。"
|
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-08-11"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "wx(GIT)"
|
author: "wx(GIT)"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "b9b17dbf"
|
frontend_ref: "b9b17dbf"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 含生产构建全过。"
|
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-08-12"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "修改接口"
|
|||||||
author: "yst"
|
author: "yst"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "pending"
|
gateway_status: "pending"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "1f716683"
|
frontend_ref: "1f716683"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 全绿。"
|
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-08-12"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "前端缺陷"
|
|||||||
author: "wx(GIT)"
|
author: "wx(GIT)"
|
||||||
backend_status: "not_required"
|
backend_status: "not_required"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "0538f4b4"
|
frontend_ref: "0538f4b4"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 合入当前发布分支并发布后再验。"
|
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-08-12"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "前端缺陷"
|
|||||||
author: "wx(GIT)"
|
author: "wx(GIT)"
|
||||||
backend_status: "not_required"
|
backend_status: "not_required"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "0538f4b4"
|
frontend_ref: "0538f4b4"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 全过。"
|
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-08-12"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ change_type: "前端缺陷"
|
|||||||
author: "wx(GIT)"
|
author: "wx(GIT)"
|
||||||
backend_status: "not_required"
|
backend_status: "not_required"
|
||||||
gateway_status: "not_required"
|
gateway_status: "not_required"
|
||||||
frontend_status: "implemented"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "d4d25a1c"
|
frontend_ref: "d4d25a1c"
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_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 全过。"
|
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-08-12"
|
updated_at: "2026-09-18"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -7,12 +7,12 @@ author: "wx"
|
|||||||
change_type: "新增接口"
|
change_type: "新增接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "pending"
|
frontend_status: "not_required"
|
||||||
frontend_owner: ""
|
frontend_owner: ""
|
||||||
frontend_ref: ""
|
frontend_ref: ""
|
||||||
target_release: ""
|
target_release: ""
|
||||||
verified_at: ""
|
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"
|
updated_at: "2026-08-16"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
generated: "2026-08-16T00:35:00+08:00"
|
generated: "2026-08-16T00:35:00+08:00"
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ author: "wx"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "pending"
|
frontend_status: "not_required"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: ""
|
frontend_ref: ""
|
||||||
target_release: ""
|
target_release: ""
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ author: "wx"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "pending"
|
frontend_status: "not_required"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: ""
|
frontend_ref: ""
|
||||||
target_release: ""
|
target_release: ""
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ author: "wx"
|
|||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
backend_status: "deployed"
|
backend_status: "deployed"
|
||||||
gateway_status: "verified"
|
gateway_status: "verified"
|
||||||
frontend_status: "pending"
|
frontend_status: "not_required"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: ""
|
frontend_ref: ""
|
||||||
target_release: ""
|
target_release: ""
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
schema: "hl-changelog/v2"
|
schema: "hl-changelog/v2"
|
||||||
ticket: "6397"
|
ticket: "6397"
|
||||||
title: "供应商注册合同聚合信息"
|
title: "供应商注册合同聚合信息(已废弃)"
|
||||||
consumer: "admin"
|
consumer: "admin"
|
||||||
author: "lc(GIT)"
|
author: "lc(GIT)"
|
||||||
change_type: "修改接口"
|
change_type: "修改接口"
|
||||||
@@ -10,32 +10,44 @@ gateway_status: "verified"
|
|||||||
frontend_status: "verified"
|
frontend_status: "verified"
|
||||||
frontend_owner: "mmg"
|
frontend_owner: "mmg"
|
||||||
frontend_ref: "f2a4200d"
|
frontend_ref: "f2a4200d"
|
||||||
target_release: ""
|
target_release: "v2.1"
|
||||||
verified_at: "2026-08-26"
|
verified_at: "2026-08-29"
|
||||||
status_note: "PR #6405 已合并 dev-v3;Deploy Panel 任务 af3f205b 成功发布 Resource 双实例,合同接口已完成 23 项真实 Gateway 验收。TEST 工作副本存在服务器本地提交导致精确提交回读仍被阻塞,后端工单保持开启;本条只交接已经实测存在的接口契约。"
|
status_note: "本条记录的 #6405 合同随供应商草稿/注册聚合写入语义已被业务纠正并废弃,不再是当前可联调契约。当前后端以 #6544 为准:add/update/submit 对旧 contracts 输入兼容忽略,合同只在已有 supplierId 后通过三个独立接口维护,不进入建档审批;详情继续只读返回 contracts。最终 Resource 已通过任务 ca2fe4d7 部署提交 c579c87014f56452fea2fce5075b31ae6fd12a35。旧前端 002475b2 仅作为历史记录,当前消费状态恢复 pending。"
|
||||||
updated_at: "2026-08-26"
|
updated_at: "2026-08-29"
|
||||||
base: "dev-v3"
|
base: "dev-v3"
|
||||||
---
|
---
|
||||||
|
|
||||||
# 🔧 供应商注册合同聚合信息
|
# ⚠️ 供应商注册合同聚合信息(已废弃)
|
||||||
|
|
||||||
供应商创建草稿、提交注册和基础信息详情现统一支持合同完整快照。管理端应把“合同信息”放在“资质证照”之后、现有账户区域之前,并把原“初始账户”展示标题改为“结算信息”。
|
> **2026-08-29 纠正:本文以下聚合写入说明仅保留为历史,不得继续用于联调或实现。** 当前契约见 [#6544 供应商合同独立登记](../2026-08/29_6544_供应商合同独立登记-新增接口-管理后台.md):供应商草稿、资料更新和注册提交对旧 `contracts` 输入兼容接收但完全忽略;合同必须在取得 `supplierId` 后,通过独立 add/update/del 接口和独立事务维护,且不进入建档审批。`basic-info/view` 仍只读返回未软删合同,`initialAccounts` 字段保持不变。
|
||||||
|
|
||||||
|
原前端提交 `002475b2` 消费的是已撤销的聚合写语义,只作为历史事实保留,当前状态为待按独立接口重新接入。
|
||||||
|
|
||||||
展示名调整不改变接口字段:原请求字段仍为 `initialAccounts`,不得改成 `settlementInfo` 或其他名称。
|
展示名调整不改变接口字段:原请求字段仍为 `initialAccounts`,不得改成 `settlementInfo` 或其他名称。
|
||||||
|
|
||||||
## 变更接口清单
|
## 二、变更接口清单(历史,禁止用于当前联调)
|
||||||
|
|
||||||
| # | 接口 | 方法 | 路径 | 变化 |
|
| # | 接口 | 方法 | 路径 | 变更类型 | 说明 |
|
||||||
|---:|---|---|---|---|
|
|---:|---|---|---|---|---|
|
||||||
| 1 | 创建供应商注册草稿 | POST | `/admin/supplier/items/add` | 请求可选增加 `contracts` 完整集合 |
|
| 1 | 创建供应商注册草稿 | POST | `/admin/supplier/items/add` | 请求体新增可选字段 | 可选增加 `contracts` 完整集合 |
|
||||||
| 2 | 提交供应商注册 | POST | `/admin/supplier/items/{supplierId}/submit` | 请求可选增加 `contracts` 完整快照 |
|
| 2 | 提交供应商注册 | POST | `/admin/supplier/items/{supplierId}/submit` | 请求体新增可选字段 | 可选增加 `contracts` 完整快照 |
|
||||||
| 3 | 查询供应商基本信息 | GET | `/admin/supplier/items/{supplierId}/basic-info/view` | 响应增加 `contracts` 列表 |
|
| 3 | 查询供应商基本信息 | GET | `/admin/supplier/items/{supplierId}/basic-info/view` | 响应新增字段 | 响应增加 `contracts` 列表 |
|
||||||
|
|
||||||
统一响应均为 `Result<T>`。业务失败可能仍为 HTTP 200,调用方必须同时判断 `code`、`success`、`message` 和 `data`。
|
统一响应均为 `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 字符 |
|
| `scanFileUrl` | String | 否 | 否 | 合同扫描件永久地址,最长 1000 字符 |
|
||||||
| `remark` | String | 否 | 否 | 最长 500 字符 |
|
| `remark` | String | 否 | 否 | 最长 500 字符 |
|
||||||
|
|
||||||
### 响应字段 `contracts[]`
|
#### 响应字段 `contracts[]`
|
||||||
|
|
||||||
详情返回上述全部业务字段,并额外返回:
|
详情返回上述全部业务字段,并额外返回:
|
||||||
|
|
||||||
@@ -62,20 +74,40 @@ base: "dev-v3"
|
|||||||
| `contractId` | String | 合同 ID,始终按字符串处理,不得转 JavaScript Number |
|
| `contractId` | String | 合同 ID,始终按字符串处理,不得转 JavaScript Number |
|
||||||
| `updateTime` | String | 合同当前版本,格式 `yyyy-MM-dd HH:mm:ss` |
|
| `updateTime` | String | 合同当前版本,格式 `yyyy-MM-dd HH:mm:ss` |
|
||||||
|
|
||||||
|
响应中的 `amount` 为 String(如 `"1200.50"`,PR #6450 起),请求中的 `amount` 仍按 Number 传。
|
||||||
|
|
||||||
历史数据可能返回只读状态 `TERMINATED`;创建和提交请求不得发送该状态。
|
历史数据可能返回只读状态 `TERMINATED`;创建和提交请求不得发送该状态。
|
||||||
|
|
||||||
## 1. 创建供应商注册草稿
|
### 1. 创建供应商注册草稿 `POST /admin/supplier/items/add`
|
||||||
|
|
||||||
`POST /admin/supplier/items/add`
|
**VO**: `SupplierDraftSaveReqVO`(请求;响应 data 字段见下表)
|
||||||
|
|
||||||
### 使用场景与边界
|
#### 使用场景
|
||||||
|
|
||||||
- `contracts` 可省略、为 `null` 或空数组,旧客户端行为不变。
|
供应商注册第一步:创建草稿。`contracts` 为本次新增的可选完整集合,随草稿与供应商主体、资质、`initialAccounts` 一起成功或一起失败;旧客户端省略该字段时行为完全不变。
|
||||||
- 非空时最多 100 项,合同与供应商主体、资质和 `initialAccounts` 一起成功或一起失败。
|
|
||||||
- 创建请求中的每个合同都是新合同,禁止携带 `contractId`。
|
|
||||||
- 写入仍要求现有供应商创建权限;仅可信 `FINANCE`、`SUPER_ADMIN` 且拥有对应平台权限的身份可执行。
|
|
||||||
|
|
||||||
### 典型请求
|
#### 入参
|
||||||
|
|
||||||
|
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| `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
|
```http
|
||||||
POST /admin/supplier/items/add
|
POST /admin/supplier/items/add
|
||||||
@@ -123,7 +155,7 @@ Content-Type: application/json
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### 成功响应
|
#### 响应示例
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
@@ -141,7 +173,13 @@ Content-Type: application/json
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### 失败响应:创建携带合同 ID
|
#### 空数据 / 降级响应
|
||||||
|
|
||||||
|
`contracts` 省略、为 `null` 或空数组均可正常创建,旧客户端行为不变;创建响应不返回合同明细(合同通过详情接口回显)。草稿无结算账户时 `initialAccounts` 返回空数组 `[]`,不返回 `null`。
|
||||||
|
|
||||||
|
#### 错误响应
|
||||||
|
|
||||||
|
创建请求携带合同 ID(创建时每个合同都是新项,禁止 `contractId`):
|
||||||
|
|
||||||
```json
|
```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`:本次不处理合同,保留草稿当前合同。
|
**VO**: `SupplierDraftSaveReqVO`(请求,含 `expectedUpdateTime` 版本;响应 data 字段见下表)
|
||||||
- `contracts: []`:明确清空当前全部合同。
|
|
||||||
- 非空数组:作为完整快照;带 `contractId` 的项覆盖当前合同,不带 ID 的项新增,当前已有但数组中遗漏的合同删除。
|
|
||||||
- 带 ID 的合同必须属于路径中的供应商;不属于当前供应商、重复 ID、非法枚举、负金额或日期逆序均失败。
|
|
||||||
- `expectedUpdateTime` 仍是供应商聚合并发版本;发生并发修改时调用方应刷新详情后重新组装完整表单。
|
|
||||||
- 合同快照会进入本次审批资料,但提交注册不会自动改写合同自身的 `status`。
|
|
||||||
|
|
||||||
### 典型请求
|
#### 使用场景
|
||||||
|
|
||||||
|
注册第二步:把草稿完整表单(含合同快照)提交审批。`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
|
```http
|
||||||
POST /admin/supplier/items/2090300000000063970/submit
|
POST /admin/supplier/items/2090300000000063970/submit
|
||||||
@@ -204,7 +266,7 @@ Content-Type: application/json
|
|||||||
"signDate": "2026-08-26",
|
"signDate": "2026-08-26",
|
||||||
"startDate": "2026-09-01",
|
"startDate": "2026-09-01",
|
||||||
"endDate": "2027-08-31",
|
"endDate": "2027-08-31",
|
||||||
"amount": 1200.50,
|
"amount": "1200.50",
|
||||||
"pricingMode": "按团结算",
|
"pricingMode": "按团结算",
|
||||||
"settleCycle": "MONTHLY",
|
"settleCycle": "MONTHLY",
|
||||||
"status": "ACTIVE",
|
"status": "ACTIVE",
|
||||||
@@ -217,7 +279,7 @@ Content-Type: application/json
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### 成功响应
|
#### 响应示例
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
@@ -238,7 +300,13 @@ Content-Type: application/json
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### 失败响应:合同不属于当前供应商
|
#### 空数据 / 降级响应
|
||||||
|
|
||||||
|
`contracts` 省略或为 `null` 时保留草稿当前合同,走既有审批流程,无降级差异;`contracts: []` 为明确清空(不是省略),会删除当前全部合同。草稿本身无合同时按无合同提交,不报错。
|
||||||
|
|
||||||
|
#### 错误响应
|
||||||
|
|
||||||
|
合同不属于当前供应商(或重复 ID、非法枚举、负金额、日期逆序等同族校验失败):
|
||||||
|
|
||||||
```json
|
```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
|
```http
|
||||||
GET /admin/supplier/items/2090300000000063970/basic-info/view
|
GET /admin/supplier/items/2090300000000063970/basic-info/view
|
||||||
Authorization: Bearer <admin-token>
|
Authorization: Bearer <admin-token>
|
||||||
```
|
```
|
||||||
|
|
||||||
无请求体。读取继续要求可信读角色和 `supplier:view` 平台权限。
|
#### 响应示例
|
||||||
|
|
||||||
### 成功响应
|
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
@@ -322,7 +420,7 @@ Authorization: Bearer <admin-token>
|
|||||||
"signDate": "2026-08-26",
|
"signDate": "2026-08-26",
|
||||||
"startDate": "2026-09-01",
|
"startDate": "2026-09-01",
|
||||||
"endDate": "2027-08-31",
|
"endDate": "2027-08-31",
|
||||||
"amount": 1200.50,
|
"amount": "1200.50",
|
||||||
"pricingMode": "按团结算",
|
"pricingMode": "按团结算",
|
||||||
"settleCycle": "MONTHLY",
|
"settleCycle": "MONTHLY",
|
||||||
"status": "DRAFT",
|
"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` | 前端处理 |
|
| 场景 | `code` | 前端处理 |
|
||||||
|---|---:|---|
|
|---|---:|---|
|
||||||
@@ -347,17 +458,13 @@ Authorization: Bearer <admin-token>
|
|||||||
| 可信角色或 `supplier:view` 平台权限不足 | `403` | 展示无权限状态 |
|
| 可信角色或 `supplier:view` 平台权限不足 | `403` | 展示无权限状态 |
|
||||||
| 供应商不存在或已删除 | `395001` | 返回列表并刷新 |
|
| 供应商不存在或已删除 | `395001` | 返回列表并刷新 |
|
||||||
|
|
||||||
## 修改前后对比
|
#### 业务边界
|
||||||
|
|
||||||
| 场景 | 修改前 | 修改后 |
|
- 读取要求可信读角色(`ADMIN`/`FINANCE`/`SUPER_ADMIN`)和 `supplier:view` 平台权限。
|
||||||
|---|---|---|
|
- 敏感字段(税号、证件号、手机号)一律脱敏返回,前端不得期待明文。
|
||||||
| 创建草稿 | 请求不能携带合同 | 可选携带完整 `contracts`,与草稿一起成功或失败 |
|
- `updateTime` 是后续提交表单的并发版本,必须原样缓存回传。
|
||||||
| 提交注册 | 提交表单不能维护合同 | 可省略保留、空数组清空或提交完整合同快照 |
|
|
||||||
| 基础信息 | 不返回合同列表 | 返回完整 `contracts[]` 及字符串 ID、版本 |
|
|
||||||
| 账户区域标题 | 页面显示“初始账户” | 页面应显示“结算信息”,接口字段仍为 `initialAccounts` |
|
|
||||||
| 页面区块顺序 | 资质后直接进入账户区域 | 资质证照 → 合同信息 → 结算信息 |
|
|
||||||
|
|
||||||
## 兼容性与管理端接入事项
|
## 四、契约约束与正确调用方式
|
||||||
|
|
||||||
1. 在“资质证照”区域之后新增“合同信息”表格,在合同之后显示原账户表格。
|
1. 在“资质证照”区域之后新增“合同信息”表格,在合同之后显示原账户表格。
|
||||||
2. 原账户表格标题改为“结算信息”;所有请求和响应继续使用 `initialAccounts`,不要改字段名。
|
2. 原账户表格标题改为“结算信息”;所有请求和响应继续使用 `initialAccounts`,不要改字段名。
|
||||||
@@ -367,15 +474,65 @@ Authorization: Bearer <admin-token>
|
|||||||
6. 本次不新增接口路径、权限点或业务错误码;旧客户端省略 `contracts` 时继续可用。
|
6. 本次不新增接口路径、权限点或业务错误码;旧客户端省略 `contracts` 时继续可用。
|
||||||
7. 管理端源码不在本后端工单中修改,前端状态保持 `pending`,直至完成页签、标题和表格接入并提供前端引用。
|
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` 与差异检查通过。
|
- 自动化:供应商定向测试 115 项通过;`hl-resource-service` 全量 2,111 项,0 失败、0 错误,38 项条件跳过;`hl-verify` 与差异检查通过。
|
||||||
- 部署:Deploy Panel API 任务 `af3f205b` 终态 `success`、退出码 0、`has_build_error=false`,未发现 Maven、编译或滚动发布错误。
|
- 部署:Deploy Panel API 任务 `af3f205b` 终态 `success`、退出码 0、`has_build_error=false`,未发现 Maven、编译或滚动发布错误。
|
||||||
- 健康:`hl-resource-service` 的 8082、8182 双实例运行;Nacos `test` 命名空间两实例均 `healthy=true`、`enabled=true`。
|
- 健康:`hl-resource-service` 的 8082、8182 双实例运行;Nacos `test` 命名空间两实例均 `healthy=true`、`enabled=true`。
|
||||||
- 真实 Gateway:23 项断言通过,覆盖合同随草稿创建、详情完整回显、字符串 ID、创建携带 ID 失败、普通 ADMIN 越权、提交外部合同 ID 完整回滚、日期逆序零写入和旧客户端省略 `contracts`。
|
- 真实 Gateway:23 项断言通过,覆盖合同随草稿创建、详情完整回显、字符串 ID、创建携带 ID 失败、普通 ADMIN 越权、提交外部合同 ID 完整回滚、日期逆序零写入和旧客户端省略 `contracts`。
|
||||||
|
- 同日修正复验(PR #6450):`hl-resource-service` 于 2026-08-26 23:44 滚动发布双实例 UP,jar 构建时间戳与合并提交一致;供应商定向测试 330 项通过;空原因/超长原因的状态变更请求仍由请求校验层返回 400(对外契约不变)。
|
||||||
- 清理:两个临时 DRAFT 均通过业务删除接口软删除并回读为不存在;仅保留不可逆的 CREATE/DELETE 操作审计。
|
- 清理:两个临时 DRAFT 均通过业务删除接口软删除并回读为不存在;仅保留不可逆的 CREATE/DELETE 操作审计。
|
||||||
- 环境限制:部署前锁定 `origin/dev-v3=1a16a5aec7d0b95ec87e6fb222581060a3135984`,但面板 Git API 回读到服务器本地短提交 `6f7d3ca78`,Gitea 无法解析该对象。接口行为已真实验证,后端工单仍等待测试环境恢复精确远端提交后复验,不能据此宣称最终交付完成。
|
- 环境限制:部署前锁定 `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 合入。
|
1. 从最新 `dev-v3` 创建回退分支,执行 `git revert -m 1 --no-edit 1a16a5aec7d0b95ec87e6fb222581060a3135984`,经独立 PR 合入。
|
||||||
@@ -384,6 +541,12 @@ Authorization: Bearer <admin-token>
|
|||||||
4. 已保存的合同资料保留,不做破坏性批量清理;回退后旧客户端继续按省略 `contracts` 的路径工作。
|
4. 已保存的合同资料保留,不做破坏性批量清理;回退后旧客户端继续按省略 `contracts` 的路径工作。
|
||||||
5. 经 Gateway 复测创建、提交、基础信息、未认证、越权、非法合同 ID、失败零写入和旧客户端兼容,并确认双实例与 Nacos 健康。
|
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)
|
- **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
|
||||||
@@ -0,0 +1,347 @@
|
|||||||
|
---
|
||||||
|
schema: "hl-changelog/v2"
|
||||||
|
ticket: "6476"
|
||||||
|
title: "供应商详情补齐地址备注并统一表单校验"
|
||||||
|
consumer: "admin"
|
||||||
|
author: "lc(GIT)"
|
||||||
|
change_type: "修改接口"
|
||||||
|
backend_status: "deployed"
|
||||||
|
gateway_status: "verified"
|
||||||
|
frontend_status: "verified"
|
||||||
|
frontend_owner: "mmg"
|
||||||
|
frontend_ref: "6635a2ae"
|
||||||
|
target_release: "v2.1"
|
||||||
|
verified_at: "2026-08-27"
|
||||||
|
status_note: "PR #6517 已合并 dev-v3(合并提交 a952a04c);hl-resource-service 已随 dev-v3 精确提交 b269e5fd 由 Deploy Panel 任务 938ca09e 发布 TEST。真实 TEST 身份已验证 address/remark 创建、详情、更新回显,创建/更新同口径校验、权限失败零写入及测试数据清理。"
|
||||||
|
updated_at: "2026-08-27"
|
||||||
|
base: "dev-v3"
|
||||||
|
---
|
||||||
|
|
||||||
|
# 供应商管理:详情补齐地址备注并统一表单校验
|
||||||
|
|
||||||
|
供应商详情接口现在完整返回主体的 `address` 和 `remark`,管理端可用同一份详情快照初始化查看页与编辑表单。创建、提交和更新原本已有的业务字段与校验未增加新的必填项;本工单用契约测试和真实 TEST 验收固定三条写链路的一致口径。
|
||||||
|
|
||||||
|
本次没有新增接口路径、权限点或业务错误码。
|
||||||
|
|
||||||
|
## 一、背景
|
||||||
|
|
||||||
|
创建和更新请求已经接受地址、备注等主体字段,但基础信息详情此前没有回传 `address`、`remark`,导致管理端打开编辑页时无法完整还原已保存表单。同时,创建、提交和更新分属不同请求模型,消费方需要一个明确、可验证的共同校验口径。
|
||||||
|
|
||||||
|
本次处理后:
|
||||||
|
|
||||||
|
- 详情响应补齐主体地址与内部备注。
|
||||||
|
- 创建、提交、更新对共同主体字段、类型、联系人、资质和合同继续执行同一业务规则。
|
||||||
|
- 更新只额外要求变更原因、主体并发版本,以及被修改子项的 ID/版本。
|
||||||
|
- #6436/#6499 已交付的授权完整值语义保持不变,不重新引入脱敏值或“留空表示保留旧敏感值”的旧约定。
|
||||||
|
|
||||||
|
## 二、变更接口清单
|
||||||
|
|
||||||
|
| # | 接口 | 方法 | 路径 | 变更类型 | 说明 |
|
||||||
|
|---:|---|---|---|---|---|
|
||||||
|
| 1 | 查询供应商基本信息 | GET | `/admin/supplier/items/{supplierId}/basic-info/view` | 响应新增字段 | 根对象新增 `address`、`remark`,用于完整初始化查看与编辑表单 |
|
||||||
|
|
||||||
|
创建草稿、提交注册和更新资料的路径、请求字段及错误码没有结构性变化,因此不作为新增接口列入上表;其稳定调用规则在第四节集中说明。
|
||||||
|
|
||||||
|
## 三、接口详情
|
||||||
|
|
||||||
|
### 1. 查询供应商基本信息 `GET /admin/supplier/items/{supplierId}/basic-info/view`
|
||||||
|
|
||||||
|
**VO**: `SupplierBasicInfoRespVO`
|
||||||
|
|
||||||
|
#### 使用场景
|
||||||
|
|
||||||
|
管理端进入供应商详情或编辑页时调用。响应是主体、类型、联系人、资质、合同及并发版本的完整快照;编辑页应直接使用其中的 `address`、`remark` 和 `updateTime`,不得用本地空值覆盖。
|
||||||
|
|
||||||
|
#### 入参
|
||||||
|
|
||||||
|
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|
||||||
|
|---|---|---|---:|---|---|
|
||||||
|
| `supplierId` | Path | String | 是 | 正整数 ID 字符串 | 目标供应商;不得转为 JavaScript Number |
|
||||||
|
|
||||||
|
#### 出参 `Result<SupplierBasicInfoRespVO>`
|
||||||
|
|
||||||
|
| 字段 | 类型 | 说明 |
|
||||||
|
|---|---|---|
|
||||||
|
| `supplierId` | String | 供应商 ID |
|
||||||
|
| `fullName` / `shortName` | String/null | 供应商全称与简称 |
|
||||||
|
| `tax_no` | String | 完整主体证件号;JSON 字段名保持 `tax_no` |
|
||||||
|
| `legalRepresentative` | String/null | 法定代表人姓名 |
|
||||||
|
| `legalRepresentativeIdNo` | String/null | 完整法人居民身份证号 |
|
||||||
|
| `legalRepresentativeIdCardFrontUrl` / `legalRepresentativeIdCardBackUrl` | String/null | 法人证件正反面永久文件地址 |
|
||||||
|
| `contactPhone` | String/null | 完整公司联系电话 |
|
||||||
|
| `establishDate` | String/null | 成立日期,格式 `yyyy-MM-dd` |
|
||||||
|
| `registeredCapital` / `businessScope` | String/null | 注册资本与经营范围 |
|
||||||
|
| `address` | String/null | 本次新增回显:注册地址或经营地址 |
|
||||||
|
| `staffScale` | String/null | 人员规模字典值 |
|
||||||
|
| `mainCooperation` | String | 主要合作内容 |
|
||||||
|
| `remark` | String/null | 本次新增回显:供应商主体内部备注 |
|
||||||
|
| `types` | Array | 类型完整集合;每项包含 `isPrimary` |
|
||||||
|
| `primaryTypeCode` / `primaryTypeName` | String/null | 当前主类型 |
|
||||||
|
| `contacts` / `qualifications` / `contracts` | Array | 联系人、资质和合同完整集合;现有项包含字符串 ID 与 `updateTime` |
|
||||||
|
| `status` | String | 当前供应商状态 |
|
||||||
|
| `updateTime` | String | 主体并发版本,格式 `yyyy-MM-dd HH:mm:ss` |
|
||||||
|
|
||||||
|
#### 请求示例
|
||||||
|
|
||||||
|
```http
|
||||||
|
GET /admin/supplier/items/2092800000000000001/basic-info/view
|
||||||
|
Authorization: Bearer <admin-token>
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 响应示例
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"code": 200,
|
||||||
|
"message": "成功",
|
||||||
|
"success": true,
|
||||||
|
"data": {
|
||||||
|
"supplierId": "2092800000000000001",
|
||||||
|
"fullName": "示例旅行服务有限公司",
|
||||||
|
"shortName": "示例旅行",
|
||||||
|
"tax_no": "91350211M000100Y46",
|
||||||
|
"legalRepresentative": "示例法人",
|
||||||
|
"legalRepresentativeIdNo": "11010519491231002X",
|
||||||
|
"legalRepresentativeIdNoMask": "11010519491231002X",
|
||||||
|
"legalRepresentativeIdCardFrontUrl": "https://files.example.com/supplier/id-front.jpg",
|
||||||
|
"legalRepresentativeIdCardBackUrl": "https://files.example.com/supplier/id-back.jpg",
|
||||||
|
"contactPhone": "13800138000",
|
||||||
|
"contactPhoneMask": "13800138000",
|
||||||
|
"establishDate": "2020-01-01",
|
||||||
|
"registeredCapital": "100万元",
|
||||||
|
"businessScope": "境内旅游服务",
|
||||||
|
"address": "福建省厦门市示例路 1 号",
|
||||||
|
"staffScale": "LT50",
|
||||||
|
"mainCooperation": "酒店与景区资源合作",
|
||||||
|
"remark": "重点合作供应商",
|
||||||
|
"types": [{"typeCode": "HOTEL", "typeName": "酒店", "isPrimary": true}],
|
||||||
|
"primaryTypeCode": "HOTEL",
|
||||||
|
"primaryTypeName": "酒店",
|
||||||
|
"contacts": [],
|
||||||
|
"qualifications": [],
|
||||||
|
"contracts": [],
|
||||||
|
"status": "DRAFT",
|
||||||
|
"updateTime": "2026-08-27 15:30:00"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 空数据 / 降级响应
|
||||||
|
|
||||||
|
历史供应商未填写地址或备注时,字段明确返回 `null`;无类型、联系人、资质或合同时,相应集合返回空数组,不把缺失数据当成接口异常:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"code": 200,
|
||||||
|
"message": "成功",
|
||||||
|
"success": true,
|
||||||
|
"data": {
|
||||||
|
"supplierId": "2092800000000000001",
|
||||||
|
"address": null,
|
||||||
|
"remark": null,
|
||||||
|
"types": [],
|
||||||
|
"primaryTypeCode": null,
|
||||||
|
"primaryTypeName": null,
|
||||||
|
"contacts": [],
|
||||||
|
"qualifications": [],
|
||||||
|
"contracts": [],
|
||||||
|
"updateTime": "2026-08-27 15:30:00"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 错误响应
|
||||||
|
|
||||||
|
供应商不存在、已删除或超出数据范围时不返回空详情:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"code": 395001,
|
||||||
|
"message": "供应商不存在",
|
||||||
|
"success": false,
|
||||||
|
"data": null
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 业务边界
|
||||||
|
|
||||||
|
- 要求可信管理身份、`supplier:view` 平台权限和供应商数据范围;登录态不能代替业务权限。
|
||||||
|
- `address`、`remark` 属于响应的向后兼容增加;旧客户端忽略未知字段即可继续运行。
|
||||||
|
- `legalRepresentativeIdNoMask`、`contactPhoneMask` 等废弃兼容别名继续与完整值字段同值;新代码使用无 `Mask` 字段。
|
||||||
|
- Long ID 一律按字符串保存、比较和传输。
|
||||||
|
- 本接口只读,不修改主体版本、缓存或审批状态。
|
||||||
|
|
||||||
|
## 四、契约约束与正确调用方式
|
||||||
|
|
||||||
|
以下三个既有写接口没有新增路径或字段,但共同业务口径由本工单固定:
|
||||||
|
|
||||||
|
- 创建草稿:`POST /admin/supplier/items/add`
|
||||||
|
- 提交注册:`POST /admin/supplier/items/{supplierId}/submit`
|
||||||
|
- 更新资料:`PUT /admin/supplier/items/{supplierId}/update`
|
||||||
|
|
||||||
|
### 共同主体字段规则
|
||||||
|
|
||||||
|
| 字段 | 创建/提交 | 更新 | 统一约束 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| `fullName` | 必填 | 可选 | 最长 500 字符 |
|
||||||
|
| `shortName` | 可选 | 可选 | 最长 300 字符 |
|
||||||
|
| `taxNo` | 必填 | 可选,且仅允许在状态规则内修改 | 6 至 64 位字母、数字或展示分隔符;身份证/统一社会信用代码还校验日期或校验位 |
|
||||||
|
| `legalRepresentative` | 可选 | 可选 | 最长 500 字符 |
|
||||||
|
| `legalRepresentativeIdNo` | 可选 | 可选 | 18 位合法居民身份证号;与正反面地址按完整三字段组合校验 |
|
||||||
|
| `legalRepresentativeIdCardFrontUrl` / `legalRepresentativeIdCardBackUrl` | 可选 | 可选 | 公网 HTTPS 永久文件地址,单项最长 1000 字符 |
|
||||||
|
| `contactPhone` | 可选 | 可选 | 7 至 20 位合法电话字符 |
|
||||||
|
| `establishDate` | 可选 | 可选 | `yyyy-MM-dd`,不得晚于当前日期 |
|
||||||
|
| `registeredCapital` | 可选 | 可选 | 最长 50 字符 |
|
||||||
|
| `businessScope` | 可选 | 可选 | 最长 500 字符 |
|
||||||
|
| `address` | 可选 | 可选 | 最长 500 字符;创建和更新同口径 |
|
||||||
|
| `staffScale` | 可选 | 可选 | `LT50`、`R50_200`、`R200_500`、`GT500` |
|
||||||
|
| `mainCooperation` | 必填 | 可选 | 创建/提交不能为空白;更新传值时按同一业务含义保存 |
|
||||||
|
| `licenseImageUrl` | 可选 | 可选 | 最长 500 字符,并与营业执照资质归一化 |
|
||||||
|
| `remark` | 可选 | 可选 | 供应商主体内部备注,不等同于审批意见或 `changeReason` |
|
||||||
|
|
||||||
|
集合上限与语义保持不变:`types` 最多 15 项;`contacts`、`qualifications`、`contracts` 各最多 100 项;`initialAccounts` 最多 1 项。非空类型必须来自生效字典且不得重复,非空联系人集合必须形成唯一默认联系人,资质和合同继续执行类型、日期、金额、归属和完整快照校验。
|
||||||
|
|
||||||
|
更新场景额外要求:
|
||||||
|
|
||||||
|
- `changeReason` 必填、非空白、最长 500 字符,并进入业务审计。
|
||||||
|
- `expectedUpdateTime` 必须等于详情最新 `updateTime`。
|
||||||
|
- 已有联系人、资质、合同随完整快照更新时,必须带回对应字符串 ID 和子项 `updateTime`。
|
||||||
|
|
||||||
|
### ✅ 正确 / ❌ 错误 payload 对照
|
||||||
|
|
||||||
|
| 场景 | payload / 结果 |
|
||||||
|
|---|---|
|
||||||
|
| ✅ 更新地址和备注 | `{"address":"福建省厦门市示例路 2 号","remark":"地址已确认","changeReason":"更新地址和备注","expectedUpdateTime":"2026-08-27 15:30:00"}` |
|
||||||
|
| ✅ 只更新备注 | `{"remark":"新的内部备注","changeReason":"补充内部备注","expectedUpdateTime":"2026-08-27 15:30:00"}` |
|
||||||
|
| ❌ 地址超过 500 字符 | 创建、更新均返回 `400`,零写入 |
|
||||||
|
| ❌ 成立日期晚于当前日期 | 创建、更新均返回 `400`,零写入 |
|
||||||
|
| ❌ 更新缺少 `changeReason` | 返回 `400`,零写入 |
|
||||||
|
| ❌ 使用旧 `expectedUpdateTime` | 返回 `395014`,零写入;必须刷新详情后由用户确认 |
|
||||||
|
|
||||||
|
### 正确更新顺序
|
||||||
|
|
||||||
|
1. 先查询详情,保存字符串 ID、子项版本和根对象 `updateTime`。
|
||||||
|
2. 用户提交时只发送实际变更字段,并附非空 `changeReason`、最新 `expectedUpdateTime`。
|
||||||
|
3. 更新成功后采用响应里的新版本;需要完整表单时重新查询详情。
|
||||||
|
4. 遇到 `395014` 先刷新,不得自动用旧表单覆盖他人修改。
|
||||||
|
|
||||||
|
## 五、数据库行为
|
||||||
|
|
||||||
|
- 成功创建、提交或更新时,主体与本次携带的类型、联系人、资质、合同及业务审计按聚合事务一起成功。
|
||||||
|
- 地址和备注保存后,详情读取与变更审计使用同一业务值;`remark` 不会被提升为审批意见或变更原因。
|
||||||
|
- 请求校验、权限、状态、归属或并发版本失败时零写入,主体 `updateTime` 不变化。
|
||||||
|
- 本次没有数据库结构变更、Flyway migration 或历史数据回填;旧记录的地址/备注原值保持不变。
|
||||||
|
- 不新增 Redis、MQ、Feign 或跨服务副作用。
|
||||||
|
|
||||||
|
## 六、边界行为
|
||||||
|
|
||||||
|
- 未登录或 Token 失效:`401`,不把无认证响应当作正向验收。
|
||||||
|
- ADMIN 等无写权限角色调用创建、提交或更新:`395002`,零写入;已有详情仍按读取权限返回。
|
||||||
|
- 供应商不存在或已删除:`395001`。
|
||||||
|
- 并发版本过期:`395014`,调用方刷新详情后重提。
|
||||||
|
- 地址超过 500 字符、未来成立日期、必填字段缺失或组合不完整:`400`,零写入。
|
||||||
|
- 历史 `address`、`remark` 为空:详情返回 `null`,不报错、不猜测默认值。
|
||||||
|
- `ARCHIVED` 等不可修改状态继续由既有状态门禁拒绝更新。
|
||||||
|
- 业务失败可能仍使用 HTTP 200,调用方必须同时判断响应体 `code`、`success`、`data`。
|
||||||
|
|
||||||
|
## 六.5、枚举 / 数据字典
|
||||||
|
|
||||||
|
### `staffScale`(供应商人员规模稳定值)
|
||||||
|
|
||||||
|
**所属字段**: `SupplierDraftSaveReqVO.staffScale / SupplierUpdateReqVO.staffScale / SupplierBasicInfoRespVO.staffScale` | **类型**: `String`
|
||||||
|
|
||||||
|
| 值 | 中文 | 说明 |
|
||||||
|
|---|---|---|
|
||||||
|
| `LT50` | 50 人以下 | 小于 50 人 |
|
||||||
|
| `R50_200` | 50 至 200 人 | 50 至 200 人档 |
|
||||||
|
| `R200_500` | 200 至 500 人 | 200 至 500 人档 |
|
||||||
|
| `GT500` | 500 人以上 | 大于 500 人 |
|
||||||
|
|
||||||
|
`types[].typeCode`、`contacts[].contactRole`、`qualifications[].qualType` 继续从对应生效数据字典读取,不在客户端硬编码展示名。
|
||||||
|
|
||||||
|
## 六.6、修改前后对比
|
||||||
|
|
||||||
|
### 字段级对比
|
||||||
|
|
||||||
|
| 字段 | 改前 | 改后 |
|
||||||
|
|---|---|---|
|
||||||
|
| 详情根对象 `address` | 未返回,已保存值无法用于表单回填 | 返回保存的地址;未填写为 `null` |
|
||||||
|
| 详情根对象 `remark` | 未返回,已保存值无法用于表单回填 | 返回主体内部备注;未填写为 `null` |
|
||||||
|
| 创建/提交/更新请求字段 | 已存在 | 无新增字段、无新增必填项 |
|
||||||
|
|
||||||
|
### 行为级对比
|
||||||
|
|
||||||
|
| 行为 | 改前 | 改后 |
|
||||||
|
|---|---|---|
|
||||||
|
| 打开编辑页 | 详情缺少地址和备注,表单初始化不完整 | 一次详情调用可完整初始化主体字段 |
|
||||||
|
| 共同字段校验 | 实现存在,但缺少跨创建/更新契约锁定 | 自动化和 TEST 验收固定创建/更新同口径 |
|
||||||
|
| 完整敏感值回显 | 按 #6436/#6499 返回授权完整值 | 保持不变 |
|
||||||
|
|
||||||
|
## 六.7、影响评估
|
||||||
|
|
||||||
|
- **是否破坏向后兼容**: 否。响应新增两个可空字段,旧客户端可忽略;请求无新增必填项。
|
||||||
|
- **前端是否必须同步上线**: 为闭合编辑体验需要接入 `address`、`remark`,但不构成旧客户端继续运行的硬门禁。
|
||||||
|
- **前端 workaround 清理点**: 删除编辑页对地址、备注的本地空值兜底,改为使用详情真实值。
|
||||||
|
- **QA 重点**: 新建后打开详情、更新后刷新详情、地址长度 500/501、今天/未来成立日期、ADMIN 越权、旧版本并发冲突。
|
||||||
|
|
||||||
|
## 七、不影响范围
|
||||||
|
|
||||||
|
- **仅影响**: 管理后台供应商详情/编辑表单的主体地址、内部备注回填,以及已有写接口校验口径的契约固定。
|
||||||
|
- **零影响**:
|
||||||
|
- Gateway 路由和认证级别。
|
||||||
|
- 供应商生命周期状态机、审批、收款账户、证明附件、资源关系及归档语义。
|
||||||
|
- 数据库结构、历史数据、Nacos 配置、Redis、MQ、Feign 和其他服务。
|
||||||
|
- 小程序、C 端、Web、H5、桌面端接口。
|
||||||
|
- #6436/#6499 的授权完整值和废弃 `*Mask` 兼容语义。
|
||||||
|
|
||||||
|
## 八、测试环境已验证
|
||||||
|
|
||||||
|
- 本地自动化:供应商定向测试 49 项通过;最新 `dev-v3` 上 `hl-resource-service` Reactor 全量 2,153 项,0 失败、0 错误、38 项条件跳过。
|
||||||
|
- 部署:Deploy Panel API 任务 `938ca09e` 终态 `success`;目标与实际提交均为 `b269e5fdca2e1d29e0336314a909885e9d1f9d16`,包含本工单合并提交 `a952a04c`。
|
||||||
|
- 采样:部署任务期 8 个有效采样;每个采样至少 2 个运行进程、2 个健康启用 Nacos 实例,零观测不可用采样。该证据只证明采样点,不代表采样间绝对连续。
|
||||||
|
- 真实 Gateway:SUPER_ADMIN 创建完整表单后,详情精确回显 `address`、`remark`、完整授权字段、主类型及联系人/资质/合同 ID 和版本;更新后 API、数据库主体与更新审计一致。
|
||||||
|
- 失败路径:创建/更新的地址超长均返回 `400`;创建/更新的未来成立日期均返回 `400`;ADMIN 更新返回 `395002`;所有失败均验证零写入、版本不变。
|
||||||
|
- 清理:临时供应商先经业务删除接口软删除,确认主体已删除且活动子项为 0;随后按本次唯一标记精确清理 8 行测试数据,17 张关联表回读,剩余供应商 0 行;测试会话已注销并验证失效。
|
||||||
|
|
||||||
|
## 九、相关历史 PR
|
||||||
|
|
||||||
|
| PR | Issue | 说明 | 是否仍有效 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| #6478 / #6483 / #6486 | #6436 | 供应商授权完整值、主类型及同日修正 | ✅ 有效,本次保持 |
|
||||||
|
| #6517 | #6476 | 详情补齐地址备注并固定表单校验契约 | ✅ 最新 |
|
||||||
|
|
||||||
|
## 十、相关文档
|
||||||
|
|
||||||
|
- 关联 Issue:[#6476](https://git.1814.love:8443/wx/HL/issues/6476)
|
||||||
|
- 关联 PR:[#6517](https://git.1814.love:8443/wx/HL/pulls/6517)
|
||||||
|
- 相关完整值契约:`changelogs-v2/2026-08/27_6436_供应商敏感字段完整回显与主类型-修改接口-管理后台.md`
|
||||||
|
- 管理端接入:读取详情 `address`、`remark`,更新时保留最新 `expectedUpdateTime`;前端引用待回填。
|
||||||
|
|
||||||
|
## 撤回
|
||||||
|
|
||||||
|
1. 从最新 `dev-v3` 创建独立回退分支,执行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git revert -m 1 --no-edit a952a04cf80f24d6c50cbec4b992c82f8580beba
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 运行供应商定向测试、`hl-resource-service` 全量测试和差异检查,经独立 PR 合入。
|
||||||
|
3. 使用同一 Deploy Panel 两阶段客户端,仅滚动部署 `hl-resource-service`,并绑定批准回退分支的精确提交。
|
||||||
|
4. 管理端停止依赖详情响应中的 `address`、`remark`,再撤回本 Changelog;既有请求字段和完整值契约保持不变。
|
||||||
|
5. 无数据库、配置、Redis 或 MQ 恢复步骤;已保存的地址和备注数据保留,不做破坏性回填或删除。
|
||||||
|
6. 撤回后经 Gateway 复测详情、创建、更新、未认证、越权、并发冲突和失败零写入,并确认 Resource 双实例与 Nacos 健康。
|
||||||
|
|
||||||
|
## 关联 / 联系人
|
||||||
|
|
||||||
|
### 链接
|
||||||
|
|
||||||
|
- **Issue**: [#6476](https://git.1814.love:8443/wx/HL/issues/6476)
|
||||||
|
- **PR**: [#6517](https://git.1814.love:8443/wx/HL/pulls/6517)
|
||||||
|
- **实现提交**: [`3cd07d27`](https://git.1814.love:8443/wx/HL/commit/3cd07d27dc876f17af1751ec7ef9de2ddbd71949)
|
||||||
|
- **Merge commit**: [`a952a04c`](https://git.1814.love:8443/wx/HL/commit/a952a04cf80f24d6c50cbec4b992c82f8580beba)
|
||||||
|
- **TEST 目标提交**: [`b269e5fd`](https://git.1814.love:8443/wx/HL/commit/b269e5fdca2e1d29e0336314a909885e9d1f9d16)
|
||||||
|
|
||||||
|
### 联系人
|
||||||
|
|
||||||
|
- **后端负责人**: @lc
|
||||||
|
- **管理端负责人**: @mmg(`frontend_status: pending`)
|
||||||
某些文件未显示,因为此 diff 中更改的文件太多 显示更多
在新工单中引用
屏蔽一个用户