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.
41 lines
8.0 KiB
41 lines
8.0 KiB
|
4 hours ago
|
# Map: A7 重接口补齐(同步任务 + 全局日志 + 挂账收尾)
|
||
|
|
|
||
|
|
Label: wayfinder:map · charted 2026-09-08
|
||
|
|
|
||
|
|
## Destination
|
||
|
|
|
||
|
|
[a7-parity](../a7-parity/map.md) 二期:把一期记账不做的重接口落地——A7-1-2 同步任务 5 端点(任务化改造 + 定时调度)、A7-4 全局日志 5 端点(新建 crm-log + AOP/埋点采集 + 批量结果文件 90 天管理)、公海规则「绑定商机(数量)」出参、浏览器级 Demo E2E(复用一期 demo 底座,票 05)——bruno-sync 重生成对账双向零差 + 全仓基线验收(编译过 / BOM 0 / 单测全绿),本 effort 内收官。
|
||
|
|
|
||
|
|
## Notes
|
||
|
|
|
||
|
|
- 前置真相源(一期成果,直接引用不重盘):
|
||
|
|
- 矩阵:[matrix-a7-1-a7-2.md](../a7-parity/matrix-a7-1-a7-2.md) §二(同步任务)/ [matrix-a7-4-a7-5.md](../a7-parity/matrix-a7-4-a7-5.md) §一(日志三页端点素材 + 形态决策素材)
|
||
|
|
- 原型文本库:`.scratch/opportunity-bugfix/lanhu-pages/A7-1-2_同步任务.md`、`A7-4-1_用户操作日志.md`、`A7-4-2_登录日志.md`、`A7-4-3_批量操作日志.md`
|
||
|
|
- 一期拍板(票 [06](../a7-parity/issues/06-gap-verdict.md),不再裁决):日志形态 A = 新全局表 + AOP 采集,域内三表(OpportunityOplog / CustomerOplog / LeadHistory)保留服务各域详情页、不动不聚合;全局日志归**新建 crm-log 轻模块**(不并入 crm-auth)。
|
||
|
|
- 代码现状预核(2026-09-08 建图时):crm-log 模块不存在(现 crm-app/auth/base/customer/dict/file/lead/opportunity/preference/rule 共 10 模块);SystemController 仅阻塞式 `POST /sync/dingtalk`(无 tasks/page、tasks/detail、settings);商机侧无公海规则引用列(运行时 `OpportunityPoolRuleMatcher.loadPublished().match(ownerDeptId)` 动态匹配);lastSyncTime 现存 Redis(key `crm:auth:sync:last-sync-time`)。
|
||
|
|
- 可复用基建:定时任务先例 CustomerReminderJob / LeadMaintenanceJob / OpportunityMaintenanceJob / OrphanChunkCleanupTask(@Scheduled);批量写侧 crm-base `BatchResult`(LeadPool 导入导出已用);登录入口 crm-auth AuthController;文件存储 crm-file + MinIO;全局快照表先例 sys_user_transfer_log;跨域 seam 先例 UserTransferPort(crm-base 定义 + 各模块实现);浏览器级 e2e 先例 a7-parity demo/index.html 底座 + demo_smoke.py 骨架(票 05 复用新建);商机构造先例 opportunity-e2e(POST /api/opportunity/edit,六必填+省市 code)。
|
||
|
|
- 分段与序号:错误码 61xxx=auth(已用至 61021)/ 62xxx=lead(62008)/ 63xxx=dict / 64xxx=rule(64036),**crm-log 取 65xxx**;权限种子 @Order 已用至 24,钉死分配:票 01=25(同步任务菜单)、票 02=26(日志管理菜单)。
|
||
|
|
- 机制沿用(不再裁决):深 tag = 完整页面路径(ADR-0024);bruno-sync 为文档仓唯一权威通道(sourceRoots 加 crm-log、menuBindings 加日志管理菜单);新 Controller 出入参规范 ADR-0017(扁平动作动词 + 查询参数传 id,禁 @PathVariable/@RequestBody);新 Java 文件 UTF-8 无 BOM;agent 不提交任何 git。
|
||
|
|
- 执行基线(沿用先例,执行票直接引用):编译过 + BOM 0 + 全仓单测全绿 + bruno-sync 对账双向零差。
|
||
|
|
- 纪律:采集覆盖面对齐原型操作类型枚举即可,不追求全端点全采;仓库现无 @Aspect 先例,AOP 依赖与切面形态由实现票内核实拍板。
|
||
|
|
|
||
|
|
## Decisions so far
|
||
|
|
|
||
|
|
- 2026-09-08 建图后票审(同日):①权限种子 @Order 钉死分配——票 01=25、票 02=26(原两票面均写 25,并行执行会撞号);②票 01 tasks/page 由矩阵原文 GET 改 POST(对齐全仓 page 惯例:users/roles/rule/log page 均 POST 带筛选 body,detail 类轻查询才 GET);③票 03 方案 B 计数口径钉 match 语义(默认规则 = 不命中发布中部门专用规则的商机数,非全部商机);④e2e 票 [05](issues/05-e2e-demo-smoke.md) 毕业(复用一期 demo 底座与 demo_smoke.py 骨架,新建 a7-heavy/demo,tab 仅二期三域),**前置于收官票 04**——一期票 13 在收官票 12 之后发现 D-01 代码缺陷与 F-01 文档缺陷、修复穿透收官验收,二期先 e2e 修复闭环再终态基线验收;票 04 Blocked by 改 01,02,03,05。执行票 01–05 开放。
|
||
|
|
- 2026-09-08 票 01 执行落地(resolved):同步任务 5 端点任务化全量实现——契约改型返 `DtSyncLaunchDTO{taskId, taskNo}`、launch 并发占位 61023、单线程池异步、进度 5/45/90/100;**组织拉取抽离 `OrgSourcePort` SPI(执行中用户拍板)**:`DingTalkOrgSource` 实现 + 装配缝 `crm.auth.org-source`(缺省 dingtalk),编排层 `DtOrgSyncServiceImpl` 平台无关化零 SDK 依赖,后续企微/自有 OA 新增实现类即可;lastSyncTime 直接切换 dt_sync_task 最新成功行(Redis 兼容读取未做);重试规则仅落设置+边界校验不实现自动重试;partial_failed 枚举保留但不产生;错误码 61022-61024、权限种子 @Order(25)、bruno 5 份落文档仓;验证 crm-auth 全量单测 EXIT=0 + BOM 0。
|
||
|
|
- 2026-09-08 票 02 执行落地(resolved):**全局日志 crm-log 新模块**(轻模块不并入 crm-auth),三表 sys_log_operation/login/batch;**采集机制拍板①混合**:AOP 注解切面(全仓首个 @Aspect,补 spring-boot-starter-aop)兑底全 Controller POST + crm-base `OpLogPort` SPI 内联埋点(crm-auth 登录/退出 5 钩子 + crm-rule LeadPool 批量 3 处,ObjectProvider 容忍缺 Bean,依赖方向零循环);**覆盖面拍板②写侧先行**:不采「查询」GET(量化 81 GET/188 POST),op_type 8 枚举保留定义;批量结果文件 collector 统一落盘 + 90 天保留(下载校验 + cleanup task 3:30 错峰);权限种子 @Order(26);**错误码取 66xxx 段(非票面 65xxx——65001~65999 已被 crm-lead 占用,README 已登记)**;bruno 文档 5 份落文档仓;验证编译过 + BOM 0 + crm-log 34 用例 + 全仓回归 1273 用例全绿。
|
||
|
|
- 2026-09-08 票 [03](issues/03-pool-rule-bound-count.md) 执行落地(resolved):方案 B detail 动态统计零 DDL;**端口落位偏差**——计数 port 归 `com.crm.rule.port.outbound.PoolRuleOpportunityCountPort`(票面 crm-base 偏差,依 ADR-0025 同消费方同方向先例,实现归 crm-opportunity adapter,零 pom 改动,[ADR-0035](../docs/adr/0035-pool-rule-bound-count-port-seam.md));**page 不补列**(票面「原型列头在列表页」前提被 v29 推翻,仅 detail 回填);口径三定:公海态照常计入(owner_dept_id 保留即 match 输入)/ 排除已转项目 opp_status=5 / port 缺失 fail-open 按 0 展示;默认规则 = 不命中发布中专用规则的商机数(排除集 = 发布中专用规则部门并集);detail 出参 `boundOppCount`(Long→string 序列化);bruno 仅 patch 公海规则详情.bru 结构表一行(实测示例 JSON 不动;分页不补——BaseDTO NON_NULL 下 page 无此键,结构表补行反而撒谎);验证 mvn EXIT=0(crm-rule 32 + crm-opportunity 4 用例全绿)+ BOM 0。
|
||
|
|
|
||
|
|
## Not yet specified
|
||
|
|
|
||
|
|
- 职务下拉值域来源(OA title 去重 vs 字典分组)——一期挂账,待拍板小决策,暂不成票。
|
||
|
|
- 角色管理「处理使用人员」弹窗「当前参与商机数」列——低优先;票 03 的 `PoolRuleOpportunityCountPort` seam 已落地(ObjectProvider + adapter 形态可照搬),但其语义是「用户参与商机数」(team 成员维度),与规则绑定计数(ownerDeptId 维度)不同,需独立拍板计数口径后另票。
|
||
|
|
- OpportunityPoolRule 列表「所属战队」等冗余列——随 UI 确认后再议。
|
||
|
|
|
||
|
|
## Out of scope
|
||
|
|
|
||
|
|
- A7-2-3 数据共享 backup 3 页(一期票 06 拍板:等原型正式化后再盘点)。
|
||
|
|
- 非 A7 分区(A0-A6)的接口盘点与文档改动。
|
||
|
|
- 域内三日志表(OpportunityOplog / CustomerOplog / LeadHistory)的改造或聚合(票 06 拍板保留原状)。
|
||
|
|
- 推送/查重规则的「执行次数」统计源(执行侧归商机域,同构「绑定商机」已知裁决,随商机执行侧模块另行毕业)。
|