ai-platform-module-architecture-map.md 9.3 KB

医梦 AI 中台工程模块架构一张图

定位:现有 Maven 工程 + 规划领域模块 + 依赖/调用关系总览。
风格:大厂技术培训 / 高密度 / 强层级 / 甲方快乐图。

flowchart TB
    %% ========== Style ==========
    classDef entry fill:#0b5cff,color:#fff,stroke:#073ea8,stroke-width:2px
    classDef existing fill:#eaf3ff,color:#071d49,stroke:#6aa5ff,stroke-width:1.5px
    classDef planned fill:#eefbf3,color:#083b1f,stroke:#45b36b,stroke-width:1.5px
    classDef boundary fill:#fff7e6,color:#4a2a00,stroke:#f0a020,stroke-width:1.5px
    classDef infra fill:#f3f4f6,color:#111827,stroke:#9ca3af,stroke-width:1.5px
    classDef external fill:#f7efff,color:#2e1065,stroke:#9b5de5,stroke-width:1.5px
    classDef data fill:#fff1f2,color:#4a0614,stroke:#fb7185,stroke-width:1.5px
    classDef future fill:#ecfeff,color:#083344,stroke:#06b6d4,stroke-width:1.5px,stroke-dasharray: 5 4

    %% ========== External Channels ==========
    subgraph L0["L0 外部触点 / 客户侧入口"]
        Patient["患者端<br/>小程序 / APP / 公众号"]:::external
        Doctor["医护端<br/>医生站 / 护士站 / PDA"]:::external
        Robot["机器人 / 自助机 / 床旁屏"]:::external
        OpsUser["医院管理员 / 医梦运营 / 财务"]:::external
        Device["IoMT 设备<br/>床垫 / 雷达 / 输液泵 / 体征"]:::external
        VoiceGw["语音网关<br/>外呼 / 通话回调"]:::external
    end

    %% ========== Application Entrypoints ==========
    subgraph L1["L1 应用入口层:当前已存在,建议保留少量启动应用"]
        AdminApp["emoon-admin<br/>管理后台启动应用<br/>系统配置 / 合同账单 / 运营审计"]:::entry
        OpenApp["emoon-openplatform<br/>对外开放平台<br/>签名鉴权 / Agent API / SSE / Card Action"]:::entry
        SnailJob["emoon-extend/emoon-snailjob-server<br/>任务调度基础设施"]:::existing
        Monitor["emoon-extend/emoon-monitor-admin<br/>监控后台"]:::existing
    end

    Patient --> OpenApp
    Doctor --> OpenApp
    Robot --> OpenApp
    OpsUser --> AdminApp
    Device -.设备事件.-> IoMTHub
    VoiceGw -.通话回调.-> FollowupSvc

    %% ========== Current Maven Foundation ==========
    subgraph L2["L2 当前 Maven 基座:已有工程资产"]
        Common["emoon-infra/emoon-common<br/>core / redis / mybatis / satoken / security / oss / job / idempotent"]:::infra
        SystemApi0["emoon-modules-api/emoon-system-api<br/>系统 DO / Service API / Mapper"]:::existing
        McpApi0["emoon-modules-api/emoon-mcp-api<br/>现有 AgentEngine / 会话 / 卡片 / MCP 混合 API"]:::existing
        KnowledgeApi0["emoon-modules-api/emoon-knowledge-api<br/>知识库 / Agent 设计态 / 质控资产"]:::existing
        SystemImpl0["emoon-modules/emoon-system<br/>系统管理 / 引擎配置 CRUD"]:::existing
        McpImpl0["emoon-modules/emoon-mcp<br/>现有 MCP 雏形 / CRUD 模板"]:::existing
        Tongue0["emoon-extend/emoon-tongue<br/>舌诊/面诊专精能力"]:::existing
        Migration["emoon-extend/emoon-migration<br/>迁移工具"]:::existing
        FileDownloader["emoon-extend/emoon-file-downloader<br/>文件下载工具"]:::existing
    end

    AdminApp --> Common
    OpenApp --> Common
    AdminApp --> SystemImpl0
    SystemImpl0 --> SystemApi0
    OpenApp --> SystemApi0
    OpenApp --> McpApi0
    OpenApp --> KnowledgeApi0
    McpImpl0 --> McpApi0
    Tongue0 --> Common

    %% ========== Planned Domain Modules ==========
    subgraph L3["L3 规划领域模块:模块化单体优先,按领域隔离"]
        AiAgentApi["emoon-ai-agent-api<br/>AgentRequest / AgentResponse / Engine SPI"]:::planned
        AiAgent["emoon-ai-agent<br/>DifyAgentEngine / DirectLLM / Mock<br/>会话编排 / Dify 输出归一"]:::planned

        AiCardApi["emoon-ai-card-api<br/>CardDefinition / CardInstance / CardAction API"]:::planned
        AiCard["emoon-ai-card<br/>卡片定义 / 实例 / 动作状态机 / 快照"]:::planned

        AiMcpApi["emoon-ai-mcp-api<br/>ToolContract / ToolResult / HospitalAdapter SPI"]:::planned
        AiMcp["emoon-ai-mcp<br/>MCP Tool Service / HIS Adapter / 工具审计"]:::planned

        AiMeterApi["emoon-ai-meter-api<br/>MeterEvent / BillingEpisode / Outbox Contract"]:::planned
        AiMeter["emoon-ai-meter<br/>Outbox / MeterEvent / BillingEpisode / 事件归并"]:::planned

        AiBillingApi["emoon-ai-billing-api<br/>Contract / Pricing / Credit / Billing API"]:::planned
        AiBilling["emoon-ai-billing<br/>合同 / 能力值账户 / 定价 / 账本 / 账单"]:::planned

        AiKnowledgeApi["emoon-ai-knowledge-api<br/>Knowledge / Prompt / RAG / QC API"]:::planned
        AiKnowledge["emoon-ai-knowledge<br/>知识资产 / Prompt 模板 / RAG / 质控规则"]:::planned
    end

    %% planned replacement/migration hints
    McpApi0 -.拆分迁移.-> AiAgentApi
    McpApi0 -.拆分迁移.-> AiCardApi
    McpApi0 -.拆分迁移.-> AiMcpApi
    KnowledgeApi0 -.收敛迁移.-> AiKnowledgeApi
    SystemApi0 -.保留系统域.-> AiBillingApi

    OpenApp --> AiAgentApi
    OpenApp --> AiCardApi
    OpenApp --> AiMeterApi
    OpenApp --> AiBillingApi
    OpenApp --> AiKnowledgeApi
    AdminApp --> AiBillingApi
    AdminApp --> AiCardApi
    AdminApp --> AiMcpApi
    AdminApp --> AiKnowledgeApi

    AiAgent --> AiAgentApi
    AiCard --> AiCardApi
    AiMcp --> AiMcpApi
    AiMeter --> AiMeterApi
    AiBilling --> AiBillingApi
    AiKnowledge --> AiKnowledgeApi

    AiAgent --> AiKnowledgeApi
    AiAgent --> AiCardApi
    AiAgent --> AiMeterApi
    AiCard --> AiMcpApi
    AiCard --> AiMeterApi
    AiMcp --> AiMeterApi
    AiMeter --> AiBillingApi
    AiBilling --> AiMeterApi

    %% ========== Future Boundary Services ==========
    subgraph L4["L4 可独立部署边界:先模块化实现,满足条件后拆服务"]
        McpServer["MCP Tool Server<br/>独立院内部署候选<br/>HIS/EMR/LIS/PACS 唯一工具出口"]:::future
        AudioGw["AudioStreamGateway<br/>WebSocket 音频流 / ASR 分钟计量"]:::future
        IoMTHub["IoMTEventIngestion<br/>设备认证 / 护理预警事件接入"]:::future
        FollowupSvc["OutboundFollowupService<br/>随访计划 / 语音外呼 / 风险升级"]:::future
        FileWorker["File/OCR/ASR Worker<br/>报告解析 / 图片处理 / 长任务"]:::future
    end

    AiMcp -.后续独立.-> McpServer
    AiAgent -.音频文本进入 Agent.-> AudioGw
    AudioGw --> AiMeterApi
    IoMTHub --> AiMeterApi
    FollowupSvc --> AiMeterApi
    FileWorker --> AiMeterApi
    OpenApp --> AudioGw
    SnailJob --> FollowupSvc
    SnailJob --> AiMeter
    SnailJob --> AiBilling

    %% ========== External AI / Hospital Systems ==========
    subgraph L5["L5 外部系统 / 院内系统 / AI 能力"]
        Dify["Dify Platform<br/>Workflow / LLM 节点 / RAG / 工具调用"]:::external
        DirectLLM["Direct LLM / Vision Model<br/>L1 主引擎 / 降级 / 专精模型"]:::external
        HIS["HIS / EMR / LIS / PACS<br/>排班 / 号源 / 建档 / 住院 / 随访"]:::external
        ASR["ASR / TTS Provider<br/>语音识别 / 合成"]:::external
        OSS["Object Storage<br/>报告 / 图片 / 音频 / 脱敏附件"]:::external
    end

    AiAgent --> Dify
    AiAgent --> DirectLLM
    Dify --> AiMcp
    AiMcp --> HIS
    McpServer --> HIS
    AudioGw --> ASR
    FollowupSvc --> ASR
    OpenApp --> OSS
    FileWorker --> OSS
    Tongue0 --> DirectLLM

    %% ========== Data Layer ==========
    subgraph L6["L6 数据与可靠性底座:先单库强一致,Outbox 异步扩展"]
        MySQL["MySQL<br/>系统 / Agent / Card / Meter / Billing / Audit"]:::data
        Redis["Redis<br/>缓存 / 限流 / 短锁 / SSE 状态"]:::data
        Outbox["Outbox Table<br/>业务事实同事务落库"]:::data
        Ledger["Credit Ledger<br/>grant / freeze / settle / release / reverse"]:::data
        Audit["Audit / Trace<br/>traceId / 医疗确认 / 敏感访问"]:::data
    end

    SystemImpl0 --> MySQL
    AiAgent --> MySQL
    AiCard --> MySQL
    AiMcp --> MySQL
    AiMeter --> MySQL
    AiBilling --> MySQL
    AiKnowledge --> MySQL
    AiMeter --> Outbox
    AiBilling --> Ledger
    OpenApp --> Redis
    AiCard --> Redis
    AiMcp --> Redis
    AiMeter --> Audit
    AiBilling --> Audit
    AiMcp --> Audit
    AiCard --> Audit

    %% ========== Legend ==========
    subgraph Legend["图例 / 拆分原则"]
        LG1["蓝色:启动应用 / 入口"]:::entry
        LG2["浅蓝:当前已有模块"]:::existing
        LG3["绿色:建议规划领域模块"]:::planned
        LG4["青色虚线:未来可拆服务"]:::future
        LG5["红色:数据与账本事实"]:::data
        LG6["紫色:外部系统"]:::external
    end

读图口径

  1. 短期不做全量微服务:主路径保持模块化单体,优先跑通业务闭环。
  2. 当前最需要拆清楚的是 emoon-mcp-api:它现在混了 Agent、Card、MCP 概念,建议拆成 emoon-ai-agent-apiemoon-ai-card-apiemoon-ai-mcp-api
  3. Billing/Meter 不建议先拆服务:合同、账本、事件归并需要强一致语义,先同库同事务 + Outbox。
  4. MCP、Audio、IoMT、Followup 是未来服务化边界:它们有独立部署、长连接、设备接入或外部网关诉求,但第一阶段可先模块化实现。
  5. L1 可走 DirectLLM 主引擎:不必强制上 Dify;L2/L3 复杂场景再以 Dify Workflow 作为主编排。