--- schema: "hl-changelog/v2" ticket: "7400" title: "资源供应商解绑免原因" consumer: "admin" author: "lc(GIT)" change_type: "修改接口" backend_status: "deployed" gateway_status: "verified" frontend_status: "verified" frontend_owner: "mmg" frontend_ref: "02e17345" target_release: "" verified_at: "2026-09-09" status_note: "verified 2026-09-09 mmg(hl-admin 02e17345):SupplierRelationModal 解绑改确认框确定后直接 submitUnbind,body 仅两 expected 版本字段不带 changeReason;设置/改绑原因弹窗与必填校验保留,SCENIC 设置/改绑免原因(#7274/#7357)不动;resources.js 050 JSDoc 同步。scoped checkpoint 全绿(Vitest 全量+生产构建)。" updated_at: "2026-09-09" base: "dev-v3" --- # 资源供应商解绑免原因 ## ⚠️ 关键变化 资源管理解绑供应商时,`changeReason` 由必填改为可选;前端无需再弹出原因输入框,也不要补写默认原因。 ## 二、变更接口清单 | # | 接口 | 方法 | 路径 | 变更类型 | 说明 | |---|---|---|---|---|---| | 1 | 解除资源供应商 | POST | `/admin/supplier/resource-relations/{resourceModule}/{resourceId}/unbind` | 修改接口 | `changeReason` 改为可选 | ## 三、接口详情 ### 1. 解除资源供应商 `POST /admin/supplier/resource-relations/{resourceModule}/{resourceId}/unbind` **VO**: `SupplierResourceUnbindReqVO / Result` #### 使用场景 资源管理页面确认解除当前供应商关系时调用。 #### 入参 | 字段 | 位置 | 类型 | 必填 | 约束 | 说明 | |---|---|---|---|---|---| | `resourceModule` | Path | String | 是 | 现有资源模块编码 | 资源模块 | | `resourceId` | Path | String | 是 | 正整数 | 资源 ID | | `expectedCurrentSupplierId` | Body | String | 是 | 正整数 | 当前关系返回的 `supplierId` | | `expectedRelationUpdateTime` | Body | String | 是 | `yyyy-MM-dd HH:mm:ss` | 当前关系返回的 `updateTime` | | `changeReason` | Body | String | 否 | 最长 500 字 | 省略、`null`、空串或空白均视为未填写 | #### 出参 `Result` | 字段 | 类型 | 说明 | |---|---|---| | `code` / `message` / `success` | Integer / String / Boolean | 业务结果 | | `data` | null | 成功时固定为空 | #### 请求示例 ```json {"expectedCurrentSupplierId":"2000000000000000022","expectedRelationUpdateTime":"2026-09-09 10:01:00"} ``` #### 响应示例 ```json {"code":200,"message":"成功","data":null,"success":true} ``` #### 空数据 / 降级响应 无空成功集合;关系不存在或必要依赖不可用时返回失败结果,不执行解绑。 #### 错误响应 ```json {"code":395014,"message":"数据已被他人修改,请刷新后重试","data":null,"success":false} ``` #### 业务边界 - 未登录返回 `401`;缺少任一版本字段或原因超过 500 字返回 `400`;关系不存在返回 `395038`。 - 权限、数据范围、景区未完成订单门禁、幂等、并发版本与软删除规则不变;失败不改写关系或审计。 ## 四、契约约束与正确调用方式 用户确认解绑后,直接提交当前关系的两个版本字段: | 场景 | payload | |---|---| | 正确:省略原因 | `{"expectedCurrentSupplierId":"22","expectedRelationUpdateTime":"2026-09-09 10:01:00"}` | | 兼容:继续传原因 | `{"expectedCurrentSupplierId":"22","expectedRelationUpdateTime":"2026-09-09 10:01:00","changeReason":"业务调整"}` | | 错误:缺版本时间 | `{"expectedCurrentSupplierId":"22"}` → `400` | 关系版本已变化返回 `395014`,应刷新当前关系后再由用户重试。业务失败可能仍为 HTTP 200,须判断响应体 `code` 和 `success`。 ## 五、数据库行为 成功解绑仍按原逻辑软删除当前关系并追加供应商变更审计;省略原因时 `supplier_change_log.change_reason` 记录为 `NULL`,非空原因继续原样审计。无表结构或迁移变化。 ## 六、边界行为 - `changeReason` 省略、`null`、空串或纯空白均可解绑,且不生成虚构默认值。 - `changeReason` 最长 500 字;501 字返回 `400` 且零写入。 - 两个 `expected*` 字段仍必填;陈旧版本返回 `395014` 且零写入。 - 景区已有未完成订单时继续按既有规则返回 `395059`,不允许解绑。 ## 六.6、修改前后对比 | 字段 / 行为 | 改前 | 改后 | |---|---|---| | `changeReason` | 必填 | 可省略;非空请求继续兼容 | | 关系版本、权限与业务门禁 | 必须满足 | 不变 | ## 六.7、影响评估 - **是否破坏向后兼容**: 否。 - **前端是否必须同步上线**: 是,移除解绑原因弹框及必填校验。 - **前端 workaround 清理点**: 删除为了满足旧契约而填写或生成解绑原因的逻辑。 ## 七、不影响范围 - 仅影响资源供应商解绑请求的 `changeReason` 必填性。 - 设置与改绑契约、响应字段、错误码数值、数据库结构、Redis、MQ、Feign 和网关路由均不变。 ## 八、测试环境已验证 TEST Gateway 已验证省略原因的解绑成功并恢复原关系基线;匿名、缺版本、501 字原因及陈旧版本请求均被拒绝且零写入,原有携带原因的解绑继续成功。 **当前状态:后端已交付,待前端处理。** ## 九、相关历史 PR | PR | Issue | 说明 | 是否仍有效 | |---|---|---|---| | #7358 | #7357 | 景区设置及改绑免原因,不覆盖解绑 | 是 | | #7401 | #7400 | 全部资源供应商解绑免原因 | 是,最新 | ## 十、相关文档 - 关联工单:[#7400](https://git.1814.love:8443/wx/HL/issues/7400) - 后端 PR:[#7401](https://git.1814.love:8443/wx/HL/pulls/7401) ## 关联 / 联系人 - Merge commit:[49a05cfb](https://git.1814.love:8443/wx/HL/commit/49a05cfb83723ae9d72471c1927cf034961a5010) - 后端负责人:@lc