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.
 
 
 
 
 

2.7 KiB

05 修复:P0-1 池删除守卫(跨模块 seam)

Type: task Status: resolved Blocked by: 02

Question

按 ticket 02 的裁决修复 P0-1(若判"实现遗漏"):删除公海池前校验"池下无非终态线索"(status ∈ 未分发/待领取/已领取/跟进中 = 1,2,3,4),有活跃线索则拒删并抛 CODE_POOL_HAS_ACTIVE_LEAD(64005);单条 deletePool() 与批量 deletePoolBatch() 都要守(批量逐条校验,失败项记 PoolBatchFailReason.HAS_ACTIVE_LEAD,部分成功)。

必须解决的设计点(模块边界铁律):crm-rule 不得依赖 crm-lead,但守卫要查 lead 表。候选方案:

  • A(预期方向):crm-rule 定义出站端口(如 PoolLeadOccupationPort,方法 countActiveLeads(poolId)hasActiveLeads(poolId)),crm-lead 提供 Spring 实现(crm-lead 本就依赖 crm-rule,依赖倒置不破坏方向)。先例:OpportunityCreationPort(crm-lead 定义端口等商机实现,方向相反的同型模式)。
  • B:crm-rule 直接 SQL 查 lead 表——无 Java 依赖但 DB 层耦合,违背 seam 精神,不推荐。
  • C:删除编排上移 crm-lead——但删除端点在 crm-rule controller,改动面大,不推荐。

定案 A(或论证推翻)后按仓库规则出 ADR + 更新 crm-rule/crm-lead 双方 CONTEXT.md(跨模块 seam 文档化铁律)。

验收:新增单测(有活跃线索拒删 / 仅终态线索放行 / 批量部分成功含 HAS_ACTIVE_LEAD 失败项)+ mvn test(crm-rule、crm-lead)全绿 + 改动文件 BOM 扫描。

Answer

已实施完毕(2026-08-19),方案 A 落地:

  • Port 接口 crm-rule/src/main/java/com/crm/rule/port/outbound/PoolLeadOccupationPort.java——hasActiveLeads(Long poolId): boolean
  • 实现 crm-lead/src/main/java/com/crm/lead/adapter/PoolLeadOccupationAdapter.java——@Component,查 lead 表 eq(poolId).in(status, 1,2,3,4) count>0
  • deletePool 守卫 LeadPoolServiceImpl——ObjectProvider<PoolLeadOccupationPort> 可选注入;port=null→fail-safe 抛 CODE_POOL_INVALID;port.hasActiveLeads=true→抛 CODE_POOL_HAS_ACTIVE_LEAD(64005)
  • 批量 deletePoolBatch 逐条委派 self.deletePool(已有逻辑不变),失败项自动按 64005 映射 PoolBatchFailReason.HAS_ACTIVE_LEAD偿还 ADR-0023 D5 决策债
  • ADR-0025 + crm-rule/CONTEXT.md + crm-lead/CONTEXT.md 三件套齐
  • 单测 4 例(LeadPoolServiceImplTest):有活跃线索拒删 / port null fail-safe / 放行 / 批量部分失败 HAS_ACTIVE_LEAD
  • mvn test:crm-rule 26 tests 0 failures / crm-lead 70 tests 0 failures / BUILD SUCCESS
  • BOM 扫描:全部通过(UTF-8 无 BOM)