chore(changelog): #8226 回写 verified(hl-ui 9e0897c2);#8123/#8148 回写 not_required(维持通用 toast)
changelog-filename-gate / validate (push) Failing after 2s

这个提交包含在:
Mimingguang
2026-09-23 15:31:04 +08:00
父节点 b662606a22
当前提交 8591992142
共修改 2 个文件,包含 8 行新增和 8 行删除
@@ -7,12 +7,12 @@ author: "wx(GIT)"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "not_required"
frontend_status: "pending"
frontend_owner: "mmg"
frontend_status: "not_required"
frontend_owner: ""
frontend_ref: ""
target_release: ""
verified_at: "2026-09-23"
status_note: "工单 #8123 修的是团期 staff 扇出并发丢配置:两个人几乎同时保存同一团期时,两条扇出各自读到自己那一刻的整期配置、互相覆盖,结果是子订单侧留下重复行而接口两次都返 200。修法是在 saveConfig 上加订单级 @Lock4j(锁名 batch-staff:save:{productBatchId},expire 30s,acquireTimeout 不显式设 = lock4j 默认 3s)并在锁内复读整期最新配置。由此对外多出一个此前这个端点不会返回的码 100503「资源被占用,请稍后重试」——它由 hl-common/hl-starter-protection 的 lockFailureStrategy 抛出,走 HTTP 200 不是 5xx。工单 #8148 把角色↔人员类型的判据从写死角色表改为读配置位字典(GroupBatchStaffSlotResolver#slotTypesOf),随之必须区分两种「查不到归属位」:DRIVER / OTHER 这类结构性不参与配置位的照旧放行,而本该有位却查不到的(运维把 GUIDE / LEADER / PHOTOGRAPHER 从某个仍非空的配置位字典里删掉)必须拒绝,否则该角色的 582114 会当场静默失效、任意人员类型都能落库并返 200,一直到结算对账才发现人岗对不上。这一支落新码 582117。生产代码由 PR #8177 合入 dev-v3(提交 bfc10966e),后续订正 PR #8186 / #8197 / #8199,取证载体 PR #8243。2026-09-23 测试服活体已确认字节就位:order-v3 双实例(8086 / 8186,jar 与磁盘同 inode)的进程字节里 STAFF_ROLE_SLOT_MISSING、RESOURCE_LOCKED、LockFailureExceptionHandler、LockFailureStrategy、slotTypesOf、GroupBatchStaffLockNames、participatesInSlotsByFallback 全部命中。acquireTimeout 的运行时值为默认 3000ms,判据是四个配置来源全零命中且各自带阳性对照:Nacos hl-order-service-v3-dev.yml(1256 字节,阳性对照 spring / datasource 各命中)、jar 内 BOOT-INF/classes/application.yml(6064 字节,阳性对照 spring 命中 4)、仓库 src/main/resources、两个进程的 JVM 启动参数与环境变量(阳性对照:每个进程 16 条启动参数);lock4j jar 版本 2.2.7,与源码 Lock4jProperties#acquireTimeout 默认值 3000L 同版本。前端侧:5821xx 这一族在 hl-ui v2.1 上没有专门分支,统一由 src/utils/request.js 的响应拦截器按 code 非成功值 toast 后端 message,故 100503 与 582117 前端零改动即有基本行为;记 pending 的是 100503 的语义——它是「稍后重试」而不是「操作失败」,用通用错误样式提示会把一次可重试的排队说成失败。"
verified_at: ""
status_note: "工单 #8123 修的是团期 staff 扇出并发丢配置:两个人几乎同时保存同一团期时,两条扇出各自读到自己那一刻的整期配置、互相覆盖,结果是子订单侧留下重复行而接口两次都返 200。修法是在 saveConfig 上加订单级 @Lock4j(锁名 batch-staff:save:{productBatchId},expire 30s,acquireTimeout 不显式设 = lock4j 默认 3s)并在锁内复读整期最新配置。由此对外多出一个此前这个端点不会返回的码 100503「资源被占用,请稍后重试」——它由 hl-common/hl-starter-protection 的 lockFailureStrategy 抛出,走 HTTP 200 不是 5xx。工单 #8148 把角色↔人员类型的判据从写死角色表改为读配置位字典(GroupBatchStaffSlotResolver#slotTypesOf),随之必须区分两种「查不到归属位」:DRIVER / OTHER 这类结构性不参与配置位的照旧放行,而本该有位却查不到的(运维把 GUIDE / LEADER / PHOTOGRAPHER 从某个仍非空的配置位字典里删掉)必须拒绝,否则该角色的 582114 会当场静默失效、任意人员类型都能落库并返 200,一直到结算对账才发现人岗对不上。这一支落新码 582117。生产代码由 PR #8177 合入 dev-v3(提交 bfc10966e),后续订正 PR #8186 / #8197 / #8199,取证载体 PR #8243。2026-09-23 测试服活体已确认字节就位:order-v3 双实例(8086 / 8186,jar 与磁盘同 inode)的进程字节里 STAFF_ROLE_SLOT_MISSING、RESOURCE_LOCKED、LockFailureExceptionHandler、LockFailureStrategy、slotTypesOf、GroupBatchStaffLockNames、participatesInSlotsByFallback 全部命中。acquireTimeout 的运行时值为默认 3000ms,判据是四个配置来源全零命中且各自带阳性对照:Nacos hl-order-service-v3-dev.yml(1256 字节,阳性对照 spring / datasource 各命中)、jar 内 BOOT-INF/classes/application.yml(6064 字节,阳性对照 spring 命中 4)、仓库 src/main/resources、两个进程的 JVM 启动参数与环境变量(阳性对照:每个进程 16 条启动参数);lock4j jar 版本 2.2.7,与源码 Lock4jProperties#acquireTimeout 默认值 3000L 同版本。前端侧:5821xx 这一族在 hl-ui v2.1 上没有专门分支,统一由 src/utils/request.js 的响应拦截器按 code 非成功值 toast 后端 message,故 100503 与 582117 前端零改动即有基本行为;记 pending 的是 100503 的语义——它是「稍后重试」而不是「操作失败」,用通用错误样式提示会把一次可重试的排队说成失败。前端结论(2026-09-23 用户拍板):100503 不做专门「可重试」提示,维持拦截器通用 toast;582117 文案后端完整直出,5821xx 全族前端无专门分支,基本行为零改动,记 not_required 闭环。"
updated_at: "2026-09-23"
base: "dev-v3"
---
@@ -7,12 +7,12 @@ author: "jw(GIT)"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "pending"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: ""
frontend_ref: "9e0897c2934a6720fb9cbab05b1e14394c74c8f6"
target_release: ""
verified_at: ""
status_note: "PR #8232 已合并 dev-v3(9231b8d8c),2026-09-23 14:30 滚动部署 TEST 双实例(检出 7a876ec57)。真实网关实测:新增/编辑车型大类 typeName 传全角空格、半角空格、空串、null 均返回 400「大类中文名不能为空」,库内零写入;读侧临时把 mpv 名称置空后,order-v3 车型白名单仍含 mpv(展示名回落为 mpv),验毕已原样还原。前端待办:车型大类表单的 typeName 必填校验需同样把全角空格视为空。"
verified_at: "2026-09-23"
status_note: "PR #8232 已合并 dev-v3(9231b8d8c),2026-09-23 14:30 滚动部署 TEST 双实例(检出 7a876ec57)。真实网关实测:新增/编辑车型大类 typeName 传全角空格、半角空格、空串、null 均返回 400「大类中文名不能为空」,库内零写入;读侧临时把 mpv 名称置空后,order-v3 车型白名单仍含 mpv(展示名回落为 mpv),验毕已原样还原。前端待办:车型大类表单的 typeName 必填校验需同样把全角空格视为空。前端已交付(2026-09-23):CategoryEditModal typeName 必填规则改 trim() 判空 validator,纯全角/半角空白提交前拦下(与后端 400 同口径),首尾带空格正常名放行且提交不 trim 原样发;新建组件 spec 4 例全绿。"
updated_at: "2026-09-23"
base: "dev-v3"
---