190 lines
8.0 KiB
Markdown
190 lines
8.0 KiB
Markdown
# CRM 插件深度分析 & 多专家组头脑风暴
|
||
|
||
## Context
|
||
|
||
CRM 插件 (`erp-plugin-crm`) 是 ERP 平台的第一个行业业务插件,也是 WASM 插件系统的标杆验证案例。它已完成了设计规格中的全部 3 个阶段(共 24 个任务),包含 5 个实体、9 个权限、7 种页面类型。现在需要从深度和广度两个维度进行全方位审视,发现改进空间、架构风险和演进方向。
|
||
|
||
---
|
||
|
||
## 一、CRM 插件全景画像
|
||
|
||
### 1.1 架构定位
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────┐
|
||
│ 前端 SPA │
|
||
│ PluginCRUDPage / Tree / Graph / Dashboard / │
|
||
│ Tabs / Detail / Admin — 全部 schema 驱动渲染 │
|
||
└────────────────────┬────────────────────────────┘
|
||
│ REST API (pluginData + plugins)
|
||
┌────────────────────▼────────────────────────────┐
|
||
│ Plugin Host (erp-plugin) │
|
||
│ service.rs → engine.rs → host.rs → dynamic_table│
|
||
│ data_service.rs → handler → module │
|
||
└────────────────────┬────────────────────────────┘
|
||
│ WIT 接口 (Host API 9 个函数)
|
||
┌────────────────────▼────────────────────────────┐
|
||
│ CRM WASM Guest (erp-plugin-crm) │
|
||
│ lib.rs (30行) — init/on_tenant_created/ │
|
||
│ handle_event 全部 no-op │
|
||
└──────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 1.2 数据模型 (5 实体)
|
||
|
||
| 实体 | 表名 | 字段数 | 用途 |
|
||
|------|------|--------|------|
|
||
| customer | plugin_erp_crm_customer | 15 | 客户主数据 (企业/个人) |
|
||
| contact | plugin_erp_crm_contact | 8 | 联系人 |
|
||
| communication | plugin_erp_crm_communication | 7 | 沟通记录 |
|
||
| customer_tag | plugin_erp_crm_customer_tag | 3 | 客户标签 |
|
||
| customer_relationship | plugin_erp_crm_customer_relationship | 4 | 客户关系 |
|
||
|
||
### 1.3 页面矩阵 (7 页面类型)
|
||
|
||
| 页面类型 | CRM 用途 | 复杂度 |
|
||
|----------|---------|--------|
|
||
| CRUD | 客户/联系人/沟通/标签/关系列表 | 中 (搜索/筛选/排序/视图切换) |
|
||
| Detail (Drawer) | 客户360度视图 | 高 (字段+嵌套CRUD+时间线) |
|
||
| Tree | 客户层级树 | 低 |
|
||
| Tabs | 客户管理入口 | 中 |
|
||
| Graph | 关系图谱 (Canvas手绘) | 高 |
|
||
| Dashboard | 统计概览 | 中 |
|
||
| Admin | 插件生命周期管理 | 中 |
|
||
|
||
### 1.4 权限模型 (9 权限)
|
||
|
||
两级权限体系:平台级 (`plugin.admin/list`) + 插件级 (`erp-crm.customer.list/manage` 等)
|
||
|
||
---
|
||
|
||
## 二、深度分析 — 六维度体检
|
||
|
||
### 2.1 架构健壮性 ⚠️
|
||
|
||
**优势:**
|
||
- Host-Guest 沙箱隔离,Fuel 资源限制,WASM panic 不影响主服务
|
||
- 延迟写入模式 (PendingOp) 保证事务原子性
|
||
- 乐观锁 + 软删除 + 多租户隔离
|
||
|
||
**风险:**
|
||
- **JSONB 外键完整性为零** — `contact.customer_id` 指向已删除客户不会被拦截
|
||
- **WASM Guest 价值极低** — CRM 插件 lib.rs 仅 30 行,3 个生命周期钩子全是 no-op,所有业务逻辑实际在 Host 侧的 data_service.rs
|
||
- **动态表 SQL 拼接风险** — 虽有 `sanitize_identifier()`,但 JSONB 查询构建器复杂度高
|
||
- **插件热升级策略缺失** — 版本升级时如何处理已有数据的 schema 变更?
|
||
|
||
### 2.2 数据完整性 ⚠️
|
||
|
||
**当前状态:**
|
||
- 无 DB 级外键约束(JSONB 字段无法使用 PostgreSQL FK)
|
||
- 无应用层 FK 校验(data_service.rs 的 create/update 不检查关联实体是否存在)
|
||
- 删除客户时不级联处理关联的联系人/沟通记录/标签
|
||
- `customer.parent_id` 的循环引用无检测
|
||
|
||
### 2.3 查询性能 🟡
|
||
|
||
**已做优化:**
|
||
- GIN 索引覆盖 searchable 字段
|
||
- tenant_id 索引
|
||
- Redis 连接缓存 (响应 2.26s → 2ms)
|
||
|
||
**潜在瓶颈:**
|
||
- JSONB 内字段排序 (`ORDER BY data->>'field'`) 无法使用 B-tree 索引
|
||
- 聚合查询 (`aggregate`) 对大数据量可能慢
|
||
- 关系图谱需要全量加载 customer + customer_relationship,前端 Canvas 渲染
|
||
- 无分页的树结构查询(前端全量加载后客户端构建)
|
||
|
||
### 2.4 安全合规 🔴
|
||
|
||
- **数据权限缺失** — 只有操作权限 (能否操作),无数据权限 (能看到谁的数据)
|
||
- **搜索注入** — search 参数直接拼入 SQL ILIKE,需确认转义逻辑
|
||
- **权限 fallback 过宽** — `plugin.admin` 权限自动获得所有插件的所有操作权限
|
||
|
||
### 2.5 前端体验 🟡
|
||
|
||
**亮点:**
|
||
- 全 schema 驱动,零 CRM 专用前端代码
|
||
- visible_when 条件表单字段
|
||
- 时间线/表格视图切换
|
||
- Canvas 手绘关系图谱(无第三方库依赖)
|
||
- 嵌套 CRUD (Detail Drawer)
|
||
|
||
**不足:**
|
||
- 无看板视图(销售漏斗/客户跟进阶段)
|
||
- 无数据导入/导出功能
|
||
- 无批量操作
|
||
- 标签系统过于简单(无标签分组管理、无标签云)
|
||
- Dashboard 统计维度有限(只有计数+分组聚合)
|
||
- 树页面不支持拖拽排序
|
||
|
||
### 2.6 可扩展性 🟡
|
||
|
||
**平台能力沉淀:**
|
||
- 7 种通用页面类型可供未来插件复用
|
||
- 插件 manifest (TOML) schema 定义了完整的元数据规范
|
||
- 插件生命周期管理 (上传→安装→启用→禁用→卸载→清除)
|
||
|
||
**限制:**
|
||
- 页面类型有限 — 无日历、看板、甘特图、地图等业务常见页面
|
||
- WASM WIT 接口固定 — Host API 9 个函数,扩展需要修改 WIT + 双端重编译
|
||
- 插件间通信未实现 — 当前只能通过 EventBus 订阅系统事件,插件间无法直接交互
|
||
|
||
---
|
||
|
||
## 三、专家组头脑风暴议题
|
||
|
||
基于以上分析,建议从以下 6 个专家组视角展开头脑风暴:
|
||
|
||
### 专家组 1: 后端架构师
|
||
**焦点:** WASM 插件架构的真正价值在哪里?如何让 Guest 代码从 no-op 变成有意义的业务逻辑?
|
||
- Host API 的 db_query 为何不可用?如何修复?
|
||
- JSONB 动态表 vs 独立 schema 表的取舍
|
||
- 插件版本升级的数据迁移策略
|
||
- 延迟写入模式的局限性和改进
|
||
|
||
### 专家组 2: CRM 产品专家
|
||
**焦点:** 这个 CRM 能用吗?缺什么核心能力?
|
||
- 销售漏斗/商机管理缺失的影响
|
||
- 客户跟进提醒机制
|
||
- 数据导入/导出 (Excel)
|
||
- 客户画像/360度视图的完整性
|
||
- 与 ERP 其他模块 (进销存/财务) 的联动
|
||
|
||
### 专家组 3: 安全工程师
|
||
**焦点:** 数据权限、隔离性、合规风险
|
||
- 行级数据权限 (谁能看到哪些客户)
|
||
- JSONB 查询注入风险
|
||
- 插件 WASM 沙箱逃逸可能性
|
||
- 审计日志的完整性
|
||
- GDPR/数据隐私合规
|
||
|
||
### 专家组 4: 前端架构师
|
||
**焦点:** Schema 驱动 UI 的天花板和突破路径
|
||
- 复杂交互场景 (拖拽、批量操作、右键菜单) 的 schema 描述能力
|
||
- 看板/日历/甘特图等新页面类型的设计
|
||
- 大数据量下的性能优化 (虚拟滚动、懒加载)
|
||
- 插件自定义 UI 组件的可行性
|
||
|
||
### 专家组 5: 平台架构师
|
||
**焦点:** 插件平台的通用性和未来演进
|
||
- 插件间通信和协作机制
|
||
- 插件市场/分发的技术架构
|
||
- 插件依赖管理和版本兼容
|
||
- 多租户插件隔离的成本和安全性
|
||
|
||
### 专家组 6: 性能工程师
|
||
**焦点:** JSONB 动态表的性能天花板
|
||
- 百万级数据的查询优化策略
|
||
- 聚合查询的预计算/缓存
|
||
- 关系图谱大数据量下的前端渲染
|
||
- PostgreSQL JSONB 索引策略优化
|
||
|
||
---
|
||
|
||
## 四、实施计划
|
||
|
||
1. 退出计划模式后,立即调用 `/brainstorm` 技能,以本分析报告为基础材料
|
||
2. 对 6 个专家组视角逐一展开头脑风暴
|
||
3. 汇总所有专家建议,形成优先级排序的改进路线图
|
||
4. 输出最终的 CRM 插件改进计划
|