# 自由职业者工作台 — plugin.toml # 汕头市智界科技有限公司 IT 服务行业插件 [metadata] id = "erp-freelance" name = "自由职业者工作台" version = "0.1.0" description = "一人 IT 服务公司的全链路业务管理:客户→商机→报价→合同→项目→工时→开票→收支" author = "ERP Platform" min_platform_version = "0.1.0" # ── 权限声明(10 实体 × 2 = 20 个权限码)── [[permissions]] code = "client.list" name = "查看客户" description = "查看客户列表和详情" [[permissions]] code = "client.manage" name = "管理客户" description = "创建、编辑、删除客户" [[permissions]] code = "opportunity.list" name = "查看商机" description = "查看商机列表和详情" [[permissions]] code = "opportunity.manage" name = "管理商机" description = "创建、编辑、删除商机" [[permissions]] code = "quote.list" name = "查看报价" description = "查看报价单列表和详情" [[permissions]] code = "quote.manage" name = "管理报价" description = "创建、编辑、删除报价单" [[permissions]] code = "quote_line.list" name = "查看报价明细" description = "查看报价明细列表" [[permissions]] code = "quote_line.manage" name = "管理报价明细" description = "创建、编辑、删除报价明细" [[permissions]] code = "contract.list" name = "查看合同" description = "查看合同列表和详情" [[permissions]] code = "contract.manage" name = "管理合同" description = "创建、编辑、删除合同" [[permissions]] code = "project.list" name = "查看项目" description = "查看项目列表和详情" [[permissions]] code = "project.manage" name = "管理项目" description = "创建、编辑、删除项目" [[permissions]] code = "task.list" name = "查看任务" description = "查看任务列表和详情" [[permissions]] code = "task.manage" name = "管理任务" description = "创建、编辑、删除任务" [[permissions]] code = "time_entry.list" name = "查看工时" description = "查看工时记录列表" [[permissions]] code = "time_entry.manage" name = "管理工时" description = "创建、编辑、删除工时记录" [[permissions]] code = "invoice.list" name = "查看发票" description = "查看发票/收款列表和详情" [[permissions]] code = "invoice.manage" name = "管理发票" description = "创建、编辑、删除发票/收款记录" [[permissions]] code = "expense.list" name = "查看支出" description = "查看支出列表和详情" [[permissions]] code = "expense.manage" name = "管理支出" description = "创建、编辑、删除支出记录" # ── 实体定义 ── # ── 2.3.1 client(客户)── [[schema.entities]] name = "client" display_name = "客户" is_public = true [[schema.entities.fields]] name = "name" field_type = "string" required = true display_name = "客户名称" searchable = true [[schema.entities.fields]] name = "contact_name" field_type = "string" display_name = "联系人" [[schema.entities.fields]] name = "phone" field_type = "string" display_name = "电话" [[schema.entities.fields]] name = "email" field_type = "string" display_name = "邮箱" [[schema.entities.fields]] name = "industry" field_type = "string" display_name = "行业" ui_widget = "select" filterable = true options = [ { label = "制造业", value = "manufacturing" }, { label = "零售", value = "retail" }, { label = "教育", value = "education" }, { label = "医疗", value = "healthcare" }, { label = "政府", value = "government" }, { label = "金融", value = "finance" }, { label = "其他", value = "other" } ] [[schema.entities.fields]] name = "source" field_type = "string" display_name = "来源" ui_widget = "select" options = [ { label = "转介绍", value = "referral" }, { label = "线上", value = "online" }, { label = "展会", value = "exhibition" }, { label = "老客户", value = "repeat" }, { label = "主动开发", value = "outreach" } ] [[schema.entities.fields]] name = "level" field_type = "string" display_name = "重要等级" ui_widget = "select" filterable = true options = [ { label = "A", value = "a" }, { label = "B", value = "b" }, { label = "C", value = "c" } ] [[schema.entities.fields]] name = "status" field_type = "string" required = true display_name = "状态" ui_widget = "select" filterable = true default = "potential" options = [ { label = "潜在", value = "potential" }, { label = "活跃", value = "active" }, { label = "休眠", value = "dormant" }, { label = "流失", value = "lost" } ] [[schema.entities.fields]] name = "address" field_type = "string" display_name = "地址" [[schema.entities.fields]] name = "notes" field_type = "string" display_name = "备注" ui_widget = "textarea" # ── 2.3.2 opportunity(商机)── [[schema.entities]] name = "opportunity" display_name = "商机" [[schema.entities.fields]] name = "client_id" field_type = "uuid" required = true display_name = "客户" ui_widget = "entity_select" ref_entity = "client" ref_label_field = "name" ref_search_fields = ["name"] [[schema.entities.fields]] name = "title" field_type = "string" required = true display_name = "商机名称" searchable = true [[schema.entities.fields]] name = "business_type" field_type = "string" required = true display_name = "业务类型" ui_widget = "select" filterable = true options = [ { label = "软件开发", value = "software_development" }, { label = "AI 开发", value = "ai_development" }, { label = "系统集成", value = "system_integration" }, { label = "软件外包", value = "software_outsourcing" }, { label = "IT 咨询", value = "it_consulting" }, { label = "数字内容", value = "digital_content" }, { label = "营销策划", value = "marketing_planning" } ] [[schema.entities.fields]] name = "stage" field_type = "string" required = true display_name = "阶段" ui_widget = "select" filterable = true default = "visit" options = [ { label = "初访", value = "visit" }, { label = "需求确认", value = "requirement" }, { label = "报价", value = "quote" }, { label = "谈判", value = "negotiation" }, { label = "成交", value = "won" }, { label = "失败", value = "lost" } ] [[schema.entities.fields]] name = "estimated_amount" field_type = "decimal" display_name = "预估金额" sortable = true [[schema.entities.fields]] name = "probability" field_type = "integer" display_name = "成交概率(%)" [[schema.entities.fields]] name = "expected_close_date" field_type = "date" display_name = "预计成交日期" [[schema.entities.fields]] name = "next_follow_up" field_type = "date" display_name = "下次跟进日期" [[schema.entities.fields]] name = "description" field_type = "string" display_name = "需求描述" ui_widget = "textarea" # ── 2.3.3 quote(报价单)── [[schema.entities]] name = "quote" display_name = "报价单" [[schema.entities.fields]] name = "client_id" field_type = "uuid" required = true display_name = "客户" ui_widget = "entity_select" ref_entity = "client" ref_label_field = "name" ref_search_fields = ["name"] [[schema.entities.fields]] name = "opportunity_id" field_type = "uuid" display_name = "关联商机" ref_entity = "opportunity" [[schema.entities.fields]] name = "quote_number" field_type = "string" required = true display_name = "报价单号" unique = true [[schema.entities.fields]] name = "status" field_type = "string" required = true display_name = "状态" ui_widget = "select" filterable = true default = "draft" options = [ { label = "草稿", value = "draft" }, { label = "已发送", value = "sent" }, { label = "已接受", value = "accepted" }, { label = "已拒绝", value = "rejected" }, { label = "已过期", value = "expired" } ] [[schema.entities.fields]] name = "valid_until" field_type = "date" display_name = "有效期至" [[schema.entities.fields]] name = "subtotal" field_type = "decimal" display_name = "小计" sortable = true [[schema.entities.fields]] name = "tax_rate" field_type = "decimal" display_name = "税率(%)" [[schema.entities.fields]] name = "total_amount" field_type = "decimal" display_name = "总金额" sortable = true [[schema.entities.fields]] name = "notes" field_type = "string" display_name = "备注" ui_widget = "textarea" [[schema.entities.relations]] entity = "quote_line" foreign_key = "quote_id" on_delete = "cascade" name = "lines" type = "one_to_many" display_field = "item_name" # ── 2.3.4 quote_line(报价明细行)── [[schema.entities]] name = "quote_line" display_name = "报价明细" [[schema.entities.fields]] name = "quote_id" field_type = "uuid" required = true display_name = "报价单" ref_entity = "quote" [[schema.entities.fields]] name = "item_name" field_type = "string" required = true display_name = "项目名称" [[schema.entities.fields]] name = "description" field_type = "string" display_name = "描述" [[schema.entities.fields]] name = "quantity" field_type = "decimal" required = true display_name = "数量" default = 1 [[schema.entities.fields]] name = "unit_price" field_type = "decimal" required = true display_name = "单价" [[schema.entities.fields]] name = "unit" field_type = "string" display_name = "单位" ui_widget = "select" default = "project" options = [ { label = "项目", value = "project" }, { label = "人月", value = "person_month" }, { label = "人天", value = "person_day" }, { label = "小时", value = "hour" }, { label = "个", value = "piece" }, { label = "套", value = "set" } ] [[schema.entities.fields]] name = "amount" field_type = "decimal" display_name = "金额" # ── 2.3.5 contract(合同)── [[schema.entities]] name = "contract" display_name = "合同" [[schema.entities.fields]] name = "client_id" field_type = "uuid" required = true display_name = "客户" ui_widget = "entity_select" ref_entity = "client" ref_label_field = "name" ref_search_fields = ["name"] [[schema.entities.fields]] name = "opportunity_id" field_type = "uuid" display_name = "关联商机" ref_entity = "opportunity" [[schema.entities.fields]] name = "quote_id" field_type = "uuid" display_name = "关联报价" ref_entity = "quote" [[schema.entities.fields]] name = "contract_number" field_type = "string" required = true display_name = "合同编号" unique = true [[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 options = [ { label = "开发合同", value = "development" }, { label = "集成合同", value = "integration" }, { label = "外包合同", value = "outsourcing" }, { label = "咨询合同", value = "consulting" }, { label = "维保合同", value = "maintenance" }, { label = "销售合同", value = "sales" }, { label = "其他", value = "other" } ] [[schema.entities.fields]] name = "status" field_type = "string" required = true display_name = "状态" ui_widget = "select" filterable = true default = "drafting" options = [ { label = "草拟中", value = "drafting" }, { label = "待签署", value = "pending_signature" }, { label = "执行中", value = "active" }, { label = "已完成", value = "completed" }, { label = "已终止", value = "terminated" } ] [[schema.entities.fields]] name = "amount" field_type = "decimal" required = true display_name = "合同金额" sortable = true [[schema.entities.fields]] name = "paid_amount" field_type = "decimal" display_name = "已付金额" default = 0 [[schema.entities.fields]] name = "start_date" field_type = "date" display_name = "开始日期" [[schema.entities.fields]] name = "end_date" field_type = "date" display_name = "结束日期" [[schema.entities.fields]] name = "payment_terms" field_type = "string" display_name = "付款条款" [[schema.entities.fields]] name = "notes" field_type = "string" display_name = "备注" ui_widget = "textarea" # ── 2.3.6 project(项目)── [[schema.entities]] name = "project" display_name = "项目" [[schema.entities.fields]] name = "client_id" field_type = "uuid" required = true display_name = "客户" ui_widget = "entity_select" ref_entity = "client" ref_label_field = "name" ref_search_fields = ["name"] [[schema.entities.fields]] name = "contract_id" field_type = "uuid" display_name = "关联合同" ref_entity = "contract" [[schema.entities.fields]] name = "opportunity_id" field_type = "uuid" display_name = "关联商机" ref_entity = "opportunity" [[schema.entities.fields]] name = "name" field_type = "string" required = true display_name = "项目名称" searchable = true [[schema.entities.fields]] name = "business_type" field_type = "string" display_name = "业务类型" ui_widget = "select" filterable = true options = [ { label = "软件开发", value = "software_development" }, { label = "AI 开发", value = "ai_development" }, { label = "系统集成", value = "system_integration" }, { label = "软件外包", value = "software_outsourcing" }, { label = "IT 咨询", value = "it_consulting" }, { label = "数字内容", value = "digital_content" }, { label = "营销策划", value = "marketing_planning" } ] [[schema.entities.fields]] name = "deliverable_type" field_type = "string" display_name = "交付物类型" ui_widget = "select" options = [ { label = "软件", value = "software" }, { label = "网站", value = "website" }, { label = "小程序", value = "miniprogram" }, { label = "视频", value = "video" }, { label = "设计稿", value = "design" }, { label = "文档", value = "document" }, { label = "咨询报告", value = "consulting_report" } ] [[schema.entities.fields]] name = "status" field_type = "string" required = true display_name = "状态" ui_widget = "select" filterable = true default = "pending" options = [ { label = "待开始", value = "pending" }, { label = "进行中", value = "in_progress" }, { label = "已交付", value = "delivered" }, { label = "验收中", value = "accepting" }, { label = "已完成", value = "completed" }, { label = "已搁置", value = "shelved" } ] [[schema.entities.fields]] name = "start_date" field_type = "date" display_name = "开始日期" [[schema.entities.fields]] name = "end_date" field_type = "date" display_name = "截止日期" [[schema.entities.fields]] name = "contract_amount" field_type = "decimal" display_name = "合同金额" sortable = true [[schema.entities.fields]] name = "description" field_type = "string" display_name = "项目说明" ui_widget = "textarea" [[schema.entities.relations]] entity = "task" foreign_key = "project_id" on_delete = "cascade" name = "tasks" type = "one_to_many" display_field = "title" [[schema.entities.relations]] entity = "time_entry" foreign_key = "project_id" on_delete = "cascade" name = "time_entries" type = "one_to_many" display_field = "description" # ── 2.3.7 task(任务)── [[schema.entities]] name = "task" display_name = "任务" [[schema.entities.fields]] name = "project_id" field_type = "uuid" required = true display_name = "所属项目" ui_widget = "entity_select" ref_entity = "project" ref_label_field = "name" ref_search_fields = ["name"] [[schema.entities.fields]] name = "title" field_type = "string" required = true display_name = "任务标题" searchable = true [[schema.entities.fields]] name = "status" field_type = "string" required = true display_name = "状态" ui_widget = "select" filterable = true default = "todo" options = [ { label = "待办", value = "todo" }, { label = "进行中", value = "in_progress" }, { label = "已完成", value = "done" }, { label = "已取消", value = "cancelled" } ] [[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 = "due_date" field_type = "date" display_name = "截止日期" [[schema.entities.fields]] name = "estimated_hours" field_type = "decimal" display_name = "预估工时" [[schema.entities.fields]] name = "actual_hours" field_type = "decimal" display_name = "实际工时" [[schema.entities.fields]] name = "description" field_type = "string" display_name = "详细说明" ui_widget = "textarea" # ── 2.3.8 time_entry(工时记录)── [[schema.entities]] name = "time_entry" display_name = "工时记录" [[schema.entities.fields]] name = "task_id" field_type = "uuid" display_name = "关联任务" ui_widget = "entity_select" ref_entity = "task" ref_label_field = "title" ref_search_fields = ["title"] [[schema.entities.fields]] name = "project_id" field_type = "uuid" required = true display_name = "关联项目" ui_widget = "entity_select" ref_entity = "project" ref_label_field = "name" ref_search_fields = ["name"] [[schema.entities.fields]] name = "date" field_type = "date" required = true display_name = "日期" [[schema.entities.fields]] name = "hours" field_type = "decimal" required = true display_name = "时长(小时)" [[schema.entities.fields]] name = "description" field_type = "string" display_name = "工作内容" # ── 2.3.9 invoice(发票/收款)── [[schema.entities]] name = "invoice" display_name = "发票/收款" [[schema.entities.fields]] name = "client_id" field_type = "uuid" required = true display_name = "客户" ui_widget = "entity_select" ref_entity = "client" ref_label_field = "name" ref_search_fields = ["name"] [[schema.entities.fields]] name = "project_id" field_type = "uuid" display_name = "关联项目" ref_entity = "project" [[schema.entities.fields]] name = "contract_id" field_type = "uuid" display_name = "关联合同" ref_entity = "contract" [[schema.entities.fields]] name = "invoice_number" field_type = "string" required = true display_name = "发票号" unique = true [[schema.entities.fields]] name = "type" field_type = "string" required = true display_name = "类型" ui_widget = "select" filterable = true options = [ { label = "开票", value = "invoice" }, { label = "收款记录", value = "payment" } ] [[schema.entities.fields]] name = "amount" field_type = "decimal" required = true display_name = "金额" sortable = true [[schema.entities.fields]] name = "status" field_type = "string" required = true display_name = "状态" ui_widget = "select" filterable = true default = "pending" options = [ { label = "待开票", value = "pending" }, { label = "已开票", value = "issued" }, { label = "部分收款", value = "partial" }, { label = "已收款", value = "paid" }, { label = "已逾期", value = "overdue" } ] [[schema.entities.fields]] name = "issue_date" field_type = "date" display_name = "开票日期" [[schema.entities.fields]] name = "due_date" field_type = "date" display_name = "到期日" [[schema.entities.fields]] name = "payment_date" field_type = "date" display_name = "实际收款日期" [[schema.entities.fields]] name = "notes" field_type = "string" display_name = "备注" ui_widget = "textarea" # ── 2.3.10 expense(支出)── [[schema.entities]] name = "expense" display_name = "支出" [[schema.entities.fields]] name = "project_id" field_type = "uuid" display_name = "关联项目" ref_entity = "project" [[schema.entities.fields]] name = "category" field_type = "string" required = true display_name = "类别" ui_widget = "select" filterable = true options = [ { label = "硬件", value = "hardware" }, { label = "软件订阅", value = "software" }, { label = "云服务", value = "cloud" }, { label = "差旅", value = "travel" }, { label = "餐饮", value = "meal" }, { label = "办公用品", value = "office" }, { label = "其他", value = "other" } ] [[schema.entities.fields]] name = "amount" field_type = "decimal" required = true display_name = "金额" sortable = true [[schema.entities.fields]] name = "date" field_type = "date" required = true display_name = "日期" [[schema.entities.fields]] name = "vendor" field_type = "string" display_name = "供应商" [[schema.entities.fields]] name = "description" field_type = "string" display_name = "描述" # ── 编号规则 ── [[numbering]] entity = "quote" field = "quote_number" prefix = "QT" format = "{PREFIX}-{YEAR}-{SEQ}" seq_length = 4 [[numbering]] entity = "contract" field = "contract_number" prefix = "CT" format = "{PREFIX}-{YEAR}-{SEQ}" seq_length = 4 [[numbering]] entity = "invoice" field = "invoice_number" prefix = "INV" format = "{PREFIX}-{YEAR}-{SEQ}" seq_length = 4 # ── 页面设计 ── # 页面 1:全局工作台 [[ui.pages]] type = "dashboard" label = "工作台" icon = "DashboardOutlined" # 页面 2:客户管理(列表 + 详情 + 商机看板) [[ui.pages]] type = "tabs" label = "客户管理" icon = "team" [[ui.pages.tabs]] label = "客户列表" type = "crud" entity = "client" enable_search = true [[ui.pages]] type = "detail" entity = "client" label = "客户详情" [[ui.pages.sections]] type = "fields" label = "基本信息" fields = ["name", "contact_name", "phone", "email", "industry", "source", "level", "status", "address", "notes"] [[ui.pages.sections]] type = "crud" label = "商机" entity = "opportunity" filter_field = "client_id" [[ui.pages.sections]] type = "crud" label = "报价/合同" entity = "quote" filter_field = "client_id" [[ui.pages.sections]] type = "crud" label = "项目" entity = "project" filter_field = "client_id" [[ui.pages.sections]] type = "crud" label = "发票" entity = "invoice" filter_field = "client_id" # 商机看板 [[ui.pages]] type = "kanban" entity = "opportunity" label = "商机看板" icon = "swap" lane_field = "stage" lane_order = ["visit", "requirement", "quote", "negotiation", "won", "lost"] card_title_field = "title" card_subtitle_field = "estimated_amount" card_fields = ["business_type", "probability"] enable_drag = true # 页面 3:项目管理 + 详情 [[ui.pages]] type = "crud" entity = "project" label = "项目管理" icon = "project" enable_search = true [[ui.pages]] type = "detail" entity = "project" label = "项目详情" [[ui.pages.sections]] type = "fields" label = "项目信息" fields = ["name", "client_id", "contract_id", "business_type", "deliverable_type", "status", "start_date", "end_date", "contract_amount", "description"] [[ui.pages.sections]] type = "crud" label = "任务" entity = "task" filter_field = "project_id" [[ui.pages.sections]] type = "crud" label = "工时记录" entity = "time_entry" filter_field = "project_id" [[ui.pages.sections]] type = "crud" label = "发票" entity = "invoice" filter_field = "project_id" # 页面 4:财务中心 [[ui.pages]] type = "tabs" label = "财务中心" icon = "account-book" [[ui.pages.tabs]] label = "报价管理" type = "crud" entity = "quote" enable_search = true [[ui.pages.tabs]] label = "合同管理" type = "crud" entity = "contract" enable_search = true [[ui.pages.tabs]] label = "发票/收款" type = "crud" entity = "invoice" enable_search = true # 页面 5:支出管理 [[ui.pages]] type = "crud" entity = "expense" label = "支出管理" icon = "pay-circle" enable_search = true