agv小车调用

liweidong
liweidong-hj 1 month ago
parent 4f3387aa52
commit 73c5388e42
  1. 10
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/logistics/pojo/entity/Station.java
  2. 6
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/logistics/pojo/entity/TaskExecuteRecord.java
  3. 19
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/constant/AgvConstant.java
  4. 14
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/IPipelineService.java
  5. 8
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/ITaskExecuteRecordService.java
  6. 68
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/PipelineServiceImpl.java
  7. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/StorageMonitoringServiceImpl.java
  8. 24
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/TaskExecuteRecordServiceImpl.java

@ -37,6 +37,16 @@ public class Station extends BaseEntity {
*/
public static final Integer PRE_STATUS_OCCUPIED = 2;
/**
* 取货输送线 站点类型常量
*/
public static final String PICKUP_CONVEYOR_LINE = "1002";
/**
* 放货输送线 站点类型常量
*/
public static final String DROPOFF_CONVEYOR_LINE = "1001";
/**
* 站点名称

@ -75,6 +75,12 @@ public class TaskExecuteRecord extends BaseEntity {
@Schema(description = "任务的ID")
private Long taskId;
/**
* 当前任务单号
*/
@Schema(description = "当前任务单号")
private String taskCode;
/**
* 默认使用方式: start:任务开始 outbin:走出储位 end:任务结束 cancel:任务单取消 apply:CTU料箱取放申请
*/

@ -0,0 +1,19 @@
package org.springblade.desk.logistics.constant;
/**
* @author: liweidong
* @create: 2026-03-06
*/
public interface AgvConstant {
/**
* 设备类型AGV (00)
*/
public static final String EQUIPMENT_TYPE_AGV = "00";
/**
* 设备类型CTU (05)
*/
public static final String EQUIPMENT_TYPE_CTU = "05";
}

@ -26,6 +26,8 @@
package org.springblade.desk.logistics.service;
import org.springblade.core.tool.api.R;
import org.springblade.desk.logistics.pojo.entity.Station;
import org.springblade.desk.logistics.pojo.entity.Task;
import java.math.BigDecimal;
@ -60,4 +62,16 @@ public interface IPipelineService {
* @return
*/
boolean receiveBoxArriveConveyorEnd(String boxBarcode);
/**
* 调用AGV 小车 CTU 封装
* @param taskType 任务类型 (QM3,QM5,QM6,QM7)
* @param startPos 开始位置
* @param endPos 结束位置
* @param type 位置类型00AGV 05CTU
* @param task 任务对象
* @return
*/
boolean genAgvSchedulingTask(String taskType, String startPos, String endPos, String type, Task task);
}

@ -29,6 +29,7 @@ import org.springblade.core.mp.base.BaseService;
import org.springblade.core.tool.api.R;
import org.springblade.desk.logistics.pojo.dto.AGVCallBackDto;
import org.springblade.desk.logistics.pojo.entity.Task;
import org.springblade.desk.logistics.pojo.entity.TaskExecuteRecord;
import org.springblade.desk.logistics.pojo.vo.AgvSchedulingTaskVO;
@ -60,4 +61,11 @@ public interface ITaskExecuteRecordService extends BaseService<TaskExecuteRecord
*/
AgvSchedulingTaskVO genAgvSchedulingTask(String taskTyp, String startPos, String endPos, String type);
/**
* agv ctu 小车调用成功 做记录
* @param agvSchedulingTaskVO agv组装返回参数
* @param task 任务对象
* @return
*/
boolean inboundRecord(AgvSchedulingTaskVO agvSchedulingTaskVO, Task task);
}

@ -26,7 +26,9 @@
package org.springblade.desk.logistics.service.impl;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.tool.api.R;
import org.springblade.desk.logistics.constant.AgvConstant;
import org.springblade.desk.logistics.pojo.entity.*;
import org.springblade.desk.logistics.pojo.vo.AgvSchedulingTaskVO;
import org.springblade.desk.logistics.service.*;
import org.springblade.desk.logistics.utils.AgvTaskTypeUtil;
import org.springframework.beans.factory.annotation.Autowired;
@ -128,6 +130,52 @@ public class PipelineServiceImpl implements IPipelineService {
}
}
@Override
public boolean genAgvSchedulingTask(String taskType, String startPos, String endPos, String type, Task task) {
// 获取虚拟货架
VirtualShelves virtualShelves = virtualShelvesService.getVirtualShelvesCode();
if (null == virtualShelves) {
log.error("获取虚拟货架失败");
return false;
}
// 站点绑定虚拟货架
boolean shelves = taskExecuteRecordService.boundVirtualShelves(
virtualShelves.getVirtualShelvesCode(),
startPos
);
if (!shelves) {
log.error("站点绑定虚拟货架失败");
return false;
}
// 调用AGV
AgvSchedulingTaskVO agvSchedulingTaskVO = taskExecuteRecordService.genAgvSchedulingTask(
taskType,
startPos,
endPos,
type
);
if (null == agvSchedulingTaskVO || !"0".equals(agvSchedulingTaskVO.getCode())) {
log.error("调用AGV调度失败");
return false;
}
// 入库记录
if (null == task) {
return false;
}
boolean record = taskExecuteRecordService.inboundRecord(agvSchedulingTaskVO, task);
if (!record) {
log.error("入库记录保存失败");
return false;
}
return true;
}
/**
* 处理有预占的情况站点没满- 直接送往指定站点
*/
@ -144,27 +192,19 @@ public class PipelineServiceImpl implements IPipelineService {
return false;
}
log.info("站点有预占,将物料箱送往指定站点:{}", station.getStationCode());
String stationPosition = station.getStationPosition();
String taskType = agvTaskTypeUtil.getTaskType(Integer.parseInt(stationPosition));
// 获取虚拟货架
VirtualShelves virtualShelves = virtualShelvesService.getVirtualShelvesCode();
if(null == virtualShelves){
return false;
}
// 站点绑定虚拟货架
boolean shelves = taskExecuteRecordService.boundVirtualShelves(virtualShelves.getVirtualShelvesCode(),"1002");
if(!shelves){
return false;
}
// 入库记录
Task task = taskService.getBoxBarcode(boxBarcode);
// 调用AGV
taskExecuteRecordService.genAgvSchedulingTask(taskType,"1002",station.getStationCode(),"00");
boolean agvSchedulingTask = genAgvSchedulingTask
(taskType, Station.PICKUP_CONVEYOR_LINE, station.getStationCode(), AgvConstant.EQUIPMENT_TYPE_AGV, task);
return true;
return agvSchedulingTask;
}
/**

@ -85,7 +85,7 @@ public class StorageMonitoringServiceImpl implements IStorageMonitoringService {
* - 库位ID/任务/库位信息空值校验跳过异常数据
* - 状态未变化时跳过更新减少数据库IO
*/
@Scheduled(cron = "*/5 * * * * ?") // Spring定时任务注解,cron表达式控制执行频率
// @Scheduled(cron = "*/5 * * * * ?") // Spring定时任务注解,cron表达式控制执行频率
@Override // 实现IStorageMonitoringService接口的抽象方法
public void monitoringStation() {
// ========== 步骤1:查询所有空闲状态的站点 ==========

@ -11,10 +11,11 @@ import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.api.R;
import org.springblade.desk.logistics.mapper.TaskExecuteRecordMapper;
import org.springblade.desk.logistics.pojo.dto.AGVCallBackDto;
import org.springblade.desk.logistics.pojo.entity.Task;
import org.springblade.desk.logistics.pojo.entity.TaskExecuteRecord;
import org.springblade.desk.logistics.pojo.vo.AgvSchedulingTaskVO;
import org.springblade.desk.logistics.service.IOrderBindService;
import org.springblade.desk.logistics.service.ITaskExecuteRecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
@ -37,6 +38,9 @@ import java.util.Map;
@Slf4j
public class TaskExecuteRecordServiceImpl extends BaseServiceImpl<TaskExecuteRecordMapper, TaskExecuteRecord> implements ITaskExecuteRecordService {
@Autowired
TaskExecuteRecordMapper taskExecuteRecordMapper;
/**
* AGV小车任务状态回调接口
* <p>
@ -224,6 +228,24 @@ public class TaskExecuteRecordServiceImpl extends BaseServiceImpl<TaskExecuteRec
}
}
@Override
public boolean inboundRecord(AgvSchedulingTaskVO agvSchedulingTaskVO, Task task) {
if(null == agvSchedulingTaskVO ){
return false;
}
if(null == task){
return false;
}
TaskExecuteRecord taskExecuteRecord = new TaskExecuteRecord();
taskExecuteRecord.setTaskId(task.getId());
taskExecuteRecord.setTaskCode(agvSchedulingTaskVO.getTaskCode());
taskExecuteRecord.setStartPos(agvSchedulingTaskVO.getStartPos());
taskExecuteRecord.setEndPos(agvSchedulingTaskVO.getEndPos());
int insert = taskExecuteRecordMapper.insert(taskExecuteRecord);
return insert > 0;
}
/**
* 生成请求唯一标识
* @param prefix 前缀

Loading…
Cancel
Save