# 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