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.
 
 
 
 
 
 

3.8 KiB

基础包(crm-base)

通用能力与非业务域原语。不装 controller、不建业务表,只提供基础设施:异常体系、响应封装、分页、雪花 ID、MyBatis-Plus 扩展、数据权限词汇、安全上下文工具。跨模块 seam 也放在这里。

Language

批量执行器: BatchRunner——跨模块非原子批量操作的统一编排协议(ADR-0028),与 BatchResult<F>(结果骨架)同居 domain.result 组成批量协议家族。静态 run(ids, op, bizFail, unknownFail):空判短路 → 逐条委派单条操作(调用方传 self 代理方法引用保每条独立事务,ADR-0023 D1)→ 业务异常经 bizFail(id, e) 翻译收集 → 未知异常 log + unknownFail(id, e) 兜底且不中断后续 → 组装 BatchResult。失败项类型 F 经函数参数注入(各域失败项类提供 bizOf/unknownOf 翻译工厂,如 crm-lead 的 LeadBatchFailItem),本类无业务枚举依赖,保持 crm-base 非业务纯净(ADR-0023 D2/D5)。 Avoid: 批量服务、BatchService、批量框架(要点是「编排协议的静态执行器 + 翻译知识在域」)

权限种子器: 一个 seam interface,让任意业务模块声明式地将自己的权限点(button 节点)种子化到权限资源树(sys_menu 物理表),而不需要知道该表的物理 schema。调用方通过 PermissionModuleDescriptor 声明目录名、菜单名、按钮列表、目标角色编码;实现方(在 crm-auth 中)拥有 sys_menu 的全部字段知识,负责 find-or-create 幂等写入与角色绑定。替代了此前的影子实体方案——crm-dict 曾创建 SysMenuSeed 等重复实体类直接映射 sys_menu 表,导致 schema 泄漏。 Avoid: 权限初始化器、权限注入器、权限注册器

权限模块描述符: 权限种子化的声明单元。一个描述符 = 一个目录 + 一个菜单 + 一组按钮 + 目标角色编码列表。目录幂等——同一目录名被多次 seedModule 只创建一次。调用方不暴露 sys_menu 的任何字段名、枚举值或默认值;denyBehaviorstatusvisible 等 schema 默认值由种子器实现方硬编码。 Avoid: 权限配置、种子描述文件

按钮种子: 权限模块描述符中一条按钮权限点的最小声明:名称、权限码、接口 URL、排序。不包含 denyBehavior/status/visible——这些是 sys_menu 的 schema 细节,由种子器实现方统一硬编码。需要不同值的管理员在启动后通过资源管理 API 修改。 Avoid: 按钮配置、权限点定义

待发通知写入引擎: PendingNoticeWriter<N>service 包,架构审查候选 #3)——多张同构 pending-notice 表(商机回收提醒 / 客户超期提醒)持久化语义的收编处:幂等占位(planOccupied:(biz, plan) 已有记录任意状态即占位,同一计划时刻永不重写)、只动 PENDING 失效(invalidatePendingByBiz / invalidatePendingByIds 两种失效面,已发/已失效不动)、payload 序列化兑底(域内传 Map,Jackson 失败告警存 null 照常落库)、通知状态词汇表 STATUS_PENDING/SENT/INVALID(0/1/2 唯一定义处)。非 bean:表形状差异(实体类/biz 列名/工厂)经 PendingNoticeSchema<N>(mapper + 列引用 SFunction 双用于 wrapper 与取值 + 实体工厂 + 日志域标识)钉在一处,域内各出一个薄组件 extends(商机 OpportunityPendingNoticeWriter / 客户 CustomerPendingNoticeWriter)。不收编:提醒时刻推导(回收截止 / 提醒链 k 递增)与锚点失效判定留各域——消费方只描述「落哪条 / 失效哪批」。 Avoid: 通知服务、消息中心(本引擎只管待发记录持久化,发送是未来消费者的 spin-out)、在引擎外裸 insert pending-notice 行