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<Task> validBusDto(List<TaskDto> taskDtoList) {
|
List<Task> 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());
|
}
|
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());
|
}
|
// 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<String> 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;
|
}
|
|
}
|