# -*- coding: utf-8 -*- """Rework old RESTful-era .bru into flat-verb style, preserving all prose/E2E values.""" import os import re DOCS = r'E:\code\crm-api-docs' PROJ = r'e:\code\crm-backend-matt\.scratch\customer-rework' ID_EX = '750844477165273088' MEMBER_EX = '744842318024015872' def qblock(pairs): lines = 'params:query {\n' for n, v in pairs: lines += ' %s: %s\n' % (n, v) return lines + '}\n' def transform(c, r): # 1. method name swap inside method block (before docs) if r.get('method'): head, sep, tail = c.partition('docs {') head = re.sub(r'\b' + r['method'][0] + r' \{', r['method'][1] + ' {', head, count=1) c = head + sep + tail # docs key line + example lines: swap uppercase METHOD word globally c = re.sub(r'\b' + r['method'][0].upper() + r'\b', r['method'][1].upper(), c) # 2. path rewrites (url line + example lines) for pat, repl in r.get('path_re', []): c = re.sub(pat, repl, c) # 2b. example line already had a query string -> collapse the double '?' c = re.sub(r'(\?id=[^?\s]*)\?', r'\1&', c) # 3. docs key line (pattern form) for old, new in r.get('key_sub', []): assert old in c, 'key line not found: ' + old c = c.replace(old, new) # 4. params:query add/merge qa = r.get('query_add') or [] if qa: if 'params:query {' in c: ins = ''.join(' %s: %s\n' % (n, v) for n, v in qa) c = c.replace('params:query {\n', 'params:query {\n' + ins, 1) else: block = qblock(qa) c = re.sub(r'(auth: (?:inherit|none)\n\}\n)', r'\1\n' + block, c, count=1) # 5. body:form-urlencoded line renames (viewType -> workspace) & adds for old, new in r.get('form_rename', []): c = re.sub(r'^(\s*)' + re.escape(old) + r'\s*:.*$', lambda m: m.group(1) + new, c, count=1, flags=re.M) fa = r.get('form_add') or [] if fa: ins = ''.join(' %s: %s\n' % (n, v) for n, v in fa) c = re.sub(r'(body:form-urlencoded \{(?:[^}]*\n)?)(\n?\})', lambda m: m.group(1) + ins + m.group(2), c, count=1) # 6. docs request-param table: append rows after header+separator ta = r.get('table_add') or [] # list of (name, type, req, default, desc) if ta: m5 = r'(\| 参数 \| 类型 \| 必填 \| 默认 \| 说明 \|\n\s*\|[ :|-]+\n)' m4 = r'(\| 参数 \| 类型 \| 必填 \| 说明 \|\n\s*\|[ :|-]+\n)' if re.search(m5, c): rows = ''.join(' | %s | %s | %s | %s | %s |\n' % t for t in ta) c = re.sub(m5, lambda m: m.group(1) + rows, c, count=1) elif re.search(m4, c): rows = ''.join(' | %s | %s | %s | %s |\n' % (t[0], t[1], t[2], t[4]) for t in ta) c = re.sub(m4, lambda m: m.group(1) + rows, c, count=1) else: raise AssertionError('param table not found for rows: ' + str(ta[:1])) # 7. replace a literal "无(...)" param section with a table if r.get('table_replace'): hdr5 = '| 参数 | 类型 | 必填 | 默认 | 说明 |\n| --- | --- | --- | --- | --- |\n' rows = ''.join('| %s | %s | %s | %s | %s |\n' % t for t in r['table_replace']) c = re.sub(r' 无([^\n]*)\n', ' ' + hdr5 + rows, c, count=1) # 8. example form string key rename (viewType= -> workspace=) for old, new in r.get('example_rename', []): c = c.replace(old, new) # 8b. docs param table row rename (viewType row -> workspace row) for oldname, newrow in r.get('table_row_replace', []): c = re.sub(r'^(\s*)\| ' + re.escape(oldname) + r' \|.*$', lambda m: m.group(1) + newrow, c, count=1, flags=re.M) # 9. example form string prepend (workspace=mine&) if r.get('example_prepend'): c = re.sub(r'( POST \S+workspace/(?:page|board/summary|board/cards)\n)', r'\1 ' + r['example_prepend'] + '\n', c, count=1) return c W_TABLE = [('workspace', 'string', '是', '-', '逻辑视图:mine(我的客户)/ overview(客户总览)/ pool(客户公海)')] RULES = [ dict(src=r'A4 客户管理\A4-5 联系人\新增联系人.bru', dst=[(r'A4 客户管理\联系人', '新增联系人.bru')], path_re=[(r'/api/customer/contact(?=[^/\w])', '/api/customer/contact/create')]), dict(src=r'A4 客户管理\A4-5 联系人\编辑联系人.bru', dst=[(r'A4 客户管理\联系人', '编辑联系人.bru')], method=('put', 'post'), path_re=[(r'/api/customer/contact/\d+', '/api/customer/contact/edit?id=' + ID_EX)], key_sub=[('`POST /api/customer/contact/{id}`', '`POST /api/customer/contact/edit`')], query_add=[('id', ID_EX)], table_add=[('id', 'string', '是', '-', '联系人 id(查询参数)')]), dict(src=r'A4 客户管理\A4-5 联系人\删除联系人.bru', dst=[(r'A4 客户管理\联系人', '删除联系人.bru')], method=('delete', 'post'), path_re=[(r'/api/customer/contact/\d+', '/api/customer/contact/delete?id=' + ID_EX)], key_sub=[('`POST /api/customer/contact/{id}`', '`POST /api/customer/contact/delete`')], query_add=[('id', ID_EX)], table_replace=[('id', 'string', '是', '-', '联系人 id(查询参数)')]), dict(src=r'A4 客户管理\A4-5 联系人\联系人详情.bru', dst=[(r'A4 客户管理\联系人', '联系人详情.bru')], path_re=[(r'/api/customer/contact/\d+', '/api/customer/contact/detail?id=' + ID_EX)], key_sub=[('`GET /api/customer/contact/{id}`', '`GET /api/customer/contact/detail`')], query_add=[('id', ID_EX)], table_replace=[('id', 'string', '是', '-', '联系人 id(查询参数)')]), dict(src=r'A4 客户管理\客户管理\新增客户.bru', dst=[(r'A4 客户管理\我的客户', '新增客户.bru')], path_re=[(r'/api/customer(?=[^/\w])', '/api/customer/create')]), dict(src=r'A4 客户管理\客户管理\编辑客户.bru', dst=[(r'A4 客户管理\客户详情', '编辑客户.bru'), (r'A4 客户管理\我的客户', '编辑客户.bru')], method=('put', 'post'), path_re=[(r'/api/customer/\d+(?![/\w])', '/api/customer/edit?id=' + ID_EX)], key_sub=[('`POST /api/customer/{id}`', '`POST /api/customer/edit`')], query_add=[('id', ID_EX)], table_add=[('id', 'string', '是', '-', '客户 id(查询参数)')]), dict(src=r'A4 客户管理\客户管理\客户详情.bru', dst=[(r'A4 客户管理\客户详情', '客户详情.bru')], path_re=[(r'/api/customer/\d+(?![/\w])', '/api/customer/detail?id=' + ID_EX)], key_sub=[('`GET /api/customer/{id}`', '`GET /api/customer/detail`')], query_add=[('id', ID_EX)], table_replace=[('id', 'string', '是', '-', '客户 id(查询参数)')]), dict(src=r'A4 客户管理\客户管理\按客户查联系人.bru', dst=[(r'A3 商机管理\销售机会', '按客户查联系人列表.bru')], path_re=[(r'/api/customer/(\d+)/contacts', r'/api/customer/contacts?customerId=\1')], key_sub=[('`GET /api/customer/{customerId}/contacts`', '`GET /api/customer/contacts`')], query_add=[('customerId', ID_EX)], table_replace=[('customerId', 'string', '是', '-', '客户 id(查询参数;商机字段17级联数据源)')]), dict(src=r'A4 客户管理\客户详情页\详情公共头部.bru', dst=[(r'A4 客户管理\客户详情', '详情公共头部.bru')], path_re=[(r'/api/customer/(\d+)/detail-head', r'/api/customer/detail-head?id=\1')], key_sub=[('`GET /api/customer/{id}/detail-head`', '`GET /api/customer/detail-head`')], query_add=[('id', ID_EX)], table_replace=[('id', 'string', '是', '-', '客户 id(查询参数)')]), dict(src=r'A4 客户管理\客户详情页\团队成员页签.bru', dst=[(r'A4 客户管理\客户详情\团队成员', '团队成员页签.bru')], path_re=[(r'/api/customer/(\d+)/members(?![/\w])', r'/api/customer/member/list?id=\1')], key_sub=[('`GET /api/customer/{id}/members`', '`GET /api/customer/member/list`')], query_add=[('id', ID_EX)], table_replace=[('id', 'string', '是', '-', '客户 id(查询参数)')]), dict(src=r'A4 客户管理\客户详情页\添加团队成员.bru', dst=[(r'A4 客户管理\客户详情\团队成员', '添加团队成员.bru')], path_re=[(r'/api/customer/(\d+)/members(?![/\w])', r'/api/customer/member/add?id=\1')], key_sub=[('`POST /api/customer/{id}/members`', '`POST /api/customer/member/add`')], query_add=[('id', ID_EX)], table_add=[('id', 'string', '是', '-', '客户 id(查询参数)')]), dict(src=r'A4 客户管理\客户详情页\移除团队成员.bru', dst=[(r'A4 客户管理\客户详情\团队成员', '移除团队成员.bru')], method=('delete', 'post'), path_re=[(r'/api/customer/(\d+)/members/(\d+)', r'/api/customer/member/remove?id=\1&memberUserId=\2')], key_sub=[('`POST /api/customer/{id}/members/{memberUserId}`', '`POST /api/customer/member/remove`')], query_add=[('id', ID_EX), ('memberUserId', MEMBER_EX)], table_replace=[('id', 'string', '是', '-', '客户 id(查询参数)'), ('memberUserId', 'string', '是', '-', '被移除成员用户 id(查询参数)')]), dict(src=r'A4 客户管理\客户详情页\关联商机页签.bru', dst=[(r'A4 客户管理\客户详情\关联商机', '关联商机页签.bru')], path_re=[(r'/api/customer/(\d+)/opportunities', r'/api/customer/opportunity/page?id=\1')], key_sub=[('`GET /api/customer/{id}/opportunities`', '`GET /api/customer/opportunity/page`')], query_add=[('id', ID_EX)], table_add=[('id', 'string', '是', '-', '客户 id(查询参数)')]), dict(src=r'A4 客户管理\客户详情页\操作日志分页.bru', dst=[(r'A4 客户管理\客户详情\操作日志', '操作日志分页.bru')], path_re=[(r'/api/customer/(\d+)/oplog/page', r'/api/customer/oplog/page?id=\1')], key_sub=[('`GET /api/customer/{id}/oplog/page`', '`GET /api/customer/oplog/page`')], query_add=[('id', ID_EX)], table_add=[('id', 'string', '是', '-', '客户 id(查询参数)')]), dict(src=r'A4 客户管理\客户详情页\新增跟进.bru', dst=[(r'A4 客户管理\客户详情\跟进记录', '新增跟进.bru')], path_re=[(r'/api/customer/(\d+)/follow(?![/\w])', r'/api/customer/follow/add?id=\1')], key_sub=[('`POST /api/customer/{id}/follow`', '`POST /api/customer/follow/add`')], query_add=[('id', ID_EX)], table_add=[('id', 'string', '是', '-', '客户 id(查询参数)')]), dict(src=r'A4 客户管理\客户详情页\跟进记录分页.bru', dst=[(r'A4 客户管理\客户详情\跟进记录', '跟进记录分页.bru')], path_re=[(r'/api/customer/(\d+)/follow/page', r'/api/customer/follow/page?id=\1')], key_sub=[('`GET /api/customer/{id}/follow/page`', '`GET /api/customer/follow/page`')], query_add=[('id', ID_EX)], table_add=[('id', 'string', '是', '-', '客户 id(查询参数)')]), dict(src=r'A4 客户管理\客户关注与重点标记\关注客户.bru', dst=[(r'A4 客户管理\客户公海', '关注客户.bru')], path_re=[(r'/api/customer/(\d+)/focus(?![/\w])', r'/api/customer/focus?id=\1')], key_sub=[('`POST /api/customer/{id}/focus`', '`POST /api/customer/focus`')], query_add=[('id', ID_EX)], table_replace=[('id', 'string', '是', '-', '客户 id(查询参数)')]), dict(src=r'A4 客户管理\客户关注与重点标记\取消关注客户.bru', dst=[(r'A4 客户管理\客户公海', '取消关注客户.bru')], path_re=[(r'/api/customer/(\d+)/unfocus(?![/\w])', r'/api/customer/unfocus?id=\1')], key_sub=[('`POST /api/customer/{id}/unfocus`', '`POST /api/customer/unfocus`')], query_add=[('id', ID_EX)], table_replace=[('id', 'string', '是', '-', '客户 id(查询参数)')]), dict(src=r'A4 客户管理\客户关注与重点标记\标记重点客户.bru', dst=[(r'A4 客户管理\客户详情', '标记重点客户.bru')], path_re=[(r'/api/customer/(\d+)/star(?![/\w])', r'/api/customer/star?id=\1')], key_sub=[('`POST /api/customer/{id}/star`', '`POST /api/customer/star`')], query_add=[('id', ID_EX)], table_replace=[('id', 'string', '是', '-', '客户 id(查询参数)')]), dict(src=r'A4 客户管理\客户关注与重点标记\取消重点标记.bru', dst=[(r'A4 客户管理\客户详情', '取消重点标记.bru')], path_re=[(r'/api/customer/(\d+)/unstar(?![/\w])', r'/api/customer/unstar?id=\1')], key_sub=[('`POST /api/customer/{id}/unstar`', '`POST /api/customer/unstar`')], query_add=[('id', ID_EX)], table_replace=[('id', 'string', '是', '-', '客户 id(查询参数)')]), dict(src=r'A4 客户管理\客户导入\确认执行导入.bru', dst=[(r'A4 客户管理\我的客户\客户导入', '确认执行导入.bru')], path_re=[(r'/api/customer/import/(\d+|TASKID)/confirm', r'/api/customer/import/confirm?taskId=\1')], key_sub=[('`POST /api/customer/import/{taskId}/confirm`', '`POST /api/customer/import/confirm`')], query_add=[('taskId', 'TASKID')], table_replace=[('taskId', 'string', '是', '-', '导入任务 id(查询参数;来自上传预校验返回)')]), dict(src=r'A4 客户管理\客户导入\任务结果.bru', dst=[(r'A4 客户管理\我的客户\客户导入', '任务结果.bru')], path_re=[(r'/api/customer/import/(\d+|TASKID)(?![/\w])', r'/api/customer/import/result?taskId=\1')], key_sub=[('`GET /api/customer/import/{taskId}`', '`GET /api/customer/import/result`')], query_add=[('taskId', 'TASKID')], table_replace=[('taskId', 'string', '是', '-', '导入任务 id(查询参数)')]), dict(src=r'A4 客户管理\客户导入\失败疑似重复明细.bru', dst=[(r'A4 客户管理\我的客户\客户导入', '失败疑似重复明细.bru')], path_re=[(r'/api/customer/import/(\d+|TASKID)/failures', r'/api/customer/import/failures?taskId=\1')], key_sub=[('`GET /api/customer/import/{taskId}/failures`', '`GET /api/customer/import/failures`')], query_add=[('taskId', 'TASKID')], table_replace=[('taskId', 'string', '是', '-', '导入任务 id(查询参数)')]), dict(src=r'e:\code\crm-backend-matt\.scratch\customer-rework\old_交接详情.bru', dst=[(r'A4 客户管理\客户交割', '交接详情.bru')], path_re=[(r'/api/customer/transfer/(\d+)(?![/\w])', r'/api/customer/transfer/detail?id=\1')], key_sub=[('`GET /api/customer/transfer/{id}`', '`GET /api/customer/transfer/detail`')], query_add=[('id', ID_EX)], table_replace=[('id', 'string', '是', '-', '交接单 id(查询参数)')]), dict(src=r'e:\code\crm-backend-matt\.scratch\customer-rework\old_客户分配.bru', dst=[(r'A4 客户管理\客户交割', '客户分配.bru')], path_re=[(r'/api/customer/transfer/(\d+)/assign', r'/api/customer/transfer/assign?id=\1')], key_sub=[('`POST /api/customer/transfer/{id}/assign`', '`POST /api/customer/transfer/assign`')], query_add=[('id', ID_EX)], table_add=[('id', 'string', '是', '-', '交接单 id(查询参数)')]), dict(src=r'e:\code\crm-backend-matt\.scratch\customer-rework\old_可分配销售列表.bru', dst=[(r'A4 客户管理\客户交割', '可分配销售列表.bru')], path_re=[(r'/api/customer/transfer/(\d+)/assignable', r'/api/customer/transfer/assignable?id=\1')], key_sub=[('`GET /api/customer/transfer/{id}/assignable`', '`GET /api/customer/transfer/assignable`')], query_add=[('id', ID_EX)], table_replace=[('id', 'string', '是', '-', '交接单 id(查询参数)')]), dict(src=r'A4 客户管理\客户三 workspace\workspace 列表分页.bru', dst=[(r'A4 客户管理\客户总览', 'workspace 列表分页.bru'), (r'A4 客户管理\我的客户', 'workspace 列表分页.bru'), (r'A4 客户管理\客户公海', 'workspace 列表分页.bru')], path_re=[(r'/api/customer/workspace/\w+/page', '/api/customer/workspace/page')], key_sub=[('`POST /api/customer/workspace/{workspace}/page`', '`POST /api/customer/workspace/page`')], form_rename=[('viewType', 'workspace: mine')], example_rename=[('viewType=ASSIGNED', 'workspace=mine')], table_row_replace=[('viewType', '| workspace | string | 是 | 逻辑视图:mine(我的客户)/ overview(客户总览)/ pool(客户公海) |')]), dict(src=r'A4 客户管理\客户三 workspace\看板分组汇总.bru', dst=[(r'A4 客户管理\客户总览\看板列表', '看板分组汇总.bru'), (r'A4 客户管理\我的客户\看板列表', '看板分组汇总.bru')], path_re=[(r'/api/customer/workspace/\w+/board/summary', '/api/customer/workspace/board/summary')], key_sub=[('`POST /api/customer/workspace/{workspace}/board/summary`', '`POST /api/customer/workspace/board/summary`')], form_rename=[('viewType', 'workspace: mine')], example_rename=[('viewType=ASSIGNED', 'workspace=mine')], table_row_replace=[('viewType', '| workspace | string | 是 | 逻辑视图:mine(我的客户)/ overview(客户总览)/ pool(客户公海) |')]), dict(src=r'A4 客户管理\客户三 workspace\看板单列卡片.bru', dst=[(r'A4 客户管理\客户总览\看板列表', '看板单列卡片.bru'), (r'A4 客户管理\我的客户\看板列表', '看板单列卡片.bru')], path_re=[(r'/api/customer/workspace/\w+/board/cards', '/api/customer/workspace/board/cards')], key_sub=[('`POST /api/customer/workspace/{workspace}/board/cards`', '`POST /api/customer/workspace/board/cards`')], form_rename=[('viewType', 'workspace: mine')], example_rename=[('viewType=ASSIGNED', 'workspace=mine')], table_row_replace=[('viewType', '| workspace | string | 是 | 逻辑视图:mine(我的客户)/ overview(客户总览)/ pool(客户公海) |')]), dict(src=r'客户管理\超期提醒规则\保存提醒规则.bru', dst=[(r'A7 后台管理\客户管理设置\超期未跟进提醒', '保存提醒规则.bru')], method=('put', 'post'), path_re=[(r'/api/rule/customer/reminder(?=[^/\w])', '/api/rule/customer/reminder/save')]), ] # fresh content (no old draft): file -> content FRESH = {} FRESH[r'A3 商机管理\商机详情\客户\按客户查联系人.bru'] = """meta { name: 按客户查联系人 type: http seq: 5 tags: [ generated ] } get { url: {{baseUrl}}/api/opportunity/customer/contacts body: none auth: inherit } params:query { customerId: 750844477165273088 } docs { # 按客户查联系人 `GET /api/opportunity/customer/contacts` 按客户查联系人(客户模块真源,票 11 切真源);商机页签内展示某客户的联系人列表。 ## 请求参数 | 参数 | 类型 | 必填 | 默认 | 说明 | | --- | --- | --- | --- | --- | | customerId | string | 是 | - | 客户 id | ## 请求示例 请求头:Authorization: Bearer {{token}} GET /api/opportunity/customer/contacts?customerId=750844477165273088 ## 响应 data 结构 | 字段 | 类型 | 说明 | | --- | --- | --- | | [].id | string | 联系人 id | | [].customerId | string | 所属客户 id | | [].name | string | 联系人姓名 | | [].phone | string | 联系电话 | | [].jobTitleName | string | 职务名称 | ## 响应示例 // 示例数据,字段结构以上表为准,非真实返回 ```json { "code": 0, "success": true, "message": "success", "data": [ { "id": "1", "customerId": "1", "name": "张三", "phone": "13800000000", "jobTitleName": "采购经理" } ] } ``` } """ FRESH[r'A7 后台管理\客户管理设置\查重设置\读取查重设置.bru'] = """meta { name: 读取查重设置 type: http seq: 1 tags: [ generated ] } get { url: {{baseUrl}}/api/rule/customer/dedup body: none auth: inherit } docs { # 读取查重设置 `GET /api/rule/customer/dedup` 读当前查重配置(全局单例);统一社会信用代码为系统强制规则,不提供配置字段(前端固定渲染不可关闭)。 ## 请求参数 无 ## 请求示例 请求头:Authorization: Bearer {{token}} GET /api/rule/customer/dedup ## 响应 data 结构 | 字段 | 类型 | 说明 | | --- | --- | --- | | id | string | 配置行 id | | masterEnabled | number | 总开关:1启用 0禁用(仅控制名称/电话提示;信用代码强制规则不受影响) | | nameEnabled | number | 客户名称查重独立开关:1启用 0禁用 | | nameMatchMode | number | 名称匹配方式:1精确 2模糊(模糊时相似度阈值生效) | | similarityThreshold | number | 名称相似度阈值 0~100(模糊匹配生效;出厂标准 80) | | phoneEnabled | number | 联系电话查重独立开关:1启用 0禁用(精确命中仅提示不阻断) | | updateTime | string | 最近保存时间(回显只读) | ## 响应示例 // 示例数据,字段结构以上表为准,非真实返回 ```json { "code": 0, "success": true, "message": "success", "data": { "id": "1", "masterEnabled": 1, "nameEnabled": 1, "nameMatchMode": 2, "similarityThreshold": 80, "phoneEnabled": 1, "updateTime": "2024-01-01 12:00:00" } } ``` } """ FRESH[r'A7 后台管理\客户管理设置\查重设置\保存查重设置.bru'] = """meta { name: 保存查重设置 type: http seq: 2 tags: [ generated ] } post { url: {{baseUrl}}/api/rule/customer/dedup/save body: formUrlEncoded auth: inherit } body:form-urlencoded { masterEnabled: 1 nameEnabled: 1 nameMatchMode: 2 similarityThreshold: 80 phoneEnabled: 1 } docs { # 保存查重设置 `POST /api/rule/customer/dedup/save` 保存配置(全量覆盖,保存即生效);开关缺省视为关闭;匹配方式/阈值缺省回出厂(模糊/80);信用代码强制规则无配置项。表单绑定(ADR-0017)。 ## 请求参数 | 参数 | 类型 | 必填 | 默认 | 说明 | | --- | --- | --- | --- | --- | | masterEnabled | number | 否 | 0 | 总开关:1启用 0禁用(仅控制名称/电话提示;信用代码强制规则不受影响) | | nameEnabled | number | 否 | 0 | 客户名称查重独立开关:1启用 0禁用 | | nameMatchMode | number | 否 | 2 | 名称匹配方式:1精确 2模糊(模糊时相似度阈值生效) | | similarityThreshold | number | 否 | 80 | 名称相似度阈值 0~100(模糊匹配生效;出厂标准 80) | | phoneEnabled | number | 否 | 0 | 联系电话查重独立开关:1启用 0禁用(精确命中仅提示不阻断) | ## 请求示例 请求头:Authorization: Bearer {{token}} Content-Type: application/x-www-form-urlencoded POST /api/rule/customer/dedup/save masterEnabled=1&nameEnabled=1&nameMatchMode=2&similarityThreshold=80&phoneEnabled=1 ## 响应 data 结构 | 字段 | 类型 | 说明 | | --- | --- | --- | | (同读取查重设置 data) | object | 保存后的全量配置(含 id/updateTime) | ## 响应示例 // 示例数据,字段结构以上表为准,非真实返回 ```json { "code": 0, "success": true, "message": "success", "data": { "id": "1", "masterEnabled": 1, "nameEnabled": 1, "nameMatchMode": 2, "similarityThreshold": 80, "phoneEnabled": 1, "updateTime": "2024-01-01 12:00:00" } } ``` } """ FRESH[r'customer\ping\健康探针.bru'] = """meta { name: 健康探针 type: http seq: 1 tags: [ generated ] } get { url: {{baseUrl}}/api/customer/ping body: none auth: inherit } docs { # 健康探针 `GET /api/customer/ping` 客户模块健康探针(无页面入口,不挂页面 tag,ADR-0024;按 urlPattern 目录归位)。 ## 请求参数 无 ## 请求示例 请求头:Authorization: Bearer {{token}} GET /api/customer/ping ## 响应 data 结构 | 字段 | 类型 | 说明 | | --- | --- | --- | | module | string | 模块名(crm-customer) | | status | string | 状态(UP) | ## 响应示例 // 示例数据,字段结构以上表为准,非真实返回 ```json { "code": 0, "success": true, "message": "success", "data": { "module": "crm-customer", "status": "UP" } } ``` } """ def main(): import sys only = sys.argv[1] if len(sys.argv) > 1 else None written, skipped = [], [] rules = [r for r in RULES if os.path.basename(r['src']).startswith('old_')] if only else RULES for r in rules: src = os.path.join(DOCS, r['src']) base = open(src, encoding='utf-8').read() try: c = transform(base, r) except AssertionError as e: raise AssertionError('[rule: %s] %s' % (r['src'], e)) for d, fn in r['dst']: dpath = os.path.join(DOCS, d.replace('\\', os.sep)) os.makedirs(dpath, exist_ok=True) target = os.path.join(dpath, fn) if os.path.exists(target): skipped.append(d + '\\' + fn) continue open(target, 'w', encoding='utf-8', newline='').write(c) written.append(d + '\\' + fn) for rel, content in FRESH.items(): fpath = os.path.join(DOCS, rel.replace('\\', os.sep)) os.makedirs(os.path.dirname(fpath), exist_ok=True) if os.path.exists(fpath): skipped.append(rel) continue open(fpath, 'w', encoding='utf-8', newline='').write(content) written.append(rel) out = ['WRITTEN %d:' % len(written)] + [' ' + w for w in written] + \ ['SKIPPED %d:' % len(skipped)] + [' ' + s for s in skipped] open(os.path.join(PROJ, 'rework-written.txt'), 'w', encoding='utf-8').write('\n'.join(out)) print('written:', len(written), 'skipped:', len(skipped)) if __name__ == '__main__': main()