package com.vci.ubcs.flow.engine.envent; import com.vci.ubcs.flow.core.constant.ProcessConstant; 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.TaskListener; import org.flowable.engine.impl.el.FixedValue; import org.flowable.task.service.delegate.DelegateTask; 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 FlowStatusListener implements TaskListener, 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(DelegateTask delegateTask) { Map taskVariable = delegateTask.getVariables(); boolean pass = (boolean) taskVariable.get(ProcessConstant.PASS_KEY); //获取状态修改信息 if(pass){ String restURL = remoteMethod.getExpressionText(); String status = statusValue.getExpressionText(); //获取业务数据信息 List oids = (List) taskVariable.get(FlowEngineConstant.OIDS); String btmType = (String) taskVariable.get(FlowEngineConstant.BTMTYPE); taskVariable.put(FlowEngineConstant.REMOTE_METHOD,restURL); taskVariable.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(taskVariable); flowStatusDTO.setTaskHisVOList(FlowableUtils.listTaskHistory(delegateTask.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 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")); } } } }