1302 lines
30 KiB
Markdown
1302 lines
30 KiB
Markdown
# 汕头市智界科技有限公司 — 行业插件设计规格
|
||
|
||
> 日期: 2026-04-19
|
||
> 来源: 无主题发散式互动探讨(多专家头脑风暴)
|
||
> 状态: Draft
|
||
|
||
---
|
||
|
||
## 1. 背景与动机
|
||
|
||
以汕头市智界科技有限公司(一人 IT 服务公司)为案例,设计针对 IT 服务行业的 ERP 插件组合,覆盖其全部 9 条经营范围。
|
||
|
||
**公司经营范围:**
|
||
1. 软件开发
|
||
2. 数字文化创意软件开发
|
||
3. 人工智能基础/应用软件开发
|
||
4. 信息系统集成服务
|
||
5. 网络技术服务
|
||
6. 软件销售
|
||
7. 软件外包服务
|
||
8. 计算机软硬件及辅助设备批发/零售
|
||
9. 信息技术咨询服务
|
||
10. 信息系统运行维护服务
|
||
11. 数字内容制作服务
|
||
12. 市场营销策划
|
||
|
||
**设计原则:**
|
||
- 一人公司优先:所有功能对单人操作友好,减少上下文切换
|
||
- 最少插件覆盖最多场景:3 个插件覆盖全部经营范围
|
||
- 快捷操作优先:高频操作一键完成,不打开完整表单
|
||
- 全局工作台:一个仪表盘掌握全局
|
||
|
||
**插件组合与经营范围对照:**
|
||
|
||
| 插件 | 覆盖的经营范围 |
|
||
|------|--------------|
|
||
| freelance(自由职业者工作台) | 软件开发、AI开发、系统集成、外包、IT咨询、数字内容、营销策划 |
|
||
| itops(IT 运维服务台) | IT 运维服务、网络技术服务 |
|
||
| inventory(已有,需扩展) | 软硬件批发零售 |
|
||
|
||
---
|
||
|
||
## 2. 插件 1:erp-plugin-freelance(自由职业者工作台)
|
||
|
||
### 2.1 插件元数据
|
||
|
||
```toml
|
||
[metadata]
|
||
id = "erp-freelance"
|
||
name = "自由职业者工作台"
|
||
version = "0.1.0"
|
||
description = "一人 IT 服务公司的全链路业务管理:客户→商机→报价→合同→项目→工时→开票→收支"
|
||
author = "ERP Platform"
|
||
```
|
||
|
||
### 2.2 实体设计(9 个实体)
|
||
|
||
#### 2.2.1 client(客户)
|
||
|
||
```toml
|
||
[[schema.entities]]
|
||
name = "client"
|
||
display_name = "客户"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "name"
|
||
field_type = "string"
|
||
display_name = "客户名称"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "contact_name"
|
||
field_type = "string"
|
||
display_name = "联系人"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "phone"
|
||
field_type = "string"
|
||
display_name = "电话"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "email"
|
||
field_type = "string"
|
||
display_name = "邮箱"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "industry"
|
||
field_type = "string"
|
||
display_name = "行业"
|
||
ui_widget = "select"
|
||
options = ["制造业", "零售", "教育", "医疗", "政府", "金融", "其他"]
|
||
|
||
[[schema.entities.fields]]
|
||
name = "source"
|
||
field_type = "string"
|
||
display_name = "来源"
|
||
ui_widget = "select"
|
||
options = ["转介绍", "线上", "展会", "老客户", "主动开发"]
|
||
|
||
[[schema.entities.fields]]
|
||
name = "level"
|
||
field_type = "string"
|
||
display_name = "重要等级"
|
||
ui_widget = "select"
|
||
options = ["A", "B", "C"]
|
||
|
||
[[schema.entities.fields]]
|
||
name = "status"
|
||
field_type = "string"
|
||
display_name = "状态"
|
||
ui_widget = "select"
|
||
options = ["潜在", "活跃", "休眠", "流失"]
|
||
default_value = "潜在"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "address"
|
||
field_type = "string"
|
||
display_name = "地址"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "notes"
|
||
field_type = "text"
|
||
display_name = "备注"
|
||
```
|
||
|
||
#### 2.2.2 opportunity(商机)
|
||
|
||
```toml
|
||
[[schema.entities]]
|
||
name = "opportunity"
|
||
display_name = "商机"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "client_id"
|
||
field_type = "uuid"
|
||
display_name = "客户"
|
||
ref_entity = "client"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "title"
|
||
field_type = "string"
|
||
display_name = "商机名称"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "business_type"
|
||
field_type = "string"
|
||
display_name = "业务类型"
|
||
ui_widget = "select"
|
||
options = ["software_development", "ai_development", "system_integration", "software_outsourcing", "it_consulting", "digital_content", "marketing_planning"]
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "stage"
|
||
field_type = "string"
|
||
display_name = "阶段"
|
||
ui_widget = "select"
|
||
options = ["初访", "需求确认", "报价", "谈判", "成交", "失败"]
|
||
default_value = "初访"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "estimated_amount"
|
||
field_type = "number"
|
||
display_name = "预估金额"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "probability"
|
||
field_type = "number"
|
||
display_name = "成交概率(%)"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "expected_close_date"
|
||
field_type = "date"
|
||
display_name = "预计成交日期"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "next_follow_up"
|
||
field_type = "date"
|
||
display_name = "下次跟进日期"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "description"
|
||
field_type = "text"
|
||
display_name = "需求描述"
|
||
```
|
||
|
||
#### 2.2.3 quote(报价单)
|
||
|
||
```toml
|
||
[[schema.entities]]
|
||
name = "quote"
|
||
display_name = "报价单"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "client_id"
|
||
field_type = "uuid"
|
||
display_name = "客户"
|
||
ref_entity = "client"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "opportunity_id"
|
||
field_type = "uuid"
|
||
display_name = "关联商机"
|
||
ref_entity = "opportunity"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "quote_number"
|
||
field_type = "string"
|
||
display_name = "报价单号"
|
||
generated = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "status"
|
||
field_type = "string"
|
||
display_name = "状态"
|
||
ui_widget = "select"
|
||
options = ["草稿", "已发送", "已接受", "已拒绝", "已过期"]
|
||
default_value = "草稿"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "valid_until"
|
||
field_type = "date"
|
||
display_name = "有效期至"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "subtotal"
|
||
field_type = "number"
|
||
display_name = "小计"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "tax_rate"
|
||
field_type = "number"
|
||
display_name = "税率(%)"
|
||
default_value = 0
|
||
|
||
[[schema.entities.fields]]
|
||
name = "total_amount"
|
||
field_type = "number"
|
||
display_name = "总金额"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "notes"
|
||
field_type = "text"
|
||
display_name = "备注"
|
||
```
|
||
|
||
#### 2.2.4 quote_line(报价明细行)
|
||
|
||
```toml
|
||
[[schema.entities]]
|
||
name = "quote_line"
|
||
display_name = "报价明细"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "quote_id"
|
||
field_type = "uuid"
|
||
display_name = "报价单"
|
||
ref_entity = "quote"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "item_name"
|
||
field_type = "string"
|
||
display_name = "项目名称"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "description"
|
||
field_type = "string"
|
||
display_name = "描述"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "quantity"
|
||
field_type = "number"
|
||
display_name = "数量"
|
||
required = true
|
||
default_value = 1
|
||
|
||
[[schema.entities.fields]]
|
||
name = "unit_price"
|
||
field_type = "number"
|
||
display_name = "单价"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "unit"
|
||
field_type = "string"
|
||
display_name = "单位"
|
||
ui_widget = "select"
|
||
options = ["项目", "人月", "人天", "小时", "个", "套"]
|
||
default_value = "项目"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "amount"
|
||
field_type = "number"
|
||
display_name = "金额"
|
||
```
|
||
|
||
#### 2.2.5 contract(合同)
|
||
|
||
```toml
|
||
[[schema.entities]]
|
||
name = "contract"
|
||
display_name = "合同"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "client_id"
|
||
field_type = "uuid"
|
||
display_name = "客户"
|
||
ref_entity = "client"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "opportunity_id"
|
||
field_type = "uuid"
|
||
display_name = "关联商机"
|
||
ref_entity = "opportunity"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "quote_id"
|
||
field_type = "uuid"
|
||
display_name = "关联报价"
|
||
ref_entity = "quote"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "contract_number"
|
||
field_type = "string"
|
||
display_name = "合同编号"
|
||
generated = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "title"
|
||
field_type = "string"
|
||
display_name = "合同名称"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "type"
|
||
field_type = "string"
|
||
display_name = "合同类型"
|
||
ui_widget = "select"
|
||
options = ["开发合同", "集成合同", "外包合同", "咨询合同", "维保合同", "销售合同", "其他"]
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "status"
|
||
field_type = "string"
|
||
display_name = "状态"
|
||
ui_widget = "select"
|
||
options = ["草拟中", "待签署", "执行中", "已完成", "已终止"]
|
||
default_value = "草拟中"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "amount"
|
||
field_type = "number"
|
||
display_name = "合同金额"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "paid_amount"
|
||
field_type = "number"
|
||
display_name = "已付金额"
|
||
default_value = 0
|
||
|
||
[[schema.entities.fields]]
|
||
name = "start_date"
|
||
field_type = "date"
|
||
display_name = "开始日期"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "end_date"
|
||
field_type = "date"
|
||
display_name = "结束日期"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "payment_terms"
|
||
field_type = "string"
|
||
display_name = "付款条款"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "notes"
|
||
field_type = "text"
|
||
display_name = "备注"
|
||
```
|
||
|
||
#### 2.2.6 project(项目)
|
||
|
||
```toml
|
||
[[schema.entities]]
|
||
name = "project"
|
||
display_name = "项目"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "client_id"
|
||
field_type = "uuid"
|
||
display_name = "客户"
|
||
ref_entity = "client"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "contract_id"
|
||
field_type = "uuid"
|
||
display_name = "关联合同"
|
||
ref_entity = "contract"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "opportunity_id"
|
||
field_type = "uuid"
|
||
display_name = "关联商机"
|
||
ref_entity = "opportunity"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "name"
|
||
field_type = "string"
|
||
display_name = "项目名称"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "business_type"
|
||
field_type = "string"
|
||
display_name = "业务类型"
|
||
ui_widget = "select"
|
||
options = ["software_development", "ai_development", "system_integration", "software_outsourcing", "it_consulting", "digital_content", "marketing_planning"]
|
||
|
||
[[schema.entities.fields]]
|
||
name = "deliverable_type"
|
||
field_type = "string"
|
||
display_name = "交付物类型"
|
||
ui_widget = "select"
|
||
options = ["software", "website", "miniprogram", "video", "design", "document", "consulting_report"]
|
||
|
||
[[schema.entities.fields]]
|
||
name = "status"
|
||
field_type = "string"
|
||
display_name = "状态"
|
||
ui_widget = "select"
|
||
options = ["待开始", "进行中", "已交付", "验收中", "已完成", "已搁置"]
|
||
default_value = "待开始"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "start_date"
|
||
field_type = "date"
|
||
display_name = "开始日期"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "end_date"
|
||
field_type = "date"
|
||
display_name = "截止日期"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "contract_amount"
|
||
field_type = "number"
|
||
display_name = "合同金额"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "description"
|
||
field_type = "text"
|
||
display_name = "项目说明"
|
||
```
|
||
|
||
#### 2.2.7 task(任务)
|
||
|
||
```toml
|
||
[[schema.entities]]
|
||
name = "task"
|
||
display_name = "任务"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "project_id"
|
||
field_type = "uuid"
|
||
display_name = "所属项目"
|
||
ref_entity = "project"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "title"
|
||
field_type = "string"
|
||
display_name = "任务标题"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "status"
|
||
field_type = "string"
|
||
display_name = "状态"
|
||
ui_widget = "select"
|
||
options = ["待办", "进行中", "已完成", "已取消"]
|
||
default_value = "待办"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "priority"
|
||
field_type = "string"
|
||
display_name = "优先级"
|
||
ui_widget = "select"
|
||
options = ["紧急", "高", "中", "低"]
|
||
default_value = "中"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "due_date"
|
||
field_type = "date"
|
||
display_name = "截止日期"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "estimated_hours"
|
||
field_type = "number"
|
||
display_name = "预估工时"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "actual_hours"
|
||
field_type = "number"
|
||
display_name = "实际工时"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "description"
|
||
field_type = "text"
|
||
display_name = "详细说明"
|
||
```
|
||
|
||
#### 2.2.8 time_entry(工时记录)
|
||
|
||
```toml
|
||
[[schema.entities]]
|
||
name = "time_entry"
|
||
display_name = "工时记录"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "task_id"
|
||
field_type = "uuid"
|
||
display_name = "关联任务"
|
||
ref_entity = "task"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "project_id"
|
||
field_type = "uuid"
|
||
display_name = "关联项目"
|
||
ref_entity = "project"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "date"
|
||
field_type = "date"
|
||
display_name = "日期"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "hours"
|
||
field_type = "number"
|
||
display_name = "时长(小时)"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "description"
|
||
field_type = "string"
|
||
display_name = "工作内容"
|
||
```
|
||
|
||
#### 2.2.9 invoice(发票/收款)
|
||
|
||
```toml
|
||
[[schema.entities]]
|
||
name = "invoice"
|
||
display_name = "发票/收款"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "client_id"
|
||
field_type = "uuid"
|
||
display_name = "客户"
|
||
ref_entity = "client"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "project_id"
|
||
field_type = "uuid"
|
||
display_name = "关联项目"
|
||
ref_entity = "project"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "contract_id"
|
||
field_type = "uuid"
|
||
display_name = "关联合同"
|
||
ref_entity = "contract"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "invoice_number"
|
||
field_type = "string"
|
||
display_name = "发票号"
|
||
generated = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "type"
|
||
field_type = "string"
|
||
display_name = "类型"
|
||
ui_widget = "select"
|
||
options = ["开票", "收款记录"]
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "amount"
|
||
field_type = "number"
|
||
display_name = "金额"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "status"
|
||
field_type = "string"
|
||
display_name = "状态"
|
||
ui_widget = "select"
|
||
options = ["待开票", "已开票", "部分收款", "已收款", "已逾期"]
|
||
default_value = "待开票"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "issue_date"
|
||
field_type = "date"
|
||
display_name = "开票日期"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "due_date"
|
||
field_type = "date"
|
||
display_name = "到期日"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "payment_date"
|
||
field_type = "date"
|
||
display_name = "实际收款日期"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "notes"
|
||
field_type = "text"
|
||
display_name = "备注"
|
||
```
|
||
|
||
#### 2.2.10 expense(支出)
|
||
|
||
```toml
|
||
[[schema.entities]]
|
||
name = "expense"
|
||
display_name = "支出"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "project_id"
|
||
field_type = "uuid"
|
||
display_name = "关联项目"
|
||
ref_entity = "project"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "category"
|
||
field_type = "string"
|
||
display_name = "类别"
|
||
ui_widget = "select"
|
||
options = ["硬件", "软件订阅", "云服务", "差旅", "餐饮", "办公用品", "其他"]
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "amount"
|
||
field_type = "number"
|
||
display_name = "金额"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "date"
|
||
field_type = "date"
|
||
display_name = "日期"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "vendor"
|
||
field_type = "string"
|
||
display_name = "供应商"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "description"
|
||
field_type = "string"
|
||
display_name = "描述"
|
||
```
|
||
|
||
### 2.3 权限声明(10 实体 x 2 = 20 个权限码)
|
||
|
||
```toml
|
||
[[permissions]]
|
||
code = "client.list"
|
||
name = "查看客户"
|
||
|
||
[[permissions]]
|
||
code = "client.manage"
|
||
name = "管理客户"
|
||
|
||
[[permissions]]
|
||
code = "opportunity.list"
|
||
name = "查看商机"
|
||
|
||
[[permissions]]
|
||
code = "opportunity.manage"
|
||
name = "管理商机"
|
||
|
||
[[permissions]]
|
||
code = "quote.list"
|
||
name = "查看报价"
|
||
|
||
[[permissions]]
|
||
code = "quote.manage"
|
||
name = "管理报价"
|
||
|
||
[[permissions]]
|
||
code = "quote_line.list"
|
||
name = "查看报价明细"
|
||
|
||
[[permissions]]
|
||
code = "quote_line.manage"
|
||
name = "管理报价明细"
|
||
|
||
[[permissions]]
|
||
code = "contract.list"
|
||
name = "查看合同"
|
||
|
||
[[permissions]]
|
||
code = "contract.manage"
|
||
name = "管理合同"
|
||
|
||
[[permissions]]
|
||
code = "project.list"
|
||
name = "查看项目"
|
||
|
||
[[permissions]]
|
||
code = "project.manage"
|
||
name = "管理项目"
|
||
|
||
[[permissions]]
|
||
code = "task.list"
|
||
name = "查看任务"
|
||
|
||
[[permissions]]
|
||
code = "task.manage"
|
||
name = "管理任务"
|
||
|
||
[[permissions]]
|
||
code = "time_entry.list"
|
||
name = "查看工时"
|
||
|
||
[[permissions]]
|
||
code = "time_entry.manage"
|
||
name = "管理工时"
|
||
|
||
[[permissions]]
|
||
code = "invoice.list"
|
||
name = "查看发票"
|
||
|
||
[[permissions]]
|
||
code = "invoice.manage"
|
||
name = "管理发票"
|
||
|
||
[[permissions]]
|
||
code = "expense.list"
|
||
name = "查看支出"
|
||
|
||
[[permissions]]
|
||
code = "expense.manage"
|
||
name = "管理支出"
|
||
```
|
||
|
||
### 2.4 页面设计(4 个页面)
|
||
|
||
#### 页面 1:全局工作台(Dashboard)
|
||
|
||
展示内容:
|
||
- **财务概览**:本月收入/支出/利润、应收总额、逾期金额
|
||
- **紧急待办**:今日到期任务、逾期收款、即将到期合同(7天内)
|
||
- **活跃项目**:进行中项目卡片(进度条 = 已用工时/预估工时)
|
||
- **最新工单**:最近 5 条 itops 工单(如已安装)
|
||
- **商机跟进提醒**:next_follow_up 在本周内的商机
|
||
|
||
快捷操作按钮条(页面顶部):
|
||
- 开始/停止计时(悬浮计时器)
|
||
- 快速记支出(3 字段:金额+分类+备注)
|
||
- 新建报价
|
||
- 新建工单(如 itops 已安装)
|
||
|
||
#### 页面 2:客户管理
|
||
|
||
客户列表(支持搜索、按来源/行业/等级/状态筛选)+ 客户详情 Tab 页:
|
||
- Tab 1:基本信息
|
||
- Tab 2:商机列表(看板视图,按阶段分列)
|
||
- Tab 3:报价/合同
|
||
- Tab 4:项目
|
||
- Tab 5:发票/收支
|
||
|
||
从客户详情一键生成:报价单 / 合同 / 项目
|
||
|
||
#### 页面 3:项目工作台
|
||
|
||
项目列表 → 项目详情 Tab 页:
|
||
- Tab 1:项目信息
|
||
- Tab 2:任务列表(状态分组,支持拖拽排序)
|
||
- Tab 3:工时记录(支持快速录入)
|
||
- Tab 4:关联发票
|
||
|
||
#### 页面 4:财务中心
|
||
|
||
Tab 1:报价管理(报价单列表 + 详情)
|
||
Tab 2:合同管理(合同列表 + 详情 + 到期预警)
|
||
Tab 3:发票/收款(发票列表 + 收支统计图表)
|
||
|
||
---
|
||
|
||
## 3. 插件 2:erp-plugin-itops(IT 运维服务台)
|
||
|
||
### 3.1 插件元数据
|
||
|
||
```toml
|
||
[metadata]
|
||
id = "erp-itops"
|
||
name = "IT 运维服务台"
|
||
version = "0.1.0"
|
||
description = "IT 运维工单管理 + SLA 追踪 + 定期巡检"
|
||
author = "ERP Platform"
|
||
```
|
||
|
||
### 3.2 跨插件依赖声明
|
||
|
||
```toml
|
||
[dependencies.freelance]
|
||
optional = true
|
||
description = "自由职业者工作台 — 自动关联客户数据,未安装时客户字段为手动输入"
|
||
```
|
||
|
||
### 3.3 实体设计(4 个实体)
|
||
|
||
#### 3.3.1 service_contract(维保合同)
|
||
|
||
```toml
|
||
[[schema.entities]]
|
||
name = "service_contract"
|
||
display_name = "维保合同"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "client_id"
|
||
field_type = "uuid"
|
||
display_name = "客户"
|
||
ref_entity = "client"
|
||
ref_scope = "external"
|
||
ref_display_field = "name"
|
||
ref_search_fields = ["name", "phone"]
|
||
ref_fallback_label = "外部客户"
|
||
filterable = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "contract_number"
|
||
field_type = "string"
|
||
display_name = "合同编号"
|
||
generated = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "name"
|
||
field_type = "string"
|
||
display_name = "合同名称"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "service_scope"
|
||
field_type = "text"
|
||
display_name = "服务范围"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "sla_level"
|
||
field_type = "string"
|
||
display_name = "SLA 等级"
|
||
ui_widget = "select"
|
||
options = ["标准", "银牌", "金牌"]
|
||
required = true
|
||
default_value = "标准"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "sla_response_hours"
|
||
field_type = "number"
|
||
display_name = "SLA 响应时间(小时)"
|
||
default_value = 8
|
||
|
||
[[schema.entities.fields]]
|
||
name = "sla_resolve_hours"
|
||
field_type = "number"
|
||
display_name = "SLA 解决时间(小时)"
|
||
default_value = 48
|
||
|
||
[[schema.entities.fields]]
|
||
name = "status"
|
||
field_type = "string"
|
||
display_name = "状态"
|
||
ui_widget = "select"
|
||
options = ["生效中", "即将到期", "已过期", "已终止"]
|
||
default_value = "生效中"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "start_date"
|
||
field_type = "date"
|
||
display_name = "开始日期"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "end_date"
|
||
field_type = "date"
|
||
display_name = "结束日期"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "amount"
|
||
field_type = "number"
|
||
display_name = "合同金额"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "payment_terms"
|
||
field_type = "string"
|
||
display_name = "付款条款"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "notes"
|
||
field_type = "text"
|
||
display_name = "备注"
|
||
```
|
||
|
||
#### 3.3.2 ticket(工单)
|
||
|
||
```toml
|
||
[[schema.entities]]
|
||
name = "ticket"
|
||
display_name = "工单"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "contract_id"
|
||
field_type = "uuid"
|
||
display_name = "维保合同"
|
||
ref_entity = "service_contract"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "client_id"
|
||
field_type = "uuid"
|
||
display_name = "客户"
|
||
ref_entity = "client"
|
||
ref_scope = "external"
|
||
ref_display_field = "name"
|
||
ref_search_fields = ["name", "phone"]
|
||
ref_fallback_label = "外部客户"
|
||
filterable = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "title"
|
||
field_type = "string"
|
||
display_name = "工单标题"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "type"
|
||
field_type = "string"
|
||
display_name = "类型"
|
||
ui_widget = "select"
|
||
options = ["故障", "巡检", "咨询", "变更", "其他"]
|
||
default_value = "故障"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "priority"
|
||
field_type = "string"
|
||
display_name = "优先级"
|
||
ui_widget = "select"
|
||
options = ["紧急", "高", "中", "低"]
|
||
default_value = "中"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "status"
|
||
field_type = "string"
|
||
display_name = "状态"
|
||
ui_widget = "select"
|
||
options = ["待处理", "处理中", "等待客户", "已解决", "已关闭"]
|
||
default_value = "待处理"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "channel"
|
||
field_type = "string"
|
||
display_name = "来源渠道"
|
||
ui_widget = "select"
|
||
options = ["电话", "微信", "邮件", "系统"]
|
||
|
||
[[schema.entities.fields]]
|
||
name = "description"
|
||
field_type = "text"
|
||
display_name = "问题描述"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "resolution"
|
||
field_type = "text"
|
||
display_name = "解决方案"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "responded_at"
|
||
field_type = "datetime"
|
||
display_name = "首次响应时间"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "resolved_at"
|
||
field_type = "datetime"
|
||
display_name = "解决时间"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "closed_at"
|
||
field_type = "datetime"
|
||
display_name = "关闭时间"
|
||
```
|
||
|
||
#### 3.3.3 check_plan(巡检计划)
|
||
|
||
```toml
|
||
[[schema.entities]]
|
||
name = "check_plan"
|
||
display_name = "巡检计划"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "contract_id"
|
||
field_type = "uuid"
|
||
display_name = "维保合同"
|
||
ref_entity = "service_contract"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "client_id"
|
||
field_type = "uuid"
|
||
display_name = "客户"
|
||
ref_entity = "client"
|
||
ref_scope = "external"
|
||
ref_display_field = "name"
|
||
ref_search_fields = ["name", "phone"]
|
||
ref_fallback_label = "外部客户"
|
||
filterable = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "name"
|
||
field_type = "string"
|
||
display_name = "计划名称"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "frequency"
|
||
field_type = "string"
|
||
display_name = "巡检频率"
|
||
ui_widget = "select"
|
||
options = ["每周", "每两周", "每月", "每季度"]
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "check_items"
|
||
field_type = "text"
|
||
display_name = "检查项(JSON)"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "status"
|
||
field_type = "string"
|
||
display_name = "状态"
|
||
ui_widget = "select"
|
||
options = ["启用", "停用"]
|
||
default_value = "启用"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "next_check_date"
|
||
field_type = "date"
|
||
display_name = "下次巡检日期"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "notes"
|
||
field_type = "text"
|
||
display_name = "备注"
|
||
```
|
||
|
||
#### 3.3.4 check_record(巡检记录)
|
||
|
||
```toml
|
||
[[schema.entities]]
|
||
name = "check_record"
|
||
display_name = "巡检记录"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "plan_id"
|
||
field_type = "uuid"
|
||
display_name = "巡检计划"
|
||
ref_entity = "check_plan"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "contract_id"
|
||
field_type = "uuid"
|
||
display_name = "维保合同"
|
||
ref_entity = "service_contract"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "client_id"
|
||
field_type = "uuid"
|
||
display_name = "客户"
|
||
ref_entity = "client"
|
||
ref_scope = "external"
|
||
ref_display_field = "name"
|
||
ref_search_fields = ["name", "phone"]
|
||
ref_fallback_label = "外部客户"
|
||
filterable = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "check_date"
|
||
field_type = "date"
|
||
display_name = "巡检日期"
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "result"
|
||
field_type = "string"
|
||
display_name = "结果"
|
||
ui_widget = "select"
|
||
options = ["正常", "有异常"]
|
||
required = true
|
||
|
||
[[schema.entities.fields]]
|
||
name = "items_data"
|
||
field_type = "text"
|
||
display_name = "检查项结果(JSON)"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "issues_found"
|
||
field_type = "text"
|
||
display_name = "发现的问题"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "actions_taken"
|
||
field_type = "text"
|
||
display_name = "采取措施"
|
||
|
||
[[schema.entities.fields]]
|
||
name = "notes"
|
||
field_type = "text"
|
||
display_name = "备注"
|
||
```
|
||
|
||
### 3.4 权限声明(4 实体 x 2 = 8 个权限码)
|
||
|
||
```toml
|
||
[[permissions]]
|
||
code = "service_contract.list"
|
||
name = "查看维保合同"
|
||
|
||
[[permissions]]
|
||
code = "service_contract.manage"
|
||
name = "管理维保合同"
|
||
|
||
[[permissions]]
|
||
code = "ticket.list"
|
||
name = "查看工单"
|
||
|
||
[[permissions]]
|
||
code = "ticket.manage"
|
||
name = "管理工单"
|
||
|
||
[[permissions]]
|
||
code = "check_plan.list"
|
||
name = "查看巡检计划"
|
||
|
||
[[permissions]]
|
||
code = "check_plan.manage"
|
||
name = "管理巡检计划"
|
||
|
||
[[permissions]]
|
||
code = "check_record.list"
|
||
name = "查看巡检记录"
|
||
|
||
[[permissions]]
|
||
code = "check_record.manage"
|
||
name = "管理巡检记录"
|
||
```
|
||
|
||
### 3.5 页面设计(3 个页面)
|
||
|
||
#### 页面 1:运维概览(共享工作台的一部分)
|
||
|
||
作为全局工作台的一个区域展示:
|
||
- 活跃合同数 + 即将到期合同预警
|
||
- 本月工单统计(按状态饼图)
|
||
- SLA 达标率(百分比 + 趋势)
|
||
- 今日待巡检列表
|
||
- 最近 5 条工单
|
||
|
||
快捷操作:快速创建工单(3 字段:标题+客户+优先级)
|
||
|
||
#### 页面 2:合同管理
|
||
|
||
维保合同列表(支持按状态/客户/到期日筛选)+ 合同详情 Tab 页:
|
||
- Tab 1:合同信息
|
||
- Tab 2:关联工单
|
||
- Tab 3:巡检计划 + 巡检记录
|
||
|
||
#### 页面 3:工单中心
|
||
|
||
Tab 1:工单列表(按状态分 Tab:待处理/处理中/已解决/已关闭)
|
||
Tab 2:巡检管理(巡检计划列表 + 巡检记录列表)
|
||
|
||
工单详情展示 SLA 倒计时(超时变红预警)
|
||
|
||
### 3.6 SLA 自动计算规则
|
||
|
||
| SLA 等级 | 响应时间 | 解决时间 | 创建工单时自动带入 |
|
||
|----------|---------|---------|-------------------|
|
||
| 标准 | 8 小时 | 48 小时 | sla_response_hours=8, sla_resolve_hours=48 |
|
||
| 银牌 | 4 小时 | 24 小时 | sla_response_hours=4, sla_resolve_hours=24 |
|
||
| 金牌 | 2 小时 | 8 小时 | sla_response_hours=2, sla_resolve_hours=8 |
|
||
|
||
工单列表中实时显示 SLA 倒计时。
|
||
|
||
---
|
||
|
||
## 4. 跨插件引用关系
|
||
|
||
```
|
||
itops.service_contract.client_id → freelance.client (ref_scope=external)
|
||
itops.ticket.client_id → freelance.client (ref_scope=external)
|
||
itops.check_plan.client_id → freelance.client (ref_scope=external)
|
||
itops.check_record.client_id → freelance.client (ref_scope=external)
|
||
```
|
||
|
||
降级行为(freelance 未安装时):client_id 降级为文本输入字段,显示 ref_fallback_label "外部客户"。
|
||
|
||
---
|
||
|
||
## 5. inventory 插件扩展建议
|
||
|
||
在现有 inventory 插件的 product 实体增加字段:
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| product_type | select: physical/virtual/service | 产品类型,virtual/service 走零库存 |
|
||
|
||
覆盖"计算机软硬件及辅助设备批发/零售"的经营范围。
|
||
|
||
---
|
||
|
||
## 6. 全局工作台合并设计
|
||
|
||
freelance 和 itops 的仪表盘合并为一个全局工作台,布局如下:
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────┐
|
||
│ 快捷操作栏:[⏱ 计时] [💰 记支出] [📋 新报价] [🔧 新工单] │
|
||
├──────────────────────┬──────────────────────────────┤
|
||
│ 财务概览 │ 紧急待办 │
|
||
│ 本月收入: ¥XX,XXX │ 🔴 逾期收款: 2 笔 │
|
||
│ 本月支出: ¥X,XXX │ 🟡 今日到期任务: 3 项 │
|
||
│ 利润: ¥XX,XXX │ 🟡 即将到期合同: 1 份(7天内) │
|
||
│ 应收: ¥XX,XXX │ 🔵 待处理工单: 4 条 │
|
||
├──────────────────────┼──────────────────────────────┤
|
||
│ 活跃项目 (4) │ 运维概览 │
|
||
│ [项目A ████░░ 60%] │ 活跃合同: 5 份 │
|
||
│ [项目B ██░░░░ 30%] │ SLA 达标率: 96% │
|
||
│ [项目C ██████ 100%] │ 今日待巡检: 2 项 │
|
||
│ │ 最新工单: ... │
|
||
├──────────────────────┴──────────────────────────────┤
|
||
│ 商机跟进提醒 │
|
||
│ 📅 张三(XX公司) - 网站开发 - 明天需跟进 │
|
||
│ 📅 李四(YY公司) - AI方案 - 后天到期 │
|
||
└─────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 7. 实施优先级
|
||
|
||
```
|
||
P1: freelance 插件核心实体(client, opportunity, project, task, time_entry)
|
||
P2: freelance 插件财务实体(quote, quote_line, contract, invoice, expense)
|
||
P3: freelance 页面(全局工作台 + 客户管理 + 项目工作台 + 财务中心)
|
||
P4: itops 插件(全部实体 + 页面)
|
||
P5: inventory 扩展(product_type 字段)
|
||
P6: 全局工作台合并 + 快捷操作
|
||
```
|
||
|
||
---
|
||
|
||
## 8. 验证矩阵
|
||
|
||
| 验证场景 | 预期结果 |
|
||
|---------|---------|
|
||
| 单独安装 freelance | 全部功能正常,客户字段内部关联 |
|
||
| 单独安装 itops(不装 freelance) | client_id 降级为文本输入 |
|
||
| 同时安装 freelance + itops | client_id 自动关联 freelance.client,下拉选择客户 |
|
||
| 创建商机 → 创建报价 → 转合同 → 创建项目 | 全链路数据流通 |
|
||
| 项目中记录工时 → 生成发票 | 工时汇总可关联到发票 |
|
||
| 创建维保合同 → 设定巡检计划 → 执行巡检 → 创建工单 | 运维全流程 |
|
||
| SLA 超时预警 | 工单创建后超时自动标红 |
|
||
| 合同到期提醒 | 全局工作台显示即将到期合同 |
|
||
|
||
---
|
||
|
||
## 9. 讨论溯源
|
||
|
||
本文档基于 2026-04-19 的无主题发散式互动探讨产出,经过多专家头脑风暴审查(UX 专家、技术架构专家、业务顾问),采纳了以下关键建议:
|
||
|
||
- 新增 contract 实体(B2B 必要环节)
|
||
- 页面从 10 个压缩到 7 个(合并仪表盘+整合 tab)
|
||
- project 增加 business_type/deliverable_type 枚举覆盖全部经营范围
|
||
- 全局工作台 + 快捷操作(瑞士军刀原则)
|
||
- itops client_id 加 filterable + generated column 索引
|
||
- inventory 扩展 product.type 支持软硬件销售
|