1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
| -- ============================================================
| -- 流程管理基础配置补齐(本地 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;
|
|