Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/envent/FlowExecutionEndListener.java
@@ -1,19 +1,115 @@ package com.vci.ubcs.flow.engine.envent; import com.vci.ubcs.flow.core.dto.FlowStatusDTO; import com.vci.ubcs.flow.engine.constant.FlowEngineConstant; import com.vci.ubcs.flow.engine.utils.FlowableUtils; import com.vci.ubcs.starter.exception.VciBaseException; import com.vci.ubcs.starter.web.util.LangBaseUtil; import com.vci.ubcs.starter.web.util.VciBaseUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.flowable.engine.HistoryService; import org.flowable.engine.TaskService; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.ExecutionListener; import org.flowable.engine.impl.el.FixedValue; import org.springblade.core.jwt.JwtUtil; import org.springblade.core.launch.constant.TokenConstant; import org.springblade.core.tool.utils.WebUtil; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestTemplate; import java.util.List; import java.util.Map; @Slf4j @Component public class FlowExecutionEndListener implements ExecutionListener { public class FlowExecutionEndListener implements ExecutionListener, ApplicationContextAware { /** * 远程调用地址。切记:名称要与流程中定义的一样 */ private FixedValue remoteMethod; /** * 状态值。切记:名称要与流程中定义的一样 */ private FixedValue statusValue; private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext arg0) throws BeansException { applicationContext = arg0; } @Override public void notify(DelegateExecution execution) { Map var = execution.getVariableInstances(); log.info("执行流程FlowExecutionEndListener",var); Map variables = execution.getVariables(); String restURL = remoteMethod.getExpressionText(); String status = statusValue.getExpressionText(); //获取业务数据信息 List<String> oids = (List<String>) variables.get(FlowEngineConstant.OIDS); String btmType = (String) variables.get(FlowEngineConstant.BTMTYPE); variables.put(FlowEngineConstant.REMOTE_METHOD,restURL); variables.put(FlowEngineConstant.STATUS_VALUE,status); if(CollectionUtils.isEmpty(oids)){ throw new VciBaseException("执行状态修改事件时,业务数据oid为空!"); } if(StringUtils.isEmpty(btmType)){ throw new VciBaseException("执行状态修改事件时,业务类型btmType为空!"); } if(StringUtils.isEmpty(restURL)){ throw new VciBaseException("执行状态修改事件时,远程调用地址为空!"); } if(StringUtils.isEmpty(status)){ throw new VciBaseException("执行状态修改事件时,状态为空!"); } HistoryService historyService = applicationContext.getBean(HistoryService.class); TaskService taskService = applicationContext.getBean(TaskService.class); FlowStatusDTO flowStatusDTO = new FlowStatusDTO(); flowStatusDTO.setBtmType(btmType); flowStatusDTO.setOids(oids); flowStatusDTO.setVariableMap(variables); flowStatusDTO.setTaskHisVOList(FlowableUtils.listTaskHistory(execution.getProcessInstanceId(),historyService,taskService)); String token = JwtUtil.getToken(WebUtil.getRequest().getHeader(TokenConstant.HEADER)); HttpComponentsClientHttpRequestFactory requestFactory=new HttpComponentsClientHttpRequestFactory(); requestFactory.setReadTimeout(300000); requestFactory.setConnectionRequestTimeout(300000); requestFactory.setConnectTimeout(300000); RestTemplate restTemplate = new RestTemplate(requestFactory); HttpHeaders headers = new HttpHeaders(); headers.add(TokenConstant.HEADER,token); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity httpEntity = new HttpEntity<>(flowStatusDTO,headers); Map<String, Object> result = null; try { result = restTemplate.postForObject(restURL, httpEntity, Map.class); } catch (HttpClientErrorException e) { throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{},e); }catch (Throwable e){ throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{},e); } if(result == null){ throw new VciBaseException("业务事件时候没有返回值,不确定是否执行成功"); } if(CollectionUtils.isEmpty(result) && !(Boolean) result.get("success")){ throw new VciBaseException((String) result.get("message")); } } } Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/envent/FlowExecutionStartListener.java
@@ -1,25 +1,101 @@ package com.vci.ubcs.flow.engine.envent; import com.vci.ubcs.code.feign.IFlowEventClient; import com.vci.ubcs.flow.core.dto.FlowStatusDTO; import com.vci.ubcs.flow.engine.constant.FlowEngineConstant; import com.vci.ubcs.starter.exception.VciBaseException; import com.vci.ubcs.starter.web.util.LangBaseUtil; import com.vci.ubcs.starter.web.util.VciBaseUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.ExecutionListener; import org.flowable.engine.impl.el.FixedValue; import org.springblade.core.jwt.JwtUtil; import org.springblade.core.launch.constant.TokenConstant; import org.springblade.core.tool.utils.WebUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; import java.util.List; import java.util.Map; @Slf4j //@Component @Component public class FlowExecutionStartListener implements ExecutionListener { @Autowired(required = false) private IFlowEventClient iFlowEventClient; /** * 远程调用地址。切记:名称要与流程中定义的一样 */ private FixedValue remoteMethod; /** * 状态值。切记:名称要与流程中定义的一样 */ private FixedValue statusValue; @Override public void notify(DelegateExecution execution) { Map var = execution.getVariableInstances(); iFlowEventClient.flowStart(var); log.info("执行流程FlowExecutionStartListener",var); Map variables = execution.getVariables(); String restURL = remoteMethod.getExpressionText(); String status = statusValue.getExpressionText(); //获取业务数据信息 List<String> oids = (List<String>) variables.get(FlowEngineConstant.OIDS); String btmType = (String) variables.get(FlowEngineConstant.BTMTYPE); variables.put(FlowEngineConstant.REMOTE_METHOD,restURL); variables.put(FlowEngineConstant.STATUS_VALUE,status); if(CollectionUtils.isEmpty(oids)){ throw new VciBaseException("执行状态修改事件时,业务数据oid为空!"); } if(StringUtils.isEmpty(btmType)){ throw new VciBaseException("执行状态修改事件时,业务类型btmType为空!"); } if(StringUtils.isEmpty(restURL)){ throw new VciBaseException("执行状态修改事件时,远程调用地址为空!"); } if(StringUtils.isEmpty(status)){ throw new VciBaseException("执行状态修改事件时,状态为空!"); } FlowStatusDTO flowStatusDTO = new FlowStatusDTO(); flowStatusDTO.setBtmType(btmType); flowStatusDTO.setOids(oids); flowStatusDTO.setVariableMap(variables); String token = JwtUtil.getToken(WebUtil.getRequest().getHeader(TokenConstant.HEADER)); HttpComponentsClientHttpRequestFactory requestFactory=new HttpComponentsClientHttpRequestFactory(); requestFactory.setReadTimeout(300000); requestFactory.setConnectionRequestTimeout(300000); requestFactory.setConnectTimeout(300000); RestTemplate restTemplate = new RestTemplate(requestFactory); HttpHeaders headers = new HttpHeaders(); headers.add(TokenConstant.HEADER,token); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity httpEntity = new HttpEntity<>(flowStatusDTO,headers); Map<String, Object> result = null; try { result = restTemplate.postForObject(restURL, httpEntity, Map.class); } catch (HttpClientErrorException e) { throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{},e); }catch (Throwable e){ throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{},e); } if(result == null){ throw new VciBaseException("业务事件时候没有返回值,不确定是否执行成功"); } if(CollectionUtils.isEmpty(result) && !(Boolean) result.get("success")){ throw new VciBaseException((String) result.get("message")); } } } Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/envent/FlowStatusListener.java
@@ -29,6 +29,7 @@ import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestTemplate; import java.util.List; import java.util.Map; @Slf4j @@ -62,13 +63,13 @@ String restURL = remoteMethod.getExpressionText(); String status = statusValue.getExpressionText(); //获取业务数据信息 String oids = (String) taskVariable.get(FlowEngineConstant.OIDS); List<String> oids = (List<String>) taskVariable.get(FlowEngineConstant.OIDS); String btmType = (String) taskVariable.get(FlowEngineConstant.BTMTYPE); taskVariable.put(FlowEngineConstant.REMOTE_METHOD,restURL); taskVariable.put(FlowEngineConstant.STATUS_VALUE,status); if(StringUtils.isEmpty(oids)){ if(CollectionUtils.isEmpty(oids)){ throw new VciBaseException("执行状态修改事件时,业务数据oid为空!"); } if(StringUtils.isEmpty(btmType)){ @@ -86,7 +87,7 @@ FlowStatusDTO flowStatusDTO = new FlowStatusDTO(); flowStatusDTO.setBtmType(btmType); flowStatusDTO.setOids(VciBaseUtil.str2List(oids)); flowStatusDTO.setOids(oids); flowStatusDTO.setVariableMap(taskVariable); flowStatusDTO.setTaskHisVOList(FlowableUtils.listTaskHistory(delegateTask.getProcessInstanceId(),historyService,taskService)); @@ -115,7 +116,6 @@ if(CollectionUtils.isEmpty(result) && !(Boolean) result.get("success")){ throw new VciBaseException((String) result.get("message")); } } }