1. 将线索状态机坍缩为深模块
crm-lead/.../service/impl/LeadServiceImpl.java (738 行)
crm-lead/.../job/LeadRecycleJob.java
crm-lead/.../job/LeadExpireJob.java
crm-lead/.../event/PoolChangedEventListener.java
Before — 状态机散落 9 处
- • 7 方法各自 if-else 校验状态、构建 wrapper
- • 2 Job 绕过 service,用魔法数字硬编码状态
- • CAS 调用不一致:4 处用 casUpdate(),3 处内联
After — 一个深模块收拢全部迁移
- • 9 个调用点 to 1 个 interface
- • 状态规则集中声明,魔法数字消除
- • 纯逻辑可零 mock 测试
Problem
7 态状态机的迁移规则隐式散落在 7 个 service 方法 + 2 个定时任务中。理解"从已领取能走到哪"需要读 5 个方法。Job 用魔法数字 3,4 替代 STATUS_CLAIMED。CAS 调用方式不统一——4 处走 casUpdate() helper,3 处内联 baseMapper.update()。
Solution
提取 LeadTransition 深模块:声明全部 (from, action) to (to, sideEffects) 规则,暴露 execute(leadId, action) 一个方法做 CAS + 副作用 + history。Service 和 Job 都调它。
Wins