Files
erp/crates/erp-plugin-itops/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

634 lines
15 KiB
TOML
Raw Permalink 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.
# IT 运维服务台 — plugin.toml
# 汕头市智界科技有限公司 IT 服务行业插件
[metadata]
id = "erp-itops"
name = "IT 运维服务台"
version = "0.1.0"
description = "IT 运维工单管理 + SLA 追踪 + 定期巡检"
author = "ERP Platform"
min_platform_version = "0.1.0"
# ── 权限声明4 实体 × 2 = 8 个权限码)──
[[permissions]]
code = "service_contract.list"
name = "查看维保合同"
description = "查看维保合同列表和详情"
[[permissions]]
code = "service_contract.manage"
name = "管理维保合同"
description = "创建、编辑、删除维保合同"
[[permissions]]
code = "ticket.list"
name = "查看工单"
description = "查看工单列表和详情"
[[permissions]]
code = "ticket.manage"
name = "管理工单"
description = "创建、编辑、删除工单"
[[permissions]]
code = "check_plan.list"
name = "查看巡检计划"
description = "查看巡检计划列表和详情"
[[permissions]]
code = "check_plan.manage"
name = "管理巡检计划"
description = "创建、编辑、删除巡检计划"
[[permissions]]
code = "check_record.list"
name = "查看巡检记录"
description = "查看巡检记录列表"
[[permissions]]
code = "check_record.manage"
name = "管理巡检记录"
description = "创建、编辑、删除巡检记录"
# ── 实体定义 ──
# ── 3.3.1 service_contract维保合同──
[[schema.entities]]
name = "service_contract"
display_name = "维保合同"
[[schema.entities.fields]]
name = "client_id"
field_type = "uuid"
display_name = "客户"
ui_widget = "entity_select"
ref_plugin = "erp-freelance"
ref_entity = "client"
ref_label_field = "name"
ref_search_fields = ["name"]
ref_fallback_label = "外部客户"
[[schema.entities.fields]]
name = "contract_number"
field_type = "string"
required = true
display_name = "合同编号"
unique = true
validation = { pattern = "^SC-\\d{4}-\\d{4}$", message = "格式SC-YYYY-NNNN" }
[[schema.entities.fields]]
name = "name"
field_type = "string"
required = true
display_name = "合同名称"
searchable = true
[[schema.entities.fields]]
name = "service_scope"
field_type = "string"
display_name = "服务范围"
ui_widget = "textarea"
[[schema.entities.fields]]
name = "sla_level"
field_type = "string"
required = true
display_name = "SLA 等级"
ui_widget = "select"
filterable = true
default = "standard"
options = [
{ label = "标准", value = "standard" },
{ label = "银牌", value = "silver" },
{ label = "金牌", value = "gold" }
]
[[schema.entities.fields]]
name = "sla_response_hours"
field_type = "integer"
display_name = "SLA 响应时间(小时)"
default = 8
[[schema.entities.fields]]
name = "sla_resolve_hours"
field_type = "integer"
display_name = "SLA 解决时间(小时)"
default = 48
[[schema.entities.fields]]
name = "status"
field_type = "string"
required = true
display_name = "状态"
ui_widget = "select"
filterable = true
default = "active"
options = [
{ label = "生效中", value = "active" },
{ label = "即将到期", value = "expiring" },
{ label = "已过期", value = "expired" },
{ label = "已终止", value = "terminated" }
]
[[schema.entities.fields]]
name = "start_date"
field_type = "date"
required = true
display_name = "开始日期"
[[schema.entities.fields]]
name = "end_date"
field_type = "date"
required = true
display_name = "结束日期"
[[schema.entities.fields]]
name = "amount"
field_type = "decimal"
display_name = "合同金额"
sortable = true
[[schema.entities.fields]]
name = "payment_terms"
field_type = "string"
display_name = "付款条款"
[[schema.entities.fields]]
name = "notes"
field_type = "string"
display_name = "备注"
ui_widget = "textarea"
[[schema.entities.relations]]
entity = "ticket"
foreign_key = "contract_id"
on_delete = "nullify"
name = "tickets"
type = "one_to_many"
display_field = "title"
[[schema.entities.relations]]
entity = "check_plan"
foreign_key = "contract_id"
on_delete = "cascade"
name = "check_plans"
type = "one_to_many"
display_field = "name"
# ── 3.3.2 ticket工单──
[[schema.entities]]
name = "ticket"
display_name = "工单"
[[schema.entities.fields]]
name = "contract_id"
field_type = "uuid"
display_name = "维保合同"
ui_widget = "entity_select"
ref_entity = "service_contract"
ref_label_field = "name"
ref_search_fields = ["name"]
cascade_from = "client_id"
cascade_filter = "client_id"
[[schema.entities.fields]]
name = "client_id"
field_type = "uuid"
display_name = "客户"
ui_widget = "entity_select"
ref_plugin = "erp-freelance"
ref_entity = "client"
ref_label_field = "name"
ref_search_fields = ["name"]
ref_fallback_label = "外部客户"
[[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
default = "fault"
options = [
{ label = "故障", value = "fault" },
{ label = "巡检", value = "check" },
{ label = "咨询", value = "consult" },
{ label = "变更", value = "change" },
{ label = "其他", value = "other" }
]
[[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 = "status"
field_type = "string"
required = true
display_name = "状态"
ui_widget = "select"
filterable = true
default = "open"
options = [
{ label = "待处理", value = "open" },
{ label = "处理中", value = "in_progress" },
{ label = "等待客户", value = "waiting_client" },
{ label = "已解决", value = "resolved" },
{ label = "已关闭", value = "closed" }
]
[[schema.entities.fields]]
name = "channel"
field_type = "string"
display_name = "来源渠道"
ui_widget = "select"
options = [
{ label = "电话", value = "phone" },
{ label = "微信", value = "wechat" },
{ label = "邮件", value = "email" },
{ label = "系统", value = "system" }
]
[[schema.entities.fields]]
name = "description"
field_type = "string"
display_name = "问题描述"
ui_widget = "textarea"
[[schema.entities.fields]]
name = "resolution"
field_type = "string"
display_name = "解决方案"
ui_widget = "textarea"
visible_when = "status == 'resolved' || status == 'closed'"
[[schema.entities.fields]]
name = "responded_at"
field_type = "date_time"
display_name = "首次响应时间"
visible_when = "status != 'open'"
[[schema.entities.fields]]
name = "resolved_at"
field_type = "date_time"
display_name = "解决时间"
visible_when = "status == 'resolved' || status == 'closed'"
[[schema.entities.fields]]
name = "closed_at"
field_type = "date_time"
display_name = "关闭时间"
visible_when = "status == 'closed'"
# ── 3.3.3 check_plan巡检计划──
[[schema.entities]]
name = "check_plan"
display_name = "巡检计划"
[[schema.entities.fields]]
name = "contract_id"
field_type = "uuid"
required = true
display_name = "维保合同"
ui_widget = "entity_select"
ref_entity = "service_contract"
ref_label_field = "name"
ref_search_fields = ["name"]
[[schema.entities.fields]]
name = "client_id"
field_type = "uuid"
display_name = "客户"
ui_widget = "entity_select"
ref_plugin = "erp-freelance"
ref_entity = "client"
ref_label_field = "name"
ref_search_fields = ["name"]
ref_fallback_label = "外部客户"
[[schema.entities.fields]]
name = "name"
field_type = "string"
required = true
display_name = "计划名称"
searchable = true
[[schema.entities.fields]]
name = "frequency"
field_type = "string"
required = true
display_name = "巡检频率"
ui_widget = "select"
options = [
{ label = "每周", value = "weekly" },
{ label = "每两周", value = "biweekly" },
{ label = "每月", value = "monthly" },
{ label = "每季度", value = "quarterly" }
]
[[schema.entities.fields]]
name = "check_items"
field_type = "json"
display_name = "检查项"
[[schema.entities.fields]]
name = "status"
field_type = "string"
required = true
display_name = "状态"
ui_widget = "select"
default = "active"
options = [
{ label = "启用", value = "active" },
{ label = "停用", value = "inactive" }
]
[[schema.entities.fields]]
name = "next_check_date"
field_type = "date"
display_name = "下次巡检日期"
[[schema.entities.fields]]
name = "notes"
field_type = "string"
display_name = "备注"
ui_widget = "textarea"
[[schema.entities.relations]]
entity = "check_record"
foreign_key = "plan_id"
on_delete = "cascade"
name = "records"
type = "one_to_many"
display_field = "check_date"
# ── 3.3.4 check_record巡检记录──
[[schema.entities]]
name = "check_record"
display_name = "巡检记录"
[[schema.entities.fields]]
name = "plan_id"
field_type = "uuid"
required = true
display_name = "巡检计划"
ui_widget = "entity_select"
ref_entity = "check_plan"
ref_label_field = "name"
ref_search_fields = ["name"]
[[schema.entities.fields]]
name = "contract_id"
field_type = "uuid"
display_name = "维保合同"
ref_entity = "service_contract"
cascade_from = "plan_id"
cascade_filter = "contract_id"
[[schema.entities.fields]]
name = "client_id"
field_type = "uuid"
display_name = "客户"
ui_widget = "entity_select"
ref_plugin = "erp-freelance"
ref_entity = "client"
ref_label_field = "name"
ref_search_fields = ["name"]
ref_fallback_label = "外部客户"
[[schema.entities.fields]]
name = "check_date"
field_type = "date"
required = true
display_name = "巡检日期"
[[schema.entities.fields]]
name = "result"
field_type = "string"
required = true
display_name = "结果"
ui_widget = "select"
filterable = true
options = [
{ label = "正常", value = "normal" },
{ label = "有异常", value = "abnormal" }
]
[[schema.entities.fields]]
name = "items_data"
field_type = "json"
display_name = "检查项结果"
[[schema.entities.fields]]
name = "issues_found"
field_type = "string"
display_name = "发现的问题"
ui_widget = "textarea"
visible_when = "result == 'abnormal'"
[[schema.entities.fields]]
name = "actions_taken"
field_type = "string"
display_name = "采取措施"
ui_widget = "textarea"
visible_when = "result == 'abnormal'"
[[schema.entities.fields]]
name = "notes"
field_type = "string"
display_name = "备注"
ui_widget = "textarea"
# ── 插件配置 ──
[settings]
[[settings.fields]]
name = "default_sla_response"
display_name = "默认SLA响应时间(小时)"
field_type = "number"
default_value = 8
range = [1.0, 72.0]
group = "SLA"
[[settings.fields]]
name = "default_sla_resolve"
display_name = "默认SLA解决时间(小时)"
field_type = "number"
default_value = 48
range = [1.0, 168.0]
group = "SLA"
[[settings.fields]]
name = "notify_sla_breach"
display_name = "SLA超标提醒"
field_type = "boolean"
default_value = true
group = "提醒"
[[settings.fields]]
name = "notify_check_due"
display_name = "巡检到期提醒"
field_type = "boolean"
default_value = true
group = "提醒"
# ── 触发事件 ──
[[trigger_events]]
name = "ticket_created"
display_name = "新工单"
description = "创建工单时开始SLA计时并通知"
entity = "ticket"
on = "create"
[[trigger_events]]
name = "ticket_status_changed"
display_name = "工单状态变更"
description = "工单状态变化时检查SLA是否达标"
entity = "ticket"
on = "update"
[[trigger_events]]
name = "contract_status_changed"
display_name = "维保合同状态变更"
description = "合同状态变化时检查到期预警"
entity = "service_contract"
on = "update"
[[trigger_events]]
name = "check_plan_updated"
display_name = "巡检计划更新"
description = "巡检计划更新时检查下次巡检日期"
entity = "check_plan"
on = "update"
# ── 编号规则 ──
[[numbering]]
entity = "service_contract"
field = "contract_number"
prefix = "SC"
format = "{PREFIX}-{YEAR}-{SEQ}"
seq_length = 4
# ── 打印模板 ──
[[templates]]
name = "service_contract_pdf"
display_name = "维保合同"
entity = "service_contract"
format = "pdf"
# ── 页面设计 ──
# 页面 0运维概览仪表盘
[[ui.pages]]
type = "dashboard"
label = "运维概览"
icon = "DashboardOutlined"
[[ui.pages.widgets]]
type = "stat_cards"
label = "运维概览"
cards = [
{ entity = "service_contract", aggregate = "count", filter = "status == 'active'", label = "活跃合同", icon = "file-text", color = "blue" },
{ entity = "ticket", aggregate = "count", filter = "status == 'open' || status == 'in_progress'", label = "待处理工单", icon = "tool", color = "orange" },
{ entity = "ticket", aggregate = "count", filter = "status == 'resolved'", label = "已解决工单", icon = "check-circle", color = "green" },
{ entity = "check_plan", aggregate = "count", filter = "status == 'active'", label = "活跃巡检", icon = "schedule", color = "blue" }
]
[[ui.pages.widgets]]
type = "action_list"
label = "紧急待办"
max_items = 5
queries = [
{ entity = "ticket", filter = "status == 'open'", sort = "priority asc", label_field = "title", subtitle_field = "type", action = "处理", icon = "warning" },
{ entity = "service_contract", filter = "status == 'active'", sort = "end_date asc", label_field = "name", subtitle_field = "end_date", action = "续约", icon = "file-text" },
{ entity = "check_plan", filter = "status == 'active'", sort = "next_check_date asc", label_field = "name", subtitle_field = "next_check_date", action = "巡检", icon = "schedule" }
]
# 页面 1合同管理 + 详情
[[ui.pages]]
type = "crud"
entity = "service_contract"
label = "合同管理"
icon = "file-text"
enable_search = true
[[ui.pages]]
type = "detail"
entity = "service_contract"
label = "合同详情"
[[ui.pages.sections]]
type = "fields"
label = "合同信息"
fields = ["name", "client_id", "service_scope", "sla_level", "sla_response_hours", "sla_resolve_hours", "status", "start_date", "end_date", "amount", "payment_terms", "notes"]
[[ui.pages.sections]]
type = "crud"
label = "工单"
entity = "ticket"
filter_field = "contract_id"
[[ui.pages.sections]]
type = "crud"
label = "巡检计划"
entity = "check_plan"
filter_field = "contract_id"
[[ui.pages.sections]]
type = "crud"
label = "巡检记录"
entity = "check_record"
filter_field = "contract_id"
# 页面 2工单中心
[[ui.pages]]
type = "tabs"
label = "工单中心"
icon = "tool"
[[ui.pages.tabs]]
label = "工单列表"
type = "crud"
entity = "ticket"
enable_search = true
[[ui.pages.tabs]]
label = "巡检计划"
type = "crud"
entity = "check_plan"
enable_search = true
[[ui.pages.tabs]]
label = "巡检记录"
type = "crud"
entity = "check_record"
enable_search = true