|
|
|
|
@ -1,4 +1,7 @@ |
|
|
|
|
package org.springblade.desk.logistics.utils; |
|
|
|
|
import org.springblade.desk.logistics.pojo.entity.Station; |
|
|
|
|
import org.springblade.desk.logistics.service.IStationService; |
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
|
|
|
|
|
|
@ -9,103 +12,85 @@ import lombok.extern.slf4j.Slf4j; |
|
|
|
|
@Service |
|
|
|
|
public class AgvTaskTypeUtil { |
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
IStationService stationService; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 获取AGV任务类型 |
|
|
|
|
* @param floor 楼层 (1:一层, 3:三层) |
|
|
|
|
* @param isRecycle 是否回收 (true:空箱回收, false:正常任务) |
|
|
|
|
* @return 任务类型 (QM3, QM5, QM6, QM7) |
|
|
|
|
* 根据起点和终点获取AGV任务类型 |
|
|
|
|
* @param startPosition 起点位置编码 (1001/1002/站点code) |
|
|
|
|
* @param endPosition 终点位置编码 (1001/1002/站点code) |
|
|
|
|
* @return 任务类型 (QM, QM3, QM5, QM6, QM7) |
|
|
|
|
*/ |
|
|
|
|
public String getTaskType(Integer floor, Boolean isRecycle) { |
|
|
|
|
public String getTaskTypeByPositions(String startPosition, String endPosition) { |
|
|
|
|
// 参数校验
|
|
|
|
|
if (floor == null) { |
|
|
|
|
log.error("楼层参数不能为空"); |
|
|
|
|
throw new IllegalArgumentException("楼层参数不能为空"); |
|
|
|
|
if (startPosition == null || endPosition == null) { |
|
|
|
|
log.error("起点或终点位置不能为空"); |
|
|
|
|
throw new IllegalArgumentException("起点和终点位置不能为空"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 默认isRecycle为false
|
|
|
|
|
isRecycle = isRecycle != null ? isRecycle : false; |
|
|
|
|
|
|
|
|
|
String taskType; |
|
|
|
|
// 判断起点和终点的类型及楼层
|
|
|
|
|
boolean isStartConveyorStart = "1002".equals(startPosition); |
|
|
|
|
boolean isStartConveyorEnd = "1001".equals(startPosition); |
|
|
|
|
boolean isEndConveyorStart = "1002".equals(endPosition); |
|
|
|
|
boolean isEndConveyorEnd = "1001".equals(endPosition); |
|
|
|
|
|
|
|
|
|
switch (floor) { |
|
|
|
|
case 1: |
|
|
|
|
// 一层
|
|
|
|
|
if (isRecycle) { |
|
|
|
|
// 一层空箱回收 -> QM6 (同楼层放货放到输送线上)
|
|
|
|
|
taskType = "QM6"; |
|
|
|
|
log.info("一层空箱回收任务,使用QM6"); |
|
|
|
|
} else { |
|
|
|
|
// 一层正常任务 -> QM7 (输送线取货放到普通梳齿架站点)
|
|
|
|
|
taskType = "QM7"; |
|
|
|
|
log.info("一层正常任务,使用QM7"); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
// 获取站点楼层(如果不是站点,返回null)
|
|
|
|
|
Integer startFloor = null; |
|
|
|
|
Integer endFloor = null; |
|
|
|
|
|
|
|
|
|
case 3: |
|
|
|
|
// 三层
|
|
|
|
|
if (isRecycle) { |
|
|
|
|
// 三层空箱回收 -> QM5 (三楼站点取货放到三楼电梯接驳位到一层)
|
|
|
|
|
taskType = "QM5"; |
|
|
|
|
log.info("三层空箱回收任务,使用QM5"); |
|
|
|
|
} else { |
|
|
|
|
// 三层正常任务 -> QM3 (输送线取货-电梯跨楼层)
|
|
|
|
|
taskType = "QM3"; |
|
|
|
|
log.info("三层正常任务,使用QM3"); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
if (!isStartConveyorStart && !isStartConveyorEnd) { |
|
|
|
|
// 起点是站点,查询楼层
|
|
|
|
|
Station startStation = stationService.getByStationCode(startPosition); |
|
|
|
|
if (startStation == null) { |
|
|
|
|
log.error("未找到起点站点信息,站点编码:{}", startPosition); |
|
|
|
|
throw new IllegalArgumentException("无效的起点站点编码:" + startPosition); |
|
|
|
|
} |
|
|
|
|
startFloor = Integer.parseInt(startStation.getStationPosition()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
default: |
|
|
|
|
log.error("不支持的楼层:{}", floor); |
|
|
|
|
throw new IllegalArgumentException("不支持的楼层:" + floor); |
|
|
|
|
if (!isEndConveyorStart && !isEndConveyorEnd) { |
|
|
|
|
// 终点是站点,查询楼层
|
|
|
|
|
Station endStation = stationService.getByStationCode(endPosition); |
|
|
|
|
if (endStation == null) { |
|
|
|
|
log.error("未找到终点站点信息,站点编码:{}", endPosition); |
|
|
|
|
throw new IllegalArgumentException("无效的终点站点编码:" + endPosition); |
|
|
|
|
} |
|
|
|
|
endFloor = Integer.parseInt(endStation.getStationPosition()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return taskType; |
|
|
|
|
} |
|
|
|
|
// 场景1: 站点 <-----> 站点 -> QM
|
|
|
|
|
if (startFloor != null && endFloor != null) { |
|
|
|
|
log.info("站点到站点任务,使用QM"); |
|
|
|
|
return "QM"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 获取AGV任务类型(简化版,只传楼层) |
|
|
|
|
* @param floor 楼层 |
|
|
|
|
* @return 任务类型 |
|
|
|
|
*/ |
|
|
|
|
public String getTaskType(Integer floor) { |
|
|
|
|
return getTaskType(floor, false); |
|
|
|
|
} |
|
|
|
|
// 场景2: 输送线起点(1002) ---> 站点(一层) -> QM7
|
|
|
|
|
if (isStartConveyorStart && endFloor != null && endFloor == 1) { |
|
|
|
|
log.info("输送线起点到一层站点任务,使用QM7"); |
|
|
|
|
return "QM7"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 判断是否为跨楼层任务 |
|
|
|
|
* @param taskType 任务类型 |
|
|
|
|
* @return true:跨楼层 false:同楼层 |
|
|
|
|
*/ |
|
|
|
|
public boolean isCrossFloor(String taskType) { |
|
|
|
|
return "QM3".equals(taskType) || "QM5".equals(taskType); |
|
|
|
|
} |
|
|
|
|
// 场景3: 站点(一层) ----> 输送线终点(1001) -> QM6
|
|
|
|
|
if (startFloor != null && startFloor == 1 && isEndConveyorEnd) { |
|
|
|
|
log.info("一层站点到输送线终点任务,使用QM6"); |
|
|
|
|
return "QM6"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 判断是否为回收任务 |
|
|
|
|
* @param taskType 任务类型 |
|
|
|
|
* @return true:回收任务 false:正常任务 |
|
|
|
|
*/ |
|
|
|
|
public boolean isRecycleTask(String taskType) { |
|
|
|
|
return "QM5".equals(taskType) || "QM6".equals(taskType); |
|
|
|
|
} |
|
|
|
|
// 场景4: 输送线起点(1002) ---> 站点(二层) -> QM3
|
|
|
|
|
if (isStartConveyorStart && endFloor != null && endFloor == 2) { |
|
|
|
|
log.info("输送线起点到二层站点任务,使用QM3"); |
|
|
|
|
return "QM3"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 获取任务描述 |
|
|
|
|
* @param taskType 任务类型 |
|
|
|
|
* @return 任务描述 |
|
|
|
|
*/ |
|
|
|
|
public String getTaskDescription(String taskType) { |
|
|
|
|
switch (taskType) { |
|
|
|
|
case "QM3": |
|
|
|
|
return "输送线取货-电梯跨楼层(小车不做电梯),货物放电梯接驳位,三楼小车接货后放到目标站点"; |
|
|
|
|
case "QM5": |
|
|
|
|
return "三楼站点取货放到三楼电梯接驳位到一层后,一楼小车取电梯内货物放到输送线(空箱回收)"; |
|
|
|
|
case "QM6": |
|
|
|
|
return "同楼层放货放到输送线上(不跨楼层)"; |
|
|
|
|
case "QM7": |
|
|
|
|
return "输送线取货放到普通梳齿架站点(不跨电梯仅同楼层)"; |
|
|
|
|
default: |
|
|
|
|
return "未知任务类型"; |
|
|
|
|
// 场景5: 站点(二层) ----> 输送线终点(1001) -> QM5
|
|
|
|
|
if (startFloor != null && startFloor == 2 && isEndConveyorEnd) { |
|
|
|
|
log.info("二层站点到输送线终点任务,使用QM5"); |
|
|
|
|
return "QM5"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 其他情况,记录日志并抛出异常
|
|
|
|
|
log.error("无法确定任务类型,起点:{},终点:{}", startPosition, endPosition); |
|
|
|
|
throw new IllegalArgumentException("无法确定任务类型,请检查起点和终点位置的组合"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|