diff --git a/changelogs-v2/2026-08/26_6343_供应商新建修改允许供应商类型为空-修改接口-管理后台.md b/changelogs-v2/2026-08/26_6343_供应商新建修改允许供应商类型为空-修改接口-管理后台.md new file mode 100644 index 00000000..fa0d7d3e --- /dev/null +++ b/changelogs-v2/2026-08/26_6343_供应商新建修改允许供应商类型为空-修改接口-管理后台.md @@ -0,0 +1,74 @@ +--- +schema: "hl-changelog/v2" +ticket: "6343" +title: "供应商新建修改允许供应商类型为空" +consumer: "admin" +author: "lc(GIT)" +change_type: "修改接口" +backend_status: "deployed" +gateway_status: "verified" +frontend_status: "not_required" +frontend_owner: "" +frontend_ref: "" +target_release: "" +verified_at: "2026-08-26" +status_note: "PR #6385 已合并 dev-v3,合并提交 b8d99f58 已部署到 TEST。供应商创建草稿的 types 可省略、传 null 或空数组;更新省略 types 保持原关系,显式空数组清空无资源占用的类型;注册提交仍至少需要一个类型。" +updated_at: "2026-08-26" +base: "dev-v3" +--- + +# 供应商新建修改允许供应商类型为空 + +供应商草稿阶段不再强制选择供应商类型。创建草稿可不传类型,编辑草稿也可显式清空全部未被资源占用的类型;注册提交的完整性门禁保持不变。 + +## 变更接口 + +| 方法 | 路径 | 行为变化 | +|---|---|---| +| POST | `/admin/supplier/items/add` | `types` 省略、为 `null` 或空数组时均可创建无类型草稿;非空时继续校验最多 15 项、生效字典值和唯一性 | +| PUT | `/admin/supplier/items/{supplierId}/update` | 省略 `types` 时保持原类型关系;显式传空数组时清空全部无资源占用的类型;非空快照继续执行原校验 | +| POST | `/admin/supplier/items/{supplierId}/submit` | 行为不变:没有供应商类型时仍拒绝提交注册 | +| GET | `/admin/supplier/items/{supplierId}/basic-info/view` | 无类型供应商的 `types` 返回空数组 | + +字段名和 JSON 类型没有变化。`types` 非空时仍提交对象数组,类型值来自供应商类型生效字典。 + +## 校验与错误语义 + +- 创建无类型草稿仅放宽草稿保存,不放宽注册提交、审批或状态机。 +- 更新显式清空前仍检查资源关系占用;存在有效资源关系的类型不能被移除,失败时主体、类型关系和审计保持零变化。 +- 无类型草稿提交继续返回既有业务错误码 `395008`,草稿状态和并发版本不变。 +- 非空类型继续校验最多 15 项、生效字典值、重复值和主类型约束。 +- 业务失败可能仍使用 HTTP 200,客户端必须同时检查统一响应的 `code`、`success`、`message` 和 `data`。 + +## 兼容性与前端事项 + +- 管理端请求字段和响应结构不变,现有非空类型流程无需调整,因此无前端源码变更。 +- 无类型供应商仍可被列表和详情读取;客户端应兼容 `types: []`。 +- 不新增数据库 migration,不修改配置、Gateway、Redis、MQ、Nacos、Feign 或跨服务写入。 +- 本次不自动修改历史数据,也不绕过既有权限、数据范围、软删除、资源占用和审计规则。 + +## 验证证据 + +- 合并后独立审计:#6343 相关跨层定向 153 项零失败;Resource 最新目标分支全量 2111 项零失败、38 项仓库既有条件跳过;`git diff --check` 通过。 +- TEST 运行态:服务器后端仓库为 `dev-v3` 的 `1a16a5aec`,包含合并提交 `b8d99f58c`;`hl-resource-service` 的 8082、8182 双实例均监听。 +- 真实 Gateway 正向:`types` 省略、`null`、空数组分别成功创建三个 `DRAFT`,详情均返回空类型数组;带一个生效类型的草稿创建成功。 +- 更新语义:省略 `types` 后原一项类型保持不变,显式 `types: []` 后详情返回空数组。 +- 状态门禁:无类型草稿提交返回 `395008`,状态仍为 `DRAFT`、版本不变,确认零写入。 +- 权限门禁:未登录请求返回业务码 401,真实 `CUSTOMIZER` 返回 `395002`,两者均通过列表回读确认零写入;正向使用真实 `SUPER_ADMIN` 身份。 +- 清理:四条成功创建的 TEST 草稿全部删除;逐条详情返回 `395001`,按随机全名查询均为零条,没有留下测试业务数据。 + +## 撤回 + +1. 从最新 `dev-v3` 创建回退分支,执行 `git revert -m 1 --no-edit b8d99f58c84daa12ef50d68bcc3090f38f57a22d`,经独立 PR 合入。 +2. 通过 Deploy Panel API 重新构建并滚动部署 `hl-resource-service`,复核 8082、8182 双实例和 Nacos 健康状态。 +3. 无数据库、配置、Redis 或 MQ 变更,不执行 DDL、DML、缓存清理或消息补偿;不要回退后续无关工单的提交或 migration。 +4. 回退前让调用方恢复创建时至少提交一个生效类型,并停止更新时发送 `types: []`;更新不改类型时继续省略该字段。 +5. 回退后经 Gateway 复测非空类型创建、更新省略保持、无类型创建拒绝、无类型提交拒绝、资源占用移除保护和越权零写入。 + +## 关联 / 联系人 + +- **Issue**: [#6343](https://git.1814.love:8443/wx/HL/issues/6343) +- **PR**: [#6385](https://git.1814.love:8443/wx/HL/pulls/6385) +- **功能提交**: [d625f0448](https://git.1814.love:8443/wx/HL/commit/d625f04489655e11982b9baeeb45d74ba4f7c0e1) +- **合并提交**: [b8d99f58c](https://git.1814.love:8443/wx/HL/commit/b8d99f58c84daa12ef50d68bcc3090f38f57a22d) +- **后端负责人**: @lc