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.
 
 
 
 
 

120 lines
5.4 KiB

# -*- coding: utf-8 -*-
"""详情子域 - 团队 + 日志 (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,
req_form_example, req_query_example,
)
# ---------- 团队 Tab ----------
print('== 详情子域 / 团队 ==')
TEAM_ROWS = [
('id','string','团队成员行ID'),
('createTime','string','创建时间(加入团队时间)'),
('updateTime','string','更新时间'),
('opportunityId','string','所属商机ID'),
('userId','string','成员用户ID(引用 crm-auth SysUser)'),
('userNameSnapshot','string','成员姓名快照'),
('projectRole','string','项目角色字典 code(纯回显标签:商机负责人/方案工程师/招标专员等,不带权限)'),
('permission','number','行级权限档:1只读 2可写跟进 3可推进节点 4读写'),
]
TEAM_ONE = (
'{\n'
' "id": "1",\n'
' "createTime": "2024-01-01 12:00:00",\n'
' "updateTime": "2024-01-01 12:00:00",\n'
' "opportunityId": "1",\n'
' "userId": "1",\n'
' "userNameSnapshot": "张三",\n'
' "projectRole": "role_owner",\n'
' "permission": 4\n'
' }'
)
docs = build_docs(
'团队成员列表', 'GET', '/api/opportunity/team/list',
'商机详情「团队」Tab:返回该商机的全部团队成员(含负责人)。团队白名单绕开 DataScope 部门天花板,为「我参与的」视图与详情/子表读授权提供依据。移交/移除保留历史(软删 + `deleteKey` 复用键),存活成员判定带 `deleted=0`。',
[('oppId','string','','-','商机ID')],
req_query_example('GET','/api/opportunity/team/list',[('oppId','1')]),
TEAM_ROWS,
env_json(f'[\n{TEAM_ONE}\n ]'),
)
write_bru('商机管理/详情子域', '团队成员列表.bru',
bru_form(11, '团队成员列表', 'get', '/api/opportunity/team/list',
[('oppId','1')], docs))
# ---------- 日志 Tab ----------
print('== 详情子域 / 日志 ==')
OPLOG_ROWS = [
('id','string','日志ID'),
('createTime','string','创建时间'),
('updateTime','string','更新时间'),
('oppId','string','所属商机ID'),
('opKind','string','记录形态:FIELD_CHANGE 字段变更 / ROW_ADD 新增行 / ROW_DELETE 删除行'),
('logType','string','业务类别:FIELD_CHANGE/STATUS_FLOW/STAGE_FLOW/ATTACHMENT/SCHEME_PUSH/ROW_CHANGE/SYSTEM_INTERNAL(决定前端是否展示)'),
('entityName','string','变更实体对象(哪张表/业务对象)'),
('fieldName','string','变更字段名(opKind=FIELD_CHANGE 时有意义)'),
('oldValue','string','旧值(ROW_ADD 时空)'),
('newValue','string','新值(ROW_DELETE 时空)'),
('bizRef','string','被操作行业务标识(ROW_ADD/ROW_DELETE 时的可读标识,如客户名)'),
('snapshotJson','string','整行快照摘要 JSON(ROW_DELETE 保留被删行关键内容)'),
('opDesc','string','操作说明'),
('opSource','string','操作来源:SYSTEM 系统自动 / MANUAL 人工'),
('opTime','string','操作时间'),
('opUserId','string','操作人ID(系统自动时可空)'),
]
OPLOG_ONE = (
'{\n'
' "id": "1",\n'
' "createTime": "2024-01-01 12:00:00",\n'
' "updateTime": "2024-01-01 12:00:00",\n'
' "oppId": "1",\n'
' "opKind": "FIELD_CHANGE",\n'
' "logType": "FIELD_CHANGE",\n'
' "entityName": "opportunity",\n'
' "fieldName": "projectAmount",\n'
' "oldValue": "500000",\n'
' "newValue": "800000",\n'
' "bizRef": null,\n'
' "snapshotJson": null,\n'
' "opDesc": "修改项目金额",\n'
' "opSource": "MANUAL",\n'
' "opTime": "2024-01-01 12:00:00",\n'
' "opUserId": "1"\n'
' }'
)
OPLOG_PAGE_JSON = (
'{\n'
f' "content": [\n{OPLOG_ONE}\n ],\n'
' "total": 1,\n'
' "size": 10,\n'
' "current": 1,\n'
' "pages": 1,\n'
' "empty": false\n'
' }'
)
docs = build_docs(
'操作日志分页', 'POST', '/api/opportunity/oplog/page',
'商机详情「日志」Tab:字段级审计日志分页拉取,按操作时间倒序。默认全记 + 短黑名单排除(技术字段 create_time/update_time/version 等)。状态/阶段流转也记入本表,与专用快照表(`opportunity_status_history`/`opportunity_stage_history`)并存不重复。只增不删。',
[('oppId','string','','-','商机ID'),
('pageNum','number','','1','页码'),
('pageSize','number','','10','每页条数')],
req_form_example('POST','/api/opportunity/oplog/page',
[('oppId','1'),('pageNum','1'),('pageSize','10')]),
[('content','array<object>','日志记录数组')] + [('content[].'+r[0],r[1],r[2]) for r in OPLOG_ROWS] + [
('total','number','总条数'),
('size','number','每页条数'),
('current','number','当前页码'),
('pages','number','总页数'),
('empty','boolean','是否为空结果'),
],
env_json(OPLOG_PAGE_JSON),
)
write_bru('商机管理/详情子域', '操作日志分页.bru',
bru_form(12, '操作日志分页', 'post', '/api/opportunity/oplog/page',
[('oppId','1'),('pageNum','1'),('pageSize','10')], docs))
print('part3c done — 团队 + 日志 2 个接口完成')