-- ============================================================ -- 流程管理基础配置补齐(本地 ruoyi-vue-pro) -- 生成日期:2026-10-23 -- 内容:流程分类、流程表单、用户分组、流程监听器、流程表达式、 -- 流程定义扩展信息、业务附件配置 -- 说明:幂等脚本,重复执行不会产生重复数据 -- 备份:docs/sql/backup_bpm_config_20261023.sql -- ============================================================ START TRANSACTION; -- ------------------------------------------------------------ -- 1. 流程分类:按流程定义/模型实际使用的 category 补齐 -- ------------------------------------------------------------ INSERT INTO `bpm_category` (`name`,`code`,`description`,`status`,`sort`,`creator`,`create_time`,`updater`,`update_time`,`deleted`) SELECT t.name,t.code,t.description,0,t.sort,'1',NOW(),'1',NOW(),b'0' FROM ( SELECT '合同审批' AS name,'contract_approve' AS code,'合同审批流程' AS description,10 AS sort UNION ALL SELECT '采购审核' ,'purchase_request_approve' ,'采购申请审批',22 UNION ALL SELECT '采购订单审批' ,'purchase_order_approve' ,'ERP 采购订单审批',25 UNION ALL SELECT '销售订单审批' ,'sale_order_approve' ,'ERP 销售订单审批',26 UNION ALL SELECT '供应商准入审批' ,'supplier_apply_approve' ,'SRM 供应商准入审批',27 UNION ALL SELECT '销售报价审批' ,'sale_quotation_approve' ,'销售报价审批',30 UNION ALL SELECT '请假审批' ,'分类2' ,'请假审批',40 UNION ALL SELECT '回款审批' ,'1111' ,'CRM 回款审批',50 UNION ALL SELECT '开票审批' ,'crm_invoice_approve' ,'CRM 开票审批',51 UNION ALL SELECT '付款审批' ,'erp_finance_payment_approve' ,'ERP 付款单审批',60 UNION ALL SELECT '来票审批' ,'erp_purchase_invoice_approve' ,'ERP 采购来票审批',61 UNION ALL SELECT '产品项目审批' ,'mes_pd_project_approve' ,'产品项目最终审批',70 UNION ALL SELECT '报工审批' ,'mes_pro_feedback_audit' ,'MES 生产报工审批',71 UNION ALL SELECT '考勤异常审批' ,'hrm_attendance_approve' ,'HRM 考勤异常审批',80 UNION ALL SELECT '分类1' ,'分类1' ,'历史分类',99 ) t WHERE NOT EXISTS (SELECT 1 FROM `bpm_category` c WHERE c.code = t.code AND c.deleted = 0); -- 1.1 历史/脏分类 code 归并到规范 code(否则模型列表按名称分组会出现重复分组) UPDATE `ACT_RE_MODEL` SET `CATEGORY_`='contract_approve' WHERE `CATEGORY_` IN ('contract approve','审批标志'); UPDATE `ACT_RE_PROCDEF` SET `CATEGORY_`='contract_approve' WHERE `CATEGORY_` IN ('contract approve','审批标志'); UPDATE `bpm_process_definition_info` SET `category`='contract_approve' WHERE `category` IN ('contract approve','审批标志'); UPDATE `ACT_RE_MODEL` SET `CATEGORY_`='purchase_request_approve' WHERE `CATEGORY_` IN ('purchase_ request approve','purchase_request approve','purchase_approve','采购审核'); UPDATE `ACT_RE_PROCDEF` SET `CATEGORY_`='purchase_request_approve' WHERE `CATEGORY_` IN ('purchase_ request approve','purchase_request approve','purchase_approve','采购审核'); UPDATE `bpm_process_definition_info` SET `category`='purchase_request_approve' WHERE `category` IN ('purchase_ request approve','purchase_request approve','purchase_approve','采购审核'); -- 1.2 归并后逻辑删除重复分类 UPDATE `bpm_category` SET `deleted`=b'1', `updater`='1', `update_time`=NOW() WHERE `deleted`=0 AND `code` IN ('contract approve','审批标志','purchase_ request approve','purchase_request approve','purchase_approve','采购审核'); -- ------------------------------------------------------------ -- 2. 流程表单:恢复 SIMPLE 模型引用的表单 1/2/3 -- ------------------------------------------------------------ INSERT IGNORE INTO `bpm_form` (`id`, `name`, `status`, `conf`, `fields`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1,'合同审批表单',0,'{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}','[\"{\\\"type\\\":\\\"DeptSelect\\\",\\\"field\\\":\\\"69b19b45e6be46f0a922100fe0a2589c\\\",\\\"title\\\":\\\"部门选择器\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"props\\\":{\\\"returnType\\\":\\\"id\\\",\\\"defaultCurrentDept\\\":false},\\\"_fc_id\\\":\\\"id_Fq6ymssi7cb9ajc\\\",\\\"name\\\":\\\"ref_F6ljmssi7cb9akc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"DeptSelect\\\"}\", \"{\\\"type\\\":\\\"UserSelect\\\",\\\"field\\\":\\\"711fdcb037f440c3a51c3054e1ac2ea7\\\",\\\"title\\\":\\\"用户选择器\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"props\\\":{\\\"defaultCurrentUser\\\":false},\\\"_fc_id\\\":\\\"id_Fz0zmssi7f4salc\\\",\\\"name\\\":\\\"ref_F1xsmssi7f4samc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"UserSelect\\\"}\"]','表单备注','1','2026-08-14 13:26:09','1','2026-08-14 13:26:09',0x00),(2,'采购申请',0,'{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}','[\"{\\\"type\\\":\\\"UserSelect\\\",\\\"field\\\":\\\"82ccf29e136942d09a220f2a2a54d641\\\",\\\"title\\\":\\\"用户选择器\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"props\\\":{\\\"defaultCurrentUser\\\":false},\\\"_fc_id\\\":\\\"id_Fvf4mswjxhkzabc\\\",\\\"name\\\":\\\"ref_Fvgxmswjxhkzacc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"UserSelect\\\"}\", \"{\\\"type\\\":\\\"DeptSelect\\\",\\\"field\\\":\\\"3093d2424e284c31b963a94fa12305ee\\\",\\\"title\\\":\\\"部门选择器\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":false,\\\"props\\\":{\\\"returnType\\\":\\\"id\\\",\\\"defaultCurrentDept\\\":false},\\\"_fc_id\\\":\\\"id_Fytcmswjxj0ladc\\\",\\\"name\\\":\\\"ref_Fh9emswjxj0laec\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"DeptSelect\\\"}\"]',NULL,'1','2026-08-17 09:25:13','1','2026-08-17 09:25:13',0x00),(3,'请假',0,'{\"form\":{\"layout\":\"horizontal\",\"labelAlign\":\"right\",\"size\":\"middle\",\"colon\":false,\"labelCol\":{\"style\":{\"width\":\"125px\"}},\"wrapperCol\":{\"span\":24},\"labelWidth\":\"100px\"},\"resetBtn\":{\"show\":false,\"innerText\":\"重置\"},\"submitBtn\":{\"show\":true,\"innerText\":\"提交\"}}','[\"{\\\"type\\\":\\\"input\\\",\\\"field\\\":\\\"Fl55mt725q5yabc\\\",\\\"title\\\":\\\"申请人\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":true,\\\"_fc_id\\\":\\\"id_Fgnhmt725q5yacc\\\",\\\"name\\\":\\\"ref_F43dmt725q5yadc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"input\\\"}\", \"{\\\"type\\\":\\\"datePicker\\\",\\\"field\\\":\\\"F5eqmt725u3naec\\\",\\\"title\\\":\\\"请假时间\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":true,\\\"props\\\":{\\\"range\\\":true},\\\"_fc_id\\\":\\\"id_Fvj1mt725u3nafc\\\",\\\"name\\\":\\\"ref_Fv1umt725u3nagc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"dateRange\\\"}\", \"{\\\"type\\\":\\\"inputNumber\\\",\\\"field\\\":\\\"F8wtmt726c3zahc\\\",\\\"title\\\":\\\"天数\\\",\\\"info\\\":\\\"\\\",\\\"$required\\\":true,\\\"_fc_id\\\":\\\"id_Fekpmt726c3zaic\\\",\\\"name\\\":\\\"ref_F6wumt726c3zajc\\\",\\\"display\\\":true,\\\"hidden\\\":false,\\\"_fc_drag_tag\\\":\\\"inputNumber\\\"}\"]',NULL,'1','2026-08-18 16:18:20','1','2026-08-24 17:53:56',0x00); -- ------------------------------------------------------------ -- 3. 用户分组:按本地已存在用户初始化 -- ------------------------------------------------------------ INSERT INTO `bpm_user_group` (`name`,`description`,`status`,`user_ids`,`creator`,`create_time`,`updater`,`update_time`,`deleted`) SELECT t.name,t.description,0,t.user_ids,'1',NOW(),'1',NOW(),b'0' FROM ( SELECT '流程组' AS name,'流程管理员' AS description,'[1]' AS user_ids UNION ALL SELECT '经营组' ,'经营管理组' ,'[247]' UNION ALL SELECT '经营部' ,'经营部成员' ,'[1,247]' ) t WHERE NOT EXISTS (SELECT 1 FROM `bpm_user_group` g WHERE g.name = t.name AND g.deleted = 0); -- ------------------------------------------------------------ -- 4. 流程监听器:写入代码中现成的示例监听器 -- ------------------------------------------------------------ INSERT INTO `bpm_process_listener` (`name`,`status`,`type`,`event`,`value_type`,`value`,`creator`,`create_time`,`updater`,`update_time`,`deleted`) SELECT t.name,0,t.type,t.event,t.value_type,t.value,'1',NOW(),'1',NOW(),b'0' FROM ( SELECT '任务监听器-创建(类示例)' AS name,'task' AS type,'create' AS event,'class' AS value_type, 'cn.iocoder.yudao.module.bpm.framework.flowable.core.listener.demo.task.DemoDelegateClassTaskListener' AS value UNION ALL SELECT '任务监听器-创建(委托表达式示例)','task','create','delegateExpression','${demoDelegateExpressionTaskListener}' UNION ALL SELECT '执行监听器-开始(类示例)','execution','start','class', 'cn.iocoder.yudao.module.bpm.framework.flowable.core.listener.demo.exection.DemoDelegateClassExecutionListener' UNION ALL SELECT '执行监听器-开始(委托表达式示例)','execution','start','delegateExpression','${demoDelegateExpressionExecutionListener}' ) t WHERE NOT EXISTS (SELECT 1 FROM `bpm_process_listener` l WHERE l.name = t.name AND l.deleted = 0); -- ------------------------------------------------------------ -- 5. 流程表达式:补充常用条件示例 -- ------------------------------------------------------------ INSERT INTO `bpm_process_expression` (`name`,`status`,`expression`,`creator`,`create_time`,`updater`,`update_time`,`deleted`) SELECT t.name,0,t.expression,'1',NOW(),'1',NOW(),b'0' FROM ( SELECT '金额大于1000' AS name,'${amount > 1000}' AS expression UNION ALL SELECT '发起人为超级管理员','${initiator == "1"}' ) t WHERE NOT EXISTS (SELECT 1 FROM `bpm_process_expression` e WHERE e.name = t.name AND e.deleted = 0); -- ------------------------------------------------------------ -- 6. 流程定义扩展信息:为每个流程定义补齐 -- model_type 统一为 10(BPMN),避免 SIMPLE 模式 simple_model 为空导致 NPE -- ------------------------------------------------------------ INSERT INTO `bpm_process_definition_info` ( `process_definition_id`,`model_id`,`model_type`,`category`,`icon`,`description`,`form_type`,`form_id`, `form_conf`,`form_fields`,`form_custom_create_path`,`form_custom_view_path`,`simple_model`,`visible`,`sort`, `start_user_ids`,`start_dept_ids`,`manager_user_ids`,`allow_cancel_running_process`,`allow_withdraw_task`, `process_id_rule`,`auto_approval_type`,`title_setting`,`summary_setting`, `process_before_trigger_setting`,`process_after_trigger_setting`,`task_before_trigger_setting`,`task_after_trigger_setting`, `print_template_setting`,`creator`,`create_time`,`updater`,`update_time`,`deleted` ) SELECT p.ID_, COALESCE(m.ID_, ''), 10, p.CATEGORY_, NULL, IF(JSON_VALID(m.META_INFO_), JSON_UNQUOTE(JSON_EXTRACT(m.META_INFO_, '$.description')), NULL), 10, IF(JSON_VALID(m.META_INFO_), CAST(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(m.META_INFO_, '$.formId')), 'null') AS SIGNED), NULL), NULL,NULL,NULL,NULL,NULL, b'1', COALESCE(IF(JSON_VALID(m.META_INFO_), CAST(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(m.META_INFO_, '$.sort')), 'null') AS SIGNED), 0), 0), NULL,NULL, -- 该列由 LongListTypeHandler 读取,要求逗号分隔(不能是 JSON 数组文本 [1]) CASE WHEN JSON_VALID(m.META_INFO_) THEN NULLIF(NULLIF(REPLACE(REPLACE(REPLACE(JSON_UNQUOTE(JSON_EXTRACT(m.META_INFO_, '$.managerUserIds')), '[', ''), ']', ''), ' ', ''), 'null'), '') ELSE NULL END, b'1', b'0', NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL, '1',NOW(),'1',NOW(),b'0' FROM `ACT_RE_PROCDEF` p LEFT JOIN `ACT_RE_MODEL` m ON m.KEY_ = p.KEY_ WHERE NOT EXISTS (SELECT 1 FROM `bpm_process_definition_info` i WHERE i.process_definition_id = p.ID_); -- 6.1 修正已写入的 JSON 数组形式(该列由 LongListTypeHandler 读取,只接受逗号分隔) UPDATE `bpm_process_definition_info` SET `manager_user_ids` = TRIM(REPLACE(REPLACE(REPLACE(`manager_user_ids`, '[', ''), ']', ''), ' ', '')), `update_time` = NOW(), `updater` = '1' WHERE `manager_user_ids` LIKE '[%'; -- ------------------------------------------------------------ -- 7. 业务附件配置:补齐本地已有业务详情页的流程 -- ------------------------------------------------------------ INSERT INTO `bpm_business_attach` (`process_definition_key`,`business_type`,`component_path`,`status`,`remark`,`creator`,`create_time`,`updater`,`update_time`,`deleted`) SELECT t.process_definition_key,t.business_type,t.component_path,0,t.remark,'1',NOW(),'1',NOW(),b'0' FROM ( SELECT 'contract_approve' AS process_definition_key,'crm_contract' AS business_type, '/crm/contract/detail/approve/index.vue' AS component_path,'合同审批展示合同详情' AS remark UNION ALL SELECT 'crm-invoice-audit','crm_invoice','/crm/invoice/detail/approve/index.vue','开票审批展示开票详情' UNION ALL SELECT 'crm-receivable-audit','crm_receivable','/crm/receivable/detail/approve/index.vue','回款审批展示回款详情' UNION ALL SELECT 'erp-finance-payment-audit','erp_finance_payment','/erp/finance/payment/detail/approve/index.vue','付款审批展示付款单详情' UNION ALL SELECT 'erp-purchase-invoice-audit','erp_purchase_invoice','/erp/purchase/invoice/detail/approve/index.vue','来票审批展示来票详情' UNION ALL SELECT 'purchase_request_approve','erp_purchase_request','/erp/purchase/request/detail/index.vue','采购申请审批展示采购申请详情' ) t WHERE NOT EXISTS (SELECT 1 FROM `bpm_business_attach` a WHERE a.process_definition_key = t.process_definition_key AND a.deleted = 0); COMMIT;