diff --git a/crates/erp-plugin-freelance/plugin.toml b/crates/erp-plugin-freelance/plugin.toml index 38f55d1..1f5e44e 100644 --- a/crates/erp-plugin-freelance/plugin.toml +++ b/crates/erp-plugin-freelance/plugin.toml @@ -136,11 +136,13 @@ is_public = true 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" @@ -359,6 +361,7 @@ display_name = "报价单" field_type = "decimal" display_name = "总金额" sortable = true + visible_when = "status != 'draft'" [[schema.entities.fields]] name = "notes" @@ -452,12 +455,16 @@ display_name = "合同" 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" @@ -518,6 +525,7 @@ display_name = "合同" field_type = "decimal" display_name = "已付金额" default = 0 + visible_when = "status != 'drafting'" [[schema.entities.fields]] name = "start_date" @@ -728,6 +736,7 @@ display_name = "任务" name = "actual_hours" field_type = "decimal" display_name = "实际工时" + visible_when = "status != 'todo'" [[schema.entities.fields]] name = "description" @@ -749,6 +758,8 @@ display_name = "工时记录" 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" @@ -798,12 +809,16 @@ display_name = "发票/收款" 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" @@ -861,6 +876,7 @@ display_name = "发票/收款" name = "payment_date" field_type = "date" display_name = "实际收款日期" + visible_when = "status == 'paid' || status == 'partial'" [[schema.entities.fields]] name = "notes" @@ -920,6 +936,98 @@ display_name = "支出" 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]] @@ -943,6 +1051,26 @@ 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:全局工作台 diff --git a/crates/erp-plugin-itops/plugin.toml b/crates/erp-plugin-itops/plugin.toml index 82ce0c3..cffc9f3 100644 --- a/crates/erp-plugin-itops/plugin.toml +++ b/crates/erp-plugin-itops/plugin.toml @@ -76,6 +76,7 @@ display_name = "维保合同" required = true display_name = "合同编号" unique = true + validation = { pattern = "^SC-\\d{4}-\\d{4}$", message = "格式:SC-YYYY-NNNN" } [[schema.entities.fields]] name = "name" @@ -190,6 +191,8 @@ display_name = "工单" 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" @@ -279,21 +282,25 @@ display_name = "工单" 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(巡检计划)── @@ -399,6 +406,8 @@ display_name = "巡检记录" field_type = "uuid" display_name = "维保合同" ref_entity = "service_contract" + cascade_from = "plan_id" + cascade_filter = "contract_id" [[schema.entities.fields]] name = "client_id" @@ -439,12 +448,14 @@ display_name = "巡检记录" 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" @@ -452,6 +463,70 @@ display_name = "巡检记录" 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]] @@ -461,6 +536,14 @@ prefix = "SC" format = "{PREFIX}-{YEAR}-{SEQ}" seq_length = 4 +# ── 打印模板 ── + +[[templates]] +name = "service_contract_pdf" +display_name = "维保合同" +entity = "service_contract" +format = "pdf" + # ── 页面设计 ── # 页面 1:合同管理 + 详情