| sql/mysql/bpm_fix_model_manager_and_rev.sql | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
sql/mysql/bpm_fix_model_manager_and_rev.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,31 @@ -- ============================================================ -- ä¿®å¤ãæµç¨æ¨¡å â ä¿®æ¹ â æµç¨è®¾è®¡ â ä¿åã失败 -- -- ç°è±¡ï¼æ¥ãæä½æµç¨å¤±è´¥ï¼åå ï¼ä½ 䏿¯è¯¥æµç¨(xxx)ç管çåãï¼ -- æä¿®æç®¡çåé®é¢ååæãç³»ç»å¼å¸¸ã -- ï¼FlowableOptimisticLockingException: was updated by another transaction concurrentlyï¼ -- -- æ ¹å æä¸¤ä¸ªï¼é½åºå¨ä»å¤ä»½æ¢å¤/è¿ç§»è¿æ¥ç act_re_model æ°æ®ä¸ï¼ -- -- 1) META_INFO_ é managerUserIds 为空æ°ç»æç¼ºå¤± -- å端 updateModel æ¯ãå æ ¡éªç®¡çåãååå ¥ãï¼æ ¡éªè¯»çæ¯åºéçå¼ï¼ -- æä»¥ä¸æ¦ä¸ºç©ºå°±æ°¸ä¹ æ ¡éªå¤±è´¥ï¼æ æ³èªæï¼å端æä¹ä¼ æ°å¼é½æ²¡ç¨ï¼ã -- -- 2) REV_ï¼Flowable ä¹è§éçæ¬å·ï¼ä¸º NULL -- saveModel æ¶ç UPDATE æ¡ä»¶å¸¦ REV_ = ?ï¼ä¸º NULL æ¶å¹é ä¸å°ä»»ä½è¡ï¼ -- Flowable 认为被并åä¿®æ¹ï¼æ OptimisticLockingException â å端æ¾ç¤ºãç³»ç»å¼å¸¸ãã -- -- æ§è¡åééå¯å端æå¡ï¼Flowable ææ¨¡åç¼åï¼ã -- ============================================================ -- 1) è¡¥é½æµç¨ç®¡çåï¼ç©ºæ°ç» â è¶ ç®¡(1)ï¼ç¼ºå¤±è¯¥å段çï¼è¡¥å° visible åé¢ UPDATE act_re_model SET META_INFO_ = REPLACE(META_INFO_, '"managerUserIds":[]', '"managerUserIds":[1]') WHERE META_INFO_ LIKE '%"managerUserIds":[]%'; UPDATE act_re_model SET META_INFO_ = REPLACE(META_INFO_, '"visible":true', '"visible":true,"managerUserIds":[1]') WHERE META_INFO_ NOT LIKE '%managerUserIds%'; -- 2) è¡¥é½ä¹è§éçæ¬å· UPDATE act_re_model SET REV_ = 1 WHERE REV_ IS NULL; yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java
@@ -4,6 +4,7 @@ import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO; @@ -204,10 +205,26 @@ private Model validateModelManager(String id, Long userId) { Model model = validateModelExists(id); BpmModelMetaInfoVO metaInfo = BpmModelConvert.INSTANCE.parseMetaInfo(model); if (metaInfo == null || !CollUtil.contains(metaInfo.getManagerUserIds(), userId)) { throw exception(MODEL_UPDATE_FAIL_NOT_MANAGER, model.getName()); // 1. æªé ç½®æµç¨ç®¡çå â æ¾è¡ã // å岿¨¡åï¼å¤ä»½æ¢å¤/è¿ç§»ï¼META_INFO é managerUserIds 为空æ°ç»æç¼ºå¤±ï¼ // è updateModel æ¯ãå æ ¡éªååå ¥ãï¼ä¸æ¦ä¸ºç©ºå°±ä¼æ°¸ä¹ æ ¡éªå¤±è´¥ï¼æ æ³èªæã if (metaInfo == null || CollUtil.isEmpty(metaInfo.getManagerUserIds())) { log.warn("[validateModelManager][模å({}) æªé ç½®æµç¨ç®¡çåï¼è·³è¿ç®¡çåæ ¡éª]", model.getName()); return model; } return model; // 2. å½åæä½äººå¨ç®¡çåå表é â æ¾è¡ if (CollUtil.contains(metaInfo.getManagerUserIds(), userId)) { return model; } // 3. è¶ çº§ç®¡çåå§ç»æ¾è¡ã // å¦å模å䏿¦è¢«ä¿åæåªå å«æä¸ªå ·ä½è´¦å·ï¼æ¢è´¦å·ï¼å«è¶ 管ï¼å°±å乿¹ä¸äºè¯¥æ¨¡åï¼ // æ¥ãæä½æµç¨å¤±è´¥ï¼åå ï¼ä½ 䏿¯è¯¥æµç¨(xxx)ç管çåãï¼å½¢ææ»éã if (SecurityFrameworkUtils.isSuperAdmin()) { log.warn("[validateModelManager][模å({}) 管çå({}) ä¸å«å½åç¨æ·({})ï¼ä½ä¸ºè¶ 级管çåï¼æ¾è¡]", model.getName(), metaInfo.getManagerUserIds(), userId); return model; } throw exception(MODEL_UPDATE_FAIL_NOT_MANAGER, model.getName()); } @Override