# -*- 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','日志记录数组')] + [('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 个接口完成')