# -*- coding: utf-8 -*- """票 10-N3e:三个现有 .bru 结构表同步(响应示例区真值待 E2E 后回填)""" import io, sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') BASE = r'D:\code\crm-api-docs' def patch(path, pairs): txt = open(path, 'r', encoding='utf-8').read() for old, new in pairs: if old not in txt: print(f'[MISS] {path} :: {old[:40]}...') return False for old, new in pairs: txt = txt.replace(old, new, 1) open(path, 'w', encoding='utf-8', newline='').write(txt) print(f'[OK] {path} ({len(pairs)} patches)') return True # 1) 操作日志分页.bru:action 筛选值域 11→18(补 GRAPH_EDIT) patch(BASE + r'\A4 客户管理\客户详情\操作日志\操作日志分页.bru', [ ( ' | action | string | 否 | 操作类型筛选(11 种白名单:CREATE/UPDATE/FOLLOW/ARCHIVE/RESTORE/TRANSFER/CLAIM/POOL/STAGE_CHANGE/MEMBER_ADD/MEMBER_REMOVE) |', ' | action | string | 否 | 操作类型筛选(18 种值域与 CustomerConstants ACTION_* 全集一致:CREATE/UPDATE/FOLLOW/ARCHIVE/RESTORE/TRANSFER/CLAIM/POOL/STAGE_CHANGE/MEMBER_ADD/MEMBER_REMOVE/CONTACT_ADD/CONTACT_EDIT/CONTACT_DELETE/AGREEMENT_ADD/AGREEMENT_EDIT/AGREEMENT_DELETE/GRAPH_EDIT) |', ), ( ' | content[].action | String | 动作类型(CREATE/UPDATE/FOLLOW/ARCHIVE/RESTORE/TRANSFER/CLAIM/POOL/STAGE_CHANGE/MEMBER_*/CONTACT_*/AGREEMENT_*) |', ' | content[].action | String | 动作类型(CREATE/UPDATE/FOLLOW/ARCHIVE/RESTORE/TRANSFER/CLAIM/POOL/STAGE_CHANGE/MEMBER_*/CONTACT_*/AGREEMENT_*/GRAPH_EDIT) |', ), ]) # 2) 图谱全量读.bru:nodes[]. 结构表补 isInternal/giftRemark 两行(票 10-N1) patch(BASE + r'\A4 客户管理\客户详情\联系人图谱\图谱全量读.bru', [ ( ' | nodes[].isKeyContact | Integer | 是否关键联系人(1/0) |', ' | nodes[].isKeyContact | Integer | 是否关键联系人(1/0) |\n' ' | nodes[].isInternal | Integer | 是否内线(1/0);图谱悬停气泡展示 |\n' ' | nodes[].giftRemark | String | 礼品备注(悬停气泡展示,可空) |', ), ]) # 3) 详情公共头部.bru:projectCount 行说明改真值口径(票 10-N3) patch(BASE + r'\A4 客户管理\客户详情\详情公共头部.bru', [ ( ' | projectCount | Long | 关联项目数(A5 项目 seam,恒 null 显 "--") |', ' | projectCount | Long | 关联项目数(port 反查 crm-project;失败降级 null 显 "--",对称关联商机契约) |', ), ]) print('DONE')