大件运输联网系统后端代码
guoshilong
2022-12-27 c310e85a79c69e711076c7a246205d8cfe45ac75
src/main/java/org/springblade/modules/applicationCarChange/service/impl/ApplicationCarChangeServiceImpl.java
@@ -16,13 +16,44 @@
 */
package org.springblade.modules.applicationCarChange.service.impl;
import lombok.AllArgsConstructor;
import org.flowable.bpmn.model.*;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.springblade.common.constant.AuditStatusConstant;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.support.Kv;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.flow.business.service.IFlowService;
import org.springblade.flow.core.constant.ProcessConstant;
import org.springblade.flow.core.entity.BladeFlow;
import org.springblade.flow.core.utils.FlowUtil;
import org.springblade.modules.application.entity.ApplicationEntity;
import org.springblade.modules.application.entity.BasicInfoEntity;
import org.springblade.modules.application.entity.CarEntity;
import org.springblade.modules.application.service.IApplicationService;
import org.springblade.modules.application.service.ICarService;
import org.springblade.modules.application.vo.ApplicationVO;
import org.springblade.modules.application.wrapper.ApplicationWrapper;
import org.springblade.modules.applicationCarChange.entity.ApplicationCarChangeEntity;
import org.springblade.modules.applicationCarChange.vo.ApplicationCarChangeVO;
import org.springblade.modules.applicationCarChange.mapper.ApplicationCarChangeMapper;
import org.springblade.modules.applicationCarChange.service.IApplicationCarChangeService;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.modules.applicationCarChange.wrapper.ApplicationCarChangeWrapper;
import org.springblade.modules.applicationDelay.entity.ApplicationDelayEntity;
import org.springblade.modules.applicationDelay.vo.ApplicationDelayVO;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.util.List;
import java.util.Map;
/**
 * 车辆变更申请表 服务实现类
@@ -31,12 +62,140 @@
 * @since 2022-12-13
 */
@Service
@AllArgsConstructor
public class ApplicationCarChangeServiceImpl extends BaseServiceImpl<ApplicationCarChangeMapper, ApplicationCarChangeEntity> implements IApplicationCarChangeService {
   private final ICarService carService;
   private final IApplicationService applicationService;
   private final IFlowService flowService;
   private final TaskService taskService;
   private final RuntimeService runtimeService;
   private final RepositoryService repositoryService;
   @Override
   public IPage<ApplicationCarChangeVO> selectApplicationCarChangePage(IPage<ApplicationCarChangeVO> page, ApplicationCarChangeVO applicationCarChange) {
      return page.setRecords(baseMapper.selectApplicationCarChangePage(page, applicationCarChange));
   }
   @Override
   public Boolean startProcess(ApplicationCarChangeEntity entity, CarEntity carEntity) {
      String businessTable = FlowUtil.getBusinessTable(ProcessConstant.CAR_CHANGE_AUDIT);
      if (Func.isEmpty(entity.getId())) {
         // 保存变更信息
         save(entity);
         //保存车辆信息
         ApplicationEntity applicationEntity = applicationService.getByNo(entity.getNo());
         carEntity.setCarChangeId(entity.getId().toString());
         carEntity.setApplicationId(applicationEntity.getId().toString());
         carService.save(carEntity);
         // 启动流程
         Kv variables = Kv.create()
            .set(ProcessConstant.TASK_VARIABLE_CREATE_USER, AuthUtil.getUserName());
         BladeFlow flow = flowService.startProcessInstanceById(entity.getProcessDefinitionId(), FlowUtil.getBusinessKey(businessTable, String.valueOf(entity.getId())), variables);
         if (Func.isNotEmpty(flow)) {
            log.debug("流程已启动,流程ID:" + flow.getProcessInstanceId());
            // 返回流程id写入leave
            entity.setProcessInstanceId(flow.getProcessInstanceId());
            updateById(entity);
         } else {
            throw new ServiceException("开启流程失败");
         }
      } else {
         updateById(entity);
      }
      return true;
   }
   @Override
   public Boolean completeTask(BladeFlow flow) {
      String taskId = flow.getTaskId();
      String processInstanceId = flow.getProcessInstanceId();
      String comment = Func.toStr(flow.getComment(), ProcessConstant.PASS_COMMENT);
      // 增加评论
      if (StringUtil.isNoneBlank(processInstanceId, comment)) {
         taskService.addComment(taskId, processInstanceId, comment);
      }
      Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
      ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
      // 通过流程实例获取“业务键”
      String businessKey = pi.getBusinessKey().split(":")[1];
      //获取实例对象
      ApplicationCarChangeEntity entity = getById(businessKey);
      ApplicationEntity applicationEntity = applicationService.getByNo(entity.getNo());
      //驳回时
      if (!flow.isPass()){
         entity.setStatus(AuditStatusConstant.REJECT_AUDIT);
      }
      //通过且下一个节点结束流程时
      if (flow.isPass() && getEndNode(task, entity.getProcessDefinitionId())) {
         //替换车辆信息
         CarEntity searchCar = new CarEntity();
         searchCar.setApplicationId(applicationEntity.getId().toString());
         List<CarEntity> listCar = carService.list(Condition.getQueryWrapper(searchCar));
         listCar.forEach(car->{
            if (car.getStatus().equals("1")){
               car.setStatus("2");
            }else if (car.getStatus().equals("3") && car.getCarChangeId().equals(entity.getId().toString())){
               car.setStatus("1");
            }
         });
         carService.updateBatchById(listCar);
         //修改流程状态
         entity.setStatus(AuditStatusConstant.FINISH);
      }
      updateById(entity);
      // 创建变量
      Map<String, Object> variables = flow.getVariables();
      if (variables == null) {
         variables = Kv.create();
      }
      variables.put(ProcessConstant.PASS_KEY, flow.isPass());
      // 完成任务
      taskService.complete(taskId, variables);
      return true;
   }
   @Override
   public ApplicationCarChangeVO getVo(ApplicationCarChangeEntity detail) {
      ApplicationCarChangeVO vo = ApplicationCarChangeWrapper.build().entityVO(detail);
      CarEntity carEntity = new CarEntity();
      carEntity.setCarChangeId(detail.getId().toString());
      carEntity.setStatus("3");
      vo.setCarEntity(carService.getOne(Condition.getQueryWrapper(carEntity)));
      return vo;
   }
   /**
    * 判断是否包含最终节点且为倒数第二个节点
    * @param task
    * @param definitionId
    * @return
    */
   public boolean getEndNode(Task task, String definitionId){
      boolean isEnd=false;
      boolean finalTask = false;
      BpmnModel bpmnModel = repositoryService.getBpmnModel(definitionId);
      FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey());
      List<SequenceFlow> outgoingFlows = flowNode.getOutgoingFlows();
      for (SequenceFlow outgoingFlow : outgoingFlows) {
         FlowElement targetFlowElement = outgoingFlow.getTargetFlowElement();
         FlowElement sourceFlowElement = outgoingFlow.getSourceFlowElement();
         if (sourceFlowElement.getId().equals("finalTask")){
            finalTask = true;
         }
         if (targetFlowElement instanceof EndEvent){
            isEnd = true;
            break;
         }
      }
      return isEnd&&finalTask;
   }
}