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.
 
 
 
 
 

7.0 KiB

07 · E2E API 增量套件

  • Type: task
  • Status: resolved
  • Blocked by: 03, 04, 05

Question

新建 e2e-graph.py(对齐 e2e-incr.py 模式:独立夹具 + 自带 teardown + specimens 留档 + checks JSON),覆盖:

  1. 图谱读:自动生成正确性(层级位置/同级并列/多顶层并列/公司节点/未识别层级区不生成边);职务修改后图谱自动更新。
  2. 边 CRUD:手动建边(多父 OK)/ 自连拒 / 循环拒 / 重复建边拒(「已存在连线」码);系统边删除 → 保存 → 重进不恢复(否决持久化断言);布局保存回读。
  3. 并发冲突:双 session 改同一客户关系 → 后保存者收到冲突响应(按 spec 形态)。
  4. 关系变更日志:保存后日志可查、动作/内容断言。
  5. 联系人增强:page 默认掩码 → reveal → 查看日志落库断言(DB 取证);快速添加(多行/查重疑似/空行跳过/错误定位);页内编辑批量保存(行级失败定位);批量导出(勾选/未勾选拒/脱敏口径)。
  6. 导入三段式:模板下载(列集断言)/ 预检(必填前移拒 + 查重)/ confirm 执行(成功行 + 失败明细 clip500)/ 完成后图谱自动更新断言。
  7. 字典:job_title / contact_source enabled-list 值集断言(W-01 销号复验)。

夹具前缀 e2c-cg- 幂等自清;静态对账 scan_calls(新增调用 × API-SUMMARY 增量全命中零未知);三档结论口径沿用(/⚠/ + D-xx 续编)。

Answer

结果:58 checks = 57 + 1⚠(D-G1)+ 0,幂等重跑稳定,SCAN 17/17 零缺零余。 产物:.scratch/customer-contact-graph/e2e-graph-checks.json + e2e-graph-specimens.json(17 specimens)。

实现形态

  • e2e-graph.py:基建抄 e2e-incr.py(check/defect/db/dbq/dbx/get_token/双 session/api/api_raw/data_of/code_of/expect_code/_capture);夹具 _sweep_cg()(幂等清 e2c-cg-* 七表;contact_import_fail 无 customer_id 列,按 task_id 子查询先删)+ _mk_customer(needConfirm→confirmSimilar 兜底)+ _quick_add / save_graph(全量快照表单化 helper:nodes 恒拉 detail 现值保证覆盖全集,缺节点会被 67019「快照缺失」误拦)+ _mk_contact_xlsx(openpyxl 五列)。
  • 流程:G-00 字典种子 → G-01 夹具+图谱读 → G-02 边 CRUD+save → G-03 联系人增强 → G-04 导入三段式 → G-05 并发冲突 → G-06 操作日志 → teardown(archive 正门 + DB 兜底)→ scan_calls。
  • 环境:verify profile 起服(debug token)+ 远程 DB 8.129.84.155 实测;错误码断言用真实值 67018/67019/67020/67021/67022/67023/67024(demo 桩自洽码 67017 已被战略协议占用,不出现在本套件)。

票面逐条(随修订⑧适配)

  1. 图谱读:修订⑧后无自动边——适配为 detail 全量读(懒建版本行 v=0 起、nodes/edges 空、DB graph 行=1)+ quickAdd D1 字典联动 level {10,6,3,None}(other_job 无档位落右侧栏)+ phoneMasked 脱敏 + bump 信号。「职务修改后图谱自动更新」→ bump 断言(quickAdd 批量 bump 一次 / batchEdit graphDirty 才 bump / 导入 executor 收尾 bump,三处均实测版本推进)。
  2. 边 CRUD:建边回读(ret=v+1 CAS 推进)/ 追加回读 / 自连 67019 / 快照内重复 67019 / 倒挂 67019 / 未定级端点 67019 / 幽灵端点 67019 / 单父违反 67020 / 旧版本 67018 / 空 edges=清空(API+DB 双取证)/ 恢复。「循环拒」不可达:等级严格递减 → 图恒为 DAG,倒挂先被 67019 拦。「否决持久化」随修订⑧作废(无自动边即无否决)。用例设计要点:save 是全量终态替换非增量追加——重复边=快照内两条同边、单父违反=快照内一个子两个父;且六次非法保存全部被拒不 bump 版本,测旧版本冲突前必须先成功保存一次制造过期。
  3. 并发冲突:同用户双 session(S/S2 各持 ADMIN token)→ 后保存者 67018(CAS 按版本不按用户,同用户双标签页即最常见并发场景)。跨用户场景实测被数据可见域拦:CustomerScopeEvaluator.visibleToCurrent 只认 OWNER/DEPARTMENTS,团队成员不在口径内(BUDDY 加入团队后仍 67002)——行为观测记档。
  4. 关系变更日志:graph/save 无专属 oplog(grep 零命中)——现实适配为 contact 动作链路:oplog page(GET /api/customer/oplog/page)含 CONTACT_ADD(quickAdd)/ CONTACT_EDIT「批量编辑联系人【N 条】」(batchEdit)+ action=CONTACT_EDIT 过滤纯度 + 文案断言。若后续需要图谱级审计(关系变更动作),另起 effort。
  5. 联系人增强:page(keyword 客户名)掩码四行全 ✱ → reveal 明文 13800001003 + customer_contact_reveal_log DB 取证(operator_id=ADMIN / ip / op_time)→ quickAdd:空行跳过(好行+空行 successCount=1 failedRows 空)/ 手机号已存在不静默创建(failedRows「手机号已被该客户内联系人使用」)/ 无手机号同姓名同职务疑似重复提示 / 行集空 67021 → batchEdit:D2 字典跟随(other_job→chairman 联动 名称/类别/level 10/level_source=1 + bump)/ 手工锁定(save 定级 level_source=2 后改职务 level 不覆盖)/ phone 三态(明文改 / 脱敏形态不改 / null 不传)/ 原子批零落库(failedRows 定位 idx=1)/ 行集空 67022 → export 200 + xlsx PK 头。
  6. 导入三段式:template GET PK 头 + 表头五列全等(V1 锚点)→ upload 预检 t=5 insert=3 fail=2 suspect=0 + verdict 集 {INSERT,FAIL} → 表头不符文件 67023 → confirm 轮询 DONE status=2 insertCount=3 → failures 2 行 failReason≤500(clip500)→ DB customer_contact=8 + 版本 bump → 已完成任务重复 confirm 67024。
  7. 字典:job_title tree 一级 5(executive/purchase/marketing/hr/other)+ 二级 9 code 集全等 + 档位值集(chairman/shareholder=10,_manager=6,_specialist/bid_officer=3,other_job=None);contact_source enabled-list 4 项(组会/组局/转介绍/其他)——W-01 销号复验通过

发现

  • D-G1 (P2):batchEdit「空串=清空」语义在 Spring 表单绑定下不可达——ContactBatchEditParam.phone 注释声称空串=清空,Service 也有 isBlank→null 分支,但 Spring MVC 表单绑定(StringEditor allowEmpty 语义)把空串转 null,后端收到的恒为 null(=不改)→ 清空手机号无法通过页内编辑表达。缺陷验证模式记档不排查;前端清空需 reveal 后提明文或换绑定策略,修复另起 effort。
  • 语义分叉记档(合理):导入场景无手机号 = FAIL「手机号必填(导入查重键)」(批量执行无人在场,无查重键不可 SUSPECT);quickAdd 同条件 = 疑似重复提示不静默创建。两口径并存符合各自场景。
  • api_raw(multipart/字节流)补捕获 specimens(二进制只记字节数+头部 hex),保证 scan_calls 覆盖 template/upload/export。

无后端代码变更 → 无 ADR、CONTEXT.md 不动。票 08(UI Playwright 冒烟)解锁。