From a04624cd2c2e6a8647feace0b696b575d0db061c Mon Sep 17 00:00:00 2001 From: jw Date: Thu, 24 Sep 2026 16:09:27 +0800 Subject: [PATCH] =?UTF-8?q?docs(changelog):=20=E5=89=8D=E7=AB=AF=E7=BC=BA?= =?UTF-8?q?=E9=99=B7=E2=80=94=E2=80=94=E5=9B=A2=E6=9C=9F=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E9=85=8D=E5=AF=BC=E6=B8=B8/=E9=85=8D=E6=91=84=E5=BD=B1?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E6=8A=A5=20589553=EF=BC=8C=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E8=AF=AF=E4=BC=A0=E8=AE=A2=E5=8D=95=E4=BE=A7=E5=9B=A2=E6=9C=9F?= =?UTF-8?q?=20ID=EF=BC=88=E5=BA=94=E4=BC=A0=20productBatchId=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 (1M context) --- ...‘„影保存报589553弹窗误传团期ID-前端缺陷-管理后台.md | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 changelogs-v2/2026-09/24_frontend_团期详情配导游配摄影保存报589553弹窗误传团期ID-前端缺陷-管理后台.md diff --git a/changelogs-v2/2026-09/24_frontend_团期详情配导游配摄影保存报589553弹窗误传团期ID-前端缺陷-管理后台.md b/changelogs-v2/2026-09/24_frontend_团期详情配导游配摄影保存报589553弹窗误传团期ID-前端缺陷-管理后台.md new file mode 100644 index 00000000..e64b631a --- /dev/null +++ b/changelogs-v2/2026-09/24_frontend_团期详情配导游配摄影保存报589553弹窗误传团期ID-前端缺陷-管理后台.md @@ -0,0 +1,121 @@ +--- +schema: hl-changelog/v2 +ticket: "frontend" +title: "团期详情「配置导游 / 配置摄影」保存必报 589553「团期尚未创建」:弹窗把订单侧团期 ID 当成产品侧排期 ID 传给人员配置接口" +consumer: admin +author: "jw(GIT)" +change_type: "前端缺陷" +backend_status: "not_required" +gateway_status: "not_required" +frontend_status: "pending" +frontend_owner: "mmg" +frontend_ref: "" +target_release: "" +verified_at: "" +status_note: "2026-09-24 jw 在 TEST 团期详情(/order-v2/batch/detail/2101506167098511362,jw测试产品 第1期,已成团 12 户)点「配置导游」勾选两人保存,弹出「团期尚未创建(该班期还没有任何订单),请先建团并完成成团后再操作」(589553)。根因在 hl-ui:团期详情页把路由上的订单侧团期 ID(groupBatchId)传给 GroupBatchStaffConfigModal,弹窗再原样拼进 GET / PUT /v3/admin/group-batch/{productBatchId}/staff 与候选分页接口,而这组接口的路径变量是产品侧排期 ID。后端按产品侧排期 ID 反查团期,拿团期 ID 当排期 ID 查不到,按设计抛 589553。同页「设置主报账人」弹窗传的是 productBatchId,是对的。后端与数据均正常:该团期 order_group_batch 行存在(group_batch_id=2101506167098511362 / product_batch_id=2101502082564407299 / RESOURCE_PREPARING / 子订单 14 张);order_batch_staff 中按团期 ID 错存的活跃行 0 条,无需修数。本条无后端改动。" +updated_at: "2026-09-24" +base: dev-v3 +--- + +# 团期详情「配置导游 / 配置摄影」保存报 589553:弹窗传错了 ID + +> **服务**: hl-order-service-v3(**后端零改动,后端与数据均正常**) +> **页面**: 管理后台 → 团期订单 → 团期详情 → 「配导游」/「配摄影」Tab → 「配置导游」/「配置摄影」弹窗 +> **接口**: `GET` / `PUT /v3/admin/group-batch/{productBatchId}/staff`、`GET /v3/admin/group-batch/{productBatchId}/staff/candidates/page` +> **日期**: 2026-09-24 +> **影响范围**: 仅前端。所有团期、所有用户,配置导游 / 配置摄影一保存就失败;人员配置实际一直存不进去 + +--- + +## 一、现象 + +团期已成团,打开「配置导游」,候选列表正常显示,勾选人员点「保存」,右上角报错: + +`团期尚未创建(该班期还没有任何订单),请先建团并完成成团后再操作` + +「已配置人员」一直显示「暂未配置」。同一页的「设置主报账人」正常。 + +--- + +## 二、根因(对 hl-ui `origin/v2.1` = `9eb8268f` 源码实读) + +**① 详情页传给弹窗的是订单侧团期 ID** + +`src/views/order-v2/batch/detail/index.vue`: + +```vue + + +``` + +`groupBatchId`(`:454`)取自路由,就是地址栏里的订单侧运营团期 ID(例:`2101506167098511362`)。 + +**② 弹窗把它拼进三个接口的路径** + +`src/views/order-v2/batch/detail/components/GroupBatchStaffConfigModal.vue`: + +| 行 | 调用 | +|---|---| +| `:182` | `getGroupBatchStaff(props.groupBatchId, …)` → `GET /v3/admin/group-batch/{id}/staff` | +| `:197` | `getGroupBatchStaffCandidatesPage(props.groupBatchId, …)` → `GET …/{id}/staff/candidates/page` | +| `:274` | `saveGroupBatchStaff(props.groupBatchId, …)` → `PUT /v3/admin/group-batch/{id}/staff` | + +**③ 这组接口的路径变量是产品侧排期 ID** + +后端 `GroupBatchStaffAdminController` 四个端点的路径变量都是 `{productBatchId}`(`group_tour_batch.batch_id`)。 +前端自己的 API 封装 `src/api/orderV2GroupBatch.js` 在 `getGroupBatchStaff` 注释里也写明 +「`@param groupBatchId 产品侧班期 ID(group_tour_batch.batch_id)`」——**只是参数名起成了 groupBatchId,调用方就按名字传了团期 ID**。 + +**④ 为什么只有保存报错** + +- 查询已配置人员(GET staff)按排期 ID 查人员表,传错 ID 只是查到空列表,不报错 → 页面显示「暂未配置」。 +- 候选分页不校验团期存在性,候选照常出来;但它的返回里已经露了馅:每条记录的 `productBatchId` 回显成了团期 ID、`groupBatchId` 为 `null`(后端认为「这个排期还没建团」)。 +- 保存(PUT staff)先按排期 ID 反查团期、校验可配置窗口;拿团期 ID 当排期 ID 查不到团期行,按设计返 `589553`。 + +**对照**:同页「设置主报账人」弹窗(`index.vue:268-273`)传的是 `:product-batch-id="productBatchId"`(`:756`,取 `detail.productBatchId`),所以它是好的。 + +--- + +## 三、后端与数据侧的核查结果(均正常,供排除用) + +| 项 | 结果 | +|---|---| +| 团期是否存在 | `order_group_batch`:`group_batch_id=2101506167098511362`、`product_batch_id=2101502082564407299`、`batch_status=RESOURCE_PREPARING`,子订单 14 张 | +| 按错误 ID 反查 | `product_batch_id=2101506167098511362` 的团期行不存在 → 589553 是正确的后端行为 | +| 是否有错存数据 | `order_batch_staff` 中 `product_batch_id` 等于某个团期 ID 的活跃行:**0 条**,无需修数 | +| 两个 ID 调 GET staff | 均返回 `200` + `[]`(GET 不校验团期存在性,所以传错也不报错) | +| 用团期 ID 调候选分页 | `200`,`total=7`,记录里 `productBatchId=2101506167098511362`、`groupBatchId=null` | + +--- + +## 四、修复建议 + +**最小改动**(一行):`index.vue:260` 改为传产品侧排期 ID。 + +```vue + +``` + +弹窗内部读取、候选、保存三处都走这个 prop,会一起变对。 + +**建议一并做**:把弹窗 prop 与三个 API 封装的参数名改成 `productBatchId`(与 `ReporterRankModal` / `setGroupBatchStaffReporterRank` 一致),避免下一个调用方再按名字传错。 + +**建议补的回归**:`GroupBatchStaffConfigModal.spec.js` / `index.spec.js` 断言保存请求 URL 里的 ID 等于 `detail.productBatchId`,而不是路由 ID——现有弹窗用例只给了一个 `groupBatchId: '2099751575655247875'`,没有同时构造两种 ID,所以传错也测不出来。 + +--- + +## 五、业务边界 + +- 修复后可配窗口按后端现行规则:招募中、资源准备中可配,确认(物料准备中)之后返 `589598`(#8231 / #8269)。 +- `detail.productBatchId` 为空时(极端情况)应禁用「配置导游 / 配置摄影」按钮,不要拼出 `/group-batch//staff`。 +- 本条不涉及后端改动,接口契约不变。