状态修改

liweidong
liweidong-hj 1 month ago
parent 3ae4747c61
commit 56c548de81
  1. 4
      blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java
  2. 74
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/logistics/pojo/entity/Task.java
  3. 13
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/constant/AgvConstant.java
  4. 19
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/controller/PipelineController.java
  5. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/mapper/StationMapper.java
  6. 4
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/mapper/StationMapper.xml
  7. 4
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/IStationService.java
  8. 3
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/ITaskService.java
  9. 15
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/IOrderBoxServiceImpl.java
  10. 16
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/IPipelineOrderBoxServiceImpl.java
  11. 10
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/PipelineServiceImpl.java
  12. 4
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/StationServiceImpl.java
  13. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/StorageMonitoringServiceImpl.java
  14. 8
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/TaskExecuteRecordServiceImpl.java
  15. 3
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/TaskServiceImpl.java
  16. 151
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/utils/AgvTaskTypeUtil.java

@ -31,8 +31,8 @@ public interface LauncherConstant {
/**
* nacos dev 地址
*/
String NACOS_DEV_ADDR = "192.168.249.27:8848";
// String NACOS_DEV_ADDR = "192.168.0.3:8848";
// String NACOS_DEV_ADDR = "192.168.249.27:8848";
String NACOS_DEV_ADDR = "127.0.0.1:8848";
/**
* nacos prod 地址

@ -26,12 +26,7 @@ public class Task extends BaseEntity {
/**
* 起点位置
*/
public static final Integer STATUS_START = 0;
/**
* 输送线起点
*/
public static final Integer STATUS_CONVEYOR_START = 1;
public static final Integer STATUS_START = 1;
/**
* 退回(超重)
@ -39,39 +34,20 @@ public class Task extends BaseEntity {
public static final Integer STATUS_RETURNED = 2;
/**
* 输送线末尾
* 输送线末尾(配送中)
*/
public static final Integer STATUS_CONVEYOR_END = 3;
/**
* 站点
*/
public static final Integer STATUS_STATION = 4;
/**
* 库位
*/
public static final Integer STATUS_LOCATION = 5;
/**
* 等待
*/
public static final Integer STATUS_WAITING = 6;
/**
* 站点接收
*/
public static final Integer STATUS_STATION_RECEIVE = 7;
/**
* 回库
* 结束
*/
public static final Integer STATUS_BACK_TO_STORAGE = 8;
public static final Integer STATUS_FINISHED = 4;
/**
* 结束
* 失败
*/
public static final Integer STATUS_FINISHED = 9;
public static final Integer STATUS_FAILING = 5;
/**
* ID主键
@ -125,42 +101,4 @@ public class Task extends BaseEntity {
@Schema(description = "备注")
private String remark;
/**
* 获取状态描述
* @return 状态描述
*/
public String getStatusDesc() {
return getStatusDesc(this.taskStatus);
}
/**
* 根据状态值获取状态描述
* @param status 状态值
* @return 状态描述
*/
public static String getStatusDesc(Integer status) {
if (STATUS_RETURNED.equals(status)) {
return "退回(超重)";
} else if (STATUS_STATION.equals(status)) {
return "站点";
} else if (STATUS_LOCATION.equals(status)) {
return "库位";
} else if (STATUS_WAITING.equals(status)) {
return "等待";
} else if (STATUS_BACK_TO_STORAGE.equals(status)) {
return "回库";
} else if (STATUS_FINISHED.equals(status)) {
return "结束";
}else if (STATUS_START.equals(status)) {
return "起点位置";
}else if (STATUS_CONVEYOR_START.equals(status)) {
return "输送线起点";
}else if (STATUS_CONVEYOR_END.equals(status)) {
return "输送线末尾";
}else if (STATUS_STATION_RECEIVE.equals(status)) {
return "站点接收";
} else {
return "未知状态";
}
}
}

@ -16,4 +16,17 @@ public interface AgvConstant {
*/
public static final String EQUIPMENT_TYPE_CTU = "05";
/**
* 任务模板CTU
*/
public static final String CTU_TASK_TYP = "QM1";
/**
* 容器类型CTU
*/
public static final String CTU_CTNR_TYP = "1";
}

@ -35,7 +35,9 @@ import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.tool.api.R;
import org.springblade.desk.basic.util.StatusCountMap;
import org.springblade.desk.logistics.pojo.entity.Station;
import org.springblade.desk.logistics.service.IPipelineService;
import org.springblade.desk.logistics.utils.AgvTaskTypeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -145,6 +147,8 @@ public class PipelineController extends BladeController {
return R.data(isPassed);
}
@Autowired
AgvTaskTypeUtil agvTaskTypeUtil;
/**
* 接收空物料箱到输送线通知
@ -162,6 +166,21 @@ public class PipelineController extends BladeController {
}
/**
* 接收空物料箱到输送线通知
*/
@GetMapping("/test")
@ApiOperationSupport(order = 4)
@Operation(summary = "接收物料箱", description = "传入箱条码")
public R test(@RequestParam String test1,@RequestParam String test2) {
String taskType = agvTaskTypeUtil.getTaskTypeByPositions(test1,test2);
return R.data(true);
}

@ -11,5 +11,5 @@ public interface StationMapper extends BaseMapper<Station> {
List<Station> selectByWcId(@Param("wcId") Long wcId);
Station selectByStationPosition(@Param("StationPosition") String freeStationCode);
Station selectByStationCode(@Param("StationCode") String StationCode);
}

@ -10,8 +10,8 @@
from LM_STATION where IS_DELETED = 0 and WC_ID = #{wcId}
</select>
<select id="selectByStationPosition" resultType="org.springblade.desk.logistics.pojo.entity.Station">
<select id="selectByStationCode" resultType="org.springblade.desk.logistics.pojo.entity.Station">
select id, station_name, station_code, station_status, status, create_user, create_time, create_dept, update_user, update_time, is_deleted, remark, station_position, wc_id
from LM_STATION where IS_DELETED = 0 and STATION_POSITION = #{StationPosition}
from LM_STATION where IS_DELETED = 0 and STATION_CODE = #{StationCode}
</select>
</mapper>

@ -48,8 +48,8 @@ public interface IStationService extends BaseService<Station> {
/**
* 根据站点编码 查询站点信息
* @param freeStationCode
* @param stationCode
* @return
*/
Station getByStationPosition(String freeStationCode);
Station getByStationCode(String stationCode);
}

@ -45,9 +45,8 @@ public interface ITaskService extends BaseService<Task> {
* 保存输送线称重数据
* @param boxBarcode 箱条码
* @param actualWeight 输送线重量
* @param statusReturned 任务状态
*/
void savePipelineWeigh(String boxBarcode, BigDecimal actualWeight, Integer statusReturned);
void savePipelineWeigh(String boxBarcode, BigDecimal actualWeight);
/**
* 获取输送箱信息

@ -70,13 +70,10 @@ public class IOrderBoxServiceImpl implements IOrderBoxService {
static {
// 初始化运行中任务状态
RUNNING_STATUSES.add(Task.STATUS_START); // 任务启动
RUNNING_STATUSES.add(Task.STATUS_CONVEYOR_START); // 输送机启动
RUNNING_STATUSES.add(Task.STATUS_CONVEYOR_END); // 输送机结束
RUNNING_STATUSES.add(Task.STATUS_STATION); // 站点状态
RUNNING_STATUSES.add(Task.STATUS_LOCATION); // 库位状态
RUNNING_STATUSES.add(Task.STATUS_WAITING); // 等待状态
RUNNING_STATUSES.add(Task.STATUS_STATION_RECEIVE);// 站点接收
RUNNING_STATUSES.add(Task.STATUS_BACK_TO_STORAGE);// 返库状态
RUNNING_STATUSES.add(Task.STATUS_RETURNED); // 退回
RUNNING_STATUSES.add(Task.STATUS_CONVEYOR_END); // 配送
RUNNING_STATUSES.add(Task.STATUS_FINISHED); // 结束
RUNNING_STATUSES.add(Task.STATUS_FAILING); // 失败
}
public IOrderBoxServiceImpl(IYieldOrderService iYieldOrderService, ITaskService iTaskService, IOrderBindService iOrderBindService, IStationService iStationService, ILocationService iLocationService, AgvTaskTypeUtil agvTaskTypeUtil, IBsWorkCenterService bsWorkCenterService, ITaskExecuteRecordService iTaskExecuteRecordService) {
@ -324,7 +321,7 @@ public class IOrderBoxServiceImpl implements IOrderBoxService {
try {
// 2. 获取AGV任务类型并调用调度接口
String taskType = agvTaskTypeUtil.getTaskType(Integer.valueOf(targetStation.getStationPosition()), true);
String taskType = agvTaskTypeUtil.getTaskTypeByPositions(stationCode,DROPOFF_CONVEYOR_LINE);
boolean agvResult = iTaskExecuteRecordService.genAgvSchedulingTask(
taskType, stationCode, DROPOFF_CONVEYOR_LINE, EQUIPMENT_TYPE_AGV, taskList.get(0)
);
@ -358,7 +355,7 @@ public class IOrderBoxServiceImpl implements IOrderBoxService {
try {
// 3. 获取AGV任务类型并调用调度接口
String taskType = agvTaskTypeUtil.getTaskType(Integer.valueOf(targetStation.getStationPosition()), false);
String taskType = agvTaskTypeUtil.getTaskTypeByPositions(sourceStationCode,endStation.getStationCode());
boolean agvResult = iTaskExecuteRecordService.genAgvSchedulingTask(
taskType, sourceStationCode, endStation.getStationCode(), EQUIPMENT_TYPE_AGV, taskList.get(0)
);

@ -46,15 +46,13 @@ public class IPipelineOrderBoxServiceImpl implements IPipelineOrderBoxService {
private static final Set<Integer> RUNNING_STATUSES = new HashSet<>();
static {
// 初始化运行中任务状态
RUNNING_STATUSES.add(Task.STATUS_START); // 任务启动
RUNNING_STATUSES.add(Task.STATUS_CONVEYOR_START); // 输送机启动
RUNNING_STATUSES.add(Task.STATUS_CONVEYOR_END); // 输送机结束
RUNNING_STATUSES.add(Task.STATUS_STATION); // 站点状态
RUNNING_STATUSES.add(Task.STATUS_LOCATION); // 库位状态
RUNNING_STATUSES.add(Task.STATUS_WAITING); // 等待状态
RUNNING_STATUSES.add(Task.STATUS_STATION_RECEIVE);// 站点接收
RUNNING_STATUSES.add(Task.STATUS_BACK_TO_STORAGE);// 返库状态
// // 初始化运行中任务状态
// RUNNING_STATUSES.add(Task.STATUS_START); // 任务启动
// RUNNING_STATUSES.add(Task.STATUS_CONVEYOR_END); // 输送机结束
// RUNNING_STATUSES.add(Task.STATUS_LOCATION); // 库位状态
// RUNNING_STATUSES.add(Task.STATUS_WAITING); // 等待状态
// RUNNING_STATUSES.add(Task.STATUS_STATION_RECEIVE);// 站点接收
// RUNNING_STATUSES.add(Task.STATUS_BACK_TO_STORAGE);// 返库状态
}
public IPipelineOrderBoxServiceImpl(ITaskService iTaskService, IStationService iStationService, ILocationService iLocationService, IOrderBindService iOrderBindService) {

@ -78,7 +78,7 @@ public class PipelineServiceImpl implements IPipelineService {
// 1. 判断是否超重
if (WeighData.RETURN_STATUS_RETURNED.equals(returnStatus)) {
// 2. 保存称重数据
taskService.savePipelineWeigh(boxBarcode,actualWeight, Task.STATUS_RETURNED);
taskService.savePipelineWeigh(boxBarcode,actualWeight);
// 3.超重处理,解绑
R ret = iPipelineOrderBoxService.boxOrderUnbind(boxBarcode);
@ -89,7 +89,7 @@ public class PipelineServiceImpl implements IPipelineService {
return false;
} else {
// 2. 保存称重数据
taskService.savePipelineWeigh(boxBarcode,actualWeight, Task.STATUS_CONVEYOR_START);
taskService.savePipelineWeigh(boxBarcode,actualWeight);
log.info("物料箱[{}]重量校验通过", boxBarcode);
return true;
}
@ -152,8 +152,7 @@ public class PipelineServiceImpl implements IPipelineService {
log.info("站点有预占,将物料箱送往指定站点:{}", station.getStationCode());
String stationPosition = station.getStationPosition();
String taskType = agvTaskTypeUtil.getTaskType(Integer.parseInt(stationPosition));
String taskType = agvTaskTypeUtil.getTaskTypeByPositions(Station.PICKUP_CONVEYOR_LINE,station.getStationCode());
// 入库记录
Task task = taskService.getBoxBarcode(boxBarcode);
@ -178,8 +177,7 @@ public class PipelineServiceImpl implements IPipelineService {
if (null != station) {
log.info("找到空闲站点:{},将物料箱送往该站点", station.getStationCode());
String stationPosition = station.getStationPosition();
String taskType = agvTaskTypeUtil.getTaskType(Integer.parseInt(stationPosition));
String taskType = agvTaskTypeUtil.getTaskTypeByPositions(Station.PICKUP_CONVEYOR_LINE,station.getStationCode());
boolean agvSchedulingTask = iTaskExecuteRecordService.genAgvSchedulingTask
(taskType, Station.PICKUP_CONVEYOR_LINE, station.getStationCode(), AgvConstant.EQUIPMENT_TYPE_AGV, task);

@ -54,7 +54,7 @@ public class StationServiceImpl extends BaseServiceImpl<StationMapper, Station>
}
@Override
public Station getByStationPosition(String freeStationCode) {
return stationMapper.selectByStationPosition(freeStationCode);
public Station getByStationCode(String stationCode) {
return stationMapper.selectByStationCode(stationCode);
}
}

@ -182,7 +182,7 @@ public class StorageMonitoringServiceImpl implements IStorageMonitoringService {
String locationCode = locationList.get(0).getLocationCode();
//调用ctu
AgvSchedulingTaskVO ctuSchedulingTask = taskExecuteRecordService.genCtuSchedulingTask("QM1", "1", firstTask.getBoxBarcode(), location.getLocationCode(),
AgvSchedulingTaskVO ctuSchedulingTask = taskExecuteRecordService.genCtuSchedulingTask(AgvConstant.CTU_TASK_TYP, AgvConstant.CTU_CTNR_TYP, firstTask.getBoxBarcode(), location.getLocationCode(),
locationCode, AgvConstant.EQUIPMENT_TYPE_CTU);
//调用成功 添加任务

@ -292,7 +292,7 @@ public class TaskExecuteRecordServiceImpl extends BaseServiceImpl<TaskExecuteRe
if(null == task.getLocationId()){
//证明不需要送到库位
//更新task状态 根据taskCode查询
task.setTaskStatus(Task.STATUS_STATION);
task.setTaskStatus(Task.STATUS_FINISHED);
boolean taskUpdate = taskService.updateById(task);
if(!taskUpdate){
log.error("Task状态修改失败");
@ -303,10 +303,10 @@ public class TaskExecuteRecordServiceImpl extends BaseServiceImpl<TaskExecuteRe
Location location = locationService.getById(task.getLocationId());
AgvSchedulingTaskVO ctuSchedulingTask = genCtuSchedulingTask
("QM1", "1", task.getBoxBarcode(), taskExecuteRecord.getEndPos(), location.getLocationCode(), AgvConstant.EQUIPMENT_TYPE_CTU);
(AgvConstant.CTU_TASK_TYP, AgvConstant.CTU_CTNR_TYP, task.getBoxBarcode(), taskExecuteRecord.getEndPos(), location.getLocationCode(), AgvConstant.EQUIPMENT_TYPE_CTU);
if(null != ctuSchedulingTask){
task.setTaskStatus(Task.STATUS_LOCATION);
task.setTaskStatus(Task.STATUS_FINISHED);
boolean taskUpdate = taskService.updateById(task);
if(!taskUpdate){
log.error("Task状态修改失败");
@ -423,7 +423,7 @@ public class TaskExecuteRecordServiceImpl extends BaseServiceImpl<TaskExecuteRe
//调用agv小车
// 调用AGV
String taskType = agvTaskTypeUtil.getTaskType(Integer.valueOf(station.getStationPosition()));
String taskType = agvTaskTypeUtil.getTaskTypeByPositions(location.getLocationCode(),station.getStationCode());
boolean agvResult = genAgvSchedulingTask(
taskType, location.getLocationCode(),station.getStationCode() , EQUIPMENT_TYPE_AGV, task

@ -56,12 +56,11 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
TaskMapper taskMapper;
@Override
public void savePipelineWeigh(String boxBarcode, BigDecimal actualWeight, Integer statusReturned) {
public void savePipelineWeigh(String boxBarcode, BigDecimal actualWeight) {
// 1.查询物料箱 筛选状态
Task task = taskMapper.selectByBoxBarcode(boxBarcode);
// 2.更新重量以及任务状态
task.setMachineWeight(actualWeight);
task.setTaskStatus(statusReturned);
taskMapper.updateById(task);
}

@ -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("无法确定任务类型,请检查起点和终点位置的组合");
}
}

Loading…
Cancel
Save