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.
168 lines
8.8 KiB
168 lines
8.8 KiB
|
1 week ago
|
# -*- 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 副本完成')
|