feat(freelance,itops): P1-P4 智能业务引擎 + PDF 模板
Some checks failed
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
CI / security-audit (push) Has been cancelled

freelance (P1+P3):
- settings: 7 配置项 (公司/财务/提醒)
- trigger_events: 5 个触发事件 (商机/合同/发票/任务/支出)
- cascade: 5 处级联过滤 (合同→商机/报价, 发票→项目/合同, 工时→任务)
- visible_when: 4 处条件显示 (收款日期/已付金额/实际工时/总金额)
- validation: 2 处校验 (手机号/邮箱)
- templates: 3 个 PDF 模板 (报价单/发票/合同)

itops (P2+P4):
- settings: 4 配置项 (SLA/提醒)
- trigger_events: 4 个触发事件 (工单/合同/巡检)
- cascade: 2 处级联过滤 (工单→合同, 巡检记录→合同)
- visible_when: 6 处条件显示 (解决方案/响应时间/解决时间/关闭时间/问题/措施)
- validation: 1 处校验 (合同编号格式)
- templates: 1 个 PDF 模板 (维保合同)
This commit is contained in:
iven
2026-04-20 09:15:57 +08:00
parent 7e063a7e88
commit 301178067c
2 changed files with 211 additions and 0 deletions

View File

@@ -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全局工作台

View File

@@ -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合同管理 + 详情