package com.vincent.rsf.server.system.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.vincent.rsf.server.manager.entity.Task; import com.vincent.rsf.server.manager.service.TaskService; import com.vincent.rsf.server.system.entity.FlowInstance; import com.vincent.rsf.server.system.mapper.FlowStepInstanceMapper; import com.vincent.rsf.server.system.entity.FlowStepInstance; import com.vincent.rsf.server.system.service.FlowInstanceService; import com.vincent.rsf.server.system.service.FlowStepInstanceService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Date; import java.util.List; @Service("flowStepInstanceService") public class FlowStepInstanceServiceImpl extends ServiceImpl implements FlowStepInstanceService { @Autowired private TaskService taskService; @Autowired private FlowInstanceService flowInstanceService; @Override @Transactional(rollbackFor = Exception.class) public boolean jumpCurrent(Long id) { try{ FlowStepInstance flowStepInstance = getById(id); if (flowStepInstance == null || flowStepInstance.getFlowInstanceId() == null) return false; Date now = new Date(); String taskNo = flowStepInstance.getTaskNo(); Task one = taskService.getOne(new LambdaQueryWrapper().eq(Task::getTaskCode, taskNo)); FlowInstance flowInstance = flowInstanceService.getById(flowStepInstance.getFlowInstanceId()); List flowInstanceNoList = new ArrayList<>(); List flowInstanceList = flowInstanceService.list(new LambdaQueryWrapper().eq(FlowInstance::getTaskId, flowInstance.getTaskId())); flowInstanceList.forEach(flowInstance1 -> flowInstanceNoList.add(flowInstance1.getFlowInstanceNo())); FlowStepInstance flowStepInstanceNow = getOne(new LambdaQueryWrapper() .eq(FlowStepInstance::getWmsNowTaskStatus, one.getTaskStatus()) .eq(FlowStepInstance::getTaskNo, taskNo) .in(FlowStepInstance::getFlowInstanceNo, flowInstanceNoList) .ge(FlowStepInstance::getStatus, (short) 1) .ne(FlowStepInstance::getStatus, (short) 3).last("limit 1")); if (flowStepInstanceNow == null) return false; int stepOrderDifference = flowStepInstanceNow.getStepOrder() - flowStepInstance.getStepOrder(); if (stepOrderDifference>0) {//回退 for (int i = 1; i <= stepOrderDifference; i++) { FlowStepInstance flowStepInstanceUpdate = getOne(new LambdaQueryWrapper() .eq(FlowStepInstance::getTaskNo, taskNo) .eq(FlowStepInstance::getStepOrder, flowStepInstance.getStepOrder()+i) .in(FlowStepInstance::getFlowInstanceNo, flowInstanceNoList) .last("limit 1")); if (flowStepInstanceUpdate==null) return false; flowStepInstanceUpdate.setStatus((short)0); flowStepInstanceUpdate.setErrorMessage(flowStepInstanceUpdate.getErrorMessage()+now+"人工调整;"); flowStepInstanceUpdate.setErrorCode(now.toString()); flowStepInstanceUpdate.setUpdateTime(now); updateById(flowStepInstanceUpdate); } } else if (stepOrderDifference<0) {//跳转 for (int i = 1; i <= -stepOrderDifference; i++) { FlowStepInstance flowStepInstanceUpdate = getOne(new LambdaQueryWrapper() .eq(FlowStepInstance::getTaskNo, taskNo) .eq(FlowStepInstance::getStepOrder, flowStepInstance.getStepOrder()-i) .in(FlowStepInstance::getFlowInstanceNo, flowInstanceNoList) .last("limit 1")); if (flowStepInstanceUpdate==null) return false; flowStepInstanceUpdate.setStatus((short)3); flowStepInstanceUpdate.setErrorMessage(flowStepInstanceUpdate.getErrorMessage()+now+"人工调整;"); flowStepInstanceUpdate.setErrorCode(now.toString()); flowStepInstanceUpdate.setUpdateTime(now); updateById(flowStepInstanceUpdate); } } flowStepInstance.setErrorMessage(flowStepInstance.getErrorMessage()+now+"人工调整;"); flowStepInstance.setErrorCode(now.toString()); flowStepInstance.setUpdateTime(now); flowStepInstance.setStatus((short)1); updateById(flowStepInstance); one.setTaskStatus(flowStepInstance.getWmsNowTaskStatus()); taskService.updateById(one); } catch (Exception e) { throw new RuntimeException("人工调整出错:" + e); } return true; } }