Merge remote-tracking branch 'origin/master'

liweidong
liuqingkun 1 month ago
commit 9daa3e1277
  1. 50
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/logistics/pojo/entity/AGVCallBack.java
  2. 109
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/logistics/pojo/entity/TaskExecuteRecord.java
  3. 48
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/controller/AGVDockingController.java
  4. 10
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/mapper/TaskExecuteRecordMapper.java
  5. 7
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/mapper/TaskExecuteRecordMapper.xml
  6. 6
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/IStorageMonitoringService.java
  7. 43
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/ITaskExecuteRecordService.java
  8. 5
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/IOrderBoxServiceImpl.java
  9. 50
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/StorageMonitoringServiceImpl.java
  10. 72
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/TaskExecuteRecordServiceImpl.java

@ -0,0 +1,50 @@
package org.springblade.desk.logistics.pojo.entity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema(description = "箱绑定接收")
public class AGVCallBack {
/**
* 请求编号每个请求都要一个唯一
* 编号 同一个请求重复提交 使
* 用同一编号
*/
private String reqCode;
/**
* 请求时间戳格式: yyyy-MM-dd
* HH:mm:ss
*/
private String reqTime;
/**
当前位置编号
任务开始该位置为任务起点
走出储位该位置为任务起点
任务单取消该位置为工作位编号
任务结束该位置为任务终点
取放申请取放料箱的点
*/
private String currentPositionCode;
/**
方法名, 可使用任务类型做为方法
RCS-2000 任务模板配置后并告
知上层系统
默认使用方式:
start : 任务开始
outbin : 走出储位
end : 任务结束
cancel : 任务单取消
applyCTU 料箱取放申请
*/
private String method;
/**
AGV 编号 agvCode
*/
private String robotCode;
/**
当前任务单号
*/
private String taskCode;
}

@ -0,0 +1,109 @@
package org.springblade.desk.logistics.pojo.entity;
/**
* @author: liweidong
* @create: 2026-03-03
*/
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.mp.base.BaseEntity;
import java.io.Serial;
/**
* 物流库位实体类
*
* @author
* @since
*/
@Data
@TableName("LM_TASK_EXECUTE_RECORD")
@Schema(description = "AGV小车对接表")
@EqualsAndHashCode(callSuper = true)
public class TaskExecuteRecord extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 状态常量任务开始
*/
public static final String STATUS_START = "start";
/**
* 状态常量走出储位
*/
public static final String STATUS_END = "end";
/**
* 状态常量任务单取消
*/
public static final String STATUS_CANCEL = "cancel";
/**
* 状态常量走出储位
*/
public static final String STATUS_OUTBIN = "outbin";
/**
* 状态常量CTU料箱取放申请
*/
public static final String STATUS_APPLY = "apply";
/**
* 状态常量送料申请
*/
public static final String STATUS_FROMAGV = "fromAgv";
/**
* 状态常量对接结束释放
*/
public static final String STATUS_RELEASE = "release";
/**
* 状态常量放料申请
*/
public static final String STATUS_TOAGV = "toAgv";
/**
* 任务的ID
*/
@Schema(description = "任务的ID")
private Long taskId;
/**
* 默认使用方式: start:任务开始 outbin:走出储位 end:任务结束 cancel:任务单取消 apply:CTU料箱取放申请
*/
@Schema(description = "默认使用方式: start:任务开始 outbin:走出储位 end:任务结束 cancel:任务单取消 apply:CTU料箱取放申请")
private String method;
/**
* 开始位置
*/
@Schema(description = "开始位置")
private String startPos;
/**
* 结束位置
*/
@Schema(description = "结束位置")
private String endPos;
/**
* AGV编号
*/
@Schema(description = "AGV编号")
private String robotCode;
/**
* 备注
*/
@Schema(description = "备注")
private String remark;
}

@ -0,0 +1,48 @@
package org.springblade.desk.logistics.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.springblade.core.tool.api.R;
import org.springblade.desk.logistics.pojo.entity.AGVCallBack;
import org.springblade.desk.logistics.service.IOrderBoxService;
import org.springblade.desk.logistics.service.ITaskExecuteRecordService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* agv小车 控制器
*
* @author BladeX
* @since 2026-03-03
*/
@RestController
@AllArgsConstructor
@RequestMapping("/agv")
@Tag(name = "agv小车接口", description = "agv小车对接接口")
public class AGVDockingController {
private final ITaskExecuteRecordService iTaskExecuteRecordService;
@PostMapping("/agvCallbackService/agvCallback")
@ApiOperationSupport(order = 1)
@Operation(
summary = "agv小车回调接口",
description = "AGV小车回调接口"
)
public R agvCallback(@RequestBody AGVCallBack agvCallBack ){
// 1.参数合法性校验
if (agvCallBack == null || agvCallBack.getTaskCode().trim().isEmpty()) {
return R.fail("任务单号不能为空");
}
if (agvCallBack == null || agvCallBack.getMethod() .trim().isEmpty()) {
return R.fail("AGV小车当前状态不能为空");
}
return iTaskExecuteRecordService.agvCallback(agvCallBack);
}
}

@ -0,0 +1,10 @@
package org.springblade.desk.logistics.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springblade.desk.logistics.pojo.entity.TaskExecuteRecord;
import java.util.List;
public interface TaskExecuteRecordMapper extends BaseMapper<TaskExecuteRecord> {
}

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace = "org.springblade.desk.logistics.mapper.TaskExecuteRecordMapper">
</mapper>

@ -0,0 +1,6 @@
package org.springblade.desk.logistics.service;
public interface IStorageMonitoringService {
void monitoringStation();
}

@ -0,0 +1,43 @@
/**
* BladeX Commercial License Agreement
* Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
* <p>
* Use of this software is governed by the Commercial License Agreement
* obtained after purchasing a license from BladeX.
* <p>
* 1. This software is for development use only under a valid license
* from BladeX.
* <p>
* 2. Redistribution of this software's source code to any third party
* without a commercial license is strictly prohibited.
* <p>
* 3. Licensees may copyright their own code but cannot use segments
* from this software for such purposes. Copyright of this software
* remains with BladeX.
* <p>
* Using this software signifies agreement to this License, and the software
* must not be used for illegal purposes.
* <p>
* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
* not liable for any claims arising from secondary or illegal development.
* <p>
* Author: Chill Zhuang (bladejava@qq.com)
*/
package org.springblade.desk.logistics.service;
import org.springblade.core.mp.base.BaseService;
import org.springblade.core.tool.api.R;
import org.springblade.desk.logistics.pojo.entity.AGVCallBack;
import org.springblade.desk.logistics.pojo.entity.OrderBind;
import org.springblade.desk.logistics.pojo.entity.TaskExecuteRecord;
/**
* 物流小车对接实体类 服务类
*
* @author BladeX
* @since 2025-11-12
*/
public interface ITaskExecuteRecordService extends BaseService<TaskExecuteRecord> {
R agvCallback(AGVCallBack agvCallBack);
}

@ -3,11 +3,13 @@ package org.springblade.desk.logistics.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.desk.logistics.pojo.entity.*;
import org.springblade.desk.logistics.service.*;
import org.springblade.desk.order.pojo.entity.YieldOrder;
import org.springblade.desk.order.service.IYieldOrderService;
import org.springblade.system.pojo.entity.AuthClient;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@ -156,7 +158,7 @@ public class IOrderBoxServiceImpl implements IOrderBoxService {
task= (Task) location.getData();
task.setTaskStatus(Task.STATUS_START); // 设置任务初始状态为启动
task.setCreateTime(new Date()); // 设置任务创建时间
task.setCreateUser(AuthUtil.getUserId());
// 7. 计算订单总重量(无订单则重量为0)
boolean orderBool = boxBinding.getOrderIdList() == null || boxBinding.getOrderIdList().size() == 0;
if (orderBool) {
@ -164,7 +166,6 @@ public class IOrderBoxServiceImpl implements IOrderBoxService {
}else {
task.setWeight(getWeightByOrderIdList(boxBinding.getOrderIdList()));
}
// 8. 重量校验(小于50kg才允许绑定,避免超重)
if (task.getWeight().compareTo(BigDecimal.valueOf(50)) > 0) {
return R.fail("箱条码绑定的订单重量过重,请重新进行绑定");

@ -0,0 +1,50 @@
package org.springblade.desk.logistics.service.impl;
import org.springblade.desk.logistics.pojo.entity.Task;
import org.springblade.desk.logistics.service.ILocationService;
import org.springblade.desk.logistics.service.IStationService;
import org.springblade.desk.logistics.service.IStorageMonitoringService;
import org.springblade.desk.logistics.service.ITaskService;
import org.springframework.stereotype.Service;
import java.util.HashSet;
import java.util.Set;
@Service
public class StorageMonitoringServiceImpl implements IStorageMonitoringService {
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);// 返库状态
}
/**
* 任务服务处理箱绑定任务的创建状态更新删除等
*/
private final ITaskService iTaskService;
/**
* 站点服务处理站点状态占用/空闲管理
*/
private final IStationService iStationService;
/**
* 库位服务处理库位状态占用/空闲管理
*/
private final ILocationService iLocationService;
public StorageMonitoringServiceImpl(ITaskService iTaskService, IStationService iStationService, ILocationService iLocationService) {
this.iTaskService = iTaskService;
this.iStationService = iStationService;
this.iLocationService = iLocationService;
}
@Override
public void monitoringStation() {
}
}

@ -0,0 +1,72 @@
/**
* BladeX Commercial License Agreement
* Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
* <p>
* Use of this software is governed by the Commercial License Agreement
* obtained after purchasing a license from BladeX.
* <p>
* 1. This software is for development use only under a valid license
* from BladeX.
* <p>
* 2. Redistribution of this software's source code to any third party
* without a commercial license is strictly prohibited.
* <p>
* 3. Licensees may copyright their own code but cannot use segments
* from this software for such purposes. Copyright of this software
* remains with BladeX.
* <p>
* Using this software signifies agreement to this License, and the software
* must not be used for illegal purposes.
* <p>
* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
* not liable for any claims arising from secondary or illegal development.
* <p>
* Author: Chill Zhuang (bladejava@qq.com)
*/
package org.springblade.desk.logistics.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.api.R;
import org.springblade.desk.logistics.mapper.OrderBindMapper;
import org.springblade.desk.logistics.mapper.TaskExecuteRecordMapper;
import org.springblade.desk.logistics.pojo.entity.AGVCallBack;
import org.springblade.desk.logistics.pojo.entity.OrderBind;
import org.springblade.desk.logistics.pojo.entity.TaskExecuteRecord;
import org.springblade.desk.logistics.service.IOrderBindService;
import org.springblade.desk.logistics.service.ITaskExecuteRecordService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 物流小车对接实体类 服务实现类
*
* @author BladeX
* @since 2025-11-12
*/
@Service
@Slf4j
public class TaskExecuteRecordServiceImpl extends BaseServiceImpl<TaskExecuteRecordMapper, TaskExecuteRecord> implements ITaskExecuteRecordService {
@Override
public R agvCallback(AGVCallBack agvCallBack) {
log.info("agv小车接口调用参数入参:{}",agvCallBack);
List<TaskExecuteRecord> list = list(new LambdaQueryWrapper<TaskExecuteRecord>().eq(TaskExecuteRecord::getId, agvCallBack.getTaskCode()).orderByDesc(TaskExecuteRecord::getCreateTime));
if (list==null||list.size()==0) {
return R.fail("未查询到该任务单号");
}
TaskExecuteRecord taskExecuteRecord = list.get(0);
String method = agvCallBack.getMethod().replaceAll(" ", "");
taskExecuteRecord.setMethod(method);
if (!updateById(taskExecuteRecord)) {
return R.fail("保存该任务单号失败");
}
if (method.equals(TaskExecuteRecord.STATUS_END)) {
//todo: 调用东哥接口
}
return R.success();
}
}
Loading…
Cancel
Save