夹具: customer=753584922119110656 4 contacts chairman=746816 mgr=684800 spec=096832 misc=508864 == 0 打开 + 初始加载 == PASS 打开 demo: 字典+图谱真实 API 加载(4 位联系人) | 共 4 位联系人 == 1 票① 双视图切换 + 图谱元素 == PASS 默认列表视图: 4 行 | visible=True rows=4 PASS 切图谱: company 节点唯一且固定布局位 | company=1 pos={"x":1080,"y":184} PASS 等级归行: 董事长(10)在市场经理(6)上方,经理在专员(3)上方 PASS 未设置等级栏: 其他职务卡停右栏 | zone=1 未设置等级拖入左侧等级格子完成定级 PASS 等级 chip 数 = 3(4 卡,其他职务未设) | 3 PASS 切回列表视图 == 2 票② 编辑器闭环 == PASS 进入编辑: 按钮→完成绘制+变橙+graphEditing | 完成绘制 editing=True orange=True PASS 拖卡位移: 行内 x 位移+等级保持 3 | x 950->1240.8474576271187 lvl=3 PASS 拖线: dot→目标卡 pending(经理>专员) | pair=753584924191096832 svg=1 PASS 保存: toast(版本)+DB edge 落库(经理>专员) | 保存成功(版本 2),已记录关系变更日志(见右侧「日志」面板 db=[(753584924052684800, 753584924191096832)] PASS 重进: 手动边持久(committed=1) | committed=1 PASS × 删除手动边→保存: DB 删净 | pdel=1 db=0 PASS 重进: 手动边已删净(0) | committed=0 == 3 票③ 三弹窗 == PASS 重置确认弹窗: 确定→pending 清零 | title=重置 pend=0 PASS 未保存三选: 继续编辑保持态/放弃修改退出+切列表 | labels=['继续编辑', '放弃修改', '保存修改'] keep=True dropped=True toast=已放弃本次修改,恢复到进入编辑时的状态 PASS 完成绘制退出: 保存修改→边落库+退编辑 | toast=保存成功(版本 4),已记录关系变更日志(见右侧 db=[(753584924052684800, 753584924191096832)] PASS 保存修改路径: 重进边持久 == 4 票④ 悬停气泡 == PASS 悬停气泡: 显示+姓名+字段 | display=block e2c-cgd115725经 · 市场经理人脉关系情况--是否内线否礼品备注-- PASS 移出隐藏气泡 | display=none == 5 票⑤ 列表侧 == PASS 进入页内编辑: 按钮→退出编辑 | 退出编辑 PASS 改姓名: dirty 行标记+撤销链接 | dirty=1 undo=1 PASS 撤销修改: 姓名恢复+toast | e2c-cgd115725专 | 已撤销该行修改 PASS 保存全部: toast+DB 姓名更新(脱敏电话原样回传=不改) | 保存全部成功 db=e2c-cgd115725专员乙 PASS quickAdd 前端查重: 重复行拦截+确认知晓提示 | 提交失败:1 行有误(已保留全部内容并定位首错行) | hint=疑似重复:手机号已存在(138****1001),请勾选「确认知悉」 PASS quickAdd 部分成功: 2 成 1 败(服务端硬拒重复,失败行保留) | 2 行成功,1 行失败(失败行保留待改,可重提) | 手机号已被该客户内联系人使用:13800001001 PASS quickAdd 落库: 2 新联系人在库 | db=2 PASS 脱敏点击明文: 明文渲染+DB reveal_log 埋点 | plain=13800001002 logs=1 PASS 导入模板下载(xlsx) | 联系人导入模板-V1.xlsx 3694B PASS 勾选全选: 导出按钮解锁 PASS 批量导出下载(联系人导出.xlsx) | 联系人导出.xlsx 4076B == 6 票⑥ 导入 UI 三段式 == PASS 预检计数头: 共 2 行/新增 1/失败 1 | 预检完成(任务 753585026179792896 待确认):共 2 行,预计新增 1、更新 0、失败 1、疑似重复 0(新增或更新 / PASS 预检明细 2 行含 FAIL | rows=2 PASS 确认执行→轮询完成: 已完成 新增 1 | 已完成:新增 1、更新 0、未变化 0、失败 1、疑似重复 0 PASS 失败明细 1 行(手机号必填) | rows=1 2e2c-cgd115725导入乙--手机号必填(导入查重键) PASS DB 执行面: 好行入库坏行未入 | good=1 bad=0 PASS 导入后联系人计数 = 7(4+2qa+1导入) | 共 7 位联系人 == 7 网络层附带断言 == PASS console error = 0 PASS page error = 0 PASS 网络层零 PUT/DELETE (捕获 /api/** 响应 27 条) teardown: sweep e2c-cgd* 客户组 1 组(DB 硬删正门) === demo_smoke_graph: 40/40 PASS === results → d:\code\crm-backend-matt\.scratch\customer-contact-graph\demo_smoke_graph-results.json