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.
4.5 KiB
4.5 KiB
Answer
Status: resolved(重潜触发点:grill Q10 拍板 A/保守 → 第三轮 fresh 复核翻案,20260902 改票 B = 本期不触发、只留 seam)
A. 三态定义(定稿)
| 值 | 名称 | 驱动源 | 本图 |
|---|---|---|---|
| 1 | 潜在客户 | 新建客户成功默认值 | ✅ |
| 2 | 重潜客户 | 关联的任一方案卡「提交并报备成功」 | ⚠ seam(触发链路本期不可达,见 C;本期不自动触发) |
| 3 | 已成交客户 | 关联的任一项目「首次中标赢单」 | ❌ 留 seam 给 A5 |
- 只前进不回退(原型 A4-4-1 §1 明文:方案卡失败/报备失败/商机输单/项目结束均不改变阶段)。
- 不可手动改:阶段条不可点击;无面向前端的 setter API;仅内部 port + 外部回调触发。
- 父子客户不联动:子客户阶段改变不影响父客户(原型无相关规则)。
B. 存储 + 迁移约束(定稿)
customer.customer_stagetinyint default 1(票 02 已落)。- 迁移 SQL 形态:
UPDATE customer SET customer_stage=? WHERE id=? AND customer_stage < ?(只前进 CAS,天然幂等,无需去重表)。 - 迁移失败(已是更高阶段)= no-op 静默成功,不报错不写日志。
- 每次变化:写操作日志(票 07 oplog,操作人=
系统+ 注明触发来源)+ 刷新公共头部。
C. 重潜触发点 — 已翻案(grill Q10 拍板 A/保守 → 第三轮 fresh 复核,20260902 用户拍板 B)
原型 A4-4-1(8-26 fresh 复核确认)明文「任一方案卡提交并报备成功后更新为重潜」——是两个条件(提交 + 报备成功)。「报备/推送成功」在商机图是 spin-out 本期不可达(商机图票 07:方案卡状态=草稿1/已提交2/已推送3;推送链路本期不可达,仅 A5 回调特殊路径可达)。
旧拍板(grill Q10=A/保守,已废):曾决定本期先按「方案卡状态=已提交(2)」凑合触发重潜,理由是怕客户阶段永久卡在潜在。
✅ 新拍板(第三轮复核,20260902 用户选 B = 严格/不凑合):本期不自动触发潜在→重潜。理由:①原型要的是「提交并报备成功」两个条件,用「已提交」单条件凑合会造出「提交了但报备没成功、客户却已重潜」的错误状态,污染阶段派生字段;②CustomerStagePort.promote 的 seam 全部保留(契约、只前进 CAS、幂等),只是本期无调用方;③ 待报备成功链路就绪(方案卡「已推送(3)」或 A5 回调)后,由该链路调用 promote(customerId, 2, "scheme_card_reported") 触发重潜,改动是接入调用点、非改状态机。本期客户阶段实际只有「潜在」(字段/枚举/CAS 机制仍按三态建好)。
D. seam 契约(定稿)
// crm-customer 侧暴露的端口(消费方 = crm-opportunity 方案卡 / 未来 A5 项目)
public interface CustomerStagePort {
/** 提升阶段;只前进,传入更低阶段 = no-op;返回提升后阶段 */
int promote(Long customerId, int targetStage, String triggerSource);
}
triggerSource示例:scheme_card_reported(方案卡提交并报备成功,本期链路不可达 seam)/project_won(已成交,A5 seam 占位)。已弃用(D20 改票 B,不用「已提交」凑合)。scheme_card_submitted- crm-opportunity 方案卡状态机在「已提交」迁移边(或收紧后「已推送」边)同步调用此 port(对称 lead→opp port 的同步事务内调用范式;失败抛异常使方案卡事务回滚?→ 不:阶段提升失败不阻断方案卡提交,记日志降级,见 E)。
E. 失败语义(定稿,重要)
- 阶段提升失败不阻断主业务:方案卡提交成功但客户阶段提升失败时,方案卡正常提交,阶段提升记日志告警 + 可重试(幂等 no-op 使重试安全)。
- 理由:客户阶段是派生冗余视图(由业务成功结果驱动),不是主业务的一致性边界;用「尽力而为 + 幂等重试」而非「同步强一致回滚」,避免一个派生字段的失败拖垮方案卡主流程。
- 对称:lead→opp port 是强一致(建商机失败回滚线索),但那是主业务;customer_stage 是派生,弱一致即可。
F. 回填 / 下游
- 票 02:
customer_stage已含。 - 票 07:oplog 记录阶段变化(操作人=系统)。
- 票 01:CONTEXT.md 术语「客户阶段」。