Browse Source

中山机械手空托盘重试

master
常熟吴彦祖 2 weeks ago
parent
commit
b21553cb7d
  1. 14
      src/main/java/com/gaotao/modules/automatedWarehouse/controller/AgvTaskController.java
  2. 26
      src/main/java/com/gaotao/modules/automatedWarehouse/entity/CancelRetryNeedPalletData.java
  3. 10
      src/main/java/com/gaotao/modules/automatedWarehouse/service/AgvTaskService.java
  4. 69
      src/main/java/com/gaotao/modules/automatedWarehouse/service/impl/AgvTaskServiceImpl.java

14
src/main/java/com/gaotao/modules/automatedWarehouse/controller/AgvTaskController.java

@ -2,6 +2,7 @@ package com.gaotao.modules.automatedWarehouse.controller;
import com.gaotao.common.utils.PageUtils; import com.gaotao.common.utils.PageUtils;
import com.gaotao.common.utils.R; import com.gaotao.common.utils.R;
import com.gaotao.modules.automatedWarehouse.entity.CancelRetryNeedPalletData;
import com.gaotao.modules.automatedWarehouse.entity.CancelTaskResult; import com.gaotao.modules.automatedWarehouse.entity.CancelTaskResult;
import com.gaotao.modules.automatedWarehouse.entity.WmsTransportTask; import com.gaotao.modules.automatedWarehouse.entity.WmsTransportTask;
import com.gaotao.modules.automatedWarehouse.entity.tusk.AgvStatus; import com.gaotao.modules.automatedWarehouse.entity.tusk.AgvStatus;
@ -129,6 +130,19 @@ public class AgvTaskController {
} }
} }
/**
* @Description 取消并重试分拣位补盘。只接收页面定位参数,取消和重发都在服务里完成 - rqrq
* @param data 当前行的工厂和 WMS 任务号
* @return 成功提示。补盘失败由服务抛出,页面按错误信息弹窗
* @author rqrq
*/
@PostMapping("/cancelAndRetryNeedPallet")
public R cancelAndRetryNeedPallet(@RequestBody CancelRetryNeedPalletData data) {
// 取消原运输任务并按原 WCS 任务号重发补盘;失败抛运行时异常,事务回滚本次取消 - rqrq
agvTaskService.cancelAndRetryNeedPallet(data);
return R.ok("取消并重试成功");
}
/** /**
* 获取AGV实时状态 * 获取AGV实时状态
* @return AGV状态列表 * @return AGV状态列表

26
src/main/java/com/gaotao/modules/automatedWarehouse/entity/CancelRetryNeedPalletData.java

@ -0,0 +1,26 @@
package com.gaotao.modules.automatedWarehouse.entity;
import lombok.Data;
import org.apache.ibatis.type.Alias;
/**
* @Description 分拣位补盘运输任务取消并重试入参 - rqrq
* 只定位要取消的那张 wms_transport_task,补盘报文不从本对象取托盘类型和 WCS 任务号 - rqrq
* @author rqrq
*/
@Data
@Alias("CancelRetryNeedPalletData")
public class CancelRetryNeedPalletData {
/**
* 工厂编码。来源是页面当前行 wms_transport_task.site,和 taskNo 一起定位要取消的任务。
* 缺失时拒绝处理,不从登录态补。重发补盘报文里的 site 固定为 55,不使用本字段。 - rqrq
*/
private String site;
/**
* WMS 运输任务号。来源是页面当前行 wms_transport_task.task_no。
* 只取消这一张任务;重发会另开新的预约取托盘任务,并继承本任务上的 wcs_task_id。 - rqrq
*/
private String taskNo;
}

10
src/main/java/com/gaotao/modules/automatedWarehouse/service/AgvTaskService.java

@ -1,6 +1,7 @@
package com.gaotao.modules.automatedWarehouse.service; package com.gaotao.modules.automatedWarehouse.service;
import com.gaotao.common.utils.PageUtils; import com.gaotao.common.utils.PageUtils;
import com.gaotao.modules.automatedWarehouse.entity.CancelRetryNeedPalletData;
import com.gaotao.modules.automatedWarehouse.entity.CancelTaskResult; import com.gaotao.modules.automatedWarehouse.entity.CancelTaskResult;
import com.gaotao.modules.automatedWarehouse.entity.WmsTransportTask; import com.gaotao.modules.automatedWarehouse.entity.WmsTransportTask;
import com.gaotao.modules.automatedWarehouse.entity.WmsTransportTaskDetail; import com.gaotao.modules.automatedWarehouse.entity.WmsTransportTaskDetail;
@ -84,4 +85,13 @@ public interface AgvTaskService {
* @date 2025/10/31 * @date 2025/10/31
*/ */
CancelTaskResult cancelAgvTask(String site, String taskNo); CancelTaskResult cancelAgvTask(String site, String taskNo);
/**
* @Description 取消带 WCS 任务号的运输任务,并按原 WCS 任务号重新发起分拣位补盘 - rqrq
* TUSK 取消失败仍继续取消 WMS 任务并重发。补盘失败时抛出运行时异常,让本次 WMS 取消回滚。
* 已取消、已完成、没有 WCS 任务号的任务直接拒绝,不会重发。 - rqrq
* @param data 页面行上的工厂和 WMS 任务号,用来定位要取消的 wms_transport_task
* @author rqrq
*/
void cancelAndRetryNeedPallet(CancelRetryNeedPalletData data);
} }

69
src/main/java/com/gaotao/modules/automatedWarehouse/service/impl/AgvTaskServiceImpl.java

@ -10,11 +10,7 @@ import com.gaotao.modules.api.service.RfidMachineApiService;
import com.gaotao.modules.api.service.WcsApiService; import com.gaotao.modules.api.service.WcsApiService;
import com.gaotao.modules.api.service.WmsMessageService; import com.gaotao.modules.api.service.WmsMessageService;
import com.gaotao.modules.automatedWarehouse.entity.AgvStation;
import com.gaotao.modules.automatedWarehouse.entity.CancelTaskResult;
import com.gaotao.modules.automatedWarehouse.entity.PalletDetailData;
import com.gaotao.modules.automatedWarehouse.entity.WmsTransportTask;
import com.gaotao.modules.automatedWarehouse.entity.WmsTransportTaskDetail;
import com.gaotao.modules.automatedWarehouse.entity.*;
import com.gaotao.modules.automatedWarehouse.entity.tusk.TuskResponse; import com.gaotao.modules.automatedWarehouse.entity.tusk.TuskResponse;
import com.gaotao.modules.automatedWarehouse.mapper.AgvTaskMapper; import com.gaotao.modules.automatedWarehouse.mapper.AgvTaskMapper;
import com.gaotao.modules.automatedWarehouse.service.TuskClientService; import com.gaotao.modules.automatedWarehouse.service.TuskClientService;
@ -692,6 +688,69 @@ public class AgvTaskServiceImpl implements AgvTaskService {
} }
} }
/**
* @Description 取消并重试分拣位补盘 - rqrq
* 先按现有取消把这张运输任务停掉:已下给 AGV 的会调 TUSK,TUSK 失败也继续把 WMS 任务改成已取消并释放站点。
* 然后用任务上的目标站点、WCS 任务号,以及托盘类型主数据上的 WCS 整型,拼出补盘报文再调 wcsNeedPalletTask。
* 报文 site 固定 55,documents 固定空列表。补盘失败必须抛出,让本方法和取消写在同一个事务里一起回滚。 - rqrq
* @param data 页面传来的工厂和 WMS 任务号
* @author rqrq
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void cancelAndRetryNeedPallet(CancelRetryNeedPalletData data) {
if (data == null || data.getSite() == null || data.getSite().trim().isEmpty()
|| data.getTaskNo() == null || data.getTaskNo().trim().isEmpty()) {
throw new RuntimeException("工厂和任务号不能为空");
}
String site = data.getSite().trim();
String taskNo = data.getTaskNo().trim();
// 取消前先读出原任务。取消后数据库状态会变,补盘报文要用这里记下的站点、WCS任务号和托盘类型 - rqrq
WmsTransportTask task = agvTaskMapper.getTaskByTaskNo(site, taskNo);
if (task == null) {
throw new RuntimeException("任务不存在");
}
if ("已完成".equals(task.getStatus()) || "已取消".equals(task.getStatus())) {
throw new RuntimeException("已完成或已取消的任务不能取消并重试");
}
if (task.getWcsTaskId() == null || task.getWcsTaskId().trim().isEmpty()) {
throw new RuntimeException("任务没有WCS任务号,不能取消并重试");
}
if (task.getToLocation() == null || task.getToLocation().trim().isEmpty()) {
throw new RuntimeException("任务没有目标站点,不能重发补盘");
}
if (task.getPalletType() == null || task.getPalletType().trim().isEmpty()) {
throw new RuntimeException("任务没有托盘类型,不能重发补盘");
}
// 用任务所属工厂查托盘类型主数据,取出 WCS 整型托盘类型和底托类型。查不到就不能拼报文,此时还没取消 - rqrq
PalletType palletType = wcsIntegrationMapper.getPalletType(task.getSite(), task.getPalletType().trim());
if (palletType == null || palletType.getWcsPalletType() == null || palletType.getWcsBasePalletType() == null) {
throw new RuntimeException("托盘类型【" + task.getPalletType().trim() + "】未配置WCS托盘类型或底托类型,不能重发补盘");
}
// 走现有取消。TUSK 失败时取消结果仍是成功,WMS 任务、站点和 calling_flag 会按原逻辑处理;这里不因 TUSK 失败中断 - rqrq
CancelTaskResult cancelResult = cancelAgvTask(site, taskNo);
if (cancelResult == null || !cancelResult.isSuccess()) {
String cancelMessage = cancelResult == null ? "取消任务失败" : cancelResult.getMessage();
throw new RuntimeException(cancelMessage);
}
WcsNeedPalletTask needPalletTask = new WcsNeedPalletTask();
// 补盘报文 site、空明细是约定固定值;站点、WCS任务号和两个整型来自刚取消的这张任务 - rqrq
needPalletTask.setSite("55");
needPalletTask.setDocuments(new ArrayList<>());
needPalletTask.setStationCode(task.getToLocation().trim());
needPalletTask.setWcsTaskId(task.getWcsTaskId().trim());
needPalletTask.setPalletType(palletType.getWcsPalletType());
needPalletTask.setBasePalletType(palletType.getWcsBasePalletType());
// 同步重发补盘,生成新的预约取托盘并继承原 wcsTaskId。抛错会回滚上面的 WMS 取消;TUSK 已发出的取消回滚不了 - rqrq
wmsMessageService.wcsNeedPalletTask(needPalletTask);
log.info("取消并重试补盘完成,原任务号: {},WCS任务号: {},站点: {}", taskNo, task.getWcsTaskId(), task.getToLocation());
}
/** /**
* @Description 处理未取货场景的取消(场景1/2)- rqrq * @Description 处理未取货场景的取消(场景1/2)- rqrq
* @param task 运输任务 * @param task 运输任务

Loading…
Cancel
Save