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.
 
 
 
 
 

108 lines
20 KiB

[PASS] ① 鉴权 GET /api/auth/debug/token → Bearer token — token=eyJ0eXAiOiJKV1QiLCJh… (0.04s)
>>> POST /api/customer/create params=None form={'customerName': 'e2c-集成走查-115898', 'customerType': 'customer_type_01', 'industryCode': 'gov', 'provinceCode': '440000', 'cityCode': '440100', 'districtCode': '440103', 'customerStarLevel': 3, 'relationStarLevel': 3, 'isBizNegotiated': 0, 'isChild': 0, 'ownerUserId': '739564171091247104'}
<<< {"code": 0, "success": true, "message": "success", "data": {"needConfirm": true, "similarHits": [{"customerId": "753653735674085376", "customerName": "e2c-集成走查-115452", "ownerName": "罗伟健", "customerStage": 1, "archiveStatus": 2, "masked": false}, {"customerId": "753654021008392192", "customerName": "e2c-集成走查-115520", "ownerName": "罗伟健", "customerStage": 1, "archiveStatus": 2, "masked": false}], "customerNo": null, "customerName": null}}
>>> POST /api/customer/create params=None form={'customerName': 'e2c-集成走查-115898', 'customerType': 'customer_type_01', 'industryCode': 'gov', 'provinceCode': '440000', 'cityCode': '440100', 'districtCode': '440103', 'customerStarLevel': 3, 'relationStarLevel': 3, 'isBizNegotiated': 0, 'isChild': 0, 'ownerUserId': '739564171091247104', 'confirmSimilar': 1}
<<< {"code": 0, "success": true, "message": "success", "data": {"id": "753655606337863680", "needConfirm": null, "similarHits": null, "customerNo": "KH202609110016", "customerName": "e2c-集成走查-115898"}}
[PASS] ② 核心CRUD POST /api/customer/create(表单绑定,非 JSON body) — id=753655606337863680(雪花 id 出参即联调所见)
>>> GET /api/customer/detail params={'id': '753655606337863680'} form=None
<<< {"code": 0, "success": true, "message": "success", "data": {"id": "753655606337863680", "createTime": "2026-09-11 16:38:18", "updateTime": "2026-09-11 16:38:18", "customerNo": "KH202609110016", "customerStage": 1, "archiveStatus": 1, "version": 0, "customerName": "e2c-集成走查-115898", "customerType": "customer_type_01", "customerTypeName": "总包", "provinceCode": "440000", "cityCode": "440100", "districtCode": "440103", "industryCode": "gov", "industryName": "政府机关", "industryChildCode": null, "industryChildName": null, "customerStarLevel": 3, "relationStarLevel": 3, "networkUnits": null, "ownerUserId": "739564171091247104", "ownerUserNameSnapshot": "罗伟健", "ownerDeptId": "744841292348915712", "ownerDeptNameSnapshot": "广东保伦电子股份有限公司", "enterPoolTime": null, "lastValidFollowTime": "2026-09-11 16:38:19", "strategicAgreementLevel": null, "vipCustomerLevel": null, "companyDecisionMaker": null, "isBizNegotiated": 0, "directorVisitTime": null, "isChild": 0, "parentCustomerId": null, "parentCustomerNameSnapshot": null, "cooperationSystem": null, "nonCoopReason": null, "joinedPresidentClass": null, "presidentClassPerson": null, "presidentClassPhone": null, "joinedProductClass": null, "productClassPerson": null, "productClassPhone": null, "unifiedCreditCode": null, "legalRepresentative": null, "establishedDate": null, "registeredCapital": null, "businessScope": null, "staffSize": null, "annualRevenue": null, "businessAddress": null, "bizNameFromLookup": null, "remark": null}}
[PASS] ② GET /api/customer/detail 全字段回显(含 version/createTime) — version=0 customerName=e2c-集成走查-115898
>>> POST /api/customer/edit params={'id': '753655606337863680'} form={'customerName': 'e2c-集成走查-115898-v2', 'customerType': 'customer_type_01', 'provinceCode': '440000', 'cityCode': '440100', 'districtCode': '440103', 'isBizNegotiated': 0, 'isChild': 0, 'industryCode': 'gov', 'customerStarLevel': 3, 'relationStarLevel': 3, 'version': 0, 'remark': '走查:带 version 编辑成功'}
<<< {"code": 0, "success": true, "message": "success", "data": {"needConfirm": true, "similarHits": [{"customerId": "753654217876439040", "customerName": "e2c-集成走查-115567-v2", "ownerName": "罗伟健", "customerStage": 1, "archiveStatus": 2, "masked": false}, {"customerId": "753654747847720960", "customerName": "e2c-集成走查-115693-v3", "ownerName": "罗伟健", "customerStage": 1, "archiveStatus": 2, "masked": false}, {"customerId": "753655453971382272", "customerName": "e2c-集成走查-115861-v2", "ownerName": "罗伟健", "customerStage": 1, "archiveStatus": 2, "masked": false}], "customerNo": null, "customerName": null}}
>>> POST /api/customer/edit params={'id': '753655606337863680'} form={'customerName': 'e2c-集成走查-115898-v2', 'customerType': 'customer_type_01', 'provinceCode': '440000', 'cityCode': '440100', 'districtCode': '440103', 'isBizNegotiated': 0, 'isChild': 0, 'industryCode': 'gov', 'customerStarLevel': 3, 'relationStarLevel': 3, 'version': 0, 'remark': '走查:带 version 编辑成功', 'confirmSimilar': 1}
<<< {"code": 0, "success": true, "message": "success", "data": {"id": "753655606337863680", "needConfirm": null, "similarHits": null, "customerNo": "KH202609110016", "customerName": "e2c-集成走查-115898-v2"}}
[PASS] ② POST /api/customer/edit 带 version → 成功(撞相似名闸门时 confirmSimilar 重发) — code=0 needConfirm闸门=True(重发已应用,下步 CAS 67005 为证)
>>> POST /api/customer/edit params={'id': '753655606337863680'} form={'customerName': 'e2c-集成走查-115898-v3', 'customerType': 'customer_type_01', 'provinceCode': '440000', 'cityCode': '440100', 'districtCode': '440103', 'isBizNegotiated': 0, 'isChild': 0, 'industryCode': 'gov', 'customerStarLevel': 3, 'relationStarLevel': 3, 'version': 0, 'remark': '走查:旧版本应被拒', 'confirmSimilar': 1}
<<< {"code": 67005, "success": false, "message": "客户已被他人修改,请刷新后重试", "data": null}
[PASS] ② 乐观锁:edit#1 应用后(version 0→1)再用 0 编辑 → 67005 — code=67005 msg=客户已被他人修改,请刷新后重试
>>> POST /api/customer/contact/create params=None form={'customerId': '753655606337863680', 'name': '走查联系人甲', 'jobTitleName': '总经理', 'phone': '13000115898'}
<<< {"code": 0, "success": true, "message": "success", "data": "753655615208816640"}
[PASS] ③ POST /api/customer/contact/create(phone 必填;data 直出 id 字符串) — contactId=753655615208816640
>>> POST /api/customer/contact/create params=None form={'customerId': '753655606337863680', 'name': '走查联系人乙', 'jobTitleName': '采购总监', 'phone': '15000115898'}
<<< {"code": 0, "success": true, "message": "success", "data": "753655616341278720"}
>>> GET /api/customer/contact/page params={'customerId': '753655606337863680', 'current': 1, 'size': 10} form=None
<<< {"code": 0, "success": true, "message": "success", "data": {"content": [{"id": "753655616341278720", "createTime": "2026-09-11 16:38:21", "customerId": "753655606337863680", "name": "走查联系人乙", "jobTitleName": "采购总监", "jobTitleId": null, "jobTitleCategory": null, "jobTitleLevel": null, "phone": "150****5898", "isKeyContact": 0, "isInternal": 0, "giftRemark": null, "source": null, "customerName": "e2c-集成走查-115898-v2", "customerNo": "KH202609110016"}, {"id": "753655615208816640", "createTime": "2026-09-11 16:38:20", "customerId": "753655606337863680", "name": "走查联系人甲", "jobTitleName": "总经理", "jobTitleId": null, "jobTitleCategory": null, "jobTitleLevel": null, "phone": "130****5898", "isKeyContact": 0, "isInternal": 0, "giftRemark": null, "source": null, "customerName": "e2c-集成走查-115898-v2", "customerNo": "KH202609110016"}, {"id": "753655460720017408", "createTime": "2026-09-11 16:37:44", "customerId": "753655453971382272", "name": "走查联系人乙", "jobTitleName": "采购总监", "jobTitleId": null, "jobTitleCategory": null, "jobTitleLevel": null, "phone": "150****5861", "isKeyContact": 0, "isInternal": 0, "giftRemark": null, "source": null, "customerName": "e2c-集成走查-115861-v2", "customerNo": "KH202609110015"}, {"id": "753655459495280640", "createTime": "2026-09-11 16:37:43", "customerId": "753655453971382272", "name": "走查联系人甲", "jobTitleName": "总经理", "jobTitleId": null, "jobTitleCategory": null, "jobTitleLevel": null, "phone": "130****5861", "isKeyContact": 0, "isInternal": 0, "giftRemark": null, "source": null, "customerName": "e2c-集成走查-115861-v2", "customerNo": "KH202609110015"}, {"id": "75
[PASS] ③ 列表出参 phone 字段即脱敏值(前3+****+后4;图谱节点才叫 phoneMasked) — phone=130****5898
>>> GET /api/customer/contact/reveal params={'id': '753655615208816640'} form=None
<<< {"code": 0, "success": true, "message": "success", "data": "13000115898"}
[PASS] ③ GET /api/customer/contact/reveal 返回明文(走 reveal 端点留痕) — 明文=13000115898
>>> GET /api/customer/contact/graph/detail params={'customerId': '753655606337863680'} form=None
<<< {"code": 0, "success": true, "message": "success", "data": {"version": 2, "nodes": [{"contactId": "753655615208816640", "name": "走查联系人甲", "jobTitleName": "总经理", "jobTitleCategory": null, "level": null, "levelSource": 1, "phoneMasked": "130****5898", "isKeyContact": 0, "isInternal": 0, "giftRemark": null}, {"contactId": "753655616341278720", "name": "走查联系人乙", "jobTitleName": "采购总监", "jobTitleCategory": null, "level": null, "levelSource": 1, "phoneMasked": "150****5898", "isKeyContact": 0, "isInternal": 0, "giftRemark": null}], "edges": []}}
[PASS] ④ 图谱读:联系人创建即自动落图(version 随 CONTACT_ADD 递增) — version=2 nodes=2
>>> POST /api/customer/contact/graph/save params=None form={'customerId': '753655606337863680', 'version': 2, 'nodes[0].contactId': '753655615208816640', 'nodes[0].level': 2, 'nodes[1].contactId': '753655616341278720', 'nodes[1].level': 1, 'edges[0].parentId': '753655615208816640', 'edges[0].childId': '753655616341278720'}
<<< {"code": 0, "success": true, "message": "success", "data": 3}
[PASS] ④ POST graph/save 建边(上级等级数值 2 > 下级 1;customerId/version 走表单) — code=0
>>> GET /api/customer/contact/graph/detail params={'customerId': '753655606337863680'} form=None
<<< {"code": 0, "success": true, "message": "success", "data": {"version": 3, "nodes": [{"contactId": "753655615208816640", "name": "走查联系人甲", "jobTitleName": "总经理", "jobTitleCategory": null, "level": 2, "levelSource": 2, "phoneMasked": "130****5898", "isKeyContact": 0, "isInternal": 0, "giftRemark": null}, {"contactId": "753655616341278720", "name": "走查联系人乙", "jobTitleName": "采购总监", "jobTitleCategory": null, "level": 1, "levelSource": 2, "phoneMasked": "150****5898", "isKeyContact": 0, "isInternal": 0, "giftRemark": null}], "edges": [{"parentId": "753655615208816640", "childId": "753655616341278720"}]}}
[PASS] ④ N1 回读:nodes 含 isInternal/giftRemark(悬停气泡真值)+ 边落库 — node 字段=['contactId', 'giftRemark', 'isInternal', 'isKeyContact', 'jobTitleCategory', 'jobTitleName', 'level', 'levelSource', 'name', 'phoneMasked'] edges=1
>>> GET /api/customer/oplog/page params={'id': '753655606337863680', 'current': 1, 'size': 20} form=None
<<< {"code": 0, "success": true, "message": "success", "data": {"content": [{"id": "753655619742859264", "creatorId": "739564171091247104", "createTime": "2026-09-11 16:38:21", "updaterId": "739564171091247104", "updateTime": "2026-09-11 16:38:21", "deleted": false, "customerId": "753655606337863680", "action": "GRAPH_EDIT", "detail": "保存联系人图谱:关系 1 条,调整等级 2 人(版本 2 → 3)", "operatorId": "739564171091247104", "operatorName": "罗伟健", "operatorDeptName": "广东保伦电子股份有限公司"}, {"id": "753655616660045824", "creatorId": "739564171091247104", "createTime": "2026-09-11 16:38:21", "updaterId": "739564171091247104", "updateTime": "2026-09-11 16:38:21", "deleted": false, "customerId": "753655606337863680", "action": "CONTACT_ADD", "detail": "新增联系人【走查联系人乙】", "operatorId": "739564171091247104", "operatorName": "罗伟健", "operatorDeptName": "广东保伦电子股份有限公司"}, {"id": "753655615624052736", "creatorId": "739564171091247104", "createTime": "2026-09-11 16:38:21", "updaterId": "739564171091247104", "updateTime": "2026-09-11 16:38:21", "deleted": false, "customerId": "753655606337863680", "action": "CONTACT_ADD", "detail": "新增联系人【走查联系人甲】", "operatorId": "739564171091247104", "operatorName": "罗伟健", "operatorDeptName": "广东保伦电子股份有限公司"}, {"id": "753655611484274688", "creatorId": "739564171091247104", "createTime": "2026-09-11 16:38:20", "updaterId": "739564171091247104", "updateTime": "2026-09-11 16:38:20", "deleted": false, "customerId": "753655606337863680", "action": "UPDATE", "detail": "把客户名称从e2c-集成走查-115898修改为e2c-集成走查-115898-v2;把备注从空修改为走查:带 version 编辑成功", "operatorId": "739564171091247104", "operatorName": "罗伟
[PASS] ④ N2 图谱保存落操作日志 action=GRAPH_EDIT — actions=['GRAPH_EDIT', 'CONTACT_ADD', 'CONTACT_ADD', 'UPDATE', 'CREATE']
>>> POST /api/customer/contact/graph/save params=None form={'customerId': '753655606337863680', 'version': 2, 'nodes[0].contactId': '753655615208816640', 'nodes[0].level': 2, 'nodes[1].contactId': '753655616341278720', 'nodes[1].level': 1, 'edges[0].parentId': '753655615208816640', 'edges[0].childId': '753655616341278720'}
<<< {"code": 67018, "success": false, "message": "图谱已被他人修改(版本冲突),请刷新后重试", "data": null}
[PASS] ④ 乐观锁:旧 version 保存图谱 → 67018 — code=67018 msg=图谱已被他人修改(版本冲突),请刷新后重试
>>> GET /api/customer/project/page params={'id': '753655606337863680', 'current': 1, 'size': 10} form=None
<<< {"code": 0, "success": true, "message": "success", "data": {"content": [{"id": "193420000000000001", "projectName": "e2c-走查-项目-115898", "stageName": "冲突处理", "statusName": "进行中", "filingStatusName": "报备审核中", "projectAmount": 123456.78, "ownerUserId": "739564171091247104", "ownerNameSnapshot": "罗伟健", "updateTime": "2026-09-11 16:38:22"}], "total": "1", "size": "10", "current": "1", "pages": "1", "empty": false}}
[PASS] ⑤ N3 GET /api/customer/project/page 反查 crm-project 真数据 — rows=[('e2c-走查-项目-115898', '冲突处理', '进行中', '报备审核中')]
>>> GET /api/customer/detail-head params={'id': '753655606337863680'} form=None
<<< {"code": 0, "success": true, "message": "success", "data": {"id": "753655606337863680", "customerNo": "KH202609110016", "customerName": "e2c-集成走查-115898-v2", "customerStage": 1, "customerStageName": "潜在客户", "customerStarLevel": 3, "relationStarLevel": 3, "strategicAgreementLevel": null, "vipCustomerLevel": null, "archiveStatus": 1, "ownerUserId": "739564171091247104", "ownerUserNameSnapshot": "罗伟健", "ownerDeptNameSnapshot": "广东保伦电子股份有限公司", "lastFollowSummary": null, "lastFollowTime": null, "nextFollowTime": null, "opportunityCount": "0", "projectCount": "1", "wonProjectAmount": null, "planEstimateAmount": null, "ongoingOpportunityAmount": null, "contractAmount": null, "paidAmount": null}}
[PASS] ⑤ N3 detail-head.projectCount 真值(port 真实现;字符串出参防 JS 精度丢失) — projectCount='1'
>>> GET /api/customer/project/page params={'id': '753655606337863680', 'current': 1, 'size': 10} form=None
<<< {"code": 0, "success": true, "message": "success", "data": {"content": [{"id": "193420000000000001", "projectName": "e2c-走查-项目-115898", "stageName": "冲突处理", "statusName": "进行中", "filingStatusName": "报备审核中", "projectAmount": 123456.78, "ownerUserId": "739564171091247104", "ownerNameSnapshot": "罗伟健", "updateTime": "2026-09-11 16:38:22"}], "total": "1", "size": "10", "current": "1", "pages": "1", "empty": false}}
[PASS] ⑥ 对拍《关联项目页签》:文档示例字段 ⊆ 实跑响应 — 文档15键 / 实跑15键 全覆盖
>>> GET /api/customer/contact/graph/detail params={'customerId': '753655606337863680'} form=None
<<< {"code": 0, "success": true, "message": "success", "data": {"version": 3, "nodes": [{"contactId": "753655615208816640", "name": "走查联系人甲", "jobTitleName": "总经理", "jobTitleCategory": null, "level": 2, "levelSource": 2, "phoneMasked": "130****5898", "isKeyContact": 0, "isInternal": 0, "giftRemark": null}, {"contactId": "753655616341278720", "name": "走查联系人乙", "jobTitleName": "采购总监", "jobTitleCategory": null, "level": 1, "levelSource": 2, "phoneMasked": "150****5898", "isKeyContact": 0, "isInternal": 0, "giftRemark": null}], "edges": [{"parentId": "753655615208816640", "childId": "753655616341278720"}]}}
[PASS] ⑥ 对拍《图谱全量读》:文档示例字段 ⊆ 实跑响应 — 文档13键 / 实跑15键 全覆盖
>>> GET /api/customer/detail-head params={'id': '753655606337863680'} form=None
<<< {"code": 0, "success": true, "message": "success", "data": {"id": "753655606337863680", "customerNo": "KH202609110016", "customerName": "e2c-集成走查-115898-v2", "customerStage": 1, "customerStageName": "潜在客户", "customerStarLevel": 3, "relationStarLevel": 3, "strategicAgreementLevel": null, "vipCustomerLevel": null, "archiveStatus": 1, "ownerUserId": "739564171091247104", "ownerUserNameSnapshot": "罗伟健", "ownerDeptNameSnapshot": "广东保伦电子股份有限公司", "lastFollowSummary": null, "lastFollowTime": null, "nextFollowTime": null, "opportunityCount": "0", "projectCount": "1", "wonProjectAmount": null, "planEstimateAmount": null, "ongoingOpportunityAmount": null, "contractAmount": null, "paidAmount": null}}
[PASS] ⑥ 对拍《详情公共头部》:文档示例字段 ⊆ 实跑响应 — 文档23键 / 实跑23键 全覆盖
[PASS] ⑦ 清理走查项目夹具行(DB) — deleted=1
>>> POST /api/customer/archive params={'id': '753655606337863680'} form=None
<<< {"code": 0, "success": true, "message": "success", "data": null}
[PASS] ⑦ 清理 POST /api/customer/archive(正门,走 ARCHIVE 日志) — code=0
>>> GET /api/customer/oplog/page params={'id': '753655606337863680', 'current': 1, 'size': 20} form=None
<<< {"code": 0, "success": true, "message": "success", "data": {"content": [{"id": "753655630744518656", "creatorId": "739564171091247104", "createTime": "2026-09-11 16:38:24", "updaterId": "739564171091247104", "updateTime": "2026-09-11 16:38:24", "deleted": false, "customerId": "753655606337863680", "action": "ARCHIVE", "detail": "归档客户【e2c-集成走查-115898-v2】", "operatorId": "739564171091247104", "operatorName": "罗伟健", "operatorDeptName": "广东保伦电子股份有限公司"}, {"id": "753655619742859264", "creatorId": "739564171091247104", "createTime": "2026-09-11 16:38:21", "updaterId": "739564171091247104", "updateTime": "2026-09-11 16:38:21", "deleted": false, "customerId": "753655606337863680", "action": "GRAPH_EDIT", "detail": "保存联系人图谱:关系 1 条,调整等级 2 人(版本 2 → 3)", "operatorId": "739564171091247104", "operatorName": "罗伟健", "operatorDeptName": "广东保伦电子股份有限公司"}, {"id": "753655616660045824", "creatorId": "739564171091247104", "createTime": "2026-09-11 16:38:21", "updaterId": "739564171091247104", "updateTime": "2026-09-11 16:38:21", "deleted": false, "customerId": "753655606337863680", "action": "CONTACT_ADD", "detail": "新增联系人【走查联系人乙】", "operatorId": "739564171091247104", "operatorName": "罗伟健", "operatorDeptName": "广东保伦电子股份有限公司"}, {"id": "753655615624052736", "creatorId": "739564171091247104", "createTime": "2026-09-11 16:38:21", "updaterId": "739564171091247104", "updateTime": "2026-09-11 16:38:21", "deleted": false, "customerId": "753655606337863680", "action": "CONTACT_ADD", "detail": "新增联系人【走查联系人甲】", "operatorId": "739564171091247104", "operatorName": "罗伟健", "operatorDeptName": "广东保伦电子股份有限公司"}, {"
[PASS] ⑦ 复核:归档走正门 ARCHIVE 日志(归档非删除,detail 仍可读为契约) — actions=['ARCHIVE', 'GRAPH_EDIT', 'CONTACT_ADD', 'CONTACT_ADD', 'UPDATE', 'CREATE']