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.
361 lines
11 KiB
361 lines
11 KiB
|
9 hours ago
|
{
|
||
|
|
"checks": [
|
||
|
|
{
|
||
|
|
"flow": "G-00",
|
||
|
|
"case": "job_title tree:一级 5(executive/purchase/marketing/hr/other)+ 二级 9",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "top=['executive', 'hr', 'marketing', 'other', 'purchase'] subs=9"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-00",
|
||
|
|
"case": "job_title 二级 code 集全等(含 other_job 无档位)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "['bid_officer', 'chairman', 'hr_manager', 'marketing_manager', 'marketing_specialist', 'other_job', 'purchase_manager', 'purchase_specialist', 'shareholder']"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-00",
|
||
|
|
"case": "档位值集(chairman/shareholder=10,*_manager=6,*_specialist/bid_officer=3,other_job=None)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "{'chairman': 10, 'shareholder': 10, 'purchase_manager': 6, 'purchase_specialist': 3, 'marketing_manager': 6, 'marketing_specialist': 3, 'hr_manager': 6, 'bid_officer': 3, 'other_job': None}"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-00",
|
||
|
|
"case": "contact_source enabled-list:4 项(组会/组局/转介绍/其他)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "['group_activity', 'group_meeting', 'other', 'referral']"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-01",
|
||
|
|
"case": "夹具客户 A/B 就位",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "A=KH202609100001 B=KH202609100002 sweep=0"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-01",
|
||
|
|
"case": "首读懒建版本行:version 初值就绪且 nodes/edges 空 + DB graph 行=1",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "v=0 nodes=0 edges=0 db=1"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-01",
|
||
|
|
"case": "quickAdd 4 行全成功(部分成功口径 successCount=4/failedRows 空)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "{'successCount': 4, 'failedRows': []}"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-01",
|
||
|
|
"case": "detail 回读:nodes=4 level={10,6,3,None}(D1 字典联动)+ phoneMasked 脱敏 + edges 空",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "lv={'c1': 10, 'c2': 6, 'c3': 3, 'c4': None} masked=True"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-01",
|
||
|
|
"case": "quickAdd 后版本 bump(任一行成功即 bump)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "v 0 -> 1"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-02",
|
||
|
|
"case": "save 建边 chairman>manager:返回新版本 = v+1(CAS 推进)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "v=1 ret=2"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-02",
|
||
|
|
"case": "回读 edges==[(1,2)]",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "[(753314905687326720, 753314905817350144)]"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-02",
|
||
|
|
"case": "save 追加边 2>3:回读 2 条",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "e=[(753314905687326720, 753314905817350144), (753314905817350144, 753314905951567872)]"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-02",
|
||
|
|
"case": "自连边 → 67019",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "code=67019 如预期"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-02",
|
||
|
|
"case": "快照内重复边(两条 1>2)→ 67019",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "code=67019 如预期"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-02",
|
||
|
|
"case": "等级倒挂边(3>1,lv3>lv10)→ 67019",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "code=67019 如预期"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-02",
|
||
|
|
"case": "未定级端点边(1>4,赵四 level=null)→ 67019",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "code=67019 如预期"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-02",
|
||
|
|
"case": "幽灵端点边(contactId=999…)→ 67019",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "code=67019 如预期"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-02",
|
||
|
|
"case": "单父违反(快照内 3 同时有父 2 与父 1)→ 67020",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "code=67020 如预期"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-02",
|
||
|
|
"case": "成功保存推进版本(为冲突用例制造过期)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "v=3 ret=4"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-02",
|
||
|
|
"case": "旧版本保存(v 已推进)→ 67018",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "code=67018 如预期"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-02",
|
||
|
|
"case": "空 edges 保存 = 清空:API edges==[] 且 DB customer_contact_edge=0",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "api=0 db=0"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-02",
|
||
|
|
"case": "恢复边 1>2,2>3:回读 2 条",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "[(753314905687326720, 753314905817350144), (753314905817350144, 753314905951567872)]"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-03",
|
||
|
|
"case": "page(keyword 客户名):命中 4 行且 phone 全脱敏",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "rows=4 mine=4"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-03",
|
||
|
|
"case": "reveal 返回明文 13800001003",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "got=13800001003"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-03",
|
||
|
|
"case": "DB reveal_log 取证:operator_id=ADMIN + ip/op_time 非空",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "{'operator_id': '739564171091247104', 'operator_name': '罗伟健', 'ip': '0:0:0:0:0:0:0:1', 'op_time': datetime.datetime(2026"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-03",
|
||
|
|
"case": "quickAdd 好行+空行:空行跳过(successCount=1/failedRows 空)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "{'successCount': 1, 'failedRows': []}"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-03",
|
||
|
|
"case": "quickAdd 手机号已存在:不静默创建(successCount=0 + failedRows 查重明细)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "{'successCount': 0, 'failedRows': [{'rowIndex': 0, 'reason': '手机号已被该客户内联系人使用:13800001003'}]}"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-03",
|
||
|
|
"case": "quickAdd 无手机号同姓名+同职务:疑似重复提示不创建",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "{'successCount': 0, 'failedRows': [{'rowIndex': 0, 'reason': '疑似重复:该客户内已存在同姓名同职务联系人(cg034667李经理/市场经理),请确认后修改或删除该行'}]}"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-03",
|
||
|
|
"case": "quickAdd 行集空(不传 rows)→ 67021",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "code=67021 如预期"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-03",
|
||
|
|
"case": "batchEdit 职务变更 D2 字典跟随:董事长/高层管理/level 10/level_source=1",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "{'successCount': 1, 'failedRows': []} db={'n': '董事长', 'c': '高层管理', 'l': 10, 's': 1}"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-03",
|
||
|
|
"case": "batchEdit 职务联动后版本 bump",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "7->8"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-03",
|
||
|
|
"case": "graph/save 手工定级 id4=8:DB level=8/level_source=2(手工锁定)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "{'l': 8, 's': 2}"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-03",
|
||
|
|
"case": "D2 手工锁定:职务改市场专员但 level 保持 8 不覆盖",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "{'n': '市场专员', 'l': 8, 's': 2}"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-03",
|
||
|
|
"case": "batchEdit phone 明文=修改(13900002003)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "{'p': '13900002003'}"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-03",
|
||
|
|
"case": "batchEdit phone 脱敏回显形态=不改(DB 仍明文)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "{'p': '13900002003'}"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-03",
|
||
|
|
"case": "batchEdit phone 空串提交:实际不变(绑定层空串→null,语义缺口 D-G1)",
|
||
|
|
"verdict": "⚠",
|
||
|
|
"detail": "db={'p': '13900002003'}"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-03",
|
||
|
|
"case": "batchEdit 原子批:任一失败零落库(id3 name 未变 + failedRows 定位 idx=1)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "{'successCount': 0, 'failedRows': [{'rowIndex': 1, 'reason': '手机号须为 11 位手机号格式'}]} db={'n': 'cg034667王专员'}"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-03",
|
||
|
|
"case": "batchEdit 行集空 → 67022",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "code=67022 如预期"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-03",
|
||
|
|
"case": "export:200 + xlsx 字节流(PK 头)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "http=200 ct=application/vnd.openxmlformats-officedocument.spreadsheetml. head=b'PK'"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-04",
|
||
|
|
"case": "template:200 + PK 头 + 表头 5 列全等(V1 锚点)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "['姓名', '职务(字典编码)', '手机号', '来源(字典编码)', '是否关键联系人(是/否)']"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-04",
|
||
|
|
"case": "upload 预检:t=5 insert=3 fail=2 suspect=0(无手机号=查重键缺失 FAIL)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "{'taskId': '753314959143731200', 'customerId': '753314901191032832', 'importMode': 'APPEND_ONLY', 'duplicateStrategy': 'SKIP', 'totalCount': 5, 'insertCount': 3, 'updateCount': 0, 'failCount': 2, 'sus"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-04",
|
||
|
|
"case": "预检明细 verdict 集含 INSERT/FAIL",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "['FAIL', 'FAIL', 'INSERT', 'INSERT', 'INSERT']"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-04",
|
||
|
|
"case": "表头不符文件 → 67023(预校验守门)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "code=67023 如预期"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-04",
|
||
|
|
"case": "confirm 受理",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "code=0"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-04",
|
||
|
|
"case": "轮询终态 DONE:status=2 + insertCount=3",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "status=2 result={'taskId': '753314959143731200', 'customerId': '753314901191032832', 'importMode': 'APPEND_ONLY', 'templateVersion': 'V1', 'status': 2, 'totalCount': 5, 'insert"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-04",
|
||
|
|
"case": "failures=2 行且 failReason 长度<=500(clip500)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "[(4, 'cg034667导丁', '手机号须为 11 位手机号格式'), (5, 'cg034667李经理', '手机号必填(导入查重键)')]"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-04",
|
||
|
|
"case": "DB 执行面:customer_contact=8(4 夹具+1 quickAdd 新增+3 导入)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "n=8"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-04",
|
||
|
|
"case": "导入成功后图谱版本 bump(executor 收尾 bump)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "10->11"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-04",
|
||
|
|
"case": "已完成任务重复 confirm → 67024(状态不允许)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "code=67024 如预期"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-05",
|
||
|
|
"case": "双 session 读到同版本",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "11/11"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-05",
|
||
|
|
"case": "S 先保存成功",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "code=0"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-05",
|
||
|
|
"case": "S2 用旧版本保存 → 67018(乐观锁冲突)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "code=67018 如预期"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-06",
|
||
|
|
"case": "oplog 含 CONTACT_ADD(quickAdd/导入)与 CONTACT_EDIT(batchEdit)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "actions=['CONTACT_ADD', 'CONTACT_EDIT', 'CREATE']"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "G-06",
|
||
|
|
"case": "action=CONTACT_EDIT 过滤纯度 + 「批量编辑联系人【N 条】」文案",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "rows=5 pure=True batchText=True"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "TEARDOWN",
|
||
|
|
"case": "客户 A 正门 archive",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "code=0"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "TEARDOWN",
|
||
|
|
"case": "客户 B 正门 archive",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "code=0"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "TEARDOWN",
|
||
|
|
"case": "e2c-cg-* DB 兜底清扫(contact/graph/edge/reveal_log/import_task/fail/oplog)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "客户行 2 组"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"flow": "SCAN",
|
||
|
|
"case": "端点覆盖 17/17(缺 0)",
|
||
|
|
"verdict": "✅",
|
||
|
|
"detail": "missing=[] extra=[]"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"defects": [
|
||
|
|
{
|
||
|
|
"id": "D-G1",
|
||
|
|
"severity": "P2",
|
||
|
|
"title": "batchEdit「空串=清空」语义在表单绑定下不可达",
|
||
|
|
"detail": "ContactBatchEditParam.phone 注释声称空串=清空,且 Service L255 有 isBlank→null 分支;但 Spring MVC 表单绑定(StringEditor allowEmpty)把空串转 null,后端收到的恒为 null(=不改)→ 清空手机号无法通过页内编辑表达。前端需先 reveal 再提明文替代,或后端换绑定策略。缺陷验证模式记档不排查。"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"elapsedSec": 21.6
|
||
|
|
}
|