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.
572 lines
26 KiB
572 lines
26 KiB
# -*- 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()
|
|
|