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.

156 lines
8.8 KiB

1 week ago
# -*- coding: utf-8 -*-
"""第2批:菜单列表页(分页 × 3 + 看板 × 3 × 2)"""
import io, sys
sys.path.insert(0, 'D:/code/crm-backend-matt/.scratch')
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
from bru_lib import write_bru, bru_form, build_docs, env_json, page_json, req_form_example, req_query_example
# ── 商机分页公共结构 ────────────────────────────────────────────────
PAGE_PARAMS = [
('current', 'number', '', '1', '当前页码,从 1 开始'),
('size', 'number', '', '10', '每页条数,上限 500'),
('viewType', 'string', '', '-', '子菜单/展示形态:RECENT 最近访问 / MINE 我负责的 / PARTICIPATED 我参与的 / FOLLOWED 我关注的 / MANAGE 商机管理 / PUBLIC_POOL 商机公海'),
('keyword', 'string', '', '-', '模糊搜索关键字(商机名称 / 客户名 / 负责人)'),
('orderBy', 'string', '', '-', '排序字段(驼峰)'),
('asc', 'boolean','', 'false', '是否升序'),
('savedViewId', 'string', '', '-', '自定义视图 id(仅销售机会菜单支持,非空时叠加该视图检索条件)'),
('statusIn', 'string', '', '-', '商机状态筛选,多值逗号分隔,如 1,2'),
('oppSource', 'string', '', '-', '商机来源字典 code'),
('oppType', 'string', '', '-', '商机类型字典 code'),
('industryCode', 'string', '', '-', '行业字典 code'),
('bidForm', 'string', '', '-', '招标形式字典 code'),
('localityType', 'string', '', '-', '项目属地字典 code'),
('provinceCode', 'string', '', '-', '省份国标 code'),
('cityCode', 'string', '', '-', '市/区国标 code'),
('ownerDeptId', 'string', '', '-', '归属部门 ID'),
('ownerUserId', 'string', '', '-', '负责人 ID'),
('currentStageId','string', '', '-', '当前阶段节点 ID'),
('poolReason', 'string', '', '-', '进入公海原因字典 code(公海菜单专属)'),
]
OPP_DTO_RESP = [
('content', 'array', 'PageResult.content 商机列表'),
('content[].id', 'string', '商机 ID(Long 序列化为 string)'),
('content[].oppName', 'string', '商机名称'),
('content[].oppStatus', 'number', '状态:1待领取 2推进中 3暂缓中 4已关闭 5已转项目'),
('content[].primaryCustomerNameSnapshot','string','主要意向客户名快照'),
('content[].projectAmount', 'number', '项目金额'),
('content[].ownerNameSnapshot', 'string', '负责人姓名快照'),
('content[].ownerDeptName', 'string', '负责人部门名称(出参回显)'),
('content[].currentStageName', 'string', '当前阶段节点名称(出参回显)'),
('content[].stageStayDays', 'number', '节点停留天数(出参回显)'),
('content[].nextStageName', 'string', '下一节点名称(出参回显)'),
('content[].lastFollowTime', 'string', '最近跟进时间(出参回显)'),
('content[].schemeCardStatus', 'number', '方案卡状态(出参回显)'),
('content[].followed', 'boolean', '当前用户是否已关注(出参回显)'),
('content[].poolStageNameSnapshot','string', '入池前节点名称(公海视图专属)'),
('total', 'number', '总条数'),
('size', 'number', '每页条数'),
('current', 'number', '当前页码'),
('pages', 'number', '总页数'),
('empty', 'boolean', '是否为空'),
]
OPP_ELEM = '''{
"id": "1",
"oppName": "示例商机",
"oppStatus": 2,
"primaryCustomerNameSnapshot": "示例客户",
"projectAmount": 1000000,
"ownerNameSnapshot": "张三",
"ownerDeptName": "华北大区",
"currentStageName": "需求确认",
"stageStayDays": 3,
"nextStageName": "方案报价",
"lastFollowTime": "2024-01-02 10:00:00",
"schemeCardStatus": 1,
"followed": true,
"poolStageNameSnapshot": null
}'''
PAGE_RESP_JSON = env_json('{\n "content": [\n' + OPP_ELEM + '\n ],\n "total": 1,\n "size": 10,\n "current": 1,\n "pages": 1,\n "empty": false\n }')
# 三个菜单的分页配置
menus = [
('商机模块/销售机会', 1,
'RECENT/MINE/PARTICIPATED/FOLLOWED',
'销售机会菜单:4 个子菜单(最近访问/我负责的/我参与的/我关注的)共用此接口,由 `viewType` 区分。\n'
'普通列表与分屏列表均调此接口(分屏右侧预览走「商机详情/主体」接口)。\n'
'此菜单支持自定义检索(`savedViewId` 参数);商机管理/商机公海不支持。\n'
'数据隔离:个人四视图叠加团队成员白名单;`@DataScope` 部门天花板。'),
('商机模块/商机管理', 1,
'MANAGE',
'商机管理菜单:`viewType=MANAGE`,按 `@DataScope` 部门天花板可见全部商机(不叠团队白名单)。\n'
'普通列表与分屏列表共用此接口。不支持自定义检索(`savedViewId` 忽略)。'),
('商机模块/商机公海', 1,
'PUBLIC_POOL',
'商机公海菜单:`viewType=PUBLIC_POOL`,部门天花板下 `oppStatus=1 待领取` 的公海池商机。\n'
'普通列表与分屏列表共用此接口。'),
]
for folder, seq, vt_hint, desc in menus:
kv = [('viewType', vt_hint.split('/')[0]), ('current','1'), ('size','10')]
docs = build_docs(
'商机分页', 'POST', '/api/opportunity/page',
desc, PAGE_PARAMS,
req_form_example('POST', '/api/opportunity/page', kv),
OPP_DTO_RESP, PAGE_RESP_JSON,
)
write_bru(folder, '商机分页.bru', bru_form(seq, '商机分页', 'post', '/api/opportunity/page', kv, docs))
# ── 看板接口(3 菜单各一份副本)──────────────────────────────────────
BOARD_MENUS = [
'商机模块/销售机会/看板列表',
'商机模块/商机管理/看板列表',
'商机模块/商机公海/看板列表',
]
SUMMARY_PARAMS = [('stageTemplateId','string','','-','阶段模板版本 ID(不传则按默认模板)')]
SUMMARY_RESP = [
('stageId', 'string', '阶段节点 ID'),
('stageName', 'string', '阶段名称'),
('count', 'number', '该阶段商机数量'),
('totalAmount', 'number', '该阶段项目金额合计'),
]
SUMMARY_JSON = env_json('[\n {\n "stageId": "1",\n "stageName": "需求确认",\n "count": 3,\n "totalAmount": 3000000\n }\n ]')
CARDS_PARAMS = [
('stageId','string','','-','阶段节点 ID'),
('offset', 'number','','0', '偏移量(滚动翻页用,非页码)'),
('limit', 'number','','20','每次拉取条数'),
]
CARDS_RESP = [
('id', 'string', '商机 ID'),
('oppName', 'string', '商机名称'),
('primaryCustomerNameSnapshot','string', '主要意向客户名'),
('projectAmount', 'number', '项目金额'),
('ownerNameSnapshot', 'string', '负责人姓名'),
('stageStayDays', 'number', '当前阶段停留天数'),
('lastFollowTime', 'string', '最近跟进时间'),
]
CARDS_JSON = env_json('[\n {\n "id": "1",\n "oppName": "示例商机",\n "primaryCustomerNameSnapshot": "示例客户",\n "projectAmount": 1000000,\n "ownerNameSnapshot": "张三",\n "stageStayDays": 3,\n "lastFollowTime": "2024-01-02 10:00:00"\n }\n ]')
for folder in BOARD_MENUS:
# 看板阶段汇总
docs = build_docs(
'看板阶段汇总', 'POST', '/api/opportunity/board/stage-summary',
'看板视图:按阶段模板展开泳道头汇总(商机数量 + 项目金额合计)。',
SUMMARY_PARAMS,
req_form_example('POST', '/api/opportunity/board/stage-summary', [('stageTemplateId','1')]),
SUMMARY_RESP, SUMMARY_JSON,
)
write_bru(folder, '看板阶段汇总.bru', bru_form(1, '看板阶段汇总', 'post', '/api/opportunity/board/stage-summary', [('stageTemplateId','1')], docs))
# 看板阶段卡片
kv = [('stageId','1'),('offset','0'),('limit','20')]
docs = build_docs(
'看板阶段卡片', 'POST', '/api/opportunity/board/cards',
'看板视图:拉取指定阶段泳道的商机卡片列表(offset+limit 滚动翻页)。',
CARDS_PARAMS,
req_form_example('POST', '/api/opportunity/board/cards', kv),
CARDS_RESP, CARDS_JSON,
)
write_bru(folder, '看板阶段卡片.bru', bru_form(2, '看板阶段卡片', 'post', '/api/opportunity/board/cards', kv, docs))
print('batch2 done')