From 0451e4ceaa6e50eff9ee6a4b8a56b3c8ffca3224 Mon Sep 17 00:00:00 2001 From: API Changelog Bot Date: Sun, 6 Sep 2026 19:12:17 +0800 Subject: [PATCH] =?UTF-8?q?changelog(7149):=20=E6=9B=B4=E6=AD=A3=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E7=A0=81=E4=BC=98=E5=85=88=E7=BA=A7=E5=8F=A3=E5=BE=84?= =?UTF-8?q?=E2=80=94=E2=80=94=E5=85=A5=E5=8F=A3=E7=BB=93=E6=9E=84=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E5=85=88=E4=BA=8E=E7=8A=B6=E6=80=81=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=EF=BC=8C=E5=AF=B9=E5=A4=96=E5=8F=AA=E5=8F=98=E5=9B=A2=E5=8D=95?= =?UTF-8?q?=20582099=20=E5=85=88=E4=BA=8E=20582016=EF=BC=9B=E5=86=BB?= =?UTF-8?q?=E7=BB=93=E6=9C=9F=E4=BE=8B=E5=A4=96=E6=8C=89=E6=9C=80=E9=AB=98?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 复审指出原文把事务内 doUpsertHotelRequirement 的校验顺序写成公开接口整体优先级,忽略了直提入口进事务前的团单/结构前置校验。 Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01XYL5S9SsBtkg7aGyFAbrrQ --- ...可提房车需求-物资准备起冻结-团单房型间数必填-修改接口-管理后台.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/changelogs-v2/2026-09/06_7149_团期子订单支付后即可提房车需求-物资准备起冻结-团单房型间数必填-修改接口-管理后台.md b/changelogs-v2/2026-09/06_7149_团期子订单支付后即可提房车需求-物资准备起冻结-团单房型间数必填-修改接口-管理后台.md index f9a26da5..dff284c0 100644 --- a/changelogs-v2/2026-09/06_7149_团期子订单支付后即可提房车需求-物资准备起冻结-团单房型间数必填-修改接口-管理后台.md +++ b/changelogs-v2/2026-09/06_7149_团期子订单支付后即可提房车需求-物资准备起冻结-团单房型间数必填-修改接口-管理后台.md @@ -140,9 +140,9 @@ base: "dev-v3" #### 业务边界 - 团期闸门(房车共用):`RECRUITING / RESOURCE_PREPARING` 放行;`MATERIAL_PREPARING / PENDING_DEPARTURE / TRAVELLING / REVIEWING / SETTLED` 及未知状态 589536;`CANCELLED` / 查不到团期 589501;核心订单不查团期。 -- 冻结期例外:该户用房需求最新一版为 `REJECTED_TO_CONSULTANT`(团期管理员打回)时放行重提,新版本回到 `PENDING_REVIEW`;之后再改仍 589536,要再改只能再次被打回。 +- 冻结期例外:该户用房需求最高版本组(同 version 的一组行,含已失活的打回行;有生效行看生效行,否则组内任一行)为 `REJECTED_TO_CONSULTANT`(团期管理员打回)时放行重提,新版本回到 `PENDING_REVIEW`;之后再改仍 589536,要再改只能再次被打回。 - 团单房型间数必填按「段首候选 rooms 行」判,与全团需求汇总 `requirement-summary` 同口径;旧结构(无 `rooms[]`)按段级 `roomCategory + roomCount` 合成一行判。 -- 校验顺序(PR #7184 起):订单状态(582017)→ 团期闸门(589536 / 589501)→ 晚数匹配(582011)→ 团单房型间数(582099,含房数为空 / 0)→ 通用结构校验(582098 / 582016 / 582019);任一拒绝均在写库之前,无新版本、`room_control_status` 不变。核心订单仍以通用结构校验给码(房数 0 → 582016)。 +- 校验顺序(接口对外可观察口径,PR #7184 / #7200 起):本接口**进事务前**先做入口校验——团单房型间数(582099,仅团单,含房数为空 / 0)→ 通用结构校验(582098 / 582016 / 582019 / 582020);都通过才进事务依次查订单状态(582017)→ 团期闸门(589536 / 589501)→ 晚数匹配(582011)→ 已配房晚改自订(582097)。事务内再跑的 582099 / 结构校验只是兜底,不会先于入口触发。因此**结构类错误仍先于订单状态与团期闸门返回**(冻结期团单缺房型得到 582099 而不是 589536);本单对外只改变一点:团单 582099 先于 582016。任一拒绝均在写库之前,无新版本、`room_control_status` 不变。核心订单仍以通用结构校验给码(房数 0 → 582016)。 - 成功后 `order_main.room_control_status=PENDING_REVIEW`(既有行为),团期成团时定制师不再产生「房型需求 · 待提交」待办。 ### 2. 订单调整统一提交 `POST /v3/admin/order/{id}/adjustment/submit` @@ -311,7 +311,7 @@ base: "dev-v3" - **冻结期打回只给一次重提机会**:重提后最新版变 `PENDING_REVIEW`,再改回到 589536;这是有意设计(改需求须经管理员再次打回)。 - **自订晚**:`customerSelfBooked=true` 的晚不做房型校验;全团汇总 `requirement-summary` 也整晚跳过(PR #7184 复审补漏),残留 `segments/rooms` 不计入采购分母、不再出「未知」桶——前端标记自订后仍建议清空该晚 `segments`,但后端不依赖它。 - **未知团期状态**按冻结处理(fail closed),不会误放行。 -- **错误码优先级变化(PR #7184,核心订单也受影响)**:结构校验(582098 / 582016 / 582019 / 582020)从「最先」挪到订单状态(582017)、团期闸门(589536 / 589501)、晚数匹配(582011)、已配房晚改自订(582097)之后;同一请求同时有结构错误和前置错误时,现在先返回前置错误码。前端若按错误码分支提示需按新顺序理解,语义是「更根因的错误优先」。 +- **错误码优先级(2026-09-06 复审更正,以本条为准)**:两条对外入口的可观察顺序都是「结构类校验先于状态类校验」——`PUT …/hotel-requirement` 在进事务前先做 团单 582099 → 通用结构 582098 / 582016 / 582019 / 582020,之后才是 582017 → 589536 / 589501 → 582011 → 582097;`adjustment/submit` 在自身状态边界守卫之后、任何写库与 Feign 之前先做 团单 582099 → 通用结构,团期闸门 589536 / 589501 与晚数 582011 在落库阶段。本单对外**唯一**的优先级变化是团单 582099 先于 582016(两入口一致)。PR #7184 把事务内 `doUpsertHotelRequirement` 的结构校验挪到闸门之后只是内部兜底顺序(供改期减天等内部路径),对外不可观察,核心订单的错误码顺序没有变化。本文早先版本写「结构校验挪到订单状态 / 闸门之后、核心订单也受影响」是把事务内顺序误当成接口整体优先级。 - **调整入口同口径(PR #7184)**:`adjustment/submit` 对团期子订单同样先做团单房型间数校验,房数为空 / 0 也返回 582099「第 N 晚第 M 段」,不再先出 582016。 - **全团汇总某晚全团自订则无该晚条目**:`dailyRoomBreakdown` 按 dayNumber 升序但不保证连续,前端逐日表按 dayNumber 对齐、不要按下标。 - **子订单详情统计同步(PR #7184)**:订单详情 `hotelRequirementBrief.totalRoomCount / roomTypeSummary` 也不再计入自订晚残留段,与全团汇总一致;该晚仍出现在 `days[]` 里,并**新增响应字段** `hotelRequirementBrief.days[].customerSelfBooked`(Boolean,纯新增不破坏契约)供前端解释「段里有房型行但不计入总数」。