8 天以前 8c3f0c9edd90caa76d1e615b5cae98f7e74f412f
docs(sql): 添加BPM审核流程修复和部署脚本

- 创建修复脚本解决流程定义引擎版本空串问题
- 修复流程模型元信息缺失导致的页面异常
- 统一处理测试和废弃流程的挂起状态
- 实现业务规范流程多版本治理机制
- 补齐缺失的流程分类数据
- 开发存储过程实现模板化流程部署
- 部署各类业务单据审批流程定义
- 确保流程定义信息完整性和一致性
已添加2个文件
312 ■■■■■ 文件已修改
docs/sql/bpm_audit_flow_01_repair_and_category.sql 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/sql/bpm_audit_flow_02_deploy_proc.sql 202 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/sql/bpm_audit_flow_01_repair_and_category.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,110 @@
-- =============================================================================
-- æ–‡ä»¶ï¼šbpm_audit_flow_01_repair_and_category.sql
-- ç”¨é€”:BPM å®¡æ ¸æµç¨‹ã€Œä¿®å¤ + åˆ†ç±»è¡¥é½ã€æ®µï¼ˆç¬¬ 1 ä¸ªæ‰§è¡Œï¼‰
-- ç›®æ ‡åº“:ruoyi-vue-pro(后端 48080 å®žé™…读取的运行库)
-- è¦æ±‚:MySQL 8.0+;建议先备份:mysqldump ruoyi-vue-pro act_re_procdef act_re_model
--       act_re_deployment act_ge_bytearray bpm_category bpm_process_definition_info > bpm_bak.sql
-- ç‰¹æ€§ï¼šæœ¬æ–‡ä»¶å†…所有语句均幂等(可重复执行);判断"已存在/数据不完整"后只做必要修复,
--       ä¸åˆ é™¤ä»»ä½•既有数据,只做状态修正。
-- è¯´æ˜Žï¼š
--   1) ä¿®å¤æ®µåªåšå®‰å…¨ä¿®å¤ï¼Œä¸è‡ªåŠ¨åˆ é™¤"测试/垃圾流程"(涉及历史数据判断,需人工)。
--      å¯¹æ˜Žæ˜¾åžƒåœ¾æµç¨‹ç»Ÿä¸€"挂起",避免出现在前端发起列表,且不影响运行中的流程实例。
--   2) åˆ†ç±»è¡¥é½ï¼šåªä¸ºä»£ç ä¸­å·²å¼•用、但库里缺失的分类 code è¡¥æ’(已存在则跳过)。
-- =============================================================================
SET NAMES utf8mb4;
-- -----------------------------------------------------------------------------
-- â‘  æ•°æ®å®Œæ•´æ€§ä¿®å¤
-- -----------------------------------------------------------------------------
-- 1.1 ACT_RE_PROCDEF.ENGINE_VERSION_ ç©ºä¸²ä¼šå¯¼è‡´ Flowable æäº¤å®¡æ‰¹æŠ¥é”™
--     ï¼ˆInvalid 'engine' for process definition ...),需修正为 NULL。
UPDATE ACT_RE_PROCDEF
   SET ENGINE_VERSION_ = NULL
 WHERE ENGINE_VERSION_ = '';
-- 1.2 ACT_RE_MODEL.META_INFO_ ä¸ºç©ºä¼šå¯¼è‡´æµç¨‹æ¨¡åž‹åˆ—表/页面反序列化异常。
--     è¡¥é½ä¸€ä¸ªæœ€å°çš„合法 JSON(type=10 BPMN æ¨¡å¼ï¼Œå« sort),保证页面可打开。
--     åªè¡¥ç©ºå€¼è¡Œï¼Œä¸å½±å“å·²æœ‰å®Œæ•´é…ç½®ã€‚
UPDATE ACT_RE_MODEL
   SET META_INFO_ = CONCAT('{"type":10,"sort":', UNIX_TIMESTAMP(NOW(3)) * 1000, ',"formType":10,"visible":true}')
 WHERE META_INFO_ IS NULL OR META_INFO_ = '';
-- 1.3 bpm_process_definition_info.model_type éž 10 çš„ BPMN æµç¨‹ï¼Œåˆ›å»ºæµç¨‹å®žä¾‹ä¼š NPE。
--     ä»…当该流程确为 BPMN(在 ACT_RE_PROCDEF å­˜åœ¨ï¼‰ä¸”非 SIMPLE(simple_model ä¸ºç©ºï¼‰æ—¶ä¿®æ­£ä¸º 10。
UPDATE bpm_process_definition_info i
  JOIN ACT_RE_PROCDEF p ON p.ID_ = i.process_definition_id
   SET i.model_type = 10
 WHERE i.simple_model IS NULL
   AND i.model_type <> 10;
-- 1.4 ä¸šåŠ¡è§„èŒƒæµç¨‹çš„å¤šç‰ˆæœ¬æ²»ç†ï¼šåŒ key ä¿ç•™æœ€æ–°ç‰ˆæœ¬æ¿€æ´»ï¼ˆSUSPENSION_STATE_=1),
--     åŽ†å²ç‰ˆæœ¬ä¸€å¾‹æŒ‚èµ·ï¼ˆ=2)。只作用于"在用"白名单 key,其余不动。
UPDATE ACT_RE_PROCDEF p
  JOIN (SELECT KEY_, MAX(VERSION_) AS max_ver
          FROM ACT_RE_PROCDEF
         WHERE KEY_ IN ('erp-finance-payment-audit','crm-invoice-audit',
                        'crm-receivable-audit','mes-pd-project-audit',
                        'purchase_request_approve')
         GROUP BY KEY_) t ON t.KEY_ = p.KEY_
   SET p.SUSPENSION_STATE_ = IF(p.VERSION_ = t.max_ver, 1, 2);
-- 1.5 æ˜Žæ˜¾ä¸º"测试/已废弃"的流程统一挂起(=2),避免出现在发起/待办选择列表。
--     ä»…改状态不删除,可随时人工在界面或 SQL æ¸…理;对运行中实例无影响。
UPDATE ACT_RE_PROCDEF
   SET SUSPENSION_STATE_ = 2
 WHERE KEY_ IN ('Ada','QWEDD','SSQ','_..123abc','b000_abc.','yz001','yz002',
                'caigoushenpi','pus','purchase_approve','contract_approve');
-- 1.6 ï¼ˆå¯é€‰ï¼‰æŸ¥çœ‹ä»å¤„于激活状态的流程,人工确认是否残留垃圾流程:
-- SELECT KEY_, NAME_, VERSION_, SUSPENSION_STATE_ FROM ACT_RE_PROCDEF
--  WHERE SUSPENSION_STATE_ = 1 ORDER BY KEY_;
-- -----------------------------------------------------------------------------
-- â‘¡ æµç¨‹åˆ†ç±»ï¼ˆbpm_category)补齐
--    å¯¹åº”各业务单据发起审批时按 code æ‹‰å–可发起流程列表;代码中已引用但库中缺失则补。
--    æ¯æ¡å‡åš"已存在则跳过"判断(code + æœªåˆ é™¤ï¼‰ã€‚
-- -----------------------------------------------------------------------------
-- 2.1 ERP é‡‡è´­è®¢å•审批
INSERT INTO bpm_category (name, code, description, status, sort, creator, create_time, updater, update_time, deleted)
SELECT '采购订单审批', 'purchase_order_approve', 'ERP é‡‡è´­è®¢å•审批', 0, 10, '1', NOW(), '1', NOW(), 0
 WHERE NOT EXISTS (SELECT 1 FROM bpm_category WHERE code = 'purchase_order_approve' AND deleted = 0);
-- 2.2 ERP é”€å”®è®¢å•审批
INSERT INTO bpm_category (name, code, description, status, sort, creator, create_time, updater, update_time, deleted)
SELECT '销售订单审批', 'sale_order_approve', 'ERP é”€å”®è®¢å•审批', 0, 20, '1', NOW(), '1', NOW(), 0
 WHERE NOT EXISTS (SELECT 1 FROM bpm_category WHERE code = 'sale_order_approve' AND deleted = 0);
-- 2.3 HRM è¯·å‡å®¡æ‰¹
INSERT INTO bpm_category (name, code, description, status, sort, creator, create_time, updater, update_time, deleted)
SELECT '请假审批', 'hrm_leave_approve', 'HRM è¯·å‡ç”³è¯·å®¡æ‰¹', 0, 30, '1', NOW(), '1', NOW(), 0
 WHERE NOT EXISTS (SELECT 1 FROM bpm_category WHERE code = 'hrm_leave_approve' AND deleted = 0);
-- 2.4 HRM åŠ ç­å®¡æ‰¹
INSERT INTO bpm_category (name, code, description, status, sort, creator, create_time, updater, update_time, deleted)
SELECT '加班审批', 'overtime_approve', 'HRM åŠ ç­ç”³è¯·å®¡æ‰¹', 0, 40, '1', NOW(), '1', NOW(), 0
 WHERE NOT EXISTS (SELECT 1 FROM bpm_category WHERE code = 'overtime_approve' AND deleted = 0);
-- 2.5 HRM ç¦»èŒå®¡æ‰¹
INSERT INTO bpm_category (name, code, description, status, sort, creator, create_time, updater, update_time, deleted)
SELECT '离职审批', 'hrm_resignation_approve', 'HRM ç¦»èŒç”³è¯·å®¡æ‰¹', 0, 50, '1', NOW(), '1', NOW(), 0
 WHERE NOT EXISTS (SELECT 1 FROM bpm_category WHERE code = 'hrm_resignation_approve' AND deleted = 0);
-- 2.6 HRM è°ƒåŠ¨å®¡æ‰¹
INSERT INTO bpm_category (name, code, description, status, sort, creator, create_time, updater, update_time, deleted)
SELECT '调动审批', 'hrm_transfer_approve', 'HRM è°ƒåŠ¨ç”³è¯·å®¡æ‰¹', 0, 60, '1', NOW(), '1', NOW(), 0
 WHERE NOT EXISTS (SELECT 1 FROM bpm_category WHERE code = 'hrm_transfer_approve' AND deleted = 0);
-- 2.7 MES æŠ¥å·¥/生产工单审批(代码侧 MES æŠ¥å·¥ä¸Žå·¥å•共用分类 mes_pro_feedback_audit)
INSERT INTO bpm_category (name, code, description, status, sort, creator, create_time, updater, update_time, deleted)
SELECT '报工审批', 'mes_pro_feedback_audit', 'MES ç”Ÿäº§æŠ¥å·¥/工单审批', 0, 70, '1', NOW(), '1', NOW(), 0
 WHERE NOT EXISTS (SELECT 1 FROM bpm_category WHERE code = 'mes_pro_feedback_audit' AND deleted = 0);
-- -----------------------------------------------------------------------------
-- â‘¢ ä¿®å¤ç»“果自查(应全部返回 0)
-- -----------------------------------------------------------------------------
-- SELECT '空串ENGINE_VERSION_残留' AS chk, COUNT(*) FROM ACT_RE_PROCDEF WHERE ENGINE_VERSION_ = ''
-- UNION ALL SELECT '空META_INFO_残留' , COUNT(*) FROM ACT_RE_MODEL WHERE META_INFO_ IS NULL OR META_INFO_ = ''
-- UNION ALL SELECT '分类待补' , 0;
docs/sql/bpm_audit_flow_02_deploy_proc.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,202 @@
-- =============================================================================
-- æ–‡ä»¶ï¼šbpm_audit_flow_02_deploy_proc.sql
-- ç”¨é€”:BPM å®¡æ ¸æµç¨‹ã€Œæµç¨‹å®šä¹‰éƒ¨ç½²ã€æ®µï¼ˆç¬¬ 2 ä¸ªæ‰§è¡Œï¼Œéœ€å…ˆæ‰§è¡Œ 01 ä¿®å¤/分类文件)
-- ç›®æ ‡åº“:ruoyi-vue-pro
-- è¦æ±‚:
--   * MySQL 8.0+,账号需具备 CREATE PROCEDURE æƒé™
--   * ä»¥ mysql CLI æ‰§è¡Œï¼ˆå« DELIMITER):
--        mysql -u<账号> -p ruoyi-vue-pro < bpm_audit_flow_02_deploy_proc.sql
--   * æ¨¡æ¿ï¼šé»˜è®¤ä»Ž ruoyi-vue-pro å†…已有规范流程「erp-finance-payment-audit」复制,
--           å…¶ BPMN ä¸ºâ€œå‘起人节点 + æäº¤å³é€šè¿‡â€(candidateStrategy=36) çš„æœ€ç®€ç»“构,
--           é€‚合所有对接单据先跑通;后续如需多级审批可在「流程模型」界面调整。
-- å¥å£®æ€§è®¾è®¡ï¼š
--   * å¹‚等:目标 key è‹¥å·²å­˜åœ¨ï¼ˆæ— è®ºæ¿€æ´»/挂起)→ æ•´æ®µè·³è¿‡ï¼Œä¸é‡å¤éƒ¨ç½²ã€ä¸äº§ç”Ÿæ–°ç‰ˆæœ¬ã€‚
--   * äº‹åŠ¡ï¼šå•æµç¨‹ 5 å¼ è¡¨å†™å…¥åŒ…在一个事务内,任一步失败自动回滚,不留半成品。
--   * è‡ªæ£€ï¼šprocdef ID = key:1:<32位uuid>,超 64 å­—符直接报错中断。
--   * ç©ºå€¼è§„避:ENGINE_VERSION_ ä¸å†™å…¥ç©ºä¸²(保持 NULL),避免 Flowable æäº¤å®¡æ‰¹æŠ¥é”™ï¼›
--              META_INFO_ å†™å…¥æœ€å°åˆæ³• JSON(含 sort/type=10),避免模型页/列表 NPE。
--   * é‡å¤æ‰§è¡Œæ–‡ä»¶å®‰å…¨ï¼šDROP PROCEDURE IF EXISTS ä¿è¯å¯é‡å¤è¿è¡Œã€‚
-- =============================================================================
SET NAMES utf8mb4;
-- éƒ¨ç½²å‰è‡ªæ£€ï¼šæ¨¡æ¿å­˜åœ¨æ€§ï¼ˆåº”返回 1 è¡Œï¼‰
SELECT KEY_, NAME_, SUSPENSION_STATE_ FROM ACT_RE_PROCDEF WHERE KEY_ = 'erp-finance-payment-audit';
DROP PROCEDURE IF EXISTS bpm_deploy_flow_from_template;
DELIMITER $$
-- ä»Žä¸€ä¸ªâ€œæ¨¡æ¿æµç¨‹â€å¤åˆ¶éƒ¨ç½²ä¸€ä¸ªæ–°å®¡æ ¸æµç¨‹ï¼ˆBPMN ç»“构一致,仅替换 key/名称)
CREATE PROCEDURE bpm_deploy_flow_from_template(
    IN p_key        VARCHAR(64),   -- æ–°æµç¨‹ key(需与代码侧监听器匹配)
    IN p_name       VARCHAR(128),  -- æ–°æµç¨‹æ˜¾ç¤ºå
    IN p_category   VARCHAR(64),   -- å½’属流程分类 code
    IN p_template   VARCHAR(64)    -- å¤åˆ¶æ¥æºæ¨¡æ¿æµç¨‹ key
)
label_deploy: BEGIN
    DECLARE v_exist      INT DEFAULT 0;
    DECLARE v_tpl_key    VARCHAR(64) DEFAULT 'erp-finance-payment-audit';
    DECLARE v_tpl_dep    VARCHAR(64) DEFAULT NULL;
    DECLARE v_tpl_name   VARCHAR(255) DEFAULT NULL;
    DECLARE v_dep        VARCHAR(64);
    DECLARE v_model_id   VARCHAR(64);
    DECLARE v_byte_id    VARCHAR(64);
    DECLARE v_procdef_id VARCHAR(64);
    DECLARE v_meta       TEXT;
    DECLARE v_sort       BIGINT;
    DECLARE v_now        DATETIME;
    -- ä»»ä½•异常 â†’ å›žæ»šå¹¶é‡æ–°æŠ›å‡º
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;
        RESIGNAL;
    END;
    -- å¹‚等:key å·²å­˜åœ¨ç›´æŽ¥è·³è¿‡
    SELECT COUNT(*) INTO v_exist FROM ACT_RE_PROCDEF WHERE KEY_ = p_key;
    IF v_exist > 0 THEN
        SELECT CONCAT('[SKIP] æµç¨‹å·²å­˜åœ¨ï¼Œè·³è¿‡ï¼š', p_key) AS deploy_result;
        LEAVE label_deploy;
    END IF;
    -- æ¨¡æ¿å®šä½
    IF p_template IS NOT NULL AND p_template <> '' THEN
        SET v_tpl_key = p_template;
    END IF;
    SELECT DEPLOYMENT_ID_ INTO v_tpl_dep FROM ACT_RE_PROCDEF
     WHERE KEY_ = v_tpl_key ORDER BY VERSION_ DESC LIMIT 1;
    SELECT NAME_        INTO v_tpl_name FROM ACT_RE_PROCDEF
     WHERE KEY_ = v_tpl_key ORDER BY VERSION_ DESC LIMIT 1;
    IF v_tpl_dep IS NULL THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = CONCAT('模板流程不存在,无法复制:', v_tpl_key);
    END IF;
    SET v_now     = NOW(3);
    SET v_sort    = UNIX_TIMESTAMP(v_now) * 1000;
    SET v_dep     = REPLACE(UUID(), '-', '');
    SET v_model_id = REPLACE(UUID(), '-', '');
    SET v_byte_id  = REPLACE(UUID(), '-', '');
    SET v_procdef_id = CONCAT(p_key, ':1:', v_dep);
    -- procdef ID åˆ— VARCHAR(64) é•¿åº¦å®ˆå«
    IF CHAR_LENGTH(v_procdef_id) > 64 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = CONCAT('流程 key è¿‡é•¿ï¼Œprocdef ID å°†è¶… 64 å­—符:', p_key);
    END IF;
    START TRANSACTION;
    -- 1) éƒ¨ç½²è®°å½•(ACT_RE_DEPLOYMENT æ—  REV_ åˆ—)
    INSERT INTO ACT_RE_DEPLOYMENT
        (ID_, NAME_, CATEGORY_, KEY_, TENANT_ID_, DEPLOY_TIME_, ENGINE_VERSION_)
    VALUES
        (v_dep, p_name, p_category, p_key, '', v_now, NULL);
    -- 2) BPMN å­—节(复制模板字节并替换 key ä¸Žæ˜¾ç¤ºåï¼‰
    INSERT INTO ACT_GE_BYTEARRAY
        (ID_, NAME_, DEPLOYMENT_ID_, BYTES_, GENERATED_)
    SELECT
        v_byte_id,
        CONCAT(p_key, '.bpmn'),
        v_dep,
        CONVERT(
            REPLACE(
                REPLACE(CONVERT(BYTES_ USING utf8mb4), v_tpl_key, p_key),
                v_tpl_name, p_name)
        USING utf8mb4),
        0
      FROM ACT_GE_BYTEARRAY
     WHERE DEPLOYMENT_ID_ = v_tpl_dep
       AND NAME_ = CONCAT(v_tpl_key, '.bpmn');
    -- 3) æµç¨‹å®šä¹‰ï¼ˆæ¿€æ´»æ€ SUSPENSION_STATE_=1;ENGINE_VERSION_ ç•™ NULL)
    INSERT INTO ACT_RE_PROCDEF
        (ID_, REV_, CATEGORY_, NAME_, KEY_, VERSION_, DEPLOYMENT_ID_, RESOURCE_NAME_,
         DGRM_RESOURCE_NAME_, DESCRIPTION_, HAS_START_FORM_KEY_, HAS_GRAPHICAL_NOTATION_,
         SUSPENSION_STATE_, TENANT_ID_, ENGINE_VERSION_, DERIVED_VERSION_)
    VALUES
        (v_procdef_id, 1, p_category, p_name, p_key, 1, v_dep, CONCAT(p_key, '.bpmn'),
         NULL, NULL, 0, 1,
         1, '', NULL, 0);
    -- 4) æµç¨‹æ¨¡åž‹ï¼ˆå«æœ€å°åˆæ³• META_INFO_,避免模型列表 NPE)
    SET v_meta = CONCAT(
        '{"type":10,"formType":10,"sort":', v_sort,
        ',"visible":true,"allowCancelRunningProcess":true,"allowWithdrawTask":false',
        ',"autoApprovalType":0,"description":"","formCustomCreatePath":"","formCustomViewPath":"",',
        '"formId":null,"managerUserIds":[],"startUserIds":[],"startDeptIds":[],"icon":null,',
        '"processBeforeTriggerSetting":null,"processAfterTriggerSetting":null,',
        '"taskBeforeTriggerSetting":null,"taskAfterTriggerSetting":null,',
        '"printTemplateSetting":null,"summarySetting":null,"titleSetting":null,"processIdRule":null}');
    INSERT INTO ACT_RE_MODEL
        (ID_, NAME_, KEY_, CATEGORY_, CREATE_TIME_, LAST_UPDATE_TIME_, VERSION_, META_INFO_, DEPLOYMENT_ID_, TENANT_ID_)
    VALUES
        (v_model_id, p_name, p_key, p_category, v_now, v_now, 1, v_meta, v_dep, '');
    -- 5) æµç¨‹å®šä¹‰æ‰©å±•信息(model_type=10)
    INSERT INTO bpm_process_definition_info
        (process_definition_id, model_id, model_type, category, form_type, visible, sort,
         allow_cancel_running_process, allow_withdraw_task,
         creator, create_time, updater, update_time, deleted)
    VALUES
        (v_procdef_id, v_model_id, 10, p_category, 10, 1, v_sort,
         1, 1,
         '1', v_now, '1', v_now, 0);
    COMMIT;
    SELECT CONCAT('[OK] å·²éƒ¨ç½²æ–°å®¡æ ¸æµç¨‹ï¼š', p_key, ' (procdef=', v_procdef_id, ')') AS deploy_result;
END$$
DELIMITER ;
-- =============================================================================
-- â‘£ æŒ‰å•据逐个部署缺失流程(重复执行会自动跳过已存在项)
--    å‚数:(key, åç§°, åˆ†ç±»code, æ¨¡æ¿key)
-- =============================================================================
-- ERP é”€å”®è®¢å•审批(代码监听 key:sale_order_approve)
CALL bpm_deploy_flow_from_template('sale_order_approve', '销售订单审批', 'sale_order_approve', 'erp-finance-payment-audit');
-- ERP é‡‡è´­è®¢å•审批(代码监听 key:purchase_order_approve)
CALL bpm_deploy_flow_from_template('purchase_order_approve', '采购订单审批', 'purchase_order_approve', 'erp-finance-payment-audit');
-- CRM åˆåŒå®¡æ‰¹ï¼ˆä»£ç ç›‘听 key:crm-contract-audit,挂既有 contract_approve åˆ†ç±»ï¼‰
CALL bpm_deploy_flow_from_template('crm-contract-audit', '合同审批', 'contract_approve', 'erp-finance-payment-audit');
-- HRM è¯·å‡å®¡æ‰¹ï¼ˆä»£ç ç›‘听 key:hrm_leave)
CALL bpm_deploy_flow_from_template('hrm_leave', '请假审批', 'hrm_leave_approve', 'erp-finance-payment-audit');
-- HRM åŠ ç­å®¡æ‰¹ï¼ˆä»£ç ç›‘å¬ key:hrm_overtime)
CALL bpm_deploy_flow_from_template('hrm_overtime', '加班审批', 'overtime_approve', 'erp-finance-payment-audit');
-- HRM ç¦»èŒå®¡æ‰¹ï¼ˆä»£ç ç›‘听 key:hrm_resignation)
CALL bpm_deploy_flow_from_template('hrm_resignation', '离职审批', 'hrm_resignation_approve', 'erp-finance-payment-audit');
-- HRM è°ƒåŠ¨å®¡æ‰¹ï¼ˆä»£ç ç›‘å¬ key:hrm_transfer)
CALL bpm_deploy_flow_from_template('hrm_transfer', '调动审批', 'hrm_transfer_approve', 'erp-finance-payment-audit');
-- HRM è€ƒå‹¤å¼‚常审批(全量监听不挑 key,挂既有 hrm_attendance_approve åˆ†ç±»ï¼‰
CALL bpm_deploy_flow_from_template('hrm_attendance_approve', '考勤异常审批', 'hrm_attendance_approve', 'erp-finance-payment-audit');
-- SRM ä¾›åº”商准入审批(代码监听 key:supplier_apply_approve)
CALL bpm_deploy_flow_from_template('supplier_apply_approve', '供应商准入审批', 'supplier_apply_approve', 'erp-finance-payment-audit');
-- MES ä»“库入库 / å‡ºåº“ / è°ƒæ‹¨å®¡æ‰¹ï¼ˆä»£ç ç›‘听 key å›ºå®šï¼ŒæŒ‚既有 wms_approve åˆ†ç±»ï¼‰
CALL bpm_deploy_flow_from_template('wms_inbound_approve', '仓库入库审批', 'wms_approve', 'erp-finance-payment-audit');
CALL bpm_deploy_flow_from_template('wms_outbound_approve', '仓库出库审批', 'wms_approve', 'erp-finance-payment-audit');
CALL bpm_deploy_flow_from_template('wms_transfer_approve', '仓库调拨审批', 'wms_approve', 'erp-finance-payment-audit');
-- MES é‡‡è´­æ”¶è´§ï¼ˆå…¥åº“单)审批(全量监听,挂既有 item_receipt_approve åˆ†ç±»ï¼‰
CALL bpm_deploy_flow_from_template('item_receipt_approve', '采购入库审批', 'item_receipt_approve', 'erp-finance-payment-audit');
-- MES æŠ¥å·¥/生产工单审批(代码监听 key:mes-pro-feedback-audit)
CALL bpm_deploy_flow_from_template('mes-pro-feedback-audit', '报工审批', 'mes_pro_feedback_audit', 'erp-finance-payment-audit');
-- =============================================================================
-- â‘¤ éƒ¨ç½²ç»“果校验(应看到 14 æ¡æ–°æµç¨‹ä¸” SUSPENSION_STATE_=1、model_type=10)
-- =============================================================================
SELECT p.KEY_, p.NAME_, p.VERSION_, p.SUSPENSION_STATE_ AS active_flag,
       LENGTH(p.ID_) AS procdef_id_len,
       i.model_type, i.category
  FROM ACT_RE_PROCDEF p
  LEFT JOIN bpm_process_definition_info i ON i.process_definition_id = p.ID_
 WHERE p.KEY_ IN ('sale_order_approve','purchase_order_approve','crm-contract-audit',
                  'hrm_leave','hrm_overtime','hrm_resignation','hrm_transfer',
                  'hrm_attendance_approve','supplier_apply_approve',
                  'wms_inbound_approve','wms_outbound_approve','wms_transfer_approve',
                  'item_receipt_approve','mes-pro-feedback-audit')
 ORDER BY p.KEY_;