景区首次设置供应商免变更原因(#7274)
changelog-filename-gate / validate (push) Successful in 2s

这个提交包含在:
lc
2026-09-07 16:55:26 +08:00
父节点 8347561971
当前提交 eba4d9e7dc
@@ -0,0 +1,175 @@
---
schema: "hl-changelog/v2"
ticket: "7274"
title: "景区首次设置供应商免变更原因"
consumer: "admin"
author: "lc(GIT)"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "pending"
frontend_owner: ""
frontend_ref: ""
target_release: ""
verified_at: ""
status_note: "后端已部署并通过 TEST Gateway 验证;景区首次设置可省略原因。当前状态:待前端移除“设置供应商”原因弹框并在确定选择后直接提交。"
updated_at: "2026-09-07"
base: "dev-v3"
---
# 景区管理:首次设置供应商免变更原因
## 一、关键变化
景区尚未绑定供应商时,用户选择供应商并点击“确定选择”后应直接调用设置接口;不再打开“设置供应商”变更原因弹框,也不需要提交 `changeReason`。
## 二、变更接口清单
| # | 接口 | 方法 | 路径 | 变更类型 | 说明 |
|---|---|---|---|---|---|
| 1 | 设置或改绑资源供应商 | PUT | `/admin/supplier/resource-relations/{resourceModule}/{resourceId}/update` | 请求必填性调整 | 仅 `SCENIC` 首次设置允许省略 `changeReason` |
## 三、接口详情
### 1. 设置或改绑资源供应商 `PUT /admin/supplier/resource-relations/{resourceModule}/{resourceId}/update`
**VO**: `SupplierResourceReassignReqVO / SupplierResourceRelationRespVO`
#### 使用场景
景区管理选择候选供应商后,首次设置直接提交;同一路径继续兼容原有改绑流程。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|---|---|---|---|---|---|
| `resourceModule` | Path | String | 是 | 景区固定为 `SCENIC` | 当前资源模块 |
| `resourceId` | Path | String | 是 | 正整数 | 景区 ID |
| `supplierId` | Body | String | 是 | 正整数 | 选中的供应商 ID |
| `changeReason` | Body | String | 条件必填 | 最长 500 字 | `SCENIC` 首次设置可省略;景区改绑及其他资源设置/改绑仍必填 |
| `expectedCurrentSupplierId` | Body | String | 改绑必填 | 与版本时间同传 | 当前关系供应商 ID |
| `expectedRelationUpdateTime` | Body | String | 改绑必填 | `yyyy-MM-dd HH:mm:ss` | 当前关系的 `updateTime` |
| `requiredTypeCode` | Body | String | 否 | 最长 64 字 | 景区沿用既有规则,可省略 |
| `remark` | Body | String | 否 | 最长 500 字 | 关系备注 |
#### 出参
| 字段 | 类型 | 说明 |
|---|---|---|
| `data.relationId` | String | 当前关系 ID |
| `data.supplierId` / `supplierName` | String | 生效供应商 ID / 全称 |
| `data.resourceModule` / `resourceId` | String | 资源模块 / 资源 ID |
| `data.requiredTypeCode` | String | 景区为 `SCENIC` |
| `data.available` / `unavailableReasons` | Boolean / Array | 当前可用性及原因 |
| `data.updateTime` | String | 后续改绑或解绑使用的关系版本 |
| 其他既有字段 | - | 响应字段和语义均未变化 |
#### 请求示例
```http
PUT /admin/supplier/resource-relations/SCENIC/3001000000000000015/update
Authorization: Bearer <当前有效凭证>
Content-Type: application/json
{"supplierId":"2094247871271350274"}
```
#### 响应示例
```json
{
"code": 200,
"message": "成功",
"data": {
"relationId": "2096882924480589826",
"supplierId": "2094247871271350274",
"supplierNo": "SUP2094247871271350274",
"supplierName": "示例景区供应商",
"resourceModule": "SCENIC",
"moduleName": "景区管理",
"resourceId": "3001000000000000015",
"resourceName": "示例景区",
"requiredTypeCode": "SCENIC",
"requiredTypeName": "景区管理",
"remark": null,
"available": true,
"unavailableReasons": [],
"createTime": "2026-09-07 16:47:02",
"updateTime": "2026-09-07 16:47:02"
},
"success": true
}
```
#### 空数据 / 降级响应
没有空成功数据;校验或依赖失败时返回业务错误和 `data: null`,不会降级为成功,也不会创建或改写关系。
#### 错误响应
```json
{"code":400,"message":"changeReason不能为空","data":null,"success":false}
```
#### 业务边界
- 只有 `SCENIC` 且当前无供应商关系的首次设置可省略 `changeReason`。
- 景区改绑仍须提交两个并发版本字段和非空原因;其他资源设置/改绑与所有解绑行为不变。
- 权限、资源数据范围、供应商状态与资格门禁不变。
## 四、契约约束与正确调用方式
- 当前资源模块为 `SCENIC` 且没有现有关系时,供应商选择器点击“确定选择”后立即提交上述 PUT,请求体不要补默认原因或空原因。
- 提交成功后结束设置流程,不再打开 `SupplierRelationModal` 中的“设置供应商”原因弹框。
- 景区已有关系时仍按改绑流程提交两个并发版本字段和非空 `changeReason`。
- 非景区资源的首次设置、改绑,以及所有资源的解绑流程均保持原原因校验和弹框行为。
## 五、数据库行为
首次设置成功后可立即查询到当前关系,并追加一条原因为空的关系变更审计;后端不会生成默认或伪造原因。校验失败时关系与审计均不变化。本次没有表结构或存量数据迁移。
## 六、边界行为
- 景区显式改绑省略 `changeReason`:`code=400`、`success=false`,消息为 `changeReason不能为空`。
- 未登录:应用响应 `code=401`、`success=false`。
- 业务错误可能仍使用 HTTP 200,调用方必须同时判断响应体 `code` 和 `success`。
- 无新增响应字段、错误码、枚举或接口路径。
## 六.6、修改前后对比
| 场景 | 修改前 | 修改后 |
|---|---|---|
| `SCENIC` 首次设置 | 原因必填,确定选择后打开原因弹框 | 原因可省略,确定选择后直接完成设置 |
| `SCENIC` 改绑 | 原因与并发版本必填 | 不变 |
| 其他资源设置/改绑、解绑 | 原因必填 | 不变 |
## 六.7、影响评估
- **是否破坏向后兼容**: 否;原有携带原因的请求仍可用。
- **前端是否必须同步上线**: 是;后端无法移除前端主动打开的弹框。
- **前端 workaround 清理点**: 景区无现有关系时,删除“确定选择后打开原因弹框”的步骤并直接提交。
## 七、不影响范围
- **仅影响**: 管理后台景区首次设置供应商。
- **零影响**: 景区改绑、其他资源设置/改绑、所有解绑、响应字段、错误码和小程序接口。
## 八、测试环境已验证
- 首次设置请求完全省略 `changeReason`,返回 `code=200`,关系查询与空原因审计一致。
- 匿名设置返回 `401`;景区显式改绑省略原因返回 `400`,失败路径零写入。
- 测试关系已解绑并回读恢复为未绑定状态。
**当前状态:后端已部署并验证;待前端处理。**
## 十、相关文档
- [Issue #7274](https://git.1814.love:8443/wx/HL/issues/7274)
- [PR #7282](https://git.1814.love:8443/wx/HL/pulls/7282)
## 关联 / 联系人
- **Issue**: [#7274](https://git.1814.love:8443/wx/HL/issues/7274)
- **PR**: [#7282](https://git.1814.love:8443/wx/HL/pulls/7282)
- **Merge commit**: [86286f5fdfac0b5e097bf36ab0ac4be757aeaac0](https://git.1814.love:8443/wx/HL/commit/86286f5fdfac0b5e097bf36ab0ac4be757aeaac0)
- **后端负责人**: @lc