EAMX 2.0 技术架构全景:一个 AI-Native 设备管理系统的诞生

> 一个设备管理系统从传统 CRUD 到 AI-Native 需要迈过几道坎?本文拆解 EAMX 2.0 的完整技术架构:11 个插件的模块化设计、14 个 AI Agent 的协作管线、CASL 同构权限体系、以及一次架构评审触发的三阶段重构。

1. 项目定位

EAMX 是一个 AI-Native 企业设备资产管理系统(CMMS),对标 MaintainX。核心差异化在于:用户通过自然语言对话完成设备建档、故障报修、备件查询等操作,而不是在几十个菜单和表单中手动操作。

技术定位:多租户 SaaS + 插件化架构 + AI 管道 + CASL 权限 + MCP 标准工具暴露

2. 全栈技术栈一览

``<br>┌─ 前端 ─────────────────────────────────────┐<br>│ React 19 + TypeScript │<br>│ Vite 7 (构建) │<br>│ wouter (路由) + React Query (状态) │<br>│ shadcn/ui (55 个组件) │<br>│ CASL (前端权限消费) │<br>├─────────────────────────────────────────────┤<br>│ packages/core (前后端共享) │<br>│ PluginRegistry / Ability Builder / Types │<br>├─ 后端 ─────────────────────────────────────┐<br>│ Express 5 + TypeScript │<br>│ Drizzle ORM (类型安全 SQL) │<br>│ PostgreSQL 16 (主库 + pgvector + Session) │<br>│ Vercel AI SDK (Tool Calling + SSE) │<br>│ OpenAI 兼容 API (SiliconFlow 代理) │<br>│ pino-http (日志) │<br>└─────────────────────────────────────────────┘<br>``

关键的架构选择

| 决策 | 选型 | 理由 |<br>|---|---|---|<br>| 前后端共享类型 | packages/core pnpm workspace | 权限码、插件接口、Tool 类型共享 |<br>| ORM | Drizzle ORM | 类型安全的 SQL builder,无运行时开销 |<br>| AI SDK | Vercel AI SDK streamText | 原生 Tool Calling + SSE 流式 |<br>| 权限 | CASL createMongoAbility | 前后端同构,条件权限支持 |<br>| 模型代理 | OpenAI 兼容 API → SiliconFlow | 一行 baseURL 切换任意模型厂商 |

3. 多租户架构
3.1 租户隔离策略

所有业务表以 tenant_id 为第一隔离维度:

``sql<br>-- 所有查询自动注入租户条件<br>SELECT * FROM equipments WHERE tenant_id = $1;<br>``

``typescript<br>// Drizzle ORM 层:租户过滤器工具函数<br>export function wt<T>(tenantId: string | null, ...conditions: SQL[]) {<br> return and(eq(table.tenantId, tenantId), ...conditions);<br>}<br>``

选择 应用层隔离 而非 PostgreSQL Row-Level Security,理由:

3.2 跨租户管理

平台超级管理员(isAdmin=true, tenantId=null)可以跨越租户边界:

``typescript<br>// auth.ts — writeAdminSession<br>s.isAdmin = true;<br>s.tenantId = null; // null = 跨租户<br>s.dataScope = "all";<br>``

在 Drizzle 查询层,tenantId=null 时跳过租户过滤,从而看到全局数据。

4. 插件化架构:11 个独立模块
4.1 插件清单

| 插件 ID | 路由前缀 | 职责 |<br>|---|---|---|<br>| core-data | /departments, /users, /roles, /admin, /workflows... | 组织架构、用户、审批流核心 |<br>| equipment | /equipments, /equipment-categories, /locations | 设备台账 |<br>| technical-standards | /technical-standards | 技术标准 |<br>| work-orders | /work-orders | 工单管理 |<br>| pm-plans | /pm-plans | 预防性维护 |<br>| fault-reports | /fault-reports | 故障上报 |<br>| inventory | /inventory, /spare-parts, /purchase-requests | 库存备件 |<br>| notifications | /notifications | 通知中心 |<br>| ai-chat | /ai-chat, /ai-sessions, /ai-workflow | AI 对话 |<br>| ai-suggestions | /ai-suggestions | AI 建议中心 |<br>| reports | /reports | 数据分析 |

4.2 插件自描述

每个插件按 PluginManifest 接口声明自己的五要素:

``typescript<br>// plugins/equipment/equipment.plugin.ts<br>export const equipmentPlugin: PluginManifest = {<br> id: "equipment",<br> version: "2.0.0",<br> name: "设备台账",<br> permissions: [ / 该模块的所有权限码 / ],<br> navItems: [ / 前端导航声明 / ],<br> approvalSupport: [{ documentType: "equipment", label: "设备信息变更" }],<br> lifecycleHandlers: {<br> "approval.approved": async (payload) => { / 审批通过后更新设备状态 / },<br> },<br> cronJobs: [],<br> createRouter: () => { / 返回 Express Router / },<br>};<br>``

4.3 PluginRegistry 核心

整个注册中心只有 74 行代码,核心逻辑极简:

```typescript<br>// packages/core/src/plugin-registry.ts<br>class PluginRegistry {<br> private plugins = new Map<string, PluginManifest>();

register(plugin: PluginManifest): void {<br> // 依赖检查<br> for (const dep of plugin.dependencies ?? []) {<br> if (!this.plugins.has(dep)) throw new Error(缺少依赖: ${dep});<br> }<br> this.plugins.set(plugin.id, plugin);<br> }

getAllPermissions(): PermissionDefinition[] { / 聚合所有插件权限 / }<br> getAllNavItems(): NavItem[] { / 聚合导航 / }<br> mountAll(router: Router): void { / 统一挂载路由 / }<br>}<br>```

4.4 启动流程

``<br>index.ts<br> → app.ts (Express 实例化)<br> → routes/index.ts (构建主 Router)<br> → _registry.ts (注册所有插件)<br> → pluginRegistry.register(coreDataPlugin)<br> → pluginRegistry.register(equipmentPlugin)<br> → ...<br> → pluginRegistry.mountAll(mainRouter)<br> → 每个插件的 createRouter() 挂载到主路由<br> → 注册 AI Chat 路由、认证路由等<br> → Express 中间件链<br> → pino-http → cors → json → session → requireAuth → buildAbility<br>``

5. AI 管道架构
5.1 管道全景

``<br>POST /api/ai/chat<br> │<br> ├─ [100ms 超时] IntentAgent.preprocessIntent()<br> │ ├─ Step 1: 别名解析 (entity_aliases DB lookup)<br> │ ├─ Step 2a: 静态关键词匹配 (内存, 0ms)<br> │ ├─ Step 2b: 意图模式库 (intent_patterns DB)<br> │ └─ Step 3: LLM 兜底分类 (AI_FAST_MODEL, ~200ms)<br> │<br> └─ Orchestrator.streamOrchestrator()<br> ├─ Phase 1: Context Build (System Prompt + Entity + Patterns)<br> ├─ Phase 2: 图片预处理(视觉模型 → 文字摘要拼入)<br> ├─ Phase 3: LLM Reasoning (streamText + Tool Calling)<br> │ ├─ Tool 注册项按 CASL 权限过滤<br> │ └─ Agent 执行 → UI Card 返回<br> └─ Phase 4: Learning (fire-and-forget 记录意图模式)<br>``

5.2 14 个 AI Agent

| Agent | 职责 |<br>|---|---|<br>| coordinator.agent.ts | 核心调度器:路由意图到子 Agent,生成 SSE 流 |<br>| intent.agent.ts | 意图识别三层策略 + 意图学习 |<br>| equipment.agent.ts | 设备 CRUD、360° 画像、DynamicForm 构造 |<br>| fault.agent.ts | 故障上报、查询、分派 |<br>| maintenance.agent.ts | 维护工单操作 |<br>| inventory.agent.ts | 库存查询、备件推荐、出入库 |<br>| analytics.agent.ts | 报表生成、数据统计 |<br>| external-knowledge.agent.ts | 外部知识库 RAG 检索 |<br>| intent-suggestion.agent.ts | 意图建议补全 |<br>| nameplate-extractor.ts | 铭牌 OCR 两阶段管线 |<br>| field-classifier.ts | 字段分类(纯代码查表) |<br>| rag.ts | pgvector 检索增强生成 |

5.3 模型分层策略

``env<br>AI_CHAT_MODEL=deepseek-ai/DeepSeek-V3.2 # 主推理模型 (Tool Calling)<br>AI_FAST_MODEL=deepseek-ai/DeepSeek-V3.2 # 意图分类、快速响应<br>AI_VISION_MODEL=Qwen/Qwen3-VL-32B-Instruct # 铭牌 OCR、图片识别<br>``

通过 OpenAI 兼容 API 的 baseURL 统一代理到 SiliconFlow,一行配置切换模型厂商。

6. CASL 同构权限体系
6.1 架构要点
6.2 后端权限中间件

```typescript<br>// Express 中间件:每个请求构建 ability 挂载到 req<br>app.use(buildAbilityMiddleware);

// routes 中的守卫<br>router.post("/equipments", requireAbility("create:Equipment"), handler);<br>```

6.3 前端权限消费

``tsx<br>// React 组件中<br>const ability = useAbility();<br>{ability.can("create", "Equipment") && <CreateButton />}<br>``

7. 通知系统:LLM 决策分发

``<br>业务事件触发 dispatch<br> → 查询事件配置(是否开启)<br> → 解析候选接收人(contextual-user-resolver)<br> → 拉取历史通知记忆<br> → LLM 决策:发给谁、发什么内容、走什么渠道<br> → 渠道过滤(站内信 / 短信 / 钉钉 / 邮件)<br> → 发送<br>``

关键设计:通知渠道是 NotificationDispatcher 的策略模式,新增渠道(如钉钉工作通知)只需注册新策略。

8. 三阶段架构重构

2026 年 5 月的 [架构评审](file:///c:/Users/wangz/eamx-L/qod/architecture-review-2026-05-08.md) 诊断了 4 个系统的问题,触发了三阶段重构:

| 阶段 | 内容 | 改动量 |<br>|---|---|---|<br>| Phase 1 | Service 层引入 — 路由不再直接操作 DB,通过 Service 封装 | 14 个 Service 类 |<br>| Phase 2 | AI 管道去硬编码 — Coordinator 从 880 行重构为 233 行 Orchestrator + Tool Registry | cordinator.agent.ts 精简 |<br>| Phase 3 | MCP Server 顺手牵羊 — Tool Registry 直接输出 MCP tools/list | mcp/server.ts 66 行 |

重构的核心原则:

9. 核心文件索引

| 模块 | 核心文件 | 行数 |<br>|---|---|---|<br>| 架构评审 | qod/architecture-review-2026-05-08.md | 557 |<br>| AI 架构 | qod/ai-architecture-v2.md | 900+ |<br>| 插件系统 | packages/core/src/plugin-registry.ts | 74 |<br>| 权限 | packages/core/src/ability.ts | 132 |<br>| 编排器 | artifacts/api-server/src/ai/orchestrator.ts | 233 |<br>| 意图识别 | artifacts/api-server/src/agents/intent.agent.ts | 611 |<br>| 铭牌 OCR | artifacts/api-server/src/agents/nameplate-extractor.ts | 171 |<br>| 字段分类 | artifacts/api-server/src/agents/field-classifier.ts | 232 |<br>| Tool Registry | artifacts/api-server/src/ai/tool-registry.ts | 86 |<br>| MCP Server | artifacts/api-server/src/mcp/server.ts | 66 |

本系列后续 9 篇文章将对上述每个模块做深度拆解:从代码实现、性能优化、到踩坑复盘。下一篇将深入 意图识别三层策略——如何用渐进式架构在 0ms 到 200ms 之间精准判断用户意图。

作者:白杨,十余年设备资产管理从业经验,EAMX 产品负责人。