|
|
|
|
# 商机模块端到端验收报告(e2e-report.md 终稿)
|
|
|
|
|
|
|
|
|
|
> **票 09 聚合产出**(20260828)· 聚合自 `report-core.md`(票 07)+ `report-rules.md`(票 08)+ `seed-data-manifest.md`(票 05)。
|
|
|
|
|
> **票 09 修复后终版回归**(20260830):D-01~D-22 全部闭环(19 已修复 + 3 翻案关闭),全量 148 用例 ✅146/⚠2/❌0 · 缺陷登记 0;缺陷状态逐条见 §四状态列,回归变化见 §二/§三各节末尾,终版快照 `*-t09-final.*`。
|
|
|
|
|
> **票 02 验收回归**(20260831):clean package 重建 + seed v2 基线全量重跑,177 用例 ✅176/⚠1/❌0 · 新增缺陷 0——新增 workplan(票 12 四端点 17/17)与 D-01 fail-fast 专项(7/7)两个验收面;快照 `*-acceptance.*`。
|
|
|
|
|
> **环境**:本地后端 `localhost:8080`(verify profile,`CRM_MINIO_AK=admin`)+ 远程 DB `8.129.84.155`。
|
|
|
|
|
> **数据基线**:seed 12 条 `e2e-` 商机 + F01 新建 1 条(重跑方式见第六章)。
|
|
|
|
|
> **实测脚本**:`e2e-core.py`(F01-F15)+ `e2e-rules.py`(R01-R03),Python requests、flat 路径实测。
|
|
|
|
|
> **判定纪律**:原型 > PRD(`.scratch/opportunity-module/商机业务-PRD.md`)> 票 04 拍板;判 ❌ 前必须核对 flat 实际路径。
|
|
|
|
|
> **图例**:✅ 存在且业务可用|⚠ 行为不符/契约差异/被缺陷阻断|❌ 缺失或真实 bug。
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 一、执行摘要
|
|
|
|
|
|
|
|
|
|
| 维度 | 初验(20260828) | 修复后终版回归(20260830,票 09) | 验收回归(20260831,票 02) |
|
|
|
|
|
|------|------|------|------|
|
|
|
|
|
| 流程覆盖 | 18 流程全部实测 | 同左(含 3 处断言反转 + rules 三条占位断言补真实 publish 顶替断言) | 同左 + workplan 四端点(票 12)+ D-01 fail-fast 专项两个新验收面 |
|
|
|
|
|
| 用例计数 | 104(core)+ 46(rules)= 150:✅ 125 / ⚠ 17 / ❌ 9 | 101(core)+ 47(rules)= **148:✅ 146 / ⚠ 2 / ❌ 0 · 缺陷登记 0**(快照 `*-t09-final.json`) | 106(core)+ 47(rules)+ 17(t12)+ 7(D-01 专项)= **177:✅ 176 / ⚠ 1 / ❌ 0 · 新增缺陷 0**(快照 `*-acceptance.json`) |
|
|
|
|
|
| 缺陷 22 条 | P1×13 / P2×9 / P0×0 | **全部闭环:19 已修复(票 03~06 + 票 09 D-16 收尾)+ 3 翻案关闭(D-08/18/19)**,逐条状态见 §四 | 闭环状态全部保持(全量重跑无回归) |
|
|
|
|
|
| 路由缺失(真 404) | 6 个:关联客户 3 + 团队成员 3 | **0 个**——六写端点已在票 04 落地(F11/F12 探测 HTTP 200 + t04-verify 27/27) | 0 个(保持) |
|
|
|
|
|
| 残留 ⚠(非缺陷) | — | 2 条:F08 MinIO 凭据外部依赖(探针预期失败);F13 工作目标 U08 宽断言(seed 切阶段样例未填 workGoal,非代码问题) | 1 条:F13 工作目标 U08 宽断言(同前);F08 已带凭据完整跑通 ✅ |
|
|
|
|
|
|
|
|
|
|
**三大 P1 主题(已全部收口)**:
|
|
|
|
|
|
|
|
|
|
1. **6 个 404 端点**:关联客户添加/搜索/设主要意向(原型 A3-1-1-2-4、A3-1-1-1-2)+ 团队成员增/删/改(原型 A3-1-1-1-8)——原型有按钮无接口,F11/F12 主流程断链;
|
|
|
|
|
2. **V-CONFIG 版本推进 API 全断**(规则族):编辑发布中/停用版本生成新草稿三族同构 50001 主键冲突(`resolveDraft` 的 `dto.toEntity()` 携带源版本 id insert);
|
|
|
|
|
3. **`opportunity.owner_dept_id` 恒空**:创建/领取/分配/移交均不写部门快照(全表 13/13 NULL)→ 部门专用公海规则永不命中 + DataScope 部门天花板同源失效。
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 二、核心域 F01-F15(e2e-core.py · 初验 ✅86/⚠12/❌6 → 票 09 终版回归 ✅99/⚠2/❌0 → 票 02 验收回归 ✅105/⚠1/❌0)
|
|
|
|
|
|
|
|
|
|
| 流程 | 用例分布 | 关键结论 |
|
|
|
|
|
|------|---------|---------|
|
|
|
|
|
| F01 新建 | ✅6 | `convertible-leads` 下拉接口 ✅(0 条可关联线索);新建成功、初始负责人=当前用户、**U01 复核:初始 oppStatus=2(推进中)**、MINE 视图即刻可见 |
|
|
|
|
|
| F02 四视图 | ✅13 | MANAGE/MINE/PUBLIC_POOL/FOLLOWED/RECENT/PARTICIPATED 全口径 ✅;keyword/statusIn 筛选 ✅;B/MINE 不含公海态、A/MINE 不含 B 商机(范围互斥 ✅);出参回显列(schemeCardStatus/stageStayDays/lastFollowTime)✅ |
|
|
|
|
|
| F03 看板 | ✅2 ⚠1 | MANAGE summary 口径 ✅;cards 首批限量+翻页不重不漏 ✅;**⚠ PUBLIC_POOL summary=7 未按视图状态过滤(视图内公海态=2)** |
|
|
|
|
|
| F04 详情 | ✅4 ⚠1 | view-touch 上报 → RECENT 出现且倒序 ✅;**⚠ detail 六联动字段 null**(节点停留天数/下阶段名/方案卡状态/方案预算/是否关注/最近跟进,PRD §7.9) |
|
|
|
|
|
| F05 编辑 | ✅2 ⚠1 | 编辑回写 ✅;**⚠ P1:暂缓态商机编辑未被拦截(code=0 成功,PRD §3.3 受限出边违反)** |
|
|
|
|
|
| F06 关注 | ✅3 ⚠1 | unfocus/focus/focus-batch 计数全 ✅;B 视角关注 A 商机(跨部门)✅;⚠ focus 后 detail.followed 回显 None |
|
|
|
|
|
| F07 跟进 | ✅4 | 写跟进/分页/删除 ✅;**lastValidFollowTime 刷新(回收锚点)✅** |
|
|
|
|
|
| F08 附件 | ✅6 | MinIO 直传→add→list→delete→download 全链 ✅(凭据 AK=admin);FileInfoDTO 主键=`fileId`(String);bizType 缺省 → 66001(D-21 修复后契约正式用例,票 02 起) |
|
|
|
|
|
| F09 方案卡 | ✅8 ⚠1 | selectable-templates ✅;一客户一卡约束 ✅;草稿→提交 cardStatus 1→2 ✅;**⚠ 提交后主表 schemeBudget/schemeCardStatus 未回显** |
|
|
|
|
|
| F10 勘察 | ✅3 ⚠2 | ⚠ surveySeq 需调用方传入(与「次数自动生成」拍板相反);⚠ 补充说明未强制必填(与拍板相反) |
|
|
|
|
|
| F11 关联客户 | ✅3 ❌3 | list/出参结构/primaryCustomerSnapshot 回显 ✅;**❌ add/search/set-primary 三端点 404** |
|
|
|
|
|
| F12 团队成员 | ✅2 ❌3 | team/list ✅;**❌ add/delete/update 三端点 404**(API 无法造团队成员样例) |
|
|
|
|
|
| F13 日志 | ✅3 ⚠3 | stage/history 留痕 ✅、progress 5 节点 ✅;⚠ **oplog 流转不留痕**(A2 历经 6 种流转仅 2 条 ROW_CHANGE 且 fieldName=null) |
|
|
|
|
|
| F14 状态机 | ✅21 ⚠2 | E1-E9 主边 + CAS 守卫 + 批量接口全 ✅;**⚠ P1:暂缓态可直接关闭**;**⚠ P1:禁领规则版本未生效**(allowFreeClaim=0 发布后仍可领取——U02);poolReason 枚举落库+回显 ✅ |
|
|
|
|
|
| F15 自定义视图 | ✅7 | save(upsert)/list/set-default/delete 全 ✅;scopeKey 域隔离(lead/opportunity 不串)✅;B 的 seed 视图隔离 ✅ |
|
|
|
|
|
|
|
|
|
|
明细证据(请求/响应逐条)见 `report-core.md`;机读 `e2e-core-result.json`。
|
|
|
|
|
|
|
|
|
|
**票 09 终版回归变化**(对照初验,无新增回归):
|
|
|
|
|
|
|
|
|
|
- F03 ⚠→✅:PUBLIC_POOL summary 按视图过滤(D-15,票 06 OpportunityViewFilter)。
|
|
|
|
|
- F04 ⚠→✅:detail 六联动字段全非空(D-16 票 06 四字段 + 票 09 收尾 stageStayDays/nextStageName——口径与列表页计算列同源 describeStages/fillStageStayDays,消 page/detail 口径差)。
|
|
|
|
|
- F05 ⚠→✅:暂缓态编辑 66003 拦截(D-07,票 05);新增 D-14 编辑改空负路径 ✅(66001 逐字段)。
|
|
|
|
|
- F06 ⚠→✅:focus 后 detail.followed 回显(D-16)。
|
|
|
|
|
- F09 ⚠→✅:提交后主表 budget=880000/cardStatus=2 回显(D-17,票 06 submitCard 回写 + seed 主客户冗余列同步维护后回写条件成立)。
|
|
|
|
|
- F10 ⚠⚠→✅✅:断言按 D-18/19 翻案反转(次数需调用方传/说明非强制)。
|
|
|
|
|
- F11/F12 ❌×6→✅:六写端点落地(D-01~06,票 04)。
|
|
|
|
|
- F13 ⚠→✅:oplog 流转留痕 7 条 STATUS_FLOW/opp_status(D-20,票 06);「工作目标文本存在性 ⚠」保留(U08 宽断言,样例未填 workGoal)。
|
|
|
|
|
- F14 ⚠⚠→✅✅:暂缓态关闭按 D-08 翻案记合法边 ✅;禁领 66014 生效(D-09,票 05)。
|
|
|
|
|
- F08 ⚠ 保留:MinIO 凭据外部依赖,附件全链 SKIP(待凭据补跑)。
|
|
|
|
|
|
|
|
|
|
**票 02 验收回归变化**(20260831,clean package 重建 + seed v2 全量重置,✅105/⚠1/❌0,无后端回归):
|
|
|
|
|
|
|
|
|
|
- F08 ⚠→✅:带 MinIO 凭据(`E2E_MINIO_AK/SK`)完整跑通;旧断言「bizType 缺省即 50001 契约矛盾」已过期(D-21 修复后缺省/非法统一 66001)——转为正式负路径用例。
|
|
|
|
|
- F14 批量领取:seed v2(票 11 `ensure_dept_claim_rule`)新增 `e2e-seed冠军团队禁领` 部门专用规则(发布中)覆盖 B2/BPL(owner_dept=冠军团队)→ claim-batch 整批 66014 被拒,转为 **D-09 批量端点禁领守卫的运行时验证用例**(批量正常路径由 t05-verify + 单测覆盖)。
|
|
|
|
|
- F14 U02 禁领段:B1(owner_dept=冠军团队)被 seed 禁领规则永久覆盖,造成「停用禁领版后恢复领取」假阳性 ⚠ → 换 C2(跨中心)验证默认位禁领版本发布/停用周期,⚠→✅。
|
|
|
|
|
- F15 lead 视图:save 无 upsert-by-name、跨轮叠加(上轮已积 13 条)→ f15 开头加清理,opportunity/lead 域隔离断言语义恢复纯净。
|
|
|
|
|
- 残留 ⚠ 仅 1 条:F13 工作目标 U08 宽断言(seed 样例未填 workGoal,配置观察项非代码问题,与票 09 同款)。
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 三、规则族 R01-R03(e2e-rules.py · 初验 ✅39/⚠5/❌3 → 票 09 终版回归 ✅47/⚠0/❌0 → 票 02 验收回归 ✅47/⚠0/❌0)
|
|
|
|
|
|
|
|
|
|
| 流程 | 用例分布 | 关键结论 |
|
|
|
|
|
|------|---------|---------|
|
|
|
|
|
| R01 阶段模板 | ✅16 ⚠2 ❌1 | 负路径 5 连拒(缺名/部门专用无部门/部门专用设默认/固定节点手配 64013、空模板 publish 64017)✅;V1.0 草稿+节点规范化(末位系统补 OPP_STAGE_05 固定节点+seq 重算)✅;草稿原位编辑(版本编码不变)✅;copy 独立新编码 ✅;disable 草稿拒/delete 草稿级联 ✅;**D-01 种子保护(disable 被 64018 拒)✅**;**绑定锁版本(发新模板后 A1 节点集 5 节点不变)✅**;⚠ versions 出参实体直出泄露(P2);**❌ 编辑发布中生新草稿 50001(P1,三族同构根因在此实锤)**;⚠ publish 自我顶替被 P1 阻断(旁证=票 07 U02) |
|
|
|
|
|
| R02 方案卡模板 | ✅12 ⚠1 ❌1 | field-defs 16 项系统字段库 ✅;伪造 fieldKey 拒(64022 快照防伪造)✅;字段项快照回显(fieldName/fieldType 服务层写入)✅;**关显示同步清必填** ✅;空模板 publish 拒 ✅;copy ✅;❌ 编辑发布中同构 50001 |
|
|
|
|
|
| R03 公海规则 | ✅10 ⚠2 ❌1 | 五配置项校验链 5 连拒(64008:缺名/缺 recycleDays/recycleDays=0/remindDays≥recycleDays/未开回收先开提醒)✅;publish 落库 ✅;**U03 配置层:部门专用规则发布+deptIds 绑定回显 ✅**;⚠ U03 生效层按缺陷预期放行(owner_dept_id 恒空不命中部门索引——见缺陷 D-21);❌ 编辑发布中同构 50001 |
|
|
|
|
|
| 清理闭环 | ✅4 | 三族自建规则全部停用/删除,无发布中残留;`e2e-seed公海规则` 仍发布中(F14 前置未破坏) |
|
|
|
|
|
|
|
|
|
|
**V-CONFIG 生命周期实测覆盖说明(票 09 终版)**:新建草稿→编辑→发布→**编辑发布中生新草稿 V1.1(D-10/11/12 票 03 修复后三族全 ✅)→publish V1.1 自我顶替(V1.0 转停用 status=3,票 09 补真实断言三族实测成立)**→绑定生效→复制/删除约束全链 ✅。versions 实体直出泄露 ⚠→✅(D-22,票 06 DTO 白名单化);U03 生效层 ⚠→✅(D-13,票 03 owner_dept_id 落库后部门专用规则可命中)。
|
|
|
|
|
|
|
|
|
|
明细证据见 `report-rules.md`;机读 `e2e-rules-result.json`。
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 三b、工作计划 workplan(票 12 四端点 · t12-verify.py · 票 02 验收回归 17/17)
|
|
|
|
|
|
|
|
|
|
> **断言归属拍板**(票 02):workplan 断言留在 `t12-verify.py` 独立脚本(自带建测清闭环、MARK 时间戳防撞),不合入 e2e-core.py——core 的视图计数断言与 seed 基线强耦合,合入会互相污染;报告层面统一收录,保证验收完整性。
|
|
|
|
|
|
|
|
|
|
| 部件 | 用例 | 关键结论 |
|
|
|
|
|
|------|------|---------|
|
|
|
|
|
| Part L 清理 | ✅1 | 历史残留清理(幂等重跑) |
|
|
|
|
|
| Part A add | ✅5 | 空内容/超 1000 字 → 66001;逾期/临期 deadline 样例落库;ROW_ADD 日志(entityName=opportunity_work_plan) |
|
|
|
|
|
| Part U update | ✅5 | 部分更新放行;登记完成 planStatus=1 服务端回填 finishTime、取消完成清空;planStatus=2 → 66001;目标不存在 → 66002 |
|
|
|
|
|
| Part D delete | ✅3 | 删除后 list 不可见;ROW_DELETE 日志;重复删除 → 66002 |
|
|
|
|
|
| Part P 暂缓禁写 | ✅3 | 暂缓商机 add/update/delete → 66003(与 F05 编辑拦截同守卫族) |
|
|
|
|
|
|
|
|
|
|
明细脚本:`.scratch/opportunity-bugfix/t12-verify.py`(自带建测清闭环,不依赖 seed 基线)。
|
|
|
|
|
|
|
|
|
|
**D-01 fail-fast 专项**(opportunity-fix 口径 · 票 02 运行时断言 7/7)——注意与 §四 D-01(opportunity-bugfix 口径:关联客户 add 404,票 04 已修)是**两个 effort 的同号缺陷**,本节验证的是 opportunity-fix 的 D-01(新建商机 500):
|
|
|
|
|
|
|
|
|
|
- a) fail-fast:DB 临时停用全部发布中阶段模板 → 新建商机 → **60001「系统未配置发布中的商机阶段模板,无法新建商机,请联系管理员在后台发布商机阶段模板」**(OpportunityIntakeException → OpportunityCreateServiceImpl seam 译 BusinessErrorException);finally 恢复后新建恢复正常(fail-fast 不留痕)。
|
|
|
|
|
- b) 预设保护:`OPP_STAGE_TPL_01` 系统预设模板 disable → **64018**「系统预设商机阶段模板受保护,不可停用」(rules R01 已验,专项复验)。
|
|
|
|
|
- c) 首阶段落位:新建商机 `currentStageId` 落真实首节点(非空)+ progress **5 节点、首节点 CURRENT(seq=1)**。
|
|
|
|
|
- 脚本:`.scratch/opportunity-acceptance/d01-runtime-assert.py`(DB 临时停用 + finally 恢复,环境无残留)。
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 四、缺陷清单(22 条,交接修复 effort 的直接输入)
|
|
|
|
|
|
|
|
|
|
> 复现基线统一:`python .scratch/opportunity-e2e/seed-opportunity.py` 后跑对应脚本(核心域 `e2e-core.py` / 规则族 `e2e-rules.py`,均幂等可重跑);F08 类需环境变量 `E2E_MINIO_AK/SK`(= `CRM_MINIO_AK/SK`)。下表只写特异点。
|
|
|
|
|
|
|
|
|
|
### P1(13 条)
|
|
|
|
|
|
|
|
|
|
| 编号 | 现象(期望 vs 实际) | 复现 | 接口/位置 | 原型依据 | 终版状态(票 09) |
|
|
|
|
|
|---|---|---|---|---|---|
|
|
|
|
|
| D-01 | 关联客户**添加**无端点:原型有「添加客户」按钮,接口 404(期望存在) | F11 端点探测 | `POST /api/opportunity/customer/add` | A3-1-1-2-4 | ✅ 已修复(票 04:直设主要自动降旧主+主表快照回写;本轮探测 HTTP 200 + t04-verify 27/27) |
|
|
|
|
|
| D-02 | 客户**搜索**无端点(添加弹窗第一步):404 | F11 端点探测 | `POST /api/opportunity/customer/search` | A3-1-1-2-4 | ✅ 已修复(票 04:「快照池降级」候选池;本轮探测 HTTP 200) |
|
|
|
|
|
| D-03 | **设为主要意向客户**无端点:404 | F11 端点探测 | `POST /api/opportunity/customer/set-primary` | A3-1-1-1-2 | ✅ 已修复(票 04:三步事务幂等;本轮探测 HTTP 200) |
|
|
|
|
|
| D-04 | 团队成员**添加**无端点:404 | F12 端点探测 | `POST /api/opportunity/team/add` | A3-1-1-1-8 | ✅ 已修复(票 04:批量+66012/66013 锁;本轮探测 HTTP 200) |
|
|
|
|
|
| D-05 | 团队成员**移除**无端点:404 | F12 端点探测 | `POST /api/opportunity/team/delete` | A3-1-1-1-8 | ✅ 已修复(票 04:软删 delete_key=id 复用键;本轮探测 HTTP 200) |
|
|
|
|
|
| D-06 | 团队成员**角色编辑**无端点:404 | F12 端点探测 | `POST /api/opportunity/team/update` | A3-1-1-1-8 | ✅ 已修复(票 04:直接换人+快照刷新;本轮探测 HTTP 200) |
|
|
|
|
|
| D-07 | 暂缓态商机可编辑(期望 §3.3 受限态拦截写操作;实际 code=0 成功) | F05 负路径:对 oppStatus=3 商机调 edit | `POST /api/opportunity/edit` | PRD §3.3 | ✅ 已修复(票 05:OpportunityActionGuard 13 端点 66003;本轮 F05「暂缓态编辑受限 ✅」) |
|
|
|
|
|
| D-08 | 暂缓态可直接关闭(期望 §3.3 状态机无 3→4 出边;实际成功) | F14:对暂缓态调 close | `POST /api/opportunity/close` | PRD §3.3 | ⚠ 翻案关闭(票 02:PRD E6 本就是 2,3→4 合法边,e2e 期望写反;本轮 F14 按翻案记 ✅) |
|
|
|
|
|
| D-09 | 禁领规则版本未生效:发布 allowFreeClaim=0 版本后仍可自由领取(期望拦截;旁证说明规则版本表数据已落库) | F14 U02:发禁领版后 claim | `POST /api/opportunity/claim` + 规则发布 | PRD §5.4 U02 | ✅ 已修复(票 05:claim/claim-batch 接 ensureClaimAllowed 66014;本轮 F14 禁领负路径 ✅) |
|
|
|
|
|
| D-10 | **V-CONFIG 版本推进 API 全断**:编辑发布中版本生成新草稿必 50001;日志 `Duplicate entry for opportunity_stage_template.PRIMARY`(根因:`VersionedConfigSupport.resolveDraft` 编辑分支的 `dto.toEntity()` 携带源版本 id 直接 insert) | R01:publish 后对发布中版本调 save-draft 带 id | `POST /api/rule/opp-stage-template/save-draft` | 源码 `crm-rule/.../OpportunityStageTemplateServiceImpl` | ✅ 已修复(票 03:resolveDraft 三分支 insert 前清 id;本轮「生新草稿 V1.1 ✅」+ publish 自我顶替端到端 ✅) |
|
|
|
|
|
| D-11 | 同 D-10(方案卡模板族同构现象) | R02 同路径 | `POST /api/rule/opp-scheme-template/save-draft` | 同上 | ✅ 已修复(票 03;本轮 R02 两断言全 ✅) |
|
|
|
|
|
| D-12 | 同 D-10(公海规则族同构现象) | R03 同路径 | `POST /api/rule/opp-pool-rule/save-draft` | 同上 | ✅ 已修复(票 03;本轮 R03 两断言全 ✅) |
|
|
|
|
|
| D-13 | **owner_dept_id 恒空**:创建/领取/分配/移交均不写部门快照(DB 全表 13/13 NULL)→ ①部门专用公海规则(applyScope=2)对任何商机永不命中(匹配器按 owner_dept_id 查部门索引落空,U03 实测:发布部门专用 allowManualPool=0 后 release-pool 照常成功);②DataScope 部门天花板同源失效 | R03 U03 段 + DB 直查 | `OpportunityPoolRuleMatcherImpl` / `Opportunity` deptColumn 锚点 | PRD §5.4 部门专用 | ✅ 已修复(票 03:owner 快照组件三件套服务端覆盖+存量回填 affected=13;本轮 U03 生效层 ✅) |
|
|
|
|
|
|
|
|
|
|
### P2(9 条)
|
|
|
|
|
|
|
|
|
|
| 编号 | 现象(期望 vs 实际) | 复现 | 接口/位置 | 原型依据 | 终版状态(票 09) |
|
|
|
|
|
|---|---|---|---|---|---|
|
|
|
|
|
| D-14 | 新建必填校验以 500 类「系统内部错误」返回而非参数错误提示 | F01 缺商机名提交 | `POST /api/opportunity`(flat create) | 交互惯例 | ✅ 已修复(票 06:create 6 必填逐字段 66001 + edit merged 合并校验;本轮 F01/F05 断言全 ✅) |
|
|
|
|
|
| D-15 | PUBLIC_POOL 看板 summary=7 未按视图状态过滤(视图内公海态实际=2) | F03 对比 summary 与 page(statusIn=1) | `POST /api/opportunity/board/summary` | §7 看板 | ✅ 已修复(票 06:OpportunityViewFilter 单一事实源 + board 两端点 viewType;本轮 F03 全 ✅) |
|
|
|
|
|
| D-16 | detail 六联动字段 null:节点停留天数/下阶段名/方案卡状态/方案预算/是否关注/最近跟进 | F04 detail 回显 | `GET /api/opportunity/detail` | PRD §7.9 | ✅ 已修复(票 06 四字段 + 票 09 收尾 stageStayDays/nextStageName——票 02 曾收窄至 4 字段,收尾依据=列表页已有计算列同源口径消 page/detail 口径差;本轮 F04「6 个联动字段全非空 ✅」) |
|
|
|
|
|
| D-17 | 方案卡提交后主表 schemeBudget/schemeCardStatus 未回显(与 D-16 同根因族) | F09 提交后看主表 | 同 detail | P0-4 锚点 | ✅ 已修复(票 06:submitCard 主客户卡回写 C4 快照列;本轮 F09 主表 budget=880000/cardStatus=2 ✅) |
|
|
|
|
|
| D-18 | 勘察次数需调用方传 surveySeq(与「次数自动生成」拍板 P1-2 相反) | F10 不传 surveySeq 被拒 | `POST /api/opportunity/survey/add` | 拍板 P1-2 | ⚠ 翻案关闭(票 02:v29 字段说明=须调用方传,实现正确;本轮断言反转后 ✅) |
|
|
|
|
|
| D-19 | 勘察补充说明未强制必填(与拍板 P1-3 相反:空说明成功) | F10 空说明提交 | 同上 | 拍板 P1-3 | ⚠ 翻案关闭(票 02:v29 说明非必填,实现正确;本轮断言反转后 ✅) |
|
|
|
|
|
| D-20 | oplog 流转不留痕:商机历经 release/claim/assign/close/reopen/handover 仅 2 条 ROW_CHANGE 且 fieldName=null | F13 oplog/page | `POST /api/opportunity/oplog/page` | 拍板 P1-5 | ✅ 已修复(票 06:E1-E10 全边落 oplog STATUS_FLOW/opp_status;本轮 F13 7 条流转留痕 ✅) |
|
|
|
|
|
| D-21 | attachment/add 可选参数 bizType 缺省即 50001(Controller 声明 optional vs 表 biz_type NOT NULL 无默认,契约矛盾;正路径须显式传值域 OPP/FOLLOW_UP/SITE_SURVEY/SCHEME_CARD) | F08 不传 bizType | `POST /api/opportunity/attachment/add` | 契约一致性 | ✅ 已修复(票 06:required=false 缺失/非法统一 66001 + 四值封闭;专项 t06-verify A 段 66001 ✅) |
|
|
|
|
|
| D-22 | versions 端点返回实体直出,泄露 creatorId/deleted/updaterId(违 ADR-0017 Entity 禁令) | R01 versions 检查 | `GET /api/rule/opp-stage-template/versions` | ADR-0017 | ✅ 已修复(票 06:三族 versions DTO 白名单化;本轮 R01「内部字段泄露=无 ✅」) |
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 五、与上轮 `opportunity-verify/verify-report.md` 的差异说明
|
|
|
|
|
|
|
|
|
|
| 维度 | 上轮(20260827) | 本轮(20260828) |
|
|
|
|
|
|---|---|---|
|
|
|
|
|
| 范围 | 85 路由黑盒 + 状态机 9 步 | **18 业务流程**(含 F15 自定义视图、F08 MinIO 全链、规则族三族 V-CONFIG 生命周期 + U03 配置生效——均为上轮未测面) |
|
|
|
|
|
| 上轮 D-01 新建必 500 | ❌(current_stage_id 无默认值,新建 100% 失败) | **已修复回归 ✅**(F01 新建成功 + 初始态/负责人/视图可见全对) |
|
|
|
|
|
| 上轮「状态机全缺」误判 | ❌(RESTful 路径 404 误判) | **flat 路径核对后 E1-E9 主边 + CAS 守卫 + 批量接口全 ✅**(翻案延续:map「判定纪律」即因此立) |
|
|
|
|
|
| 上轮「唯一致命缺陷」表述 | 新建 500 一项 | 本轮无 P0;P1 主题转向**功能缺失(6 个 404)+ 规则引擎断点(V-CONFIG 版本推进)+ 数据链断点(owner_dept_id)** |
|
|
|
|
|
| MinIO | 未测(凭据缺失) | F08 全链 ✅(AK=admin 实锤) |
|
|
|
|
|
| 数据基础 | 存量 26 条测试残留 | seed 12 条矩阵化样例(幂等重跑) |
|
|
|
|
|
|
|
|
|
|
**结论**:上轮验收的核心结论(接口存在性、flat 契约差异、状态机守卫)全部被本轮确认;本轮新增的是**业务流程级**的深度结论(联动回显、约束拦截、规则引擎生效性)——这些是上轮路由级黑盒无法触达的。
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 六、测试数据指引(seed-data-manifest 速览)
|
|
|
|
|
|
|
|
|
|
- **完整清单**:`seed-data-manifest.md`(人读)+ `seed-manifest.json`(机读,不一致时以 json 为准)。
|
|
|
|
|
- **账号矩阵**(debug token = `GET /api/auth/debug/token?userId=`):管理员罗伟健 `739564171091247104`(全量可见)/ A 赖永利 `744842565802524672`(特战团队)/ B 肖琴 `744842566742048768`(冠军团队)/ C 曾偲青 `744842318024015872`(跨中心职员)。
|
|
|
|
|
- **商机矩阵 12 条**:待领取 2 / 推进 6 / 暂缓 2 / 关闭 2,跨 A/B/C 三人(DataScope 视角差异可直接用);A 已关注 B 一条;子表样例:跟进 2、勘察 1、方案卡 1(已提交·88 万)、关联客户 1(DB 直插——add 端点缺失 D-01)、自定义视图 1(B 名下)。
|
|
|
|
|
- **规则前置**:`e2e-seed公海规则` + `e2e-seed冠军团队禁领`(部门专用·D-09 回归依赖,票 11 seed v2 起)+ `全公司通用方案卡模板` 均发布中(demo 票 10 的 tab3 可直接用)。
|
|
|
|
|
- **重跑方式**:
|
|
|
|
|
- `python .scratch/opportunity-e2e/seed-opportunity.py` —— 先清后造(幂等,ID 会变)
|
|
|
|
|
- `python .scratch/opportunity-e2e/e2e-core.py` —— 核心域全量(注意:跑完 F14 会把部分商机状态流转偏离 seed 基线,重跑 seed 即复位;F08 需环境变量 `E2E_MINIO_AK/SK`)
|
|
|
|
|
- `python .scratch/opportunity-e2e/e2e-rules.py` —— 规则族全量(自带建测清闭环,不污染 seed)
|
|
|
|
|
- `python .scratch/opportunity-bugfix/t12-verify.py` —— workplan 四端点(自带建测清闭环,不依赖 seed)
|
|
|
|
|
- `python .scratch/opportunity-acceptance/d01-runtime-assert.py` —— D-01 fail-fast 专项(DB 临时停用模板 + finally 恢复)
|
|
|
|
|
- **已知数据事实**(联调者注意):① `opportunity.owner_dept_id` 已由票 03 落库(服务端快照覆盖+存量回填,五路径跟人走);② `sys_dept` 最老 root 部门 `744636475731083264` 的 dept_name 是历史 mojibake 存量(选部门时避开);③ e2e-core 跑过后 A1/B1 归属变更、C1/C2/A2 历经关闭/重启/回公海(重跑 seed 复位);④ seed v2 起冠军团队(肖琴)名下商机(含公海态 B1/B2/BPL)被 `e2e-seed冠军团队禁领` 覆盖——任何人 claim 均被 66014 拦(对照:A 域商机走通用默认规则放行),测试领取正常路径请用 A 域商机或走 assign 分配。
|