You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
32 lines
3.4 KiB
32 lines
3.4 KiB
|
6 hours ago
|
# 04 — crm-dict 管理端规则改造(按票 03 拍板)
|
||
|
|
|
||
|
|
**Type:** task (HITL)
|
||
|
|
**Status:** resolved (20260907)
|
||
|
|
**Blocked by:** 03
|
||
|
|
|
||
|
|
## What to build
|
||
|
|
|
||
|
|
票 03 拍板落地的 crm-dict 侧改造,每项配 H2 集成测试:
|
||
|
|
|
||
|
|
1. **默认项禁停**(拍板 2/5):`/api/dict/item/status` 改停用与 `saveOrUpdate` 改停用两条路都拦默认项,提示「该字典为分组默认项,请先取消默认或指定其他默认项」(新错误码);US-27 测试改写(停用默认 → 拦截)。停用分组的默认休眠语义(US-28)不变。
|
||
|
|
2. **键值被引用后可改**(拍板 4):删 `checkValueMutable` 的 isReferenced 拦截(DictItemServiceImpl.java:169,:262-271),保留同组唯一校验;US-25 测试改写。
|
||
|
|
3. **换组放开**(拍板 6):替换 :91-94/:157-160 的一律禁改组——换组 ∧ 被引用 → 拦(提示「该字典已被引用,不可修改」);未引用 → 目标组存在且启用 + 目标组内**编码/键值双重唯一**重校验 + ref_count 计数行随迁(删旧预新同事务);有存活子项的父项禁换组(先处理子项)。
|
||
|
|
4. **分组 saveOrUpdate 解锁 status**(拍板 5):DictGroupServiceImpl.java:102-105 不再强制保留原值;启用/停用规则与列表行操作一致。
|
||
|
|
5. **字典键值必填**(拍板 3):item saveOrUpdate 空白抛 63001(不再归一 null);存量空值行编辑需补值的迁移提示写进交付说明。
|
||
|
|
6. **(可选增项)GET /api/dict/item/tree?groupCode=**(拍板 10):包装既有 `listTree` 契约,挂 `dict:item:list`,tag 同字典项,供管理页/业务级联。
|
||
|
|
|
||
|
|
**验收**:上述行为 H2 集成测试全绿;全库 `*.java` BOM 扫描过;`mvn compile` 过;AGENTS.md 接口 checklist 对照过(新端点 tree 深 tag / GET 读 / 查询参数传参)。
|
||
|
|
|
||
|
|
## Answer
|
||
|
|
|
||
|
|
6 项全部落地(20260907),crm-dict 53/53 测试全绿,BOM 扫描无命中,`mvn compile` 通过:
|
||
|
|
|
||
|
|
1. **默认项禁停**:新错误码 63013(README 已登记);`/item/status` 与 `saveOrUpdate` 改停用两路同拦(`isGroupDefault` 判定),提示「该字典为分组默认项,请先取消默认或指定其他默认项」;`removeDefaultIfPresent` 仅保留在删除路径
|
||
|
|
2. **键值被引用可改**:删 `checkValueMutable`(US-25 拦截移除),同组唯一校验保留
|
||
|
|
3. **换组放开**:未被引用 ∧ 无存活子项 → 目标组须启用 + 编码/键值目标组内双重唯一重校验 + `migrateRefCountRow`(旧组行删、新组建 ref=0,同事务);被引用拦 63009;子项换组由父项同组校验自然拦截
|
||
|
|
4. **分组编辑弹窗可改状态**:`DictGroupServiceImpl.saveGroup` 编辑分支不再锁 status(核过 GlobalDataBindingAdvice:strip 名单只有审计字段+builtin,status 可正常绑定)
|
||
|
|
5. **字典键值必填**:saveItem 新建/编辑统一空白抛 63001(不再归一 null)
|
||
|
|
6. **GET /api/dict/item/tree?groupCode=** 已暴露(包 DictQueryService.listTree,挂 `dict:item:list`,class tag 沿用字典项)
|
||
|
|
|
||
|
|
测试:DictItemServiceTest 改写 4 例(valueRequired/moveGroupAndIdentityRules/valueMutableWhenReferenced/defaultDisableBlocked)+ 新增 saveOrUpdate 禁停 1 例;DictGroupServiceTest 新增编辑改状态 1 例;DictDataInitializerTest 的种子默认项用例改为 Mapper 直操作模拟历史遗留(服务层已不可停用默认项);DictQueryServiceTest 补键值。
|