From 1da98c8a8207dd062e433242e1567b6418c6ed81 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: 星期六, 06 四月 2024 11:20:29 +0800 Subject: [PATCH] update 优化表单绑定逻辑,移除流程定义配置表单 --- ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfNodeConfig.java | 5 + ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java | 25 ++++- ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java | 15 +++ ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/ModelUtils.java | 26 ++++ ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java | 36 ------- ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfNodeConfigBo.java | 13 + ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java | 29 +++-- ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java | 4 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActModelService.java | 12 ++ ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java | 12 ++ ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfNodeConfigServiceImpl.java | 2 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java | 28 +---- ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java | 72 ++++++++++--- ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfNodeConfigVo.java | 6 + 14 files changed, 181 insertions(+), 104 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java index d175ba8..df27d3c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java @@ -81,6 +81,11 @@ String WF_DEFINITION_CONFIG_VO = "wfDefinitionConfigVo"; /** + * 鑺傜偣閰嶇疆 + */ + String WF_NODE_CONFIG_VO = "wfNodeConfigVo"; + + /** * 娴佺▼鍙戣捣浜� */ String INITIATOR = "initiator"; @@ -119,4 +124,14 @@ * 浼氱 */ String MULTI_INSTANCE = "multiInstance"; + + /** + * 鏄� + */ + String TRUE = "0"; + + /** + * 鍚� + */ + String FALSE = "1"; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java index ebe0882..3332f86 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java @@ -126,7 +126,7 @@ /** * 瀵煎嚭妯″瀷zip鍘嬬缉鍖� * - * @param modelIds 妯″瀷id + * @param modelIds 妯″瀷id * @param response 鐩稿簲 */ @GetMapping("/export/zip/{modelIds}") @@ -134,4 +134,14 @@ HttpServletResponse response) { actModelService.exportZip(modelIds, response); } + + /** + * 澶嶅埗妯″瀷 + * + * @param modelBo 妯″瀷鏁版嵁 + */ + @PostMapping("/copyModel") + public R<Void> copyModel(@RequestBody ModelBo modelBo) { + return toAjax(actModelService.copyModel(modelBo)); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfNodeConfig.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfNodeConfig.java index cf88676..999425f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfNodeConfig.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfNodeConfig.java @@ -52,5 +52,10 @@ */ private String definitionId; + /** + * 鏄惁涓虹敵璇蜂汉鑺傜偣 锛�0鏄� 1鍚︼級 + */ + private String applyUserTask; + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfNodeConfigBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfNodeConfigBo.java index 24144cf..de518d3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfNodeConfigBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfNodeConfigBo.java @@ -23,7 +23,7 @@ /** * 涓婚敭 */ - @NotNull(message = "涓婚敭涓嶈兘涓虹┖", groups = { EditGroup.class }) + @NotNull(message = "涓婚敭涓嶈兘涓虹┖", groups = {EditGroup.class}) private Long id; /** @@ -39,20 +39,25 @@ /** * 鑺傜偣鍚嶇О */ - @NotBlank(message = "鑺傜偣鍚嶇О涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "鑺傜偣鍚嶇О涓嶈兘涓虹┖", groups = {AddGroup.class, EditGroup.class}) private String nodeName; /** * 鑺傜偣id */ - @NotBlank(message = "鑺傜偣id涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "鑺傜偣id涓嶈兘涓虹┖", groups = {AddGroup.class, EditGroup.class}) private String nodeId; /** * 娴佺▼瀹氫箟id */ - @NotBlank(message = "娴佺▼瀹氫箟id涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "娴佺▼瀹氫箟id涓嶈兘涓虹┖", groups = {AddGroup.class, EditGroup.class}) private String definitionId; + /** + * 鏄惁涓虹敵璇蜂汉鑺傜偣 锛�0鏄� 1鍚︼級 + */ + @NotBlank(message = "鏄惁涓虹敵璇蜂汉鑺傜偣涓嶈兘涓虹┖", groups = {AddGroup.class, EditGroup.class}) + private String applyUserTask; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java index b697e29..ab3e7a1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java @@ -94,7 +94,7 @@ private List<TaskVo> taskVoList; /** - * 娴佺▼瀹氫箟閰嶇疆 + * 鑺傜偣閰嶇疆 */ - private WfDefinitionConfigVo wfDefinitionConfigVo; + private WfNodeConfigVo wfNodeConfigVo; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfNodeConfigVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfNodeConfigVo.java index 90b5ab5..89e9d9b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfNodeConfigVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfNodeConfigVo.java @@ -61,6 +61,12 @@ private String definitionId; /** + * 鏄惁涓虹敵璇蜂汉鑺傜偣 锛�0鏄� 1鍚︼級 + */ + @ExcelProperty(value = "鏄惁涓虹敵璇蜂汉鑺傜偣 锛�0鏄� 1鍚︼級") + private String applyUserTask; + + /** * 琛ㄥ崟绠$悊 */ private WfFormManageVo wfFormManageVo; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActModelService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActModelService.java index b9e712a..4a6d170 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActModelService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActModelService.java @@ -68,8 +68,16 @@ /** * 瀵煎嚭妯″瀷zip鍘嬬缉鍖� * - * @param modelIds 妯″瀷id - * @param response 鐩稿簲 + * @param modelIds 妯″瀷id + * @param response 鍝嶅簲 */ void exportZip(List<String> modelIds, HttpServletResponse response); + + /** + * 澶嶅埗妯″瀷 + * + * @param modelBo 妯″瀷鏁版嵁 + * @return 缁撴灉 + */ + boolean copyModel(ModelBo modelBo); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java index 226b88c..b79e160 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java @@ -6,6 +6,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.ZipUtil; +import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.alibaba.excel.util.StringUtils; import jakarta.servlet.http.HttpServletResponse; @@ -21,15 +22,14 @@ import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.domain.WfNodeConfig; import org.dromara.workflow.domain.bo.ModelBo; -import org.dromara.workflow.domain.bo.WfDefinitionConfigBo; import org.dromara.workflow.domain.vo.ModelVo; -import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; import org.dromara.workflow.service.IActModelService; -import org.dromara.workflow.service.IWfDefinitionConfigService; import org.dromara.workflow.service.IWfNodeConfigService; import org.dromara.workflow.utils.ModelUtils; import org.dromara.workflow.utils.QueryUtils; +import org.flowable.bpmn.converter.BpmnXMLConverter; import org.flowable.bpmn.model.BpmnModel; +import org.flowable.bpmn.model.Process; import org.flowable.bpmn.model.UserTask; import org.flowable.engine.RepositoryService; import org.flowable.engine.repository.*; @@ -59,7 +59,6 @@ public class ActModelServiceImpl implements IActModelService { private final RepositoryService repositoryService; - private final IWfDefinitionConfigService iWfDefinitionConfigService; private final IWfNodeConfigService iWfNodeConfigService; /** @@ -261,7 +260,6 @@ } // 鏌ヨ妯″瀷鐨勫熀鏈俊鎭� Model model = repositoryService.getModel(id); - ProcessDefinition processDefinition = QueryUtils.definitionQuery().processDefinitionKey(model.getKey()).latestVersion().singleResult(); // xml璧勬簮鐨勫悕绉� 锛屽搴攁ct_ge_bytearray琛ㄤ腑鐨刵ame_瀛楁 String processName = model.getName() + ".bpmn20.xml"; // 璋冪敤閮ㄧ讲鐩稿叧鐨刟pi鏂规硶杩涜閮ㄧ讲娴佺▼瀹氫箟 @@ -284,20 +282,9 @@ // 鏇存柊鍒嗙被 ProcessDefinition definition = QueryUtils.definitionQuery().deploymentId(deployment.getId()).singleResult(); repositoryService.setProcessDefinitionCategory(definition.getId(), model.getCategory()); - //鏇存柊娴佺▼瀹氫箟琛ㄥ崟 - if (processDefinition != null) { - WfDefinitionConfigVo definitionVo = iWfDefinitionConfigService.getByDefId(processDefinition.getId()); - if (definitionVo != null) { - WfDefinitionConfigBo wfFormDefinition = new WfDefinitionConfigBo(); - wfFormDefinition.setDefinitionId(definition.getId()); - wfFormDefinition.setProcessKey(definition.getKey()); - wfFormDefinition.setFormId(ObjectUtil.isNotNull(definitionVo.getFormId()) ? definitionVo.getFormId() : null); - wfFormDefinition.setRemark(definitionVo.getRemark()); - iWfDefinitionConfigService.saveOrUpdate(wfFormDefinition); - } - } //鏇存柊娴佺▼鑺傜偣閰嶇疆琛ㄥ崟 - List<UserTask> userTasks = ModelUtils.getuserTaskFlowElements(definition.getId()); + List<UserTask> userTasks = ModelUtils.getUserTaskFlowElements(definition.getId()); + UserTask applyUserTask = ModelUtils.getApplyUserTask(definition.getId()); List<WfNodeConfig> wfNodeConfigList = new ArrayList<>(); for (UserTask userTask : userTasks) { if (StringUtils.isNotBlank(userTask.getFormKey()) && userTask.getFormKey().contains(StrUtil.COLON)) { @@ -308,6 +295,7 @@ String[] split = userTask.getFormKey().split(StrUtil.COLON); wfNodeConfig.setFormType(split[0]); wfNodeConfig.setFormId(Long.valueOf(split[1])); + wfNodeConfig.setApplyUserTask(applyUserTask.getId().equals(userTask.getId()) ? FlowConstant.TRUE : FlowConstant.FALSE); wfNodeConfigList.add(wfNodeConfig); } } @@ -374,4 +362,52 @@ } } } + + /** + * 澶嶅埗妯″瀷 + * + * @param modelBo 妯″瀷鏁版嵁 + * @return 缁撴灉 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean copyModel(ModelBo modelBo) { + try { + String key = modelBo.getKey(); + if (StringUtils.isNotBlank(key)) { + // 鏌ヨ妯″瀷 + Model model = repositoryService.createModelQuery().modelId(modelBo.getId()).singleResult(); + if (ObjectUtil.isNotNull(model)) { + byte[] modelEditorSource = repositoryService.getModelEditorSource(model.getId()); + List<Model> list = QueryUtils.modelQuery().modelKey(key).list(); + if (CollUtil.isNotEmpty(list)) { + throw new ServiceException("妯″瀷KEY宸插瓨鍦紒"); + } + // 鏍¢獙key鍛藉悕瑙勮寖 + if (!Validator.isMatchRegex(FlowConstant.MODEL_KEY_PATTERN, key)) { + throw new ServiceException("妯″瀷鏍囪瘑KEY鍙兘瀛楃鎴栬�呬笅鍒掔嚎寮�澶达紒"); + } + // 澶嶅埗妯″瀷鏁版嵁 + Model newModel = repositoryService.newModel(); + newModel.setKey(modelBo.getKey()); + newModel.setName(modelBo.getName()); + newModel.setCategory(modelBo.getCategoryCode()); + newModel.setVersion(1); + newModel.setMetaInfo(modelBo.getDescription()); + newModel.setTenantId(TenantHelper.getTenantId()); + String xml = StrUtil.utf8Str(modelEditorSource); + BpmnModel bpmnModel = ModelUtils.xmlToBpmnModel(xml); + Process mainProcess = bpmnModel.getMainProcess(); + mainProcess.setId(modelBo.getKey()); + mainProcess.setName(modelBo.getName()); + byte[] xmlBytes = new BpmnXMLConverter().convertToXML(bpmnModel); + repositoryService.saveModel(newModel); + repositoryService.addModelEditorSource(newModel.getId(), xmlBytes); + } + } + } catch (Exception e) { + throw new ServiceException(e.getMessage()); + } + return true; + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java index b8b882e..89a71db 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java @@ -21,7 +21,6 @@ import org.dromara.workflow.domain.WfCategory; import org.dromara.workflow.domain.WfNodeConfig; import org.dromara.workflow.domain.bo.ProcessDefinitionBo; -import org.dromara.workflow.domain.bo.WfDefinitionConfigBo; import org.dromara.workflow.domain.vo.ProcessDefinitionVo; import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; import org.dromara.workflow.service.IActProcessDefinitionService; @@ -323,14 +322,13 @@ String processName = splitFilename[0]; //娴佺▼key String processKey = splitFilename[1]; - ProcessDefinition oldProcessDefinition = QueryUtils.definitionQuery().processDefinitionKey(processKey).latestVersion().singleResult(); DeploymentBuilder builder = repositoryService.createDeployment(); Deployment deployment = builder.addInputStream(filename, zipInputStream) .tenantId(TenantHelper.getTenantId()) .name(processName).key(processKey).category(categoryCode).deploy(); ProcessDefinition definition = QueryUtils.definitionQuery().deploymentId(deployment.getId()).singleResult(); repositoryService.setProcessDefinitionCategory(definition.getId(), categoryCode); - setForm(oldProcessDefinition, definition); + setWfNodeConfig(definition); zipInputStream.closeEntry(); } } catch (IOException e) { @@ -353,7 +351,6 @@ String processName = splitFilename[0]; //娴佺▼key String processKey = splitFilename[1]; - ProcessDefinition oldProcessDefinition = QueryUtils.definitionQuery().processDefinitionKey(processKey).latestVersion().singleResult(); DeploymentBuilder builder = repositoryService.createDeployment(); Deployment deployment = builder.addInputStream(originalFilename, inputStream) @@ -362,7 +359,7 @@ // 鏇存柊鍒嗙被 ProcessDefinition definition = QueryUtils.definitionQuery().deploymentId(deployment.getId()).singleResult(); repositoryService.setProcessDefinitionCategory(definition.getId(), categoryCode); - setForm(oldProcessDefinition, definition); + setWfNodeConfig(definition); } else { throw new ServiceException("鏂囦欢绫诲瀷涓婁紶閿欒锛�"); @@ -374,24 +371,12 @@ /** * 璁剧疆琛ㄥ崟鍐呭 * - * @param oldProcessDefinition 閮ㄧ讲鍓嶆渶鏂版祦绋嬪畾涔� - * @param definition 閮ㄧ讲鍚庢渶鏂版祦绋嬪畾涔� + * @param definition 閮ㄧ讲鍚庢渶鏂版祦绋嬪畾涔� */ - private void setForm(ProcessDefinition oldProcessDefinition, ProcessDefinition definition) { - //鏇存柊娴佺▼瀹氫箟琛ㄥ崟 - if (oldProcessDefinition != null) { - WfDefinitionConfigVo definitionVo = iWfDefinitionConfigService.getByDefId(oldProcessDefinition.getId()); - if (definitionVo != null) { - WfDefinitionConfigBo wfFormDefinition = new WfDefinitionConfigBo(); - wfFormDefinition.setDefinitionId(definition.getId()); - wfFormDefinition.setProcessKey(definition.getKey()); - wfFormDefinition.setFormId(ObjectUtil.isNotNull(definitionVo.getFormId()) ? definitionVo.getFormId() : null); - wfFormDefinition.setRemark(definitionVo.getRemark()); - iWfDefinitionConfigService.saveOrUpdate(wfFormDefinition); - } - } + private void setWfNodeConfig(ProcessDefinition definition) { //鏇存柊娴佺▼鑺傜偣閰嶇疆琛ㄥ崟 - List<UserTask> userTasks = ModelUtils.getuserTaskFlowElements(definition.getId()); + List<UserTask> userTasks = ModelUtils.getUserTaskFlowElements(definition.getId()); + UserTask applyUserTask = ModelUtils.getApplyUserTask(definition.getId()); List<WfNodeConfig> wfNodeConfigList = new ArrayList<>(); for (UserTask userTask : userTasks) { if (StringUtils.isNotBlank(userTask.getFormKey()) && userTask.getFormKey().contains(StrUtil.COLON)) { @@ -402,6 +387,7 @@ String[] split = userTask.getFormKey().split(StrUtil.COLON); wfNodeConfig.setFormType(split[0]); wfNodeConfig.setFormId(Long.valueOf(split[1])); + wfNodeConfig.setApplyUserTask(applyUserTask.getId().equals(userTask.getId()) ? FlowConstant.TRUE : FlowConstant.FALSE); wfNodeConfigList.add(wfNodeConfig); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index d316520..9af37f6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -29,6 +29,7 @@ import org.dromara.workflow.flowable.strategy.FlowProcessEventHandler; import org.dromara.workflow.service.IActHiProcinstService; import org.dromara.workflow.service.IActProcessInstanceService; +import org.dromara.workflow.service.IWfNodeConfigService; import org.dromara.workflow.service.IWfTaskBackNodeService; import org.dromara.workflow.utils.QueryUtils; import org.dromara.workflow.utils.WorkflowUtils; @@ -58,8 +59,6 @@ import java.util.*; import java.util.stream.Collectors; -import static org.dromara.workflow.common.constant.FlowConstant.PROCESS_DEFINITION_ID; - /** * 娴佺▼瀹炰緥 鏈嶅姟灞傚疄鐜� * @@ -78,6 +77,7 @@ private final ManagementService managementService; private final FlowEventStrategy flowEventStrategy; private final IWfTaskBackNodeService iWfTaskBackNodeService; + private final IWfNodeConfigService iWfNodeConfigService; @Value("${flowable.activity-font-name}") private String activityFontName; @@ -122,7 +122,12 @@ } if (CollUtil.isNotEmpty(list)) { List<String> processDefinitionIds = StreamUtils.toList(list, ProcessInstanceVo::getProcessDefinitionId); - WorkflowUtils.setWfDefinitionConfigVo(list, processDefinitionIds, PROCESS_DEFINITION_ID); + List<WfNodeConfigVo> wfNodeConfigVoList = iWfNodeConfigService.selectByDefIds(processDefinitionIds); + for (ProcessInstanceVo processInstanceVo : list) { + if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(processInstanceVo.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(processInstanceVo::setWfNodeConfigVo); + } + } } long count = query.count(); TableDataInfo<ProcessInstanceVo> build = TableDataInfo.build(); @@ -164,7 +169,12 @@ } if (CollUtil.isNotEmpty(list)) { List<String> processDefinitionIds = StreamUtils.toList(list, ProcessInstanceVo::getProcessDefinitionId); - WorkflowUtils.setWfDefinitionConfigVo(list, processDefinitionIds, PROCESS_DEFINITION_ID); + List<WfNodeConfigVo> wfNodeConfigVoList = iWfNodeConfigService.selectByDefIds(processDefinitionIds); + for (ProcessInstanceVo processInstanceVo : list) { + if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(processInstanceVo.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(processInstanceVo::setWfNodeConfigVo); + } + } } long count = query.count(); TableDataInfo<ProcessInstanceVo> build = TableDataInfo.build(); @@ -669,7 +679,12 @@ } if (CollUtil.isNotEmpty(list)) { List<String> processDefinitionIds = StreamUtils.toList(list, ProcessInstanceVo::getProcessDefinitionId); - WorkflowUtils.setWfDefinitionConfigVo(list, processDefinitionIds, PROCESS_DEFINITION_ID); + List<WfNodeConfigVo> wfNodeConfigVoList = iWfNodeConfigService.selectByDefIds(processDefinitionIds); + for (ProcessInstanceVo processInstanceVo : list) { + if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(processInstanceVo.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(processInstanceVo::setWfNodeConfigVo); + } + } } long count = query.count(); TableDataInfo<ProcessInstanceVo> build = TableDataInfo.build(); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 72114fa..e4bac73 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -282,10 +282,10 @@ task.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId())); task.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey())).findFirst().ifPresent(task::setWfNodeConfigVo); + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey()) && FlowConstant.FALSE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); } } - WorkflowUtils.setWfDefinitionConfigVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID); } return TableDataInfo.build(page); } @@ -347,11 +347,11 @@ taskVo.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId())); taskVo.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey())).findFirst().ifPresent(taskVo::setWfNodeConfigVo); + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(taskVo::setWfNodeConfigVo); + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey()) && FlowConstant.FALSE.equals(e.getApplyUserTask())).findFirst().ifPresent(taskVo::setWfNodeConfigVo); } list.add(taskVo); } - WorkflowUtils.setWfDefinitionConfigVo(list, processDefinitionIds, PROCESS_DEFINITION_ID); } long count = query.count(); TableDataInfo<TaskVo> build = TableDataInfo.build(); @@ -382,10 +382,10 @@ for (TaskVo task : taskList) { task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus())); if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey())).findFirst().ifPresent(task::setWfNodeConfigVo); + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey()) && FlowConstant.FALSE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); } } - WorkflowUtils.setWfDefinitionConfigVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID); } return TableDataInfo.build(page); } @@ -418,11 +418,10 @@ for (TaskVo task : taskList) { task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus())); if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { - wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey())).findFirst().ifPresent(task::setWfNodeConfigVo); + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey()) && FlowConstant.FALSE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); } } - WorkflowUtils.setWfDefinitionConfigVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID); - } return TableDataInfo.build(page); } @@ -441,12 +440,16 @@ Page<TaskVo> page = actTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper); List<TaskVo> taskList = page.getRecords(); - for (TaskVo task : taskList) { - task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus())); - } if (CollUtil.isNotEmpty(taskList)) { List<String> processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId); - WorkflowUtils.setWfDefinitionConfigVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID); + List<WfNodeConfigVo> wfNodeConfigVoList = iWfNodeConfigService.selectByDefIds(processDefinitionIds); + for (TaskVo task : taskList) { + task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus())); + if (CollUtil.isNotEmpty(wfNodeConfigVoList)) { + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && FlowConstant.TRUE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); + wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey()) && FlowConstant.FALSE.equals(e.getApplyUserTask())).findFirst().ifPresent(task::setWfNodeConfigVo); + } + } } return TableDataInfo.build(page); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfNodeConfigServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfNodeConfigServiceImpl.java index e47d4af..07a1d63 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfNodeConfigServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfNodeConfigServiceImpl.java @@ -53,6 +53,8 @@ return baseMapper.deleteBatchIds(ids) > 0; } + + @Override public Boolean deleteByDefIds(Collection<String> ids) { return baseMapper.delete(new LambdaQueryWrapper<WfNodeConfig>().in(WfNodeConfig::getDefinitionId, ids)) > 0; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/ModelUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/ModelUtils.java index dff3e4e..7c5377e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/ModelUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/ModelUtils.java @@ -156,7 +156,13 @@ if (!(targetFlowElement instanceof UserTask) && !subtask) { throw new ServerException("寮�濮嬭妭鐐瑰悗绗竴涓妭鐐瑰繀椤绘槸鐢ㄦ埛浠诲姟锛�"); } - + //寮�濮嬭妭鐐瑰悗绗竴涓妭鐐圭敵璇蜂汉鑺傜偣 + if ((targetFlowElement instanceof UserTask) && !subtask) { + UserTask userTask = (UserTask) targetFlowElement; + if (StringUtils.isBlank(userTask.getFormKey())) { + throw new ServerException("鐢宠浜鸿妭鐐瑰繀椤婚�夋嫨琛ㄥ崟锛�"); + } + } List<EndEvent> endEventList = flowElements.stream().filter(EndEvent.class::isInstance).map(EndEvent.class::cast).collect(Collectors.toList()); if (CollUtil.isEmpty(endEventList)) { throw new ServerException(subtask ? "瀛愭祦绋嬪繀椤诲瓨鍦ㄧ粨鏉熻妭鐐癸紒" : "蹇呴』瀛樺湪缁撴潫鑺傜偣锛�"); @@ -168,7 +174,7 @@ * * @param processDefinitionId 娴佺▼瀹氫箟id */ - public static List<UserTask> getuserTaskFlowElements(String processDefinitionId) { + public static List<UserTask> getUserTaskFlowElements(String processDefinitionId) { BpmnModel bpmnModel = PROCESS_ENGINE.getRepositoryService().getBpmnModel(processDefinitionId); List<UserTask> list = new ArrayList<>(); List<Process> processes = bpmnModel.getProcesses(); @@ -264,4 +270,20 @@ FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(taskDefinitionKey); return flowNode instanceof UserTask; } + + /** + * 鑾峰彇鐢宠浜鸿妭鐐� + * + * @param processDefinitionId 娴佺▼瀹氫箟id + * @return 缁撴灉 + */ + public static UserTask getApplyUserTask(String processDefinitionId) { + BpmnModel bpmnModel = PROCESS_ENGINE.getRepositoryService().getBpmnModel(processDefinitionId); + Collection<FlowElement> flowElements = bpmnModel.getMainProcess().getFlowElements(); + List<StartEvent> startEventList = flowElements.stream().filter(StartEvent.class::isInstance).map(StartEvent.class::cast).collect(Collectors.toList()); + StartEvent startEvent = startEventList.get(0); + List<SequenceFlow> outgoingFlows = startEvent.getOutgoingFlows(); + FlowElement targetFlowElement = outgoingFlows.get(0).getTargetFlowElement(); + return (UserTask) targetFlowElement; + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 489d14d..6979671 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -55,8 +55,6 @@ private static final IWorkflowUserService WORKFLOW_USER_SERVICE = SpringUtils.getBean(IWorkflowUserService.class); private static final IActHiProcinstService ACT_HI_PROCINST_SERVICE = SpringUtils.getBean(IActHiProcinstService.class); private static final ActHiTaskinstMapper ACT_HI_TASKINST_MAPPER = SpringUtils.getBean(ActHiTaskinstMapper.class); - private static final IWfDefinitionConfigService I_WF_DEFINITION_CONFIG_SERVICE = SpringUtils.getBean(IWfDefinitionConfigService.class); - private static final IWfFormManageService I_WF_FORM_MANAGE_SERVICE = SpringUtils.getBean(IWfFormManageService.class); /** * 鍒涘缓涓�涓柊浠诲姟 @@ -291,40 +289,6 @@ } } } - - /** - * 璁剧疆娴佺▼娴佺▼瀹氫箟閰嶇疆 - * - * @param obj 涓氬姟瀵硅薄 - * @param idList 娴佺▼瀹氫箟id - * @param fieldName 娴佺▼瀹氫箟ID灞炴�у悕绉� - */ - public static void setWfDefinitionConfigVo(Object obj, List<String> idList, String fieldName) { - if (CollUtil.isEmpty(idList) || obj == null) { - return; - } - List<WfDefinitionConfigVo> wfDefinitionConfigVoList = I_WF_DEFINITION_CONFIG_SERVICE.queryList(idList); - if (CollUtil.isNotEmpty(wfDefinitionConfigVoList)) { - List<Long> formIds = StreamUtils.toList(wfDefinitionConfigVoList, WfDefinitionConfigVo::getFormId); - List<WfFormManageVo> wfFormManageVos = I_WF_FORM_MANAGE_SERVICE.queryByIds(formIds); - if (CollUtil.isNotEmpty(wfFormManageVos)) { - for (WfDefinitionConfigVo wfDefinitionConfigVo : wfDefinitionConfigVoList) { - wfFormManageVos.stream().filter(e -> ObjectUtil.equals(wfDefinitionConfigVo.getFormId(), e.getId())).findFirst().ifPresent(wfDefinitionConfigVo::setWfFormManageVo); - } - } - } - if (obj instanceof Collection<?> collection) { - for (Object o : collection) { - String fieldValue = ReflectUtils.invokeGetter(o, fieldName).toString(); - if (!CollUtil.isEmpty(wfDefinitionConfigVoList)) { - wfDefinitionConfigVoList.stream().filter(e -> e.getDefinitionId().equals(fieldValue)).findFirst().ifPresent(e -> { - ReflectUtils.invokeSetter(o, WF_DEFINITION_CONFIG_VO, e); - }); - } - } - } - } - /** * 鍙戦�佹秷鎭� -- Gitblit v1.9.3