feat(freelance): 编译 WASM 并验证安装 — 10 实体/20 权限已创建

This commit is contained in:
iven
2026-04-19 23:59:03 +08:00
parent 813df3688c
commit fc76793d6d
13 changed files with 4140 additions and 203 deletions

View File

@@ -0,0 +1,138 @@
# UX 分析报告:一人 IT 公司 ERP 插件方案
> 基于智界科技(一人 IT 服务公司)的业务场景,对 freelance + itops 两个插件的 UX 审查。
---
## 1. 一人公司的 UX 痛点
**WHY**: 一个人没有分工,老板就是销售、项目经理、财务、运维工程师。每次切换页面等于中断心流,表单越复杂越容易填一半放弃。
**核心摩擦**
- **上下文切换成本高** -- 一个人同时处理客户咨询、写代码、记账、回工单。在"客户详情"和"工时记录"之间来回跳转,每次跳转丢失工作记忆。
- **重复录入** -- 同一个客户信息在 client、opportunity、quote、invoice、ticket 中反复手填。一人公司没有人帮忙补数据。
- **决策疲劳** -- 每天面对 10 个入口,要思考"这个操作该去哪个页面"。对于一人公司ERP 应该像手机首页一样直觉。
- **过度结构化** -- 一人公司的商机通常是微信聊几句就定了,不需要复杂的销售漏斗流程。
**HOW -- 减少操作的具体措施**
1. **全局搜索 + 命令面板**Ctrl+K输入"张三"直接跳到客户详情,输入"新工时"直接弹出计时器,输入"#102"跳到工单。一人公司的 ERP 应该像一个大的搜索框 + 几个快捷按钮。
2. **自动填充上下文**:在项目工作台记工时时,自动关联当前活跃项目;从客户详情页创建报价单时,自动带入客户信息。减少手动关联操作。
3. **合并创建流程**:新建项目时一步内同时创建第一个任务,不用先建项目再跳到任务页。
---
## 2. 页面布局合理性 -- 10 个页面是否太多
**结论:可以压缩到 7 个页面,但不应低于 5 个。**
**WHY**: 一人公司的操作场景有明确的节奏切换(见客户 vs 做项目 vs 记账),完全合并会导致单页信息过载。但两个插件共 10 个页面确实有冗余。
**建议合并方案**
| 原方案 (10 页) | 优化方案 (7 页) | 理由 |
|---|---|---|
| freelance 仪表盘 | **全局工作台**(合并两个仪表盘) | 一人只需一个首页 |
| 客户管理 (360度) | 客户管理 (保留) | 核心入口,高频使用 |
| 商机跟进 (看板) | **并入客户管理**,作为客户详情的一个 tab | 一人公司的商机极少同时超过 5 个,看板过重 |
| 项目工作台 | 项目工作台 (保留) | 核心工作场景,需要独立空间 |
| 财务中心 | 财务中心 (保留) | 收支是独立节奏,需要集中视图 |
| 报价管理 | **并入财务中心**,作为 tab | 报价是财务流程的前置步骤,不放独立页面 |
| itops 运维仪表盘 | (已合并到全局工作台) | -- |
| 合同管理 | 合同管理 (保留) | 维保合同是独立业务实体 |
| 工单中心 | 工单中心 (保留) | 最高频运维操作 |
| 巡检管理 | **并入工单中心**,作为 tab 或筛选 | 巡检本质是周期性工单,不需要独立页面 |
**HOW -- 实现层面**
- freelance 插件减少为 4 个页面全局工作台dashboard、客户管理tabs 类型,含商机看板 tab、项目工作台、财务中心tabs 类型,含报价 tab
- itops 插件减少为 3 个页面工单中心tabs 类型,含巡检 tab、合同管理、全局工作台跨插件共享
- 跨插件共享的 dashboard 通过 ui.pages 的 `shared: true` 或放在 freelance 插件中声明itops 通过 `dependencies = ["erp-freelance"]` 引用
---
## 3. 关键缺失场景
**WHY**: 一人 IT 公司有 3 个高频场景在当前方案中完全缺失,不做这些等于 ERP 只覆盖了 60% 的日常工作。
| 缺失场景 | 严重性 | 说明 |
|---|---|---|
| **合同/报价到期提醒** | 高 | 维保合同到期前 30 天没有提醒 = 流失续费收入。一人公司靠记忆管理ERP 必须补上 |
| **工时 -> 开票 自动联动** | 高 | 项目完成后手动从工时记录汇总金额再创建发票,这个手工过程在一人公司中最容易被跳过,导致漏收 |
| **知识库/文档管理** | 中 | IT 运维的核心资产是文档(网络拓扑、服务器配置、密码记录)。当前方案只有结构化数据,缺非结构化知识 |
| **续约提醒 + 自动创建续约商机** | 中 | 维保合同到期时自动生成一个续约 opportunity串联 freelance 和 itops |
**HOW -- 实现建议**
1. **到期提醒**:在 itops 插件的 service_contract 实体上加 `end_date` 字段(已有),在后端增加定时事件检查 `contract.expiring`,通过消息中心的订阅机制推送到通知面板。
2. **工时 -> 开票联动**:在 invoice 实体增加 `source_type = "time_entry"``source_ids` 字段,前端提供"从工时记录生成发票"的一键操作,按项目汇总自动填充。
3. **知识库**Phase 2 考虑。可以在 client 或 project 实体上加 `attachments` (json) 字段存储文件引用,先做轻量版。
---
## 4. 仪表盘设计建议 -- 合并为一个全局工作台
**WHY**: 一人只有一个视角(老板视角),不存在"销售看销售数据、运维看运维数据"的角色分离。两个仪表盘让用户每次登录还要选择看哪个,增加了无意义的决策。
**HOW -- 全局工作台设计**
```
+------------------------------------------------------------------+
| 全局工作台 |
+------------------------------------------------------------------+
| 今日待办 (3) 本周收入: ¥12,500 |
| [ ] 回复张三报价 (2h前) 待开票: ¥8,200 |
| [ ] 完成服务器巡检 (今天) 本月支出: ¥3,400 |
| [ ] 提交项目A发票 (明天截止) 到期合同: 2个 (30天内) |
+------------------------------------------------------------------+
| 活跃项目 (2) 最新工单 (3) |
| 项目A - 进行中 ██████░░ 75% #102 网络... 进行中 |
| 项目B - 待启动 ░░░░░░░░ 0% #101 备份... 已完成 |
| #100 升级... 待处理 |
+------------------------------------------------------------------+
| [快速操作] +新建客户 +新建工单 +开始计时 +新建报价 |
+------------------------------------------------------------------+
```
**布局规则**
- 上方:紧急事项 + 财务概览(左右分栏)
- 中间:核心业务对象快照(活跃项目 + 最新工单)
- 下方:一键操作按钮条
**实现**:使用现有的 `PluginDashboardPage` 组件,通过 plugin.toml 的 `ui.pages` 中 type = "dashboard" 声明dashboard widgets 跨插件聚合数据。freelance 插件声明这个 dashboarditops 插件通过 `dependencies` 引用后注册自己的 widgets。
---
## 5. 快速操作 -- 一键完成的快捷入口
**WHY**: 一人公司最高频的操作是"快速记一笔"和"快速创建"。如果每次都要打开表单、填完所有字段、点击保存,摩擦太大导致用户放弃使用 ERP回到微信记事本。
| 快速操作 | 频率 | HOW |
|---|---|---|
| **开始/停止计时** | 每天 3-5 次 | 全局悬浮按钮,点击选择项目 -> 开始计时,再点停止自动生成 time_entry。不需要打开任何页面 |
| **快速记工单** | 每天 2-3 次 | 工单中心的 "+新建" 按钮,弹出一个精简表单(只填标题+客户+紧急度),详情后续补充 |
| **快速记支出** | 每周 2-3 次 | 财务中心的"+记一笔"按钮3 个字段:金额、分类、备注。日期默认今天 |
| **快速创建报价** | 每周 1-2 次 | 从客户详情页一键"生成报价",自动带入客户信息 + 最近的项目工时数据 |
| **快速创建工单 from 合同** | 每月 1-2 次 | 合同详情页"创建工单"按钮,自动关联合同+客户 |
**实现要点**
- 全局悬浮计时器通过前端组件实现,不依赖特定插件页面,放在 MainLayout 层
- 快速操作按钮放在各页面的 PageHeader 区域,使用 Ant Design 的 `FloatButton``Button` 组件
- 精简表单 = 只标记 `required = true` 的字段,其他字段全部可选,后续可补充
---
## 总结 -- 核心建议优先级
| 优先级 | 建议 | 预期收益 |
|---|---|---|
| P0 | 合并两个仪表盘为全局工作台 | 消除首次登录的困惑 |
| P0 | 全局悬浮计时器(开始/停止) | 工时记录从"每周补"变成"实时记" |
| P1 | 商机看板并入客户管理 tab | 减少 1 个页面,降低认知负担 |
| P1 | 工时 -> 发票一键生成 | 消除最大手工流程,防漏收 |
| P1 | 合同到期提醒 | 防止续费流失 |
| P2 | 报价并入财务中心 tab | 减少 1 个页面 |
| P2 | 巡检并入工单中心 tab | 减少 1 个页面 |
| P2 | 全局搜索命令面板 (Ctrl+K) | 极大提升操作效率 |
**核心原则**:一人公司的 ERP 应该像瑞士军刀,不是像工具箱。不需要 10 个抽屉分门别类,需要一把刀随时打开就能用。