|
|
|
@ -179,7 +179,7 @@ crm-opportunity → crm-rule(阶段模板 / 方案卡模板 / 公海规则 |
|
|
|
| E4 | 暂缓 | `PauseCmd` | 2→3 | 保留 owner + 团队;写 `pause_time`=now + `pause_reason`(字典) + `pause_expected_restart_date`(必填≥今天) + `pause_remark` | A3-1-1-2-6 | |
|
|
|
| E5 | 取消暂缓 | `ResumeCmd` | 3→2 | 保留 owner;回暂缓前阶段(阶段字段未动);清暂缓附加字段(`pause_time`/`pause_reason`/`pause_expected_restart_date`/`pause_remark`);**回收锚点顺推(grill 拍板 20260821)**:`last_valid_follow_time += now−pause_time`(把暂缓时长从未跟进时长中扣除,等价「暂缓期间冻结回收」);此后回收判定回归无状态实时比较 | A3-1-1-2-6(取消按钮) | |
|
|
|
| E6 | 关闭 | `CloseCmd` | 2,3→4 | 保留 owner(只读锁定);记关闭原因(字典) + 补充说明(选「其他」时必填) + 确认勾选 | A3-1-1-2-9 | |
|
|
|
| E7 | 重启 | `ReopenCmd` | 4→2 | 保留 owner;记重开原因(必填);统一回「推进中」 | A3-1-1(重新开启入口) | |
|
|
|
| E7 | 重启 | `ReopenCmd` | 4→2 | 保留 owner;记重开原因(必填);统一回「推进中」;**不刷 `last_valid_follow_time`——长期关闭后重启可能被 E10 立即回收,属规格空白待产品拍板**(code review 20260824 注记;票 04 按现稿实现:锚点维持原值) | A3-1-1(重新开启入口) | |
|
|
|
| E8 | 转项目 | `ConvertToProjectCmd` | 2→5 | **本期可达触发源 = 仅特殊路径:项目侧建项目关联商机后回调(A5 调 `OpportunityConvertPort`)**;① 标准路径(推送方案卡→系统建项目)**本期不可达、随推送票 spin-out**(grill 拍板 20260821);无独立「转项目」动作;保留 owner(锁死);列表「转项目」按钮 = 推送流程快捷入口(推送票落地后启用) | A3-1-1-2-x(转项目) | |
|
|
|
| E9 | 移交 | `HandoverCmd` | 2,3→自环 | 换 owner = 移交对象 + 姓名/部门快照同步刷新(`owner_dept_id` 换为移交对象部门,公海规则匹配锚点跟人走,grill 补拍 20260821);`claim_time` 不重置;**同步维护 team 表(grill 拍板 20260821)**:① 新负责人 upsert 一条 team 行、角色标签=「商机负责人」(已是成员则改标签);② 原负责人 team 行角色标签从「商机负责人」改为普通协作(保留其权限列不动——角色不带权限,原负责人是否还能写取决于其 team 行原本权限),**留在团队继续协作、落入「我参与的」**;入口在团队成员页 | A3-1-1-1-8(团队成员 Tab) | |
|
|
|
| E10 | 超时回收 | `executeRecycle` | 2→1(批量) | 清 `owner_user_id` + `owner_name_snapshot` + `claim_time`;`owner_dept_id` 保留定公海可见范围;`pool_reason`=超期回收;保留 `current_stage_id` 快照;暂缓中(3)**不参与回收**;实际执行的规则版本快照写 `opportunity_oplog`(§5.4) | **crm-opportunity 自建 `@Scheduled` 单 Job**(先提醒后回收串行,对齐线索域 ADR-0019 竞态规避;cron 配置占位符默认每日凌晨,grill 补拍 20260821) | |
|
|
|
@ -199,9 +199,9 @@ crm-opportunity → crm-rule(阶段模板 / 方案卡模板 / 公海规则 |
|
|
|
### 3.4 守卫与 CAS |
|
|
|
|
|
|
|
- **无「操作人==负责人」guard**:商机侧详情页顶部操作区动作可见即可点,权限全由权限点决定(票 01 产品明确)。 |
|
|
|
- CAS 乐观锁:每条迁移边在 `WHERE id=? AND opp_status IN (合法起始态)` 执行;更新 0 行抛 `CODE_STATUS_NOT_ALLOWED`。 |
|
|
|
- CAS 乐观锁:每条迁移边在 `WHERE id=? AND opp_status IN (合法起始态)` 执行;更新 0 行抛 `CODE_CAS_FAIL`(此处原误记 STATUS_NOT_ALLOWED,回填 20260824——两级口径以票 04 正文为准:前置守卫非法起始态抛 `CODE_STATUS_NOT_ALLOWED`,CAS 0 行抛 `CODE_CAS_FAIL`,对称 ADR-0021/lead 实现)。 |
|
|
|
- 移交 E9 CAS:`WHERE id=? AND opp_status IN (2,3) AND owner_user_id=?原owner`(防并发移交/抛公海竞态)。 |
|
|
|
- 操作日志(P6):每条 Cmd 执行后 INSERT 一条 `opportunity_oplog`,含动作类型/操作人/时间/附加说明。 |
|
|
|
- 操作日志(P6):每条 Cmd 执行后落状态迁移快照 `opportunity_status_history`(票 04 已实现:op_type + from/to status + detail JSON);通用字段级审计 `opportunity_oplog`(§7.7)由统一审计切面记状态流转的 opp_status 字段变更,两者并存不重复(回填澄清 20260824)。 |
|
|
|
|
|
|
|
### 3.5 `pool_reason` 枚举(进入公海原因) |
|
|
|
|
|
|
|
|