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.
 
 
 
 
 

5.4 KiB

07 — E2E 实测:商机核心域主流程

Type: task Status: resolved Blocked by: 05

Question

spec-flows.md(票 04 冻结版)执行核心域全部主流程的 API 级实测(Python 脚本 .scratch/opportunity-e2e/e2e-core.py,复用 seed 数据与 debug token):

  • 流程覆盖:四视图 + 自定义视图(浏览 + F15 全 CRUD,票 04 U07 改判)→ 新建商机(直接创建,含 convertible-leads 关联线索下拉接口)→ 详情各子表读 → 写跟进(回收锚点刷新)→ 切阶段(连跳/回退)→ 方案卡建/改/提交 → 现场勘察 → 团队成员增改 → 暂缓/取消暂缓 → 抛公海/领取 → 关闭/重启 → 移交;
  • 每流程按票 04 拍的断言深度断言,三档结论( / ⚠ / ); 前必须核对 flat 实际路径(地图「判定纪律」);
  • 前置(票 04 U04 决议):MinIO 凭据已提供(admin),执行前设 CRM_MINIO_AK/SK 环境变量重启后端,F08 附件流程不 SKIP;
  • 原型期望与实现不一致处:截取请求/响应证据,入缺陷清单(P0/P1/P2 初判)。

产出:e2e-core.py + 报告章节草稿 .scratch/opportunity-e2e/report-core.md。只记录不修复。

Answer

(20260828 实测完成 + 同日 F08 补跑)产出 e2e-core.py(六轮迭代,53→81;F08 补跑修复后 81→86)+ report-core.md + e2e-core-result.json。核心域 F01-F15 全部实测,最终 86 / ⚠ 12 / 6 · 缺陷 17 条(P1×9 / P2×8)· SKIP 0。复现:python seed-opportunity.py && python e2e-core.py

缺陷清单(只记录不修复)

P1(9 条)

  1. F11 添加关联客户无对应端点(404)——原型 A3-1-1-2-4 有按钮(/api/opportunity/customer/add
  2. F11 客户搜索无对应端点(404)——添加弹窗第一步(/api/opportunity/customer/search
  3. F11 设为主要意向客户无对应端点(404)——原型 A3-1-1-1-2(/api/opportunity/customer/set-primary
  4. F12 添加团队成员无对应端点(404)——原型 A3-1-1-1-8 +添加成员(/api/opportunity/team/add
  5. F12 移除团队成员无对应端点(404)
  6. F12 编辑团队成员角色无对应端点(404)
  7. F05 暂缓态商机编辑未被拦截(PRD §3.3 受限出边违反,code=0 成功)
  8. F14 暂缓态可直接关闭(迁移边约束缺失,§3.3 违反)
  9. F14 禁领规则版本未生效(allowFreeClaim=0 发布后仍可自由领取)

P2(7 条) 10. F01 新建必填校验以系统异常(500 类「系统内部错误」)实现而非参数错误提示 11. F03 PUBLIC_POOL 看板合计未按视图状态口径过滤(summary=7 vs 视图内公海态=2) 12. F04 detail 联动字段未回显:节点停留天数/下阶段名/方案卡状态/方案预算/是否关注/最近跟进(PRD §7.9) 13. F09 方案卡提交后主表 schemeBudget/schemeCardStatus 未回显(多卡取值口径待人工核 P2-3;与 12 同根因) 14. F10 勘察次数需调用方传入(add 必填 surveySeq),与「次数自动生成」拍板(P1-2)不符 15. F10 现场勘察补充说明未强制必填(与拍板 P1-3 相反:空说明竟成功) 16. F13 oplog 未覆盖流转操作(A2 历经 release/claim/assign/close/reopen/handover 仅 2 条 ROW_CHANGE 留痕且 fieldName=null) 17. F08 attachment/add 可选参数 bizType 缺省即 50001(Controller 声明 optional vs 表 biz_type NOT NULL 无默认,契约矛盾;正路径须显式传值域 OPP/FOLLOW_UP/SITE_SURVEY/SCHEME_CARD)

契约事实(供票 08/10/11)

  • 规则族:ruleCode 系统生成只读(入参侧忽略),识别/反查用 ruleName;publish=保存并发布(form 绑定完整 DTO,只传 id 报 64008「规则名称不能为空」);save-draft 是 Result(data=null),反查草稿按 ruleName+status=1
  • 方案卡:selectable-templates 元素模板 ID 字段=templateId(无 id);customerId 写入必填 + 一客户一卡约束(66009);草稿与已提交均可编辑(card_status<3);submit 校验模板必填动态字段(66007)
  • 编辑:/api/opportunity/edit 为 OpportunityDTO 整体 form 绑定——detail 全量回传时 LocalDateTime 值须 ISO 格式(空格→T),否则 40001 类型转换失败
  • 自定义视图:/api/preference/view/save JSON body + scopeKey 是 @RequestParam(save/set-default/delete 都要 params 传);save 为 upsert 语义;list 出参不回显 scopeKey 字段
  • 勘察:surveySeq 必填(调用方传);surveyDesc 非必填(实测与拍板相反)
  • 状态机:CAS 守卫生效(前置态已变被拒「当前状态不允许此操作」);已关闭不可 resume ✓;E1-E9 主边全通过
  • U01 复核:新建初始 oppStatus=2(推进中),与 seed 现象一致

F08 补跑(20260828 凭据到位,SKIP 已清零)

用户提供的凭据实锤 AK=admin / SK=Itc@123456(消息里的「minio」实指 MinIO 密码;minio/minioadmin 均被服务端 InvalidAccessKeyId 拒绝)。后端带 $env:CRM_MINIO_AK='admin'; $env:CRM_MINIO_SK='Itc@123456' 重启后,脚本注入 E2E_MINIO_AK/SK 重跑 F08 全链:upload(MinIO 直传)→ attachment/add → list → delete → download 全部 。新事实:FileInfoDTO 出参主键=fileId(String);缺陷 17 见上(bizType 契约矛盾,P2)。复现:凭据注入后 python e2e-core.py F08(自动走全链分支)。