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.
57 lines
4.5 KiB
57 lines
4.5 KiB
|
4 days ago
|
|
||
|
|
## 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_stage` tinyint 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 契约(定稿)
|
||
|
|
|
||
|
|
```java
|
||
|
|
// 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 占位)。~~`scheme_card_submitted`~~ 已弃用(D20 改票 B,不用「已提交」凑合)。
|
||
|
|
- crm-opportunity 方案卡状态机在「已提交」迁移边(或收紧后「已推送」边)**同步调用**此 port(对称 lead→opp port 的同步事务内调用范式;失败抛异常使方案卡事务回滚?→ **不**:阶段提升失败**不阻断**方案卡提交,记日志降级,见 E)。
|
||
|
|
|
||
|
|
### E. 失败语义(定稿,重要)
|
||
|
|
|
||
|
|
- **阶段提升失败不阻断主业务**:方案卡提交成功但客户阶段提升失败时,方案卡正常提交,阶段提升记日志告警 + 可重试(幂等 no-op 使重试安全)。
|
||
|
|
- 理由:客户阶段是**派生冗余视图**(由业务成功结果驱动),不是主业务的一致性边界;用「尽力而为 + 幂等重试」而非「同步强一致回滚」,避免一个派生字段的失败拖垮方案卡主流程。
|
||
|
|
- 对称:lead→opp port 是强一致(建商机失败回滚线索),但那是**主业务**;customer_stage 是**派生**,弱一致即可。
|
||
|
|
|
||
|
|
### F. 回填 / 下游
|
||
|
|
|
||
|
|
- **票 02**:`customer_stage` 已含。
|
||
|
|
- **票 07**:oplog 记录阶段变化(操作人=系统)。
|
||
|
|
- **票 01**:CONTEXT.md 术语「客户阶段」。
|