文件
hl-api-changelog/changelogs-v2/2026-09/24_frontend_团期详情配导游配摄影保存报589553弹窗误传团期ID-前端缺陷-管理后台.md
T
2026-09-24 16:34:06 +08:00

6.9 KiB
原始文件 Blame 文件历史

schema, ticket, title, consumer, author, change_type, backend_status, gateway_status, frontend_status, frontend_owner, frontend_ref, target_release, verified_at, status_note, updated_at, base
schema ticket title consumer author change_type backend_status gateway_status frontend_status frontend_owner frontend_ref target_release verified_at status_note updated_at base
hl-changelog/v2 frontend 团期详情「配置导游 / 配置摄影」保存必报 589553「团期尚未创建」:弹窗把订单侧团期 ID 当成产品侧排期 ID 传给人员配置接口 admin jw(GIT) 前端缺陷 not_required not_required verified mmg c7059880ce6470e391c6ed3a9d6dfd5305ed037a v2.1 2026-09-24 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 条,无需修数。本条无后端改动。 | 2026-09-24 mmg 修复:弹窗 prop 改传 detail.productBatchId+空 ID 闸;prop 与三 API 形参统一改名 productBatchId,JSDoc 补 589553 误传口径;index spec 新增 2 例回归(prop=detail.productBatchId 非路由 ID/空 ID 不开弹窗),弹窗 spec 6 例+index spec 5 例全绿 2026-09-24 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:

<!-- :258-263 -->
<GroupBatchStaffConfigModal
  v-model:show="staffConfigShow"
  :group-batch-id="groupBatchId"
  :role="staffConfigRole"
  @saved="onStaffConfigSaved"
/>

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。

<GroupBatchStaffConfigModal
  v-model:show="staffConfigShow"
  :group-batch-id="productBatchId"
  :role="staffConfigRole"
  @saved="onStaffConfigSaved"
/>

弹窗内部读取、候选、保存三处都走这个 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。
  • 本条不涉及后端改动,接口契约不变。