master
liweidong-hj 1 month ago
parent 8ade9f1231
commit d961b191a2
  1. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/mapper/TaskExecuteRecordMapper.java
  2. 4
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/mapper/TaskExecuteRecordMapper.xml
  3. 21
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/ITaskExecuteRecordService.java
  4. 14
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/PipelineServiceImpl.java
  5. 132
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/TaskExecuteRecordServiceImpl.java

@ -1,10 +1,12 @@
package org.springblade.desk.logistics.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.springblade.desk.logistics.pojo.entity.TaskExecuteRecord;
import java.util.List;
public interface TaskExecuteRecordMapper extends BaseMapper<TaskExecuteRecord> {
TaskExecuteRecord selectByTaskCode(@Param("taskCode") String taskCode);
}

@ -4,4 +4,8 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace = "org.springblade.desk.logistics.mapper.TaskExecuteRecordMapper">
<select id="selectByTaskCode" resultType="org.springblade.desk.logistics.pojo.entity.TaskExecuteRecord">
select id, task_id, task_code, method, start_pos, end_pos, robot_code, status, create_user, create_time, create_dept, update_user, update_time, is_deleted, remark
from LM_TASK_EXECUTE_RECORD where task_code = #{taskCode}
</select>
</mapper>

@ -52,7 +52,7 @@ public interface ITaskExecuteRecordService extends BaseService<TaskExecuteRecord
boolean boundVirtualShelves(String virtualShelvesCode,String stationCode);
/**
* 调用AGV小车 CTU
* 调用AGV小车
* @param taskTyp 任务类型 (QM3,QM5,QM6,QM7)
* @param startPos 开始位置
* @param endPos 结束位置
@ -69,4 +69,23 @@ public interface ITaskExecuteRecordService extends BaseService<TaskExecuteRecord
* @return
*/
boolean inboundRecord(AgvSchedulingTaskVO agvSchedulingTaskVO, Task task);
/**
* ctu调用前置接口
* @param taskCode
* @return
*/
boolean containerToEmpty(String taskCode);
/**
* CTU调用接口
* @param taskTyp 任务模板
* @param ctnrTyp 容器类型
* @param ctnrCode 容器编号
* @param startPos 起点仓位
* @param endPos 终点仓位
* @param type
* @return
*/
boolean genCtuSchedulingTask(String taskTyp,String ctnrTyp, String ctnrCode,String startPos, String endPos, String type);
}

@ -234,7 +234,7 @@ public class PipelineServiceImpl implements IPipelineService {
// 没有空闲站点,走库位逻辑
log.info("无空闲站点,尝试将物料箱移入库位");
return handleLocationLogic(task.getBoxBarcode());
return handleLocationLogic(task);
}
/**
@ -261,11 +261,11 @@ public class PipelineServiceImpl implements IPipelineService {
/**
* 处理库位逻辑
*/
private boolean handleLocationLogic(String boxBarcode) {
private boolean handleLocationLogic(Task task) {
// 1. 查询空闲库位
List<Location> freeLocations = locationService.selectByLocationStatus(Location.STATUS_FREE);
if (CollectionUtils.isEmpty(freeLocations)) {
log.warn("没有空闲库位可用,物料箱:{}", boxBarcode);
log.warn("没有空闲库位可用,物料箱:{}", task.getBoxBarcode());
return false;
}
String targetLocationCode = freeLocations.get(0).getLocationCode();
@ -274,7 +274,7 @@ public class PipelineServiceImpl implements IPipelineService {
// 2. 查询库位梳齿架子
List<Location> combLocations = locationService.selectByStatus(1);
if (CollectionUtils.isEmpty(combLocations)) {
log.warn("没有可用的库位梳齿架子,物料箱:{}", boxBarcode);
log.warn("没有可用的库位梳齿架子,物料箱:{}", task.getBoxBarcode());
return false;
}
String combLocationCode = combLocations.get(0).getLocationCode();
@ -282,10 +282,12 @@ public class PipelineServiceImpl implements IPipelineService {
// 3. 两步操作
log.info("第一步:AGV将物料箱从输送线放入梳齿架子:{}", combLocationCode);
// TODO 调用AGV小车 将输送线物资放入梳齿架子
// 调用AGV小车 将输送线物资放入梳齿架子
boolean agvSchedulingTask = genAgvSchedulingTask
("QM7", Station.PICKUP_CONVEYOR_LINE, combLocationCode, AgvConstant.EQUIPMENT_TYPE_AGV, task);
//第二步 需要agv调用完成之后 给到mes通知接口
log.info("第二步:CTU将物料箱从梳齿架子送往库位:{}", targetLocationCode);
// TODO 调用CTU 将梳齿架子物资放入库位
return true;
}

@ -7,14 +7,19 @@ import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.redisson.executor.TasksService;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.api.R;
import org.springblade.desk.logistics.constant.AgvConstant;
import org.springblade.desk.logistics.mapper.TaskExecuteRecordMapper;
import org.springblade.desk.logistics.pojo.dto.AGVCallBackDto;
import org.springblade.desk.logistics.pojo.entity.Location;
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.ILocationService;
import org.springblade.desk.logistics.service.ITaskExecuteRecordService;
import org.springblade.desk.logistics.service.ITaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
@ -41,6 +46,12 @@ public class TaskExecuteRecordServiceImpl extends BaseServiceImpl<TaskExecuteRec
@Autowired
TaskExecuteRecordMapper taskExecuteRecordMapper;
@Autowired
ITaskService taskService;
@Autowired
ILocationService locationService;
/**
* AGV小车任务状态回调接口
* <p>
@ -112,8 +123,9 @@ public class TaskExecuteRecordServiceImpl extends BaseServiceImpl<TaskExecuteRec
// 5. 任务结束状态:触发后续的东哥接口调用(待实现)
if (method.equals(TaskExecuteRecord.STATUS_END)) {
log.info("任务单号{}已完成,准备调用东哥接口", agvCallBack.getTaskCode());
//todo: 调用东哥接口
// eastBrotherService.notifyTaskComplete(agvCallBack.getTaskCode());
//判断是否需要调用ctu接口
containerToEmpty(agvCallBack.getTaskCode());
}
// 回调处理成功
@ -160,7 +172,7 @@ public class TaskExecuteRecordServiceImpl extends BaseServiceImpl<TaskExecuteRec
// 接口地址
String url = "http://172.22.252.10:8181/rcms/services/rest/hikRpcService/genAgvSchedulingTask";
// 生成唯一标识(请求标识和任务标识使用相同值,便于追踪)
// 生成唯一标识
String reqCode = generateReqCode("AGVT");
String taskCode = reqCode;
@ -247,6 +259,120 @@ public class TaskExecuteRecordServiceImpl extends BaseServiceImpl<TaskExecuteRec
return insert > 0;
}
@Override
public boolean containerToEmpty(String taskCode) {
TaskExecuteRecord taskExecuteRecord = taskExecuteRecordMapper.selectByTaskCode(taskCode);
if(null == taskExecuteRecord){
log.error("未根据taskCode查询到有效数据,请求参数:{}", taskCode);
return false;
}
Task task = taskService.getById(taskExecuteRecord.getTaskId());
if(null == task){
log.error("查询不到Task数据,请求参数:{}", taskExecuteRecord.getTaskId());
return false;
}
if(null == task.getLocationId()){
//证明不需要送到库位
//更新task状态 根据taskCode查询
task.setTaskStatus(Task.STATUS_STATION);
boolean taskUpdate = taskService.updateById(task);
if(!taskUpdate){
log.error("Task状态修改失败");
}
return true;
}
Location location = locationService.getById(task.getLocationId());
boolean ctuSchedulingTask = genCtuSchedulingTask
("CTu2", "1", task.getBoxBarcode(), taskExecuteRecord.getEndPos(), location.getLocationCode(), AgvConstant.EQUIPMENT_TYPE_CTU);
if(!ctuSchedulingTask){
task.setTaskStatus(Task.STATUS_LOCATION);
boolean taskUpdate = taskService.updateById(task);
if(!taskUpdate){
log.error("Task状态修改失败");
}
}
return true;
}
@Override
public boolean genCtuSchedulingTask(String taskTyp, String ctnrTyp, String ctnrCode,
String startPos, String endPos, String type) {
// 接口地址
String url = "http://172.22.252.10:8181/rcms/services/rest/hikRpcService/genAgvSchedulingTask";
// 生成唯一标识
String reqCode = generateReqCode("CTUT");
String taskCode = reqCode;
try {
// 构建请求参数
Map<String, Object> requestBody = new HashMap<>();
requestBody.put("reqCode", reqCode);
requestBody.put("taskCode", taskCode);
requestBody.put("taskTyp", taskTyp);
requestBody.put("ctnrTyp", ctnrTyp);
requestBody.put("ctnrCode", ctnrCode);
// 构建位置路径列表
List<Map<String, String>> positionCodePath = new ArrayList<>();
// 起始位置
Map<String, String> startPosition = new HashMap<>();
startPosition.put("positionCode", startPos);
startPosition.put("type", type);
positionCodePath.add(startPosition);
// 目标位置
Map<String, String> endPosition = new HashMap<>();
endPosition.put("positionCode", endPos);
endPosition.put("type", type);
positionCodePath.add(endPosition);
requestBody.put("positionCodePath", positionCodePath);
// 记录请求日志
log.info("调用CTU调度任务接口,请求参数:{}", JSON.toJSONString(requestBody));
// 发送POST请求
String responseStr = HttpUtil.post(url, JSON.toJSONString(requestBody));
// 记录响应日志
log.info("调用CTU调度任务接口,响应结果:{}", responseStr);
if (!StringUtils.hasText(responseStr)) {
log.error("调用CTU调度任务接口失败,响应为空");
return false;
}
// 解析响应
JSONObject response = JSON.parseObject(responseStr);
String code = response.getString("code");
String message = response.getString("message");
// 判断是否调用成功(code为0表示成功)
if ("0".equals(code)) {
log.info("CTU调度任务创建成功,任务类型:{},任务单号:{},容器编号:{},起始位置:{},目标位置:{}",
taskTyp, taskCode, ctnrCode, startPos, endPos);
return true;
} else {
// code不等于0,输出错误信息
log.error("CTU调度任务创建失败,错误码:{},错误信息:{},任务类型:{},容器编号:{},起始位置:{},目标位置:{}",
code, message, taskTyp, ctnrCode, startPos, endPos);
return false;
}
} catch (Exception e) {
log.error("调用CTU调度任务接口异常,任务类型:{},容器编号:{},起始位置:{},目标位置:{}",
taskTyp, ctnrCode, startPos, endPos, e);
return false;
}
}
/**
* 生成请求唯一标识
* @param prefix 前缀

Loading…
Cancel
Save