@@ -0,0 +1,144 @@
|
||||
---
|
||||
schema: "hl-changelog/v2"
|
||||
ticket: "7357"
|
||||
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: "后端已部署并验证;待前端移除景区改绑原因弹框。"
|
||||
updated_at: "2026-09-09"
|
||||
base: "dev-v3"
|
||||
---
|
||||
|
||||
# 景区改绑供应商免变更原因
|
||||
|
||||
## 一、关键变化
|
||||
|
||||
景区改绑也可省略 `changeReason`。选择新供应商后直接提交,去掉“改绑供应商—变更原因”弹框;首次添加已完成的免原因行为继续保留。
|
||||
|
||||
## 二、变更接口清单
|
||||
|
||||
| # | 接口 | 方法 | 路径 | 变更类型 | 说明 |
|
||||
|---|---|---|---|---|---|
|
||||
| 1 | 设置或改绑供应商 | PUT | `/admin/supplier/resource-relations/{resourceModule}/{resourceId}/update` | 修改接口 | 景区改绑原因改为可选 |
|
||||
|
||||
## 三、接口详情
|
||||
|
||||
### 1. 设置或改绑供应商 `PUT /admin/supplier/resource-relations/{resourceModule}/{resourceId}/update`
|
||||
|
||||
**VO**: `SupplierResourceReassignReqVO / SupplierResourceRelationRespVO`
|
||||
|
||||
#### 使用场景
|
||||
|
||||
景区管理选择目标供应商后提交添加或改绑。
|
||||
|
||||
#### 入参
|
||||
|
||||
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|
||||
|---|---|---|---|---|---|
|
||||
| `resourceModule` | Path | String | 是 | 景区为 `SCENIC` | 本次放宽仅适用于景区 |
|
||||
| `resourceId` | Path | String | 是 | 正整数 | 景区 ID |
|
||||
| `supplierId` | Body | String | 是 | 正整数 | 新供应商 ID |
|
||||
| `expectedCurrentSupplierId` | Body | String | 改绑必填 | 与版本时间成对提交 | 当前关系的供应商 ID |
|
||||
| `expectedRelationUpdateTime` | Body | String | 改绑必填 | `yyyy-MM-dd HH:mm:ss` | 当前关系的 `updateTime` |
|
||||
| `changeReason` | Body | String | 景区可省略 | 最长 500 字 | 省略、null、空串、空白均视为未填;无需补默认原因 |
|
||||
| `requiredTypeCode` | Body | String | 否 | 最长 64 字 | 景区可省略,由后端确定为 `SCENIC` |
|
||||
| `remark` | Body | String | 否 | 最长 500 字 | 关系备注,继续按原表单组装 |
|
||||
|
||||
#### 出参
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|---|---|---|
|
||||
| `code` / `message` / `success` | Integer / String / Boolean | 业务结果 |
|
||||
| `data.relationId` / `supplierId` / `supplierNo` / `supplierName` | String | 生效关系及供应商标识、全称 |
|
||||
| `data.resourceModule` / `moduleName` / `resourceId` / `resourceName` | String | 资源模块及资源信息 |
|
||||
| `data.requiredTypeCode` / `requiredTypeName` | String | 要求的供应商类型 |
|
||||
| `data.remark` | String 或 null | 关系备注 |
|
||||
| `data.available` / `unavailableReasons` | Boolean / Array | 关系可用性及原因 |
|
||||
| `data.createTime` / `updateTime` | String | 关系时间;后续改绑使用最新 `updateTime` |
|
||||
|
||||
#### 请求示例
|
||||
|
||||
以下 ID 为示例,版本时间必须取当前关系返回值。
|
||||
|
||||
```http
|
||||
PUT /admin/supplier/resource-relations/SCENIC/3001000000000000015/update
|
||||
Content-Type: application/json
|
||||
|
||||
{"supplierId":"2000000000000000022","expectedCurrentSupplierId":"2000000000000000011","expectedRelationUpdateTime":"2026-09-09 10:00:00"}
|
||||
```
|
||||
|
||||
#### 响应示例
|
||||
|
||||
```json
|
||||
{"code":200,"message":"成功","success":true,"data":{"relationId":"2000000000000000031","supplierId":"2000000000000000022","supplierNo":"SUP2000000000000000022","supplierName":"示例新供应商","resourceModule":"SCENIC","moduleName":"景区管理","resourceId":"3001000000000000015","resourceName":"示例景区","requiredTypeCode":"SCENIC","requiredTypeName":"景区管理","remark":null,"available":true,"unavailableReasons":[],"createTime":"2026-09-09 10:01:00","updateTime":"2026-09-09 10:01:00"}}
|
||||
```
|
||||
|
||||
#### 空数据 / 降级响应
|
||||
|
||||
无空成功结果;校验失败返回 `data: null`、`success: false`。
|
||||
|
||||
#### 错误响应
|
||||
|
||||
```json
|
||||
{"code":395014,"message":"数据已被他人修改,请刷新后重试","data":null,"success":false}
|
||||
```
|
||||
|
||||
#### 业务边界
|
||||
|
||||
- 使用现有登录凭证及关系维护权限;目标供应商仍须符合既有状态、类型和资格要求。
|
||||
- 改绑须携带完整且最新的两个版本字段;过期返回 `395014`,不覆盖当前关系。原来携带原因的请求继续兼容。
|
||||
|
||||
## 四、契约约束与正确调用方式
|
||||
|
||||
改绑提交 `supplierId` 和两个 `expected*` 字段,可完全不传 `changeReason`。两个版本字段仅传一个会返回 `400`;已有关系却完全省略版本字段仍按原规则拒绝。
|
||||
|
||||
## 五、数据库行为
|
||||
|
||||
成功后切换当前供应商并保留新旧关系变更记录;未填原因记录为空,失败不改写关系。相同业务请求重放不产生重复变更。
|
||||
|
||||
## 六、边界行为
|
||||
|
||||
未登录返回 `401`;缺少目标供应商或原因超过 500 字返回 `400`。业务失败可能使用 HTTP 200,应同时判断响应体 `code` 和 `success`。
|
||||
|
||||
## 六.6、修改前后对比
|
||||
|
||||
| 场景 | 原来 | 现在 |
|
||||
|---|---|---|
|
||||
| 景区改绑 `changeReason` | 必填 | 可省略 |
|
||||
| 改绑关系版本 | 两字段必填 | 保持原规则 |
|
||||
|
||||
## 六.7、影响评估
|
||||
|
||||
- 向后兼容:是,原请求仍可使用。
|
||||
- 前端动作:移除景区改绑的原因弹框及必填校验,确定选择后直接调用接口;保留两个关系版本字段。
|
||||
|
||||
## 七、不影响范围
|
||||
|
||||
非景区添加/改绑、全部解绑的原因要求及现有响应字段保持原契约。
|
||||
|
||||
## 八、测试环境已验证
|
||||
|
||||
景区添加与改绑均完全省略 `changeReason` 成功,当前关系回读一致;原有携带原因的改绑请求成功。缺参、超长原因及旧关系版本均拒绝且零写入。
|
||||
|
||||
**当前状态:后端已部署并验证;待前端处理。**
|
||||
|
||||
## 九、相关历史 PR
|
||||
|
||||
[#7282](https://git.1814.love:8443/wx/HL/pulls/7282) 的首次添加免原因仍有效;其中“景区改绑仍必填”的旧口径由本次补充替代。
|
||||
|
||||
## 十、相关文档
|
||||
|
||||
主工单 [#7274](https://git.1814.love:8443/wx/HL/issues/7274),补充工单 [#7357](https://git.1814.love:8443/wx/HL/issues/7357)。
|
||||
|
||||
## 关联 / 联系人
|
||||
|
||||
- PR:[#7358](https://git.1814.love:8443/wx/HL/pulls/7358)
|
||||
- 后端负责人:@lc
|
||||
在新工单中引用
屏蔽一个用户