feat(freelance,itops): P1-P4 智能业务引擎 + PDF 模板
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:
@@ -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:全局工作台
|
||||
|
||||
@@ -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:合同管理 + 详情
|
||||
|
||||
Reference in New Issue
Block a user