package com.zy.acs.manager.core.service; import com.alibaba.fastjson.JSON; import com.zy.acs.framework.common.Cools; import com.zy.acs.framework.common.SnowflakeIdWorker; import com.zy.acs.manager.common.domain.TaskDto; import com.zy.acs.manager.common.exception.BusinessException; import com.zy.acs.manager.manager.entity.Code; import com.zy.acs.manager.manager.entity.Loc; import com.zy.acs.manager.manager.entity.Sta; import com.zy.acs.manager.manager.entity.Task; import com.zy.acs.manager.manager.enums.TaskTypeType; import com.zy.acs.manager.manager.service.CodeService; import com.zy.acs.manager.manager.service.LocService; import com.zy.acs.manager.manager.service.StaService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; import java.util.Objects; /** * Created by vincent on 2023/6/14 */ @Component("validService") public class ValidService { @Autowired private StaService staService; @Autowired private LocService locService; @Autowired private CodeService codeService; @Autowired private MapService mapService; @Autowired private SnowflakeIdWorker snowflakeIdWorker; public List validTaskDtoList(List taskDtoList) { List taskList = new ArrayList<>(); for (TaskDto taskDto : taskDtoList) { if (Cools.isEmpty(taskDto.getSeqNum())) { throw new BusinessException("Task seqNum can't be empty!"); } Task task = new Task(); taskList.add(task); task.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); task.setSeqNum(taskDto.getSeqNum()); task.setPriority(taskDto.getPriority()); // ori -------------------------- if (!Cools.isEmpty(taskDto.getOriLoc())) { Loc oriLoc = locService.selecatByLocNo(taskDto.getOriLoc()); if (null == oriLoc) { throw new BusinessException("oriLoc: " + taskDto.getOriLoc() + " doesn't exist!"); } task.setOriLoc(oriLoc.getId()); // task.setOriCode(oriLoc.getCode()); } if (!Cools.isEmpty(taskDto.getOriSta())) { Sta oriSta = staService.selectByStaNo(taskDto.getOriSta()); if (null == oriSta) { throw new BusinessException("oriSta: " + taskDto.getOriSta() + " doesn't exist!"); } task.setOriSta(oriSta.getId()); // task.setOriCode(oriSta.getCode()); } // dest -------------------------- if (!Cools.isEmpty(taskDto.getDestLoc())) { Loc destLoc = locService.selecatByLocNo(taskDto.getDestLoc()); if (null == destLoc) { throw new BusinessException("destLoc: " + taskDto.getDestLoc() + " doesn't exist!"); } task.setDestLoc(destLoc.getId()); task.setDestCode(destLoc.getCode()); } if (!Cools.isEmpty(taskDto.getDestSta())) { Sta destSta = staService.selectByStaNo(taskDto.getDestSta()); if (null == destSta) { throw new BusinessException("destSta: " + taskDto.getDestSta() + " doesn't exist!"); } task.setDestSta(destSta.getId()); task.setDestCode(destSta.getCode()); } // task-type ---------------------------------- if (null == task.getOriLoc() && null == task.getOriSta()) { throw new BusinessException("seNum:" + task.getSeqNum() + " is wrong,there must be at least one of oriLoc and oriSta"); } if (null != task.getOriLoc() && null != task.getOriSta()) { throw new BusinessException("seNum:" + task.getSeqNum() + " is wrong,there must be at least one of oriLoc and oriSta"); } if (null == task.getDestLoc() && null == task.getDestSta()) { throw new BusinessException("seNum:" + task.getSeqNum() + " is wrong,either destLoc and destSta must be present"); } if (null != task.getDestLoc() && null != task.getDestSta()) { throw new BusinessException("seNum:" + task.getSeqNum() + " is wrong,either destLoc and destSta must be present"); } if (null != task.getOriSta()) { if (null != task.getDestLoc()) { task.setTaskType(TaskTypeType.STA_TO_LOC.val()); } if (null != task.getDestSta()) { task.setTaskType(TaskTypeType.STA_TO_STA.val()); } } if (null != task.getOriLoc()) { if (null != task.getDestLoc()) { task.setTaskType(TaskTypeType.LOC_TO_LOC.val()); } if (null != task.getDestSta()) { task.setTaskType(TaskTypeType.LOC_TO_STA.val()); } } } // 校验路径合理性 for (Task task : taskList) { Code startCode = null; Code endCode = null; Loc oriLoc = null; Loc destLoc = null; Sta oriSta = null; Sta destSta = null; List pathList = null; switch (Objects.requireNonNull(TaskTypeType.get(task.getTaskTypeEl()))) { case LOC_TO_LOC: oriLoc = locService.getById(task.getOriLoc()); destLoc = locService.getById(task.getDestLoc()); startCode = codeService.getById(oriLoc.getCode()); endCode = codeService.getById(destLoc.getCode()); if (null == startCode) { throw new BusinessException("oriLoc:" + oriLoc.getLocNo() + " hasn't been bound to a QrCode yet"); } if (null == endCode) { throw new BusinessException("destLoc:" + destLoc.getLocNo() + " is not bound to a QrCode yet"); } pathList = mapService.validFeasibility(startCode, endCode); if (Cools.isEmpty(pathList)) { throw new BusinessException("seqNum:" + task.getSeqNum() + " is wrong,oriLoc:" + task.getOriLoc() + " is unable to reach destLoc" + task.getDestLoc()); } task.setPhase(JSON.toJSONString(pathList)); break; case LOC_TO_STA: oriLoc = locService.getById(task.getOriLoc()); destSta = staService.getById(task.getDestSta()); startCode = codeService.getById(oriLoc.getCode()); endCode = codeService.getById(destSta.getCode()); if (null == startCode) { throw new BusinessException("oriLoc:" + oriLoc.getLocNo() + " hasn't been bound to QrCode yet"); } if (null == endCode) { throw new BusinessException("destSta:" + destSta.getStaNo() + " is not bound to QrCode yet"); } pathList = mapService.validFeasibility(startCode, endCode); if (Cools.isEmpty(pathList)) { throw new BusinessException("seqNum:" + task.getSeqNum() + " is wrong,oriLoc:" + task.getOriLoc() + " can't move to destSta" + task.getDestSta()); } task.setPhase(JSON.toJSONString(pathList)); break; case STA_TO_LOC: oriSta = staService.getById(task.getOriSta()); destLoc = locService.getById(task.getDestLoc()); startCode = codeService.getById(oriSta.getCode()); endCode = codeService.getById(destLoc.getCode()); if (null == startCode) { throw new BusinessException("oriSta:" + oriSta.getStaNo() + " hasn't bound to QrCode yet"); } if (null == endCode) { throw new BusinessException("destLoc:" + destLoc.getLocNo() + " is not bound to QrCode yet"); } pathList = mapService.validFeasibility(startCode, endCode); if (Cools.isEmpty(pathList)) { throw new BusinessException("seqNum:" + task.getSeqNum() + " is wrong,oriSta:" + task.getOriSta() + " is unable to react destLoc" + task.getDestLoc()); } task.setPhase(JSON.toJSONString(pathList)); break; case STA_TO_STA: oriSta = staService.getById(task.getOriSta()); destSta = staService.getById(task.getDestSta()); startCode = codeService.getById(oriSta.getCode()); endCode = codeService.getById(destSta.getCode()); if (null == startCode) { throw new BusinessException("oriSta:" + oriSta.getStaNo() + " hasn't been bound to a QrCode yet"); } if (null == endCode) { throw new BusinessException("destSta:" + destSta.getStaNo() + " is not bound to a QrCode yet"); } pathList = mapService.validFeasibility(startCode, endCode); if (Cools.isEmpty(pathList)) { throw new BusinessException("seqNum:" + task.getSeqNum() + " is wrong,oriSta:" + task.getOriSta() + " can't move to destSta" + task.getDestSta()); } task.setPhase(JSON.toJSONString(pathList)); break; default: throw new BusinessException("seqNum:" + task.getSeqNum() + " is wrong, cause this type not exist"); } } return taskList; } }