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.
 
 
 
 
 
 

3.4 KiB

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/statussaveOrUpdate 改停用两路同拦(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 补键值。