| | |
| | | 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")); |
| | | } |
| | | } |
| | | } |