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.
 
 
 
 
 

167 lines
8.8 KiB

# -*- coding: utf-8 -*-
"""商机分页 6 副本 (销售机会 4 页面 + 商机管理根 + 商机公海根)."""
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,
req_form_example,
)
# Reuse OpportunityDTO 结构 (与 gen_opp_1.py 一致,此处内联一份用于 content[])
OPP_DTO_ROWS = [
('id', 'string', '商机ID(Long,序列化为 string)'),
('createTime', 'string', '创建时间'),
('updateTime', 'string', '更新时间'),
('oppName', 'string', '商机名称'),
('oppSource', 'string', '商机来源字典 code'),
('oppType', 'string', '商机类型字典 code'),
('industryCode', 'string', '行业字典 code'),
('bidForm', 'string', '招标形式字典 code'),
('localityType', 'string', '项目属地字典 code'),
('partyAClear', 'number', '甲方是否明确 0/1'),
('partyA', 'string', '甲方名称'),
('provinceCode', 'string', '省份国标 code'),
('cityCode', 'string', '市/区国标 code'),
('remark', 'string', '备注'),
('projectAmount', 'number', '项目金额(列表展示为「预计金额」)'),
('ownerUserId', 'string', '负责人ID'),
('ownerNameSnapshot', 'string', '负责人姓名快照'),
('ownerDeptId', 'string', '负责人部门ID快照'),
('poolReason', 'string', '进入公海原因字典 code'),
('oppStatus', 'number', '商机状态(轴1:1待领取/2推进中/3暂缓中/4已关闭/5已转项目)'),
('currentStageId', 'string', '当前阶段节点ID(轴2)'),
('stageTemplateVersion', 'string', '阶段模板版本号冗余'),
('sourceLeadId', 'string', '来源线索ID'),
('primaryCustomerId', 'string', '主要意向客户ID'),
('primaryCustomerNameSnapshot', 'string', '主客户名快照'),
('claimTime', 'string', '领取时刻'),
('lastValidFollowTime', 'string', '最近有效跟进时间'),
('oppSourceName', 'string', '商机来源名称(出参回显)'),
('industryName', 'string', '行业名称(出参回显)'),
('provinceName', 'string', '省份名称(出参回显)'),
('cityName', 'string', '市/区名称(出参回显)'),
('ownerDeptName', 'string', '负责人部门名称(出参回显)'),
('currentStageName', 'string', '当前工作节点名称(出参回显)'),
('stageStayDays', 'number', '节点停留时间(天,出参回显)'),
('nextStageName', 'string', '下一节点名称(出参回显)'),
('lastFollowTime', 'string', '最近跟进时间(出参回显)'),
('schemeCardStatus', 'number', '方案卡状态(出参回显;无主客户卡=未创建0)'),
('schemeBudget', 'number', '方案预算(出参回显)'),
('followed', 'boolean', '当前用户是否已关注(出参回显)'),
('poolStageNameSnapshot', 'string', '入池前工作节点名称(出参回显,公海视图专属)'),
]
OPP_DTO_ELEM = (
'{\n'
' "id": "1",\n'
' "createTime": "2024-01-01 12:00:00",\n'
' "updateTime": "2024-01-01 12:00:00",\n'
' "oppName": "示例商机",\n'
' "oppSource": "opp_source_01",\n'
' "oppType": "opp_type_01",\n'
' "industryCode": "industry_01",\n'
' "bidForm": "bid_01",\n'
' "localityType": "local_01",\n'
' "partyAClear": 1,\n'
' "partyA": "示例甲方",\n'
' "provinceCode": "110000",\n'
' "cityCode": "110100",\n'
' "remark": "备注示例",\n'
' "projectAmount": 1000000,\n'
' "ownerUserId": "1",\n'
' "ownerNameSnapshot": "张三",\n'
' "ownerDeptId": "1",\n'
' "poolReason": null,\n'
' "oppStatus": 2,\n'
' "currentStageId": "1",\n'
' "stageTemplateVersion": "v1",\n'
' "sourceLeadId": "1",\n'
' "primaryCustomerId": "1",\n'
' "primaryCustomerNameSnapshot": "示例客户",\n'
' "claimTime": "2024-01-01 12:00:00",\n'
' "lastValidFollowTime": "2024-01-02 10:00:00",\n'
' "oppSourceName": "线索转入",\n'
' "industryName": "示例行业",\n'
' "provinceName": "北京市",\n'
' "cityName": "北京市",\n'
' "ownerDeptName": "华北大区",\n'
' "currentStageName": "需求确认",\n'
' "stageStayDays": 3,\n'
' "nextStageName": "方案报价",\n'
' "lastFollowTime": "2024-01-02 10:00:00",\n'
' "schemeCardStatus": 1,\n'
' "schemeBudget": 800000,\n'
' "followed": true,\n'
' "poolStageNameSnapshot": null\n'
' }'
)
PAGE_JSON = (
'{\n'
f' "content": [\n{OPP_DTO_ELEM}\n ],\n'
' "total": 1,\n'
' "size": 10,\n'
' "current": 1,\n'
' "pages": 1,\n'
' "empty": false\n'
' }'
)
params_table = [
('current','number','','1','当前页码,从 1 开始'),
('size','number','','10','每页条数,上限 500'),
('keyword','string','','-','模糊搜索关键字'),
('orderBy','string','','-','排序字段(驼峰或下划线均可)'),
('asc','boolean','','false','是否升序,默认 false(新数据在前)'),
('viewType','string','','-','视图类型:RECENT 最近访问 / MINE 我负责的 / PARTICIPATED 我参与的 / FOLLOWED 我关注的 / MANAGE 商机管理 / PUBLIC_POOL 商机公海(空/非法回落 MINE)'),
('savedViewId','string','','-','自定义视图 id(非空时读当前用户 opportunity.sales scope 下该视图的检索条件,叠在 viewType 数据集之上)'),
('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筛选'),
('poolReason','string','','-','进入公海原因字典 code 筛选(公海视图)'),
('currentStageId','string','','-','当前阶段节点ID筛选'),
]
resp_rows = [('content','array<object>','商机记录数组(PageResult.content)')] \
+ [('content[].'+r[0], r[1], r[2]) for r in OPP_DTO_ROWS] \
+ [
('total','number','总条数'),
('size','number','每页条数'),
('current','number','当前页码'),
('pages','number','总页数'),
('empty','boolean','是否为空结果'),
]
# 6 个副本的落点:文件夹, 视图说明, viewType 建议值
copies = [
('销售机会/最近访问', '最近访问工作区:按 `viewType=RECENT` 拉取当前用户最近访问过的商机;个人视图叠加团队成员白名单。', 'RECENT'),
('销售机会/我负责的', '我负责的工作区:按 `viewType=MINE` 拉取当前用户负责的商机;个人视图叠加团队成员白名单。', 'MINE'),
('销售机会/我参与的', '我参与的工作区:按 `viewType=PARTICIPATED` 拉取当前用户为团队成员且非负责人的商机。', 'PARTICIPATED'),
('销售机会/我关注的', '我关注的工作区:按 `viewType=FOLLOWED` 拉取当前用户已关注的商机;个人视图叠加团队成员白名单。', 'FOLLOWED'),
('商机管理', '商机管理工作区:按 `viewType=MANAGE` 拉取按 DataScope 部门天花板可见的全部商机(不叠团队白名单)。', 'MANAGE'),
('商机公海', '商机公海工作区:按 `viewType=PUBLIC_POOL` 拉取部门天花板下的公海池商机(`oppStatus=1 待领取`)。', 'PUBLIC_POOL'),
]
for folder, desc_extra, vt in copies:
print(f'-- {folder} --')
desc = f'商机六视图分页查询接口(一个 URL,六个 viewType)。{desc_extra} 数据隔离由 `@DataScope` 自动注入部门天花板;个人四视图(RECENT/MINE/PARTICIPATED/FOLLOWED)另叠团队成员白名单,MANAGE/PUBLIC_POOL 严格按 DataScope。'
kv = [('viewType', vt), ('current','1'), ('size','10')]
docs = build_docs(
'商机分页', 'POST', '/api/opportunity/page',
desc, params_table,
req_form_example('POST', '/api/opportunity/page', kv),
resp_rows,
env_json(PAGE_JSON),
)
write_bru(folder, '商机分页.bru',
bru_form(1, '商机分页', 'post', '/api/opportunity/page', kv, docs))
print('part4 done — 商机分页 6 副本完成')