Files
erp/crates/erp-plugin-freelance/plugin.toml
iven 40b37cc776
Some checks failed
CI / security-audit (push) Has been cancelled
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
feat(plugin,freelance,itops,web): P5-P6 dashboard widgets 平台扩展 + 仪表盘声明
P5 平台扩展:
- manifest.rs: Dashboard 变体新增 widgets 字段
- manifest.rs: 定义 PluginWidget/StatCard/ActionQuery 类型
- 前端: 扩展 DashboardWidget 类型支持 stat_cards/action_list/funnel/card_list
- 前端: 新增 4 个 widget 渲染器 (StatCardsWidget/ActionListWidget/FunnelStageWidget/CardListWidget)
- 前端: PluginDashboardPage widget 数据加载支持新类型

P6 仪表盘 widgets:
- freelance: 工作台仪表盘 4 个 widgets (财务概览/紧急待办/商机漏斗/活跃项目)
- itops: 新增运维概览仪表盘 2 个 widgets (运维概览/紧急待办)
2026-04-20 09:35:27 +08:00

1251 lines
29 KiB
TOML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 自由职业者工作台 — plugin.toml
# 汕头市智界科技有限公司 IT 服务行业插件
[metadata]
id = "erp-freelance"
name = "自由职业者工作台"
version = "0.1.0"
description = "一人 IT 服务公司的全链路业务管理:客户→商机→报价→合同→项目→工时→开票→收支"
author = "ERP Platform"
min_platform_version = "0.1.0"
# ── 权限声明10 实体 × 2 = 20 个权限码)──
[[permissions]]
code = "client.list"
name = "查看客户"
description = "查看客户列表和详情"
[[permissions]]
code = "client.manage"
name = "管理客户"
description = "创建、编辑、删除客户"
[[permissions]]
code = "opportunity.list"
name = "查看商机"
description = "查看商机列表和详情"
[[permissions]]
code = "opportunity.manage"
name = "管理商机"
description = "创建、编辑、删除商机"
[[permissions]]
code = "quote.list"
name = "查看报价"
description = "查看报价单列表和详情"
[[permissions]]
code = "quote.manage"
name = "管理报价"
description = "创建、编辑、删除报价单"
[[permissions]]
code = "quote_line.list"
name = "查看报价明细"
description = "查看报价明细列表"
[[permissions]]
code = "quote_line.manage"
name = "管理报价明细"
description = "创建、编辑、删除报价明细"
[[permissions]]
code = "contract.list"
name = "查看合同"
description = "查看合同列表和详情"
[[permissions]]
code = "contract.manage"
name = "管理合同"
description = "创建、编辑、删除合同"
[[permissions]]
code = "project.list"
name = "查看项目"
description = "查看项目列表和详情"
[[permissions]]
code = "project.manage"
name = "管理项目"
description = "创建、编辑、删除项目"
[[permissions]]
code = "task.list"
name = "查看任务"
description = "查看任务列表和详情"
[[permissions]]
code = "task.manage"
name = "管理任务"
description = "创建、编辑、删除任务"
[[permissions]]
code = "time_entry.list"
name = "查看工时"
description = "查看工时记录列表"
[[permissions]]
code = "time_entry.manage"
name = "管理工时"
description = "创建、编辑、删除工时记录"
[[permissions]]
code = "invoice.list"
name = "查看发票"
description = "查看发票/收款列表和详情"
[[permissions]]
code = "invoice.manage"
name = "管理发票"
description = "创建、编辑、删除发票/收款记录"
[[permissions]]
code = "expense.list"
name = "查看支出"
description = "查看支出列表和详情"
[[permissions]]
code = "expense.manage"
name = "管理支出"
description = "创建、编辑、删除支出记录"
# ── 实体定义 ──
# ── 2.3.1 client客户──
[[schema.entities]]
name = "client"
display_name = "客户"
is_public = true
[[schema.entities.fields]]
name = "name"
field_type = "string"
required = true
display_name = "客户名称"
searchable = true
[[schema.entities.fields]]
name = "contact_name"
field_type = "string"
display_name = "联系人"
[[schema.entities.fields]]
name = "phone"
field_type = "string"
display_name = "电话"
validation = { pattern = "^1[3-9]\\d{9}$", message = "请输入有效的手机号" }
[[schema.entities.fields]]
name = "email"
field_type = "string"
display_name = "邮箱"
validation = { pattern = "^[^@]+@[^@]+\\.[^@]+$", message = "请输入有效的邮箱地址" }
[[schema.entities.fields]]
name = "industry"
field_type = "string"
display_name = "行业"
ui_widget = "select"
filterable = true
options = [
{ label = "制造业", value = "manufacturing" },
{ label = "零售", value = "retail" },
{ label = "教育", value = "education" },
{ label = "医疗", value = "healthcare" },
{ label = "政府", value = "government" },
{ label = "金融", value = "finance" },
{ label = "其他", value = "other" }
]
[[schema.entities.fields]]
name = "source"
field_type = "string"
display_name = "来源"
ui_widget = "select"
options = [
{ label = "转介绍", value = "referral" },
{ label = "线上", value = "online" },
{ label = "展会", value = "exhibition" },
{ label = "老客户", value = "repeat" },
{ label = "主动开发", value = "outreach" }
]
[[schema.entities.fields]]
name = "level"
field_type = "string"
display_name = "重要等级"
ui_widget = "select"
filterable = true
options = [
{ label = "A", value = "a" },
{ label = "B", value = "b" },
{ label = "C", value = "c" }
]
[[schema.entities.fields]]
name = "status"
field_type = "string"
required = true
display_name = "状态"
ui_widget = "select"
filterable = true
default = "potential"
options = [
{ label = "潜在", value = "potential" },
{ label = "活跃", value = "active" },
{ label = "休眠", value = "dormant" },
{ label = "流失", value = "lost" }
]
[[schema.entities.fields]]
name = "address"
field_type = "string"
display_name = "地址"
[[schema.entities.fields]]
name = "notes"
field_type = "string"
display_name = "备注"
ui_widget = "textarea"
# ── 2.3.2 opportunity商机──
[[schema.entities]]
name = "opportunity"
display_name = "商机"
[[schema.entities.fields]]
name = "client_id"
field_type = "uuid"
required = true
display_name = "客户"
ui_widget = "entity_select"
ref_entity = "client"
ref_label_field = "name"
ref_search_fields = ["name"]
[[schema.entities.fields]]
name = "title"
field_type = "string"
required = true
display_name = "商机名称"
searchable = true
[[schema.entities.fields]]
name = "business_type"
field_type = "string"
required = true
display_name = "业务类型"
ui_widget = "select"
filterable = true
options = [
{ label = "软件开发", value = "software_development" },
{ label = "AI 开发", value = "ai_development" },
{ label = "系统集成", value = "system_integration" },
{ label = "软件外包", value = "software_outsourcing" },
{ label = "IT 咨询", value = "it_consulting" },
{ label = "数字内容", value = "digital_content" },
{ label = "营销策划", value = "marketing_planning" }
]
[[schema.entities.fields]]
name = "stage"
field_type = "string"
required = true
display_name = "阶段"
ui_widget = "select"
filterable = true
default = "visit"
options = [
{ label = "初访", value = "visit" },
{ label = "需求确认", value = "requirement" },
{ label = "报价", value = "quote" },
{ label = "谈判", value = "negotiation" },
{ label = "成交", value = "won" },
{ label = "失败", value = "lost" }
]
[[schema.entities.fields]]
name = "estimated_amount"
field_type = "decimal"
display_name = "预估金额"
sortable = true
[[schema.entities.fields]]
name = "probability"
field_type = "integer"
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 = "string"
display_name = "需求描述"
ui_widget = "textarea"
# ── 2.3.3 quote报价单──
[[schema.entities]]
name = "quote"
display_name = "报价单"
[[schema.entities.fields]]
name = "client_id"
field_type = "uuid"
required = true
display_name = "客户"
ui_widget = "entity_select"
ref_entity = "client"
ref_label_field = "name"
ref_search_fields = ["name"]
[[schema.entities.fields]]
name = "opportunity_id"
field_type = "uuid"
display_name = "关联商机"
ref_entity = "opportunity"
[[schema.entities.fields]]
name = "quote_number"
field_type = "string"
required = true
display_name = "报价单号"
unique = true
[[schema.entities.fields]]
name = "status"
field_type = "string"
required = true
display_name = "状态"
ui_widget = "select"
filterable = true
default = "draft"
options = [
{ label = "草稿", value = "draft" },
{ label = "已发送", value = "sent" },
{ label = "已接受", value = "accepted" },
{ label = "已拒绝", value = "rejected" },
{ label = "已过期", value = "expired" }
]
[[schema.entities.fields]]
name = "valid_until"
field_type = "date"
display_name = "有效期至"
[[schema.entities.fields]]
name = "subtotal"
field_type = "decimal"
display_name = "小计"
sortable = true
[[schema.entities.fields]]
name = "tax_rate"
field_type = "decimal"
display_name = "税率(%)"
[[schema.entities.fields]]
name = "total_amount"
field_type = "decimal"
display_name = "总金额"
sortable = true
visible_when = "status != 'draft'"
[[schema.entities.fields]]
name = "notes"
field_type = "string"
display_name = "备注"
ui_widget = "textarea"
[[schema.entities.relations]]
entity = "quote_line"
foreign_key = "quote_id"
on_delete = "cascade"
name = "lines"
type = "one_to_many"
display_field = "item_name"
# ── 2.3.4 quote_line报价明细行──
[[schema.entities]]
name = "quote_line"
display_name = "报价明细"
[[schema.entities.fields]]
name = "quote_id"
field_type = "uuid"
required = true
display_name = "报价单"
ref_entity = "quote"
[[schema.entities.fields]]
name = "item_name"
field_type = "string"
required = true
display_name = "项目名称"
[[schema.entities.fields]]
name = "description"
field_type = "string"
display_name = "描述"
[[schema.entities.fields]]
name = "quantity"
field_type = "decimal"
required = true
display_name = "数量"
default = 1
[[schema.entities.fields]]
name = "unit_price"
field_type = "decimal"
required = true
display_name = "单价"
[[schema.entities.fields]]
name = "unit"
field_type = "string"
display_name = "单位"
ui_widget = "select"
default = "project"
options = [
{ label = "项目", value = "project" },
{ label = "人月", value = "person_month" },
{ label = "人天", value = "person_day" },
{ label = "小时", value = "hour" },
{ label = "个", value = "piece" },
{ label = "套", value = "set" }
]
[[schema.entities.fields]]
name = "amount"
field_type = "decimal"
display_name = "金额"
# ── 2.3.5 contract合同──
[[schema.entities]]
name = "contract"
display_name = "合同"
[[schema.entities.fields]]
name = "client_id"
field_type = "uuid"
required = true
display_name = "客户"
ui_widget = "entity_select"
ref_entity = "client"
ref_label_field = "name"
ref_search_fields = ["name"]
[[schema.entities.fields]]
name = "opportunity_id"
field_type = "uuid"
display_name = "关联商机"
ref_entity = "opportunity"
cascade_from = "client_id"
cascade_filter = "client_id"
[[schema.entities.fields]]
name = "quote_id"
field_type = "uuid"
display_name = "关联报价"
ref_entity = "quote"
cascade_from = "client_id"
cascade_filter = "client_id"
[[schema.entities.fields]]
name = "contract_number"
field_type = "string"
required = true
display_name = "合同编号"
unique = true
[[schema.entities.fields]]
name = "title"
field_type = "string"
required = true
display_name = "合同名称"
searchable = true
[[schema.entities.fields]]
name = "type"
field_type = "string"
required = true
display_name = "合同类型"
ui_widget = "select"
filterable = true
options = [
{ label = "开发合同", value = "development" },
{ label = "集成合同", value = "integration" },
{ label = "外包合同", value = "outsourcing" },
{ label = "咨询合同", value = "consulting" },
{ label = "维保合同", value = "maintenance" },
{ label = "销售合同", value = "sales" },
{ label = "其他", value = "other" }
]
[[schema.entities.fields]]
name = "status"
field_type = "string"
required = true
display_name = "状态"
ui_widget = "select"
filterable = true
default = "drafting"
options = [
{ label = "草拟中", value = "drafting" },
{ label = "待签署", value = "pending_signature" },
{ label = "执行中", value = "active" },
{ label = "已完成", value = "completed" },
{ label = "已终止", value = "terminated" }
]
[[schema.entities.fields]]
name = "amount"
field_type = "decimal"
required = true
display_name = "合同金额"
sortable = true
[[schema.entities.fields]]
name = "paid_amount"
field_type = "decimal"
display_name = "已付金额"
default = 0
visible_when = "status != 'drafting'"
[[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 = "string"
display_name = "备注"
ui_widget = "textarea"
# ── 2.3.6 project项目──
[[schema.entities]]
name = "project"
display_name = "项目"
[[schema.entities.fields]]
name = "client_id"
field_type = "uuid"
required = true
display_name = "客户"
ui_widget = "entity_select"
ref_entity = "client"
ref_label_field = "name"
ref_search_fields = ["name"]
[[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"
required = true
display_name = "项目名称"
searchable = true
[[schema.entities.fields]]
name = "business_type"
field_type = "string"
display_name = "业务类型"
ui_widget = "select"
filterable = true
options = [
{ label = "软件开发", value = "software_development" },
{ label = "AI 开发", value = "ai_development" },
{ label = "系统集成", value = "system_integration" },
{ label = "软件外包", value = "software_outsourcing" },
{ label = "IT 咨询", value = "it_consulting" },
{ label = "数字内容", value = "digital_content" },
{ label = "营销策划", value = "marketing_planning" }
]
[[schema.entities.fields]]
name = "deliverable_type"
field_type = "string"
display_name = "交付物类型"
ui_widget = "select"
options = [
{ label = "软件", value = "software" },
{ label = "网站", value = "website" },
{ label = "小程序", value = "miniprogram" },
{ label = "视频", value = "video" },
{ label = "设计稿", value = "design" },
{ label = "文档", value = "document" },
{ label = "咨询报告", value = "consulting_report" }
]
[[schema.entities.fields]]
name = "status"
field_type = "string"
required = true
display_name = "状态"
ui_widget = "select"
filterable = true
default = "pending"
options = [
{ label = "待开始", value = "pending" },
{ label = "进行中", value = "in_progress" },
{ label = "已交付", value = "delivered" },
{ label = "验收中", value = "accepting" },
{ label = "已完成", value = "completed" },
{ label = "已搁置", value = "shelved" }
]
[[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 = "decimal"
display_name = "合同金额"
sortable = true
[[schema.entities.fields]]
name = "description"
field_type = "string"
display_name = "项目说明"
ui_widget = "textarea"
[[schema.entities.relations]]
entity = "task"
foreign_key = "project_id"
on_delete = "cascade"
name = "tasks"
type = "one_to_many"
display_field = "title"
[[schema.entities.relations]]
entity = "time_entry"
foreign_key = "project_id"
on_delete = "cascade"
name = "time_entries"
type = "one_to_many"
display_field = "description"
# ── 2.3.7 task任务──
[[schema.entities]]
name = "task"
display_name = "任务"
[[schema.entities.fields]]
name = "project_id"
field_type = "uuid"
required = true
display_name = "所属项目"
ui_widget = "entity_select"
ref_entity = "project"
ref_label_field = "name"
ref_search_fields = ["name"]
[[schema.entities.fields]]
name = "title"
field_type = "string"
required = true
display_name = "任务标题"
searchable = true
[[schema.entities.fields]]
name = "status"
field_type = "string"
required = true
display_name = "状态"
ui_widget = "select"
filterable = true
default = "todo"
options = [
{ label = "待办", value = "todo" },
{ label = "进行中", value = "in_progress" },
{ label = "已完成", value = "done" },
{ label = "已取消", value = "cancelled" }
]
[[schema.entities.fields]]
name = "priority"
field_type = "string"
required = true
display_name = "优先级"
ui_widget = "select"
filterable = true
default = "medium"
options = [
{ label = "紧急", value = "urgent" },
{ label = "高", value = "high" },
{ label = "中", value = "medium" },
{ label = "低", value = "low" }
]
[[schema.entities.fields]]
name = "due_date"
field_type = "date"
display_name = "截止日期"
[[schema.entities.fields]]
name = "estimated_hours"
field_type = "decimal"
display_name = "预估工时"
[[schema.entities.fields]]
name = "actual_hours"
field_type = "decimal"
display_name = "实际工时"
visible_when = "status != 'todo'"
[[schema.entities.fields]]
name = "description"
field_type = "string"
display_name = "详细说明"
ui_widget = "textarea"
# ── 2.3.8 time_entry工时记录──
[[schema.entities]]
name = "time_entry"
display_name = "工时记录"
[[schema.entities.fields]]
name = "task_id"
field_type = "uuid"
display_name = "关联任务"
ui_widget = "entity_select"
ref_entity = "task"
ref_label_field = "title"
ref_search_fields = ["title"]
cascade_from = "project_id"
cascade_filter = "project_id"
[[schema.entities.fields]]
name = "project_id"
field_type = "uuid"
required = true
display_name = "关联项目"
ui_widget = "entity_select"
ref_entity = "project"
ref_label_field = "name"
ref_search_fields = ["name"]
[[schema.entities.fields]]
name = "date"
field_type = "date"
required = true
display_name = "日期"
[[schema.entities.fields]]
name = "hours"
field_type = "decimal"
required = true
display_name = "时长(小时)"
[[schema.entities.fields]]
name = "description"
field_type = "string"
display_name = "工作内容"
# ── 2.3.9 invoice发票/收款)──
[[schema.entities]]
name = "invoice"
display_name = "发票/收款"
[[schema.entities.fields]]
name = "client_id"
field_type = "uuid"
required = true
display_name = "客户"
ui_widget = "entity_select"
ref_entity = "client"
ref_label_field = "name"
ref_search_fields = ["name"]
[[schema.entities.fields]]
name = "project_id"
field_type = "uuid"
display_name = "关联项目"
ref_entity = "project"
cascade_from = "client_id"
cascade_filter = "client_id"
[[schema.entities.fields]]
name = "contract_id"
field_type = "uuid"
display_name = "关联合同"
ref_entity = "contract"
cascade_from = "client_id"
cascade_filter = "client_id"
[[schema.entities.fields]]
name = "invoice_number"
field_type = "string"
required = true
display_name = "发票号"
unique = true
[[schema.entities.fields]]
name = "type"
field_type = "string"
required = true
display_name = "类型"
ui_widget = "select"
filterable = true
options = [
{ label = "开票", value = "invoice" },
{ label = "收款记录", value = "payment" }
]
[[schema.entities.fields]]
name = "amount"
field_type = "decimal"
required = true
display_name = "金额"
sortable = true
[[schema.entities.fields]]
name = "status"
field_type = "string"
required = true
display_name = "状态"
ui_widget = "select"
filterable = true
default = "pending"
options = [
{ label = "待开票", value = "pending" },
{ label = "已开票", value = "issued" },
{ label = "部分收款", value = "partial" },
{ label = "已收款", value = "paid" },
{ label = "已逾期", value = "overdue" }
]
[[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 = "实际收款日期"
visible_when = "status == 'paid' || status == 'partial'"
[[schema.entities.fields]]
name = "notes"
field_type = "string"
display_name = "备注"
ui_widget = "textarea"
# ── 2.3.10 expense支出──
[[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"
required = true
display_name = "类别"
ui_widget = "select"
filterable = true
options = [
{ label = "硬件", value = "hardware" },
{ label = "软件订阅", value = "software" },
{ label = "云服务", value = "cloud" },
{ label = "差旅", value = "travel" },
{ label = "餐饮", value = "meal" },
{ label = "办公用品", value = "office" },
{ label = "其他", value = "other" }
]
[[schema.entities.fields]]
name = "amount"
field_type = "decimal"
required = true
display_name = "金额"
sortable = true
[[schema.entities.fields]]
name = "date"
field_type = "date"
required = true
display_name = "日期"
[[schema.entities.fields]]
name = "vendor"
field_type = "string"
display_name = "供应商"
[[schema.entities.fields]]
name = "description"
field_type = "string"
display_name = "描述"
# ── 插件配置 ──
[settings]
[[settings.fields]]
name = "company_name"
display_name = "公司名称"
field_type = "text"
required = true
group = "基本信息"
[[settings.fields]]
name = "currency_symbol"
display_name = "货币符号"
field_type = "text"
default_value = "¥"
group = "基本信息"
[[settings.fields]]
name = "default_tax_rate"
display_name = "默认税率(%)"
field_type = "number"
default_value = 6
range = [0.0, 100.0]
group = "财务"
[[settings.fields]]
name = "payment_reminder_days"
display_name = "收款提前提醒(天)"
field_type = "number"
default_value = 3
range = [1.0, 30.0]
group = "提醒"
[[settings.fields]]
name = "notify_contract_expiring"
display_name = "合同到期提醒"
field_type = "boolean"
default_value = true
group = "提醒"
[[settings.fields]]
name = "notify_payment_overdue"
display_name = "逾期收款提醒"
field_type = "boolean"
default_value = true
group = "提醒"
[[settings.fields]]
name = "notify_opportunity_followup"
display_name = "商机跟进提醒"
field_type = "boolean"
default_value = true
group = "提醒"
# ── 触发事件 ──
[[trigger_events]]
name = "opportunity_stage_changed"
display_name = "商机阶段变更"
description = "商机阶段发生变化时通知,特别是成交或失败"
entity = "opportunity"
on = "update"
[[trigger_events]]
name = "contract_status_changed"
display_name = "合同状态变更"
description = "合同状态变化时检查到期预警"
entity = "contract"
on = "update"
[[trigger_events]]
name = "invoice_status_changed"
display_name = "发票状态变更"
description = "发票状态变化时检查逾期收款"
entity = "invoice"
on = "update"
[[trigger_events]]
name = "task_status_changed"
display_name = "任务状态变更"
description = "任务完成或取消时通知"
entity = "task"
on = "update"
[[trigger_events]]
name = "expense_created"
display_name = "新支出记录"
description = "记录新支出时通知"
entity = "expense"
on = "create"
# ── 编号规则 ──
[[numbering]]
entity = "quote"
field = "quote_number"
prefix = "QT"
format = "{PREFIX}-{YEAR}-{SEQ}"
seq_length = 4
[[numbering]]
entity = "contract"
field = "contract_number"
prefix = "CT"
format = "{PREFIX}-{YEAR}-{SEQ}"
seq_length = 4
[[numbering]]
entity = "invoice"
field = "invoice_number"
prefix = "INV"
format = "{PREFIX}-{YEAR}-{SEQ}"
seq_length = 4
# ── 打印模板 ──
[[templates]]
name = "quote_pdf"
display_name = "报价单"
entity = "quote"
format = "pdf"
[[templates]]
name = "invoice_pdf"
display_name = "发票"
entity = "invoice"
format = "pdf"
[[templates]]
name = "contract_pdf"
display_name = "合同"
entity = "contract"
format = "pdf"
# ── 页面设计 ──
# 页面 1全局工作台
[[ui.pages]]
type = "dashboard"
label = "工作台"
icon = "DashboardOutlined"
# ── 财务概览卡片 ──
[[ui.pages.widgets]]
type = "stat_cards"
label = "财务概览"
cards = [
{ entity = "invoice", aggregate = "sum", field = "amount", filter = "type == 'payment' && status != 'overdue'", label = "本月收入", icon = "rise", color = "green" },
{ entity = "expense", aggregate = "sum", field = "amount", label = "本月支出", icon = "fall", color = "red" },
{ entity = "invoice", aggregate = "sum", field = "amount", filter = "status == 'overdue' || status == 'pending'", label = "应收总额", icon = "dollar", color = "orange" },
{ entity = "invoice", aggregate = "count", filter = "status == 'overdue'", label = "逾期笔数", icon = "warning", color = "red" }
]
# ── 紧急待办 ──
[[ui.pages.widgets]]
type = "action_list"
label = "紧急待办"
max_items = 5
queries = [
{ entity = "invoice", filter = "status == 'overdue'", label_field = "invoice_number", subtitle_field = "amount", action = "查看", icon = "warning" },
{ entity = "task", filter = "status != 'done' && status != 'cancelled'", sort = "due_date asc", label_field = "title", subtitle_field = "due_date", action = "处理", icon = "clock" },
{ entity = "contract", filter = "status == 'active'", sort = "end_date asc", label_field = "title", subtitle_field = "end_date", action = "续约", icon = "file-text" },
{ entity = "opportunity", filter = "next_follow_up <= today", label_field = "title", subtitle_field = "next_follow_up", action = "跟进", icon = "phone" }
]
# ── 商机漏斗 ──
[[ui.pages.widgets]]
type = "funnel"
label = "商机漏斗"
entity = "opportunity"
lane_field = "stage"
value_field = "estimated_amount"
lane_order = ["visit", "requirement", "quote", "negotiation", "won", "lost"]
# ── 活跃项目卡片 ──
[[ui.pages.widgets]]
type = "card_list"
label = "活跃项目"
entity = "project"
filter = "status == 'in_progress'"
max_items = 4
title_field = "name"
subtitle_field = "contract_amount"
tags = ["business_type", "status"]
# 页面 2客户管理列表 + 详情 + 商机看板)
[[ui.pages]]
type = "tabs"
label = "客户管理"
icon = "team"
[[ui.pages.tabs]]
label = "客户列表"
type = "crud"
entity = "client"
enable_search = true
[[ui.pages]]
type = "detail"
entity = "client"
label = "客户详情"
[[ui.pages.sections]]
type = "fields"
label = "基本信息"
fields = ["name", "contact_name", "phone", "email", "industry", "source", "level", "status", "address", "notes"]
[[ui.pages.sections]]
type = "crud"
label = "商机"
entity = "opportunity"
filter_field = "client_id"
[[ui.pages.sections]]
type = "crud"
label = "报价/合同"
entity = "quote"
filter_field = "client_id"
[[ui.pages.sections]]
type = "crud"
label = "项目"
entity = "project"
filter_field = "client_id"
[[ui.pages.sections]]
type = "crud"
label = "发票"
entity = "invoice"
filter_field = "client_id"
# 商机看板
[[ui.pages]]
type = "kanban"
entity = "opportunity"
label = "商机看板"
icon = "swap"
lane_field = "stage"
lane_order = ["visit", "requirement", "quote", "negotiation", "won", "lost"]
card_title_field = "title"
card_subtitle_field = "estimated_amount"
card_fields = ["business_type", "probability"]
enable_drag = true
# 页面 3项目管理 + 详情
[[ui.pages]]
type = "crud"
entity = "project"
label = "项目管理"
icon = "project"
enable_search = true
[[ui.pages]]
type = "detail"
entity = "project"
label = "项目详情"
[[ui.pages.sections]]
type = "fields"
label = "项目信息"
fields = ["name", "client_id", "contract_id", "business_type", "deliverable_type", "status", "start_date", "end_date", "contract_amount", "description"]
[[ui.pages.sections]]
type = "crud"
label = "任务"
entity = "task"
filter_field = "project_id"
[[ui.pages.sections]]
type = "crud"
label = "工时记录"
entity = "time_entry"
filter_field = "project_id"
[[ui.pages.sections]]
type = "crud"
label = "发票"
entity = "invoice"
filter_field = "project_id"
# 页面 4财务中心
[[ui.pages]]
type = "tabs"
label = "财务中心"
icon = "account-book"
[[ui.pages.tabs]]
label = "报价管理"
type = "crud"
entity = "quote"
enable_search = true
[[ui.pages.tabs]]
label = "合同管理"
type = "crud"
entity = "contract"
enable_search = true
[[ui.pages.tabs]]
label = "发票/收款"
type = "crud"
entity = "invoice"
enable_search = true
# 页面 5支出管理
[[ui.pages]]
type = "crud"
entity = "expense"
label = "支出管理"
icon = "pay-circle"
enable_search = true