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.
 
 
 
 
 

39 KiB

CRM 信息化平台技术方案

1 建设目标

面向销售组织的一体化 CRM 业务中台,围绕线索→商机→客户→项目销售全链路提供业务承载,围绕用户/组织/权限/规则/日志提供治理支撑,围绕检索/AI提供智能放大。

建设范围覆盖原型文档《【原型】itc 信息化业务中台 web 端 V1.0-202607》170 页所定型的六大业务模块与后台治理体系:

模块 页数 关键子域
A1 销售工作台 2 首页 · 消息中心
A2 线索管理 13 线索公海(分屏/列表)· 我的线索 · 我的关注 · 线索管理 · 线索设置
A3 商机管理 51 销售机会 · 商机详情(概览/客户/方案卡/现场勘察/附件/跟进/工作计划/团队/日志)· 商机公海 · 商机管理设置(阶段/方案卡模板/方案推送规则/查重规则/公海与提醒规则/字典)· 督办
A4 客户管理 39 客户公海 · 客户总览 · 我的客户 · OCR 快捷新增 · 客户详情(含联系人/跟进/关联商机/关联项目/战略协议/团队/日志)· 联系人 · 客户查重合并 · 客户交割
A5 项目管理 14 项目管理(看板/分屏/列表)· 项目详情七阶段状态机(冲突处理→方案设计→商务报价→招投标准备→赢单/输单→结项→关闭)· 项目统计
A6 数据看板 3 运营看板 · 客户看板 · 营销看板
A7 后台管理 30+ 用户管理与 OA 同步 · 角色管理与权限点管理 · 业务规则四模块 · 日志三类(操作/登录/批量)· 数据字典

平台在此范围内提供:统一登录与免登、组织架构与部门层级、基于资源树的角色权限体系、行级数据权限、文件与预览、检索与向量化、规则引擎、审计日志、AI 网关与融入点。

2 总体架构

平台采用 Spring Boot 多模块单仓库 形态,每个业务域或横切能力为独立 Maven 模块,统一由 crm-app 聚合启动。所有业务模块共享 crm-base 通用能力与 crm-auth 认证权限地基。

2.1 分层架构

顶层分层视图:前端 · API 网关 · 应用 · 基础设施四层竖向叠放。应用层再拆三带——业务域 / 平台域 / 通用基座——自上而下依赖,crm-app 横切聚合三带统一打包启动。模块级依赖细节见 §2.2。

flowchart TB
    FE["<b>① 前端层</b> React + Ant Design<br/>菜单树 / 权限码 / 字典 由后端下发驱动 UI"]
    GW["<b>② API 网关层</b> Nginx 反向代理 · JWT Bearer 鉴权"]

    subgraph APP["<b>③ 应用层</b> crm-app 聚合打包 · 唯一启动入口"]
        direction TB
        BIZ["业务域 客户 · 线索 · 商机 · 项目 · 数据看板"]
        PLAT["平台域 认证 · 文件 · AI · 检索 · 规则 · 审计 · 通知 · OA同步"]
        BASE["通用基座 crm-base(异常/ID/字典/数据权限/统一信封/ORM 增强)"]
        BIZ --> PLAT --> BASE
    end

    INFRA["<b>④ 基础设施层</b><br/>MySQL · Redis · MinIO · Elasticsearch · 向量库 · 钉钉 · LLM/OCR/自研算法服务"]

    FE --> GW --> APP --> INFRA

    classDef edge fill:#f5f7fa,stroke:#4a5568,stroke-width:2px,color:#1a202c
    classDef biz fill:#e6f4ff,stroke:#0958d9,color:#003a8c,stroke-width:1.5px
    classDef plat fill:#f6ffed,stroke:#389e0d,color:#135200,stroke-width:1.5px
    classDef base fill:#fff7e6,stroke:#d46b08,color:#873800,stroke-width:2px

    class FE,GW,INFRA edge
    class BIZ biz
    class PLAT plat
    class BASE base

前端与网关经由后端下发的菜单树/权限码/字典驱动,不含业务逻辑;应用层三带自上而下依赖(业务→平台→基座),任一带均可跨带直依赖基座;基础设施由平台域各模块封装,业务域不直接触达(详见 §2.3)。

2.2 应用层模块依赖

依赖走向自上而下:业务域 → 平台域 → crm-base,共三层。上层可跨层直依赖 crm-basecrm-app 不在依赖链内,仅聚合全部模块打包。为保持可读,层间依赖以层代表节点间的粗箭头示意,非逐模块连线(逐模块依赖矩阵见 §2.4)。

flowchart TB
    subgraph L1["① 业务域 5 模块"]
        direction LR
        Customer[crm-customer] --- Lead[crm-lead] --- Opp[crm-opportunity] --- Project[crm-project] --- Analytics[crm-analytics]
    end

    subgraph L2["② 平台域 8 模块"]
        direction LR
        Auth[crm-auth] --- File[crm-file] --- AI[crm-ai] --- Search[crm-search] --- Rule[crm-rule] --- Audit[crm-audit] --- Notify[crm-notify] --- OaSync[crm-oa-sync]
    end

    subgraph L3["③ 通用基座 1 模块"]
        Base[crm-base]
    end

    Customer ==> Auth
    Auth ==> Base
    Project -. 跨层直依赖 .-> Base

    App[["crm-app<br/>聚合打包 · 唯一启动入口"]]
    App -. 聚合全部 .-> L1

    linkStyle 11,12 stroke:#0958d9,stroke-width:3px
    linkStyle 13 stroke:#8c8c8c,stroke-dasharray:4 3
    linkStyle 14 stroke:#722ed1,stroke-dasharray:4 3

    classDef biz fill:#e6f4ff,stroke:#0958d9,color:#003a8c,stroke-width:1.5px
    classDef plat fill:#f6ffed,stroke:#389e0d,color:#135200,stroke-width:1.5px
    classDef base fill:#fff7e6,stroke:#d46b08,color:#873800,stroke-width:2px
    classDef app fill:#f9f0ff,stroke:#722ed1,color:#391085,stroke-width:1.5px

    class Customer,Lead,Opp,Project,Analytics biz
    class Auth,File,AI,Search,Rule,Audit,Notify,OaSync plat
    class Base base
    class App app

层内模块以细连线水平排列示意同级并列(无依赖含义);粗蓝箭头为主依赖走向,灰虚线为跨层直依赖,紫虚线为 crm-app 聚合。各模块简称对照见 §2.4 模块职责表。

2.3 外部依赖

基础设施与外部服务的接入位置:每类基础设施由特定平台域模块封装,业务模块通过平台域门面调用(FileApi / AiApi / SearchApi 等),不直接接触基础设施 SDK。左列平台域模块,中列存储,右列外部服务;箭头为"谁封装谁"。MySQL 为全模块共用,单列示意不逐一连线。

flowchart LR
    subgraph PLAT["平台域模块"]
        direction TB
        Auth[crm-auth]
        File[crm-file]
        AI[crm-ai]
        Search[crm-search]
        OaSync[crm-oa-sync]
        Notify[crm-notify]
    end

    subgraph STORE["存储层"]
        direction TB
        Redis[(Redis<br/>会话/缓存)]
        MinIO[(MinIO<br/>对象存储)]
        ES[(Elasticsearch<br/>全文索引)]
        Vec[(向量库<br/>Milvus/Qdrant)]
    end

    subgraph EXT["外部服务"]
        direction TB
        DingTalk[钉钉开放平台]
        LLM[大模型 Provider<br/>通义/DeepSeek/自托管]
        OCR[OCR Provider<br/>阿里云/腾讯云]
        AlgoTeam[自研算法接口<br/>HTTP + gRPC]
    end

    MySQL[(MySQL · 全模块共用)]

    Auth --> Redis
    Auth --> DingTalk
    File --> MinIO
    Search --> ES
    Search --> Vec
    AI --> LLM
    AI --> OCR
    AI --> AlgoTeam
    OaSync --> DingTalk
    Notify --> DingTalk
    PLAT -.-> MySQL

    classDef plat fill:#f6ffed,stroke:#389e0d,color:#135200,stroke-width:1.5px
    classDef store fill:#e6fffb,stroke:#08979c,color:#00474f
    classDef ext fill:#fff1f0,stroke:#cf1322,color:#5c0011

    class Auth,File,AI,Search,OaSync,Notify plat
    class MySQL,Redis,MinIO,ES,Vec store
    class DingTalk,LLM,OCR,AlgoTeam ext

2.4 模块职责

模块 职责 关键能力
crm-base 通用能力基座 全局异常、雪花 ID、公共字段填充、Jackson(Long→String/日期)、Redis 序列化、Knife4j、TraceId、数据字典、@DataScope 声明、Result<T> 统一信封、MyBatis-Plus 增强(分页/防全表更新/批量 upsert)、BaseEntity/BaseDTO/BaseParam
crm-auth 认证与组织权限 钉钉扫码/免登(同一 OAuth 换取逻辑)、组织准入、JWT+Redis 滑动会话、统一用户(OA 唯一来源)、部门(主/兼职/部门集合)、RBAC 权限资源树(catalog/menu/button 扁平存储)、行级数据权限四档(fail-closed)、动态 API 拦截(apiUrl+Caffeine)
crm-file 文件承载 直传、三阶段分片上传(断点续传+孤儿清理)、下载、kkFileView 预览(内网 presigned 回源)
crm-ai AI 能力网关 封装 OCR、摘要、推荐、结构化抽取、评分、相似度等能力,每种能力支持多种策略(第三方 API 或自研算法),由能力路由层按配置选路
crm-search 检索能力 全文检索(ES + IK 分词)、向量检索(Milvus/Qdrant)、异步建索引(事件驱动,最终一致)、失败降级 DB
crm-rule 业务规则引擎 公海规则、查重规则、方案推送规则、超期提醒规则的配置化承载与热更新
crm-audit 审计日志 AOP + @Audited 白名单,覆盖用户操作/登录/批量操作三类
crm-notify 消息通知 应用内消息、多通道分发(钉钉/短信/邮件)、消息模板、事件消费
crm-oa-sync OA 同步 定时/手动触发拉 OA 用户与部门、幂等匹配(unionId/工号)、字段映射规则、承载在职状态流转
crm-customer 客户域 客户、联系人、战略协议、跟进记录、团队成员、客户查重合并、客户交割
crm-lead 线索域 线索、线索公海池、领取四关、超时回收、软失效
crm-opportunity 商机域 商机、方案卡、方案推送规则、现场勘察、跟进、工作计划、督办
crm-project 项目域 项目、七阶段状态机、方案设计、商务报价、招投标准备、赢单/输单/结项/关闭
crm-analytics 数据看板域 运营/客户/营销三看板、预聚合汇总表、定时物化
crm-app 唯一启动入口 聚合全部模块打可执行 jar,其他模块不 repackage

2.5 核心实体关系

erDiagram
    AuthUser ||--o{ SysUserRole : "持有"
    SysRole ||--o{ SysUserRole : "被持有"
    SysRole ||--o{ SysRoleMenu : "授权"
    SysMenu ||--o{ SysRoleMenu : "被授权"
    SysMenu }o--|| SysMenu : "父子(parentId)"
    AuthUser }o--|| SysDept : "主部门"
    AuthUser }o--o{ SysDept : "兼职(user_dept)"
    SysDept }o--|| SysDept : "父子(parentId)"

    Customer ||--o{ Contact : "包含"
    Customer ||--o{ StrategicAgreement : "签订"
    Customer ||--o{ FollowUp : "跟进"
    Customer ||--o{ Opportunity : "关联"
    Customer ||--o{ Project : "衍生"
    Customer }o--|| AuthUser : "负责人"

    Lead }o--|| LeadSeaPool : "归属公海"
    Lead ||--o| Opportunity : "转化"
    Lead }o--|| AuthUser : "负责人"

    Opportunity ||--o{ SolutionCard : "含方案"
    Opportunity ||--o{ SiteSurvey : "现场勘察"
    Opportunity ||--o{ FollowUp : "跟进"
    Opportunity }o--|| Customer : "属于"
    Opportunity }o--|| AuthUser : "负责人"

    Project }o--|| Customer : "服务"
    Project }o--|| AuthUser : "负责人"

    SolutionCardTemplate ||--o{ SolutionCard : "生成"
    SolutionPushRule }o--|| SolutionCardTemplate : "推荐"

    FileMeta }o--|| AuthUser : "上传人"
    Customer ||--o{ FileMeta : "附件"
    Opportunity ||--o{ FileMeta : "附件"
    Project ||--o{ FileMeta : "附件"

2.6 请求处理链路

sequenceDiagram
    participant FE as 前端
    participant Nginx
    participant JWT as JwtAuthFilter
    participant DS as DataScope Init
    participant API as ApiPermissionInterceptor
    participant CTL as Controller
    participant SVC as Service
    participant DSI as DataScopeInterceptor (MyBatis)
    participant DB as MySQL

    FE->>Nginx: HTTP + Bearer Token
    Nginx->>JWT: 转发
    JWT->>JWT: 验签 + 查 Redis + 滑动续期
    JWT->>DS: 载入 PermissionGrant/DataVisibility
    DS->>API: 载入 ThreadLocal
    API->>API: 匹配 apiUrl pattern + 校验权限码
    API->>CTL: 通过
    CTL->>SVC: 调用
    SVC->>DSI: 发起查询
    DSI->>DSI: 注入 WHERE (owner_id / dept_id / 1=0 fail-closed)
    DSI->>DB: 执行
    DB-->>FE: Result<T>

3 模块与能力

3.1 认证与组织权限

  • 登录方式:钉钉扫码登录、钉钉免登(前端 OAuth 重定向 authCode,后端与扫码同一逻辑),扩展新渠道只需实现 ThirdPartyAuthClient SPI。跨平台身份映射键为手机号。
  • 组织准入:登录时对新用户用企业级 access token 调钉钉通讯录 API 校验组织归属,非本组织拒绝登录,已在库用户不再重复校验。
  • 会话:JWT + Redis 双重校验,剩余有效期不足一半自动续满,强制下线即删 Redis key。
  • 用户主数据:全 CRM 统一用户来源于 OA,业务表里的负责人/创建人等 id 均指向 crm_auth_user。CRM 侧唯一可写字段为角色分配。
  • 部门:主部门/兼职部门/部门集合三层语义,兼职为只读挂靠(可读该部门数据,但产出不入兼职部门)。
  • 权限资源树:菜单分组(catalog)/ 菜单页面(menu)/ 按钮(button)三类节点扁平存储于 sys_menu,通过 parentId 组树。角色→资源多对多,保存时后端沿 parentId 补全祖先,读取即已补全的完整集合。
  • 动态 API 拦截:button 节点 apiUrl(Ant-style pattern)由 Caffeine 缓存驱动 HandlerInterceptor,未注册接口 fail-open,注册接口未授权返回 403。资源树变更立即失效缓存。
  • 行级数据权限:四档(仅本人 / 本部门 / 本部门及以下 / 全部)由角色 data_scope 决定,多角色取最宽。MyBatis 拦截器在 SQL 层自动注入 WHERE;按部门档位遇空部门集合注入 1=0(fail-closed,不静默放行)。业务实体标 @DataScope(ownerColumn, deptColumn) 生效,无标注不受影响。

3.2 客户域

  • 客户主实体:包含基本信息(名称/税号/行业/等级/地址)、负责人、归属部门、来源、创建/更新审计字段。支持列表/分屏/卡片三视图与客户公海/客户总览/我的客户三入口。
  • 联系人:客户下多联系人,独立列表页与详情,支持导入。
  • 战略协议:客户下的长期合作框架协议(框架合同/年度合同),含金额/年限/条款/附件,独立列表与详情。
  • 跟进记录:客户与商机共享的时间线记录,支持文本与附件。
  • 团队成员:客户可指派协作成员,与主负责人权限区分。
  • OCR 快捷新增:上传名片/营业执照/证照 → OCR 结构化抽取 → 表单预填 → 人工确认落库。见 §5.1。
  • 客户查重与合并:主动扫描全量客户按规则(税号/名称/域名/电话)判疑似重复,卡片/列表视图供人工审核合并,主/从合并策略、字段选优、子实体(联系人/跟进/协议)归并、审计留痕。
  • 客户交割:客户从一负责人转到另一负责人的主动业务流程,含发起/分配/交接记录/详情四阶段。归属部门随负责人变更(避免接收人"本部门"档看不到自己名下数据)。离职回收角色场景走同一底层能力。

3.3 线索域

  • 线索主实体:来源/状态/意向度 extra 字段,负责人与归属部门跟随。
  • 线索公海池LeadSeaPool 管理配置实体,绑定销售团队(Dept 树非叶子)与销售部门(Dept 树叶子),支持省份/城市多选、部门负责人、跨部门协作人手选、领取规则(成员自领 / 仅管理员分配)、个人领取上限、个人持有上限、超时回收天数、软失效天数。名称全局唯一,创建后 team/dept 锁定,池下线索计数用作删除防护。
  • 部门成员动态计算:部门成员=归属该部门的用户全集,实时按 deptId 推导不落库,后续入职者自动纳入。
  • 领取四关:领取模式 → 人员范围(部门成员∪协作人)→ 单次上限 → 持有上限,任一关不通过返回失败原因。
  • 超时回收与软失效:起算点=最后跟进时间;超回收天数进公海;公海停留超失效天数转软失效。规则参数化于 crm-rule
  • 导入:Excel 按公海池名称口径导入,行级校验(团队/部门归属校验、领取规则映射、数字字段正整数)。

3.4 商机域

  • 商机主实体:金额、阶段、客户、负责人、归属部门。商机阶段由 A3-4-1 商机阶段设置维护,可配置。
  • 商机详情:概览 / 客户信息 / 方案卡 / 现场勘察 / 相关附件 / 跟进记录 / 工作计划 / 团队成员 / 操作日志 九个 tab。
  • 相关操作:写跟进、新增方案卡、添加关联客户、推送方案、暂缓、抛公海、关闭、督办、添加团队成员、新增现场勘察。
  • 方案卡:对客户可交付的产品/服务组合快照,含定价/条款/附件,作为商机下的核心子实体,可从方案卡模板生成。
  • 方案卡模板:可复用的方案卡蓝本,由管理员维护。
  • 方案推送规则:按客户属性(行业/等级/地域)与商机属性(阶段/金额)匹配推荐方案卡的可配置规则。承载于 crm-rule,AI 融入点见 §5.1。
  • 查重规则:新建商机时防重的可配置规则。
  • 公海与提醒规则:商机公海回收与超期提醒规则,与线索公海共享底层规则引擎。
  • 商机公海:无负责人商机的收纳池,支持领取/关注/分配。
  • 督办:管理者对下属商机的督办功能。

3.5 项目域

  • 项目主实体:由成交客户或商机派生,负责人与归属部门跟随。
  • 状态机(七阶段):冲突处理 → 方案设计 → 商务报价 → 招投标准备 → 赢单/输单 → 结项 → 关闭。冲突处理区分本地/异地场景,用于多环境或多方协作时的状态协调。
  • 视图:看板(按阶段列聚合)、分屏、列表三视图;我的项目视图;项目统计。

3.6 数据看板域

  • 运营看板:全局漏斗、活动度、转化率。
  • 客户看板:客户分布、活跃度、TOP 客户。
  • 营销看板:线索来源、转化、公海流转。
  • 实现:预聚合汇总表 + 定时物化视图(crm-analytics 任务),前端 ECharts。查询按数据权限档位收窄,管理层与一线看到的口径一致。
  • AI 融入点:NL2 看板问答与看板异动归因,见 §5.1。

3.7 后台治理

  • 用户管理:只读用户列表(OA 唯一来源),支持部门子树筛选、在职状态筛选、关键词(姓名/账号/手机号)搜索、最后登录时间范围。四指标卡(部门总数/在职/离职/待分配)随部门子树变。CRM 侧唯一写操作为分配角色。
  • 同步任务:OA 用户与部门定时/手动同步,字段映射规则可配,冲突记录可复核。
  • 角色管理/api/roles/* 独立端点。分步保存:基本信息与权限分配解耦。祖先补全在服务端完成。roleCode 唯一,内置角色(builtin=true,如 ADMIN)禁删禁改 roleCode。删除级联 sys_role_menu + sys_user_role
  • 权限点管理/api/resources/* 独立端点,维护整棵权限资源树。button 节点携带 apiUrl(Ant pattern)驱动动态拦截。
  • 业务规则:线索规则 / 商机规则 / 客户规则(超期未跟进提醒、客户查重设置)/ 项目规则 四模块,配置化。
  • 日志:用户操作日志 / 登录日志 / 批量操作日志 三类,AOP + @Audited 白名单显式声明写入。
  • 数据字典:全平台枚举/下拉配置中心,crm-base 提供 DictService,业务模块引用字典 code。

4 关键技术

4.1 技术栈

选型
运行时 JDK 17 + Spring Boot 3.3.5
ORM MyBatis-Plus 3.5.7(运行时 CRUD)+ JPA 注解(ddl-auto: update 全环境建表)
认证 Spring Security + JWT
缓存 Redis(会话/字典/规则)+ Caffeine(进程内热点)
文件 MinIO(对象存储)+ kkFileView(在线预览)
全文检索 Elasticsearch 8 + IK 中文分词
向量检索 Milvus 或 Qdrant
API 文档 Knife4j
调度 Spring @Scheduled + ShedLock(分布式锁,多实例互斥)
消息 Redis Pub/Sub 或 RabbitMQ(事件驱动索引与通知)
AI 框架 Spring AI 或自研薄适配层
工具库 Hutool、Guava、EasyExcel、AntPathMatcher

4.2 认证与登录

见 §3.1。JWT 载荷含 userId 与签发时间戳;Redis key 为 jwt:{userId}:{jti}。免登与扫码后端同一 OAuth2 userAccessToken 换取逻辑,区别仅在前端获取 authCode 的方式。

4.3 数据权限双管

  • 读侧:MyBatis DataScopeInterceptor 拦截 SELECT,按 @DataScope 注解与 DataVisibilityContext(ThreadLocal)注入 WHERE。
  • 写侧MetaObjectFillHandler 取同一份身份填 owner_id / dept_id
  • fail-closed:按部门档遇空集合注入 1=0;未知档位配置直接失败不静默放行。

4.4 动态 API 拦截

button 节点 apiUrl(Ant pattern)通过 Caffeine 缓存驱动 HandlerInterceptor。写操作触发 ResourceService.save/delete 立即失效缓存。fail-open 策略:未注册 URL 放行,已注册 URL 校验权限码。与 @PreAuthorize 共存,二者均需通过。

4.5 文件与预览

直传 10MB 内一次请求;超过走三阶段分片(init/upload/complete),Redis 存会话状态支持断点续传,chunks/{uploadId}/{序号} 临时对象合并后清理,OrphanChunkCleanupTask 定时兜底清孤儿分片。预览走 kkFileView,后端对 MinIO 签内网 presigned GET 拼入 onlinePreview URL,浏览器仅接触 kkFileView,MinIO 不暴公网。

4.6 检索

业务实体保存后发领域事件,crm-search 异步消费:文本切片(滑动窗口)+ embedding → 同步入 ES 与向量库。索引与主库最终一致。检索接口暴露统一 SearchApi(关键词/向量/混合三种模式),失败降级 DB LIKE 保证可用。

4.7 规则引擎

轻量优先:规则参数配置化 + 策略模式实现,判定逻辑内聚为纯函数。表达式复杂场景引入 Aviator/QLExpress。规则数据存 MySQL,Redis + Caffeine 二级缓存,写操作发事件立即失效。

4.8 AI 能力网关

AI 层采用能力路由 + 多后端 Provider双级抽象设计,隔离业务代码与底层实现,确保接入商业大模型、开源自托管模型、自研算法团队接口三类后端可自由切换与组合。

4.8.1 分层结构

调用自上而下贯穿五级:业务模块 → AiApi 门面 → AiCapability 能力路由 → 路由决策(yml)→ 四类 Provider SPI → 具体后端。网关治理为横切层,挂在 AiApi 入口,对所有能力与后端统一施加。

flowchart TB
    BIZ["业务模块<br/>(客户/线索/商机/项目/看板)"]
    AiApi["AiApi 门面<br/>业务唯一入口 · 不感知后端类型"]
    CAP["AiCapability 能力路由层<br/>ocr · extract · summarize · embed · rerank<br/>chat/rag · nlDsl · score · recommend<br/>similarity · classify · anomaly"]
    ROUTE["路由决策<br/>application.yml 编译时配置<br/>每能力 primary + fallback 降级链"]

    subgraph PROV["Provider SPI(四类并存)"]
        direction LR
        P1["LlmProvider<br/>大模型"]
        P2["OcrProvider<br/>专用 OCR"]
        P3["AlgoServiceProvider<br/>自研算法<br/>HTTP+gRPC"]
        P4["RuleProvider<br/>规则兜底"]
    end

    subgraph VEND["后端实现"]
        direction LR
        V1["通义/DeepSeek<br/>自托管 Qwen"]
        V2["阿里云/腾讯云<br/>PaddleOCR"]
        V3["自研评分/推荐<br/>查重/异常检测"]
        V4["Aviator<br/>策略规则"]
    end

    GW["网关治理(横切全后端)<br/>权限码 · 限流 · 审计 · 降级链 · 资源度量 · prompt/embedding 缓存"]

    BIZ --> AiApi
    AiApi --> CAP
    CAP --> ROUTE
    ROUTE --> P1 & P2 & P3 & P4
    P1 --> V1
    P2 --> V2
    P3 --> V3
    P4 --> V4
    AiApi -. 每次调用经治理 .-> GW

    classDef entry fill:#e6f4ff,stroke:#0958d9,color:#003a8c,stroke-width:1.5px
    classDef core fill:#f6ffed,stroke:#389e0d,color:#135200,stroke-width:1.5px
    classDef prov fill:#fff7e6,stroke:#d46b08,color:#873800,stroke-width:1.5px
    classDef vend fill:#f9f0ff,stroke:#722ed1,color:#391085
    classDef gw fill:#fff1f0,stroke:#cf1322,color:#5c0011,stroke-width:1.5px

    class BIZ entry
    class AiApi,CAP,ROUTE core
    class P1,P2,P3,P4 prov
    class V1,V2,V3,V4 vend
    class GW gw

两级抽象职责

  • AiApi 门面:业务模块唯一入口,业务代码不感知后端类型(等同 FileApi 模式)。
  • AiCapability 能力路由层:以能力(不是模型或厂商)为粒度暴露方法,如 capability.score(input)capability.recommend(input)capability.similarity(a, b)。同一能力可绑定不同后端,业务代码不需变更。
  • Provider SPI:三类底层 SPI 并存,分别承载 LLM、OCR、自研算法服务;规则引擎作为兜底 Provider 以同一 SPI 形态接入,用于 AI 不可用时降级。

4.8.2 后端类型

Provider SPI 承载 传输 典型能力
LlmProvider 大模型 HTTP (SDK 封装) chat / summarize / extract / rag / nlDsl
OcrProvider 专用 OCR 服务 HTTP ocr(名片/证照识别)
AlgoServiceProvider 自研算法团队接口 HTTP REST + gRPC 双支持 score / recommend / similarity / classify / anomaly / 或任何算法团队交付的能力
RuleProvider 规则引擎兜底 进程内调用 全部能力均可作为最终降级链末端

自研算法接口的接入路径:算法团队按 CRM 侧发布的 AiCapability 契约(JSON Schema 定义输入输出)交付 HTTP 或 gRPC 服务,CRM 侧无需为每次上线新增适配代码,配置切换即可生效。

4.8.3 契约与路由配置

契约由 CRM 侧主导:每个 AiCapability(评分/推荐/相似度/OCR/...)在 CRM 侧定义 JSON Schema 契约,明确输入输出字段与语义。算法团队实现方须符合契约;不符合时由 Provider 适配层拒绝并返回明确错误,不做隐式兼容。契约稳定,后端多变,业务代码不感知。

路由决策放在 application.yml:每能力显式声明主 Provider 与降级链,变更需发版。

crm:
  ai:
    capabilities:
      customer.ocr:
        primary: ocr-aliyun
        fallback: [ocr-tencent, llm-qwen]
      customer.dedup.similarity:
        primary: algo-team-similarity
        fallback: [embed-qwen, rule-string-match]
      lead.score:
        primary: algo-team-lead-scoring
        fallback: [rule-lead-score]
      opportunity.solution-recommend:
        primary: algo-team-recommend
        fallback: [rule-solution-match]
      customer.field-extract:
        primary: llm-deepseek
        fallback: [llm-qwen]
      analytics.nl-to-dsl:
        primary: llm-qwen
    providers:
      algo-team-similarity:
        type: algo-service
        transport: grpc
        endpoint: algo-service.internal:50051
        service: SimilarityService
        method: Compare
        timeout: 500ms
      algo-team-lead-scoring:
        type: algo-service
        transport: http
        endpoint: http://algo-service.internal/api/lead-score
        timeout: 800ms
      llm-qwen:
        type: llm
        vendor: dashscope
        model: qwen-plus
      ocr-aliyun:
        type: ocr
        vendor: aliyun

4.8.4 网关治理(统一对待所有后端)

自研算法接口与商业厂商在治理侧同等对待,不做特权豁免:

  • 权限码校验:AI 功能视为权限点,crm:ai:{capability} 权限码控制哪些用户/角色可调用。
  • 限流:能力级 QPS + 并发上限,防止内部服务雪崩传导。
  • 审计留痕:每次调用记录 traceId、userId、capability、provider、input hash、output、耗时、结果状态。AI 建议是否被人工采纳一并留痕,为后续模型评估提供数据。
  • 降级链primary 失败/超时按 fallback 顺序自动尝试,最终回落规则引擎兜底,业务不感知。
  • 资源使用度量:按能力+Provider 统计调用次数、Token 数、平均耗时。商业 API 换算为成本,自研接口作为资源使用度量(哪些能力吃自家 GPU 多),指导资源规划与算法团队优化方向。
  • prompt/embedding 缓存:相同输入命中缓存复用,同时降低外部厂商开销与自研服务压力。

4.8.5 数据权限与 AI 安全

  • 数据权限约束贯穿:AI 输入候选集与提示词上下文恒经 DataScopeInterceptor 过滤,无论后端是商业 LLM 还是自研算法服务,均不构成数据权限旁路。
  • 结构化输出强制:抽取/评分类任务由 CRM 侧定义 JSON Schema,Schema 违反自动重试;不合规输出丢弃不落库。
  • 非确定性动作人工确认:AI 产出为建议,不自动执行不可逆动作(分配/回收/合并/改归属)。人工确认或规则闸门放行后方可落地。

4.9 调度

Spring @Scheduled + ShedLock(基于 Redis 或 DB 的分布式锁),保证多实例部署下同一任务全局只跑一次。承载定时任务:公海超时回收、线索软失效、客户超期未跟进提醒、孤儿分片清理、索引重建、OA 同步、看板物化视图刷新。

4.10 审计

Spring AOP 拦截 Controller 方法,@Audited(bizDomain, action) 白名单显式声明写审计。字段:userId、traceId、apiUrl、action、bizDomain、targetId、before、after、result、ipAddr、ua、耗时。同步写 audit 表,写失败仅告警不阻断主流程。

4.8.6 AI 融入设计点

具体功能点清单见 §5.1。

5 系统易用性与自动化设计

汇总系统在易用性与自动化两方面的设计点。分两类:AI 类需模型或算法支撑;自动化类由规则、定时任务、事件驱动、批处理等常规工程手段承载。共通原则:规则能解决的不喂模型均受数据权限约束不可逆动作不自动执行,由人工或规则闸门放行。功能点为设计承载能力,是否实现按业务需要与排期取舍。

5.1 AI 融入设计点

表中"底层能力"仅列主要技术形态,实际每能力经 §4.8 的能力路由配置绑定到具体后端(商业 API / 自托管 / 自研算法 / 规则引擎),业务代码不感知。

业务模块 AI 融入功能点 说明 底层能力 典型后端选择
客户 OCR 快捷新增 上传名片/营业执照/证照 → OCR 结构化抽取企业名/联系人/电话/地址/税号 → 表单预填 → 人工确认落库 OCR + LLM 校验 商业 OCR API(阿里云/腾讯云)或自研 OCR 模型
客户 客户查重相似度 企业名/地址容错查重,规则(税号/域名精确)+ 相似度模型("深圳市 XX 有限公司" vs "深圳 XX 公司")+ 阈值可配 相似度算法 + 规则引擎 自研查重模型 / Embedding + 规则 / 商业 embedding
客户 客户档案会话问答 对单客户档案自然语言提问(历史成交/风险点/关键联系人),后端检索客户维度全文本并生成 RAG(ES + 向量 + 生成模型)+ 数据权限过滤 商业 LLM + 商业/自研 embedding
客户 战略协议关键信息抽取 上传战略协议 PDF → 抽取金额/年限/条款要点写入元数据 文档解析 + 结构化抽取 商业 LLM 或自研合同解析模型
线索 线索评分与自动分配 按来源/地域/行为特征打分,高分线索优先分配给合适销售 评分模型 + 规则引擎 自研评分模型主导 / 规则兜底 / LLM 补非结构化特征
线索 智能公海回收提醒 超天数硬规则叠加语义判断"跟进是否实质推进",回收前预警 规则引擎 + 语义判断 规则主 / LLM 或自研文本分类模型补
商机 方案卡智能推荐 商机推方案时按客户+商机属性推荐 top-N 方案卡;规则命中多张时相似度重排(客户画像 vs 方案卡描述) 推荐模型 + 相似度 + 规则 自研推荐服务主导 / 商业 embedding 兜底
商机 商机赢率预测 按阶段/金额/跟进密度预测成交率,辅助漏斗复盘 预测模型 + 定性归因 自研 ML 模型主导 / LLM 做归因说明
商机 跟进建议 基于商机上下文与阶段生成下一步动作建议 RAG + 生成模型 商业 LLM
商机 跟进记录摘要 长跟进记录一键摘要,档案概览自动生成 生成模型 商业 LLM 或自托管
项目 阶段材料智能校验 各阶段附件(方案/报价/招投标)合规性 AI 校验(要素齐全性/格式规范/敏感信息) 结构化抽取 + 规则 商业 LLM 或自研合规校验模型
数据看板 NL2 看板问答 自然语言问看板:"本周华东转化率"→ 后端翻译为受控查询 DSL → 聚合查询 → 图表返回 自然语言转 DSL(字段白名单,禁止裸 SQL) 商业 LLM
数据看板 看板异动归因 指标下滑时自动定位维度:"本周华东转化下滑" → 主因是某销售组线索转化异常 预聚合切片 + 异动识别 + 生成归因 规则+统计(识别)+ 商业 LLM(文案)
平台交互 全局 NL 检索 "上海本月未跟进的高等级客户" → 结构化查询条件(字段白名单,必过数据权限) 自然语言转 DSL + 数据权限拦截器 商业 LLM
审计与安全 异常行为检测 从审计日志识别异常访问(非工作时段大量导出、跨部门越权尝试),生成告警说明 规则 + 序列异常算法 + 告警文案 自研异常检测模型 / 规则兜底 / LLM 生成文案
消息中心 消息智能摘要与优先级 站内消息批量摘要与紧急度评估,避免通知刷屏 摘要 + 分类模型 商业 LLM 或自研分类模型

5.2 自动化处理设计点

不依赖模型,由规则、定时任务、事件驱动、批处理承载。

业务模块 自动化点 说明 承载机制
客户 客户交割自动化 离职/转岗触发客户批量交接下家,跟进记录/联系人/协议随人走,权限同步刷新 事件驱动 + 事务批处理
客户 超期未跟进提醒 按客户等级配置超期天数,达阈值自动生成提醒消息并推送责任人 定时任务 + 消息中心
客户 客户去重合并 后台批量识别疑似重复客户对,管理员一键合并,业务数据(联系人/跟进/协议)自动归并 规则引擎 + 批处理
线索 线索公海超时回收 领取四关(拨号/加微/首访/意向)未达成自动退回公海,可配置提前预警 定时任务 + 规则引擎
线索 线索软失效 长期无动作线索标记失效,从主视图隐藏但保留档案 定时任务
线索 领取节流 单用户单日/单月领取上限自动拦截 规则引擎 + Redis 计数
商机 阶段推进督办 商机停留阶段超期自动督办到人,链上升级到直属上级 定时任务 + 消息中心
商机 方案推送落库 命中推送规则自动生成方案卡关联记录,附推荐理由 规则引擎 + 事件驱动
项目 阶段状态机流转 七阶段流转按闸门条件自动放行/拦截,材料齐全性检查通过后进入下一阶段 状态机 + 规则引擎
项目 结项/关闭归档 触发终态自动冻结写入、归档附件、生成结项报告骨架 事件驱动 + 模板引擎
文件 分片上传断点续传 上传中断后续传免重传,会话过期自动清理孤儿分片 Redis 会话 + 定时任务
文件 kkFileView 预览 常见格式(PDF/Office/图片)在线预览免下载 内网 presigned 回源
数据看板 物化视图刷新 高频看板聚合结果按分钟/小时预聚合,查询走结果表 定时任务 + ShedLock 互斥
OA 同步 用户与部门自动同步 定时拉 OA 数据幂等匹配(unionId/工号),字段映射规则化,在职状态自动流转 定时任务 + 幂等匹配
审计 三类日志自动留痕 Controller AOP + @Audited 白名单自动记录用户操作/登录/批量操作,前后镜像对比 AOP + 白名单
消息 多通道分发 站内消息按用户偏好自动分发到钉钉/短信/邮件,模板化 事件驱动 + 模板引擎
检索 索引异步重建 业务实体保存发领域事件,ES 与向量库异步建索引,失败降级 DB LIKE 事件驱动 + 消息队列
权限 权限热更新 角色/资源变更立即刷新 Caffeine 缓存,全实例失效 事件驱动 + 缓存失效
调度 分布式定时任务互斥 多实例部署同一任务全局只跑一次 ShedLock + Redis/DB 锁

6 安全与治理

主题 措施
身份认证 钉钉 OAuth2 换取 userAccessToken;JWT + Redis 双重校验,滑动续期;强制下线即删 Redis key
组织准入 新用户登录时企业级 access token 调组织通讯录 API 校验企业归属,非组织成员拒登
会话安全 JWT secret 至少 32 位随机串,生产环境变量注入;HTTPS 强制;Bearer Token 请求头
权限体系 三层权限:登录校验 → 动态 API 拦截(apiUrl+权限码)→ @PreAuthorize 方法级细粒度;三者共存均需通过
行级数据权限 四档 SQL 层自动注入,fail-closed(空部门集合注入 1=0),未知档位失败不放行
AI 越权防护 AI 输入候选集与提示词上下文恒经 DataScopeInterceptor 过滤;AI 不构成数据权限旁路
AI 输出治理 抽取/OCR/建议一律人工确认落库;AI 不自动写主数据、不执行不可逆动作;结构化输出强制 JSON Schema
模型可控 LLM/OCR/自研算法服务同为可插拔 Provider,能力路由层按 yml 显式绑定后端;敏感场景走自研或自托管同一 SPI,数据不出内网
文件安全 MinIO 不暴公网,浏览器仅接触 kkFileView;扩展名黑名单、直传上限、单文件总大小上限守门
审计追溯 三类日志(操作/登录/批量)AOP 显式写入;所有 AI 调用经网关审计(能力名+后端+输入+输出+人工采纳记录),无论后端为商业厂商还是自研算法服务同等对待
请求追踪 TraceIdFilter 为每个请求注入 traceId,透传请求头,日志 pattern 全模块统一含 %X{traceId}
定时任务 ShedLock 分布式锁保证多实例部署互斥,避免漏跑/重跑
数据一致性 索引异步最终一致,失败降级 DB LIKE,不阻塞写主链路;合并/交割等跨表操作事务保护
依赖管理 父 pom 统一版本,子模块不硬编码;内部模块经 dependencyManagement 集中管理
环境隔离 生产凭证(JWT secret / MinIO AK-SK / 钉钉 client-secret / LLM API key)一律环境变量注入