status: done created: 2026-08-04 complexity: 🟢简单
字典数据表已经通过数据库唯一索引限制同一租户、同一字典类型下的有效 dict_value 不重复,但新增或修改重复值时只能依赖数据库异常,前端无法获得稳定、清晰的业务提示。
本变更在字典数据新增和修改入口增加业务唯一性校验:同一租户、同一 dict_type 下,未删除字典项的 dict_value 不能重复;修改时排除当前字典项自身。数据库唯一索引继续作为并发写入的最终防线。
forge-server/forge-framework/forge-plugin-parent/forge-plugin-system/src/main/java/com/mdframe/forge/plugin/system/controller/SysDictDataController.java:add、edit 分别调用 insertDictData、updateDictData。forge-server/forge-framework/forge-plugin-parent/forge-plugin-system/src/main/java/com/mdframe/forge/plugin/system/service/impl/SysDictDataServiceImpl.java:当前新增、修改直接调用 MyBatis-Plus insert / updateById,没有业务唯一性预检。forge-server/forge-framework/forge-plugin-parent/forge-plugin-system/src/main/java/com/mdframe/forge/plugin/system/mapper/SysDictDataMapper.java:当前没有字典键值重复查询方法。forge-server/db/migration/V1.0.51__replace_logic_delete_generated_columns.sql 已建立 uk_tenant_dict_data_active (tenant_id, dict_type, dict_value, del_flag)。SysDictData.delFlag 使用 @TableLogic(value = "0", delval = "dict_code"),有效数据为 del_flag = 0,删除后允许同值重建。del_flag = 0;租户条件由租户拦截器追加。dict_code <> 当前值 排除自身,否则仅修改标签等其它属性也会被误判重复。dictCode 后执行相同校验。dictType 标识。dictType + dictValue,只统计 del_flag = 0 的有效记录。dictCode。| 操作 | 表名 | 字段/索引 | 说明 |
|---|---|---|---|
| 无 | sys_dict_data |
复用 uk_tenant_dict_data_active |
不新增或修改 Flyway 脚本 |
| 操作 | 接口 | 方法 | 变更内容 |
|---|---|---|---|
| 行为优化 | /system/dict/data/add |
POST | 重复键值返回明确业务异常 |
| 行为优化 | /system/dict/data/edit |
POST | 排除自身后校验重复键值 |
请求和成功响应协议不变。
forge-plugin-system 字典数据 Mapper、Mapper XML、Service。insertDictData、updateDictData 新增分支及 Mapper 参数传递。test-spec.md。无。按用户原始要求将“同一个字典”解释为同一租户下相同 dictType。
countByDictTypeAndValue(dictType, dictValue, excludeDictCode) 完成业务预检,遵循数据权限可审查约定。BusinessException,新增和修改复用相同提示。| Task | 状态 | 实际改动文件 | 备注 |
|---|---|---|---|
| Proposal | 完成 | spec.md、tasks.md、test-spec.md、execution-log.md |
已完成现状和唯一索引核对 |
| Task 1 | 完成 | SysDictDataServiceImplTest.java、SysDictDataMapper.java/xml、SysDictDataServiceImpl.java |
Red 4/4 失败;Green 4/4 通过 |
| Task 2 | 完成 | 本变更四份 SDD 文档 | 系统插件全量单测 56/56 通过,静态检查通过 |
del_flag = 0,无前端/接口/数据库结构变更。forge-plugin-system 全量测试通过;真实 API/数据库 E2E 未执行并已记录为跳过项。