3 changed files with 276 additions and 1 deletions
-
45src/main/java/com/gaotao/modules/automatedWarehouse/service/WcsTaskService.java
-
230src/main/java/com/gaotao/modules/automatedWarehouse/service/impl/WcsTaskServiceImpl.java
-
2src/main/resources/mapper/notify/NewIssureMapper.xml
@ -0,0 +1,45 @@ |
|||
package com.gaotao.modules.automatedWarehouse.service; |
|||
|
|||
import com.gaotao.modules.automatedWarehouse.entity.WcsCallbackTask; |
|||
import com.gaotao.modules.automatedWarehouse.entity.WmsOrderTask; |
|||
|
|||
import java.util.List; |
|||
|
|||
/** |
|||
* WCS任务处理服务接口 |
|||
*/ |
|||
public interface WcsTaskService { |
|||
|
|||
/** |
|||
* 处理WCS回调任务 |
|||
* @param callbackTask WCS回调任务 |
|||
*/ |
|||
void processWcsCallbackTask(WcsCallbackTask callbackTask); |
|||
|
|||
/** |
|||
* 获取待处理的WCS回调任务列表 |
|||
* @param site 站点 |
|||
* @return 待处理任务列表 |
|||
*/ |
|||
List<WcsCallbackTask> getPendingWcsCallbackTasks(String site); |
|||
|
|||
/** |
|||
* 处理立库调栈板出库任务 |
|||
* @param orderTask 订单任务 |
|||
*/ |
|||
void processWcsPalletOutTask(WmsOrderTask orderTask); |
|||
|
|||
/** |
|||
* 获取待处理的立库调栈板出库任务列表 |
|||
* @param site 站点 |
|||
* @return 待处理任务列表 |
|||
*/ |
|||
List<WmsOrderTask> getPendingWcsPalletOutTasks(String site); |
|||
|
|||
/** |
|||
* 构建移库请求参数 |
|||
* @param callbackTask WCS回调任务 |
|||
* @return 移库请求参数 |
|||
*/ |
|||
Object buildWareHouseTransferRequest(WcsCallbackTask callbackTask); |
|||
} |
|||
@ -0,0 +1,230 @@ |
|||
package com.gaotao.modules.automatedWarehouse.service.impl; |
|||
|
|||
import com.gaotao.modules.api.entity.WareHouseTransferRequest; |
|||
import com.gaotao.modules.api.service.WcsApiService; |
|||
import com.gaotao.modules.api.service.WmsMessageService; |
|||
import com.gaotao.modules.automatedWarehouse.entity.WcsCallbackTask; |
|||
import com.gaotao.modules.automatedWarehouse.entity.WmsOrderTask; |
|||
import com.gaotao.modules.automatedWarehouse.mapper.WcsIntegrationMapper; |
|||
import com.gaotao.modules.automatedWarehouse.service.WcsTaskService; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
import java.util.Date; |
|||
import java.util.List; |
|||
|
|||
/** |
|||
* WCS任务处理服务实现类 |
|||
*/ |
|||
@Slf4j |
|||
@Service |
|||
public class WcsTaskServiceImpl implements WcsTaskService { |
|||
|
|||
@Autowired |
|||
private WcsIntegrationMapper wcsIntegrationMapper; |
|||
|
|||
@Autowired |
|||
private WmsMessageService wmsMessageService; |
|||
|
|||
@Autowired |
|||
private WcsApiService wcsApiService; |
|||
|
|||
@Override |
|||
public List<WcsCallbackTask> getPendingWcsCallbackTasks(String site) { |
|||
return wcsIntegrationMapper.getWcsCallbackTaskListWithStatus(site); |
|||
} |
|||
|
|||
@Override |
|||
public void processWcsCallbackTask(WcsCallbackTask callbackTask) { |
|||
try { |
|||
log.info("处理WCS回调任务:palletId={}, transType={}", callbackTask.getPalletId(), callbackTask.getTransTypeDesc()); |
|||
|
|||
// 1. 更新状态为处理中 |
|||
wcsIntegrationMapper.updateWcsCallbackTaskStatus(callbackTask.getId(), "处理中", new Date(), null, null); |
|||
|
|||
// 2. 构建移库请求参数 |
|||
WareHouseTransferRequest request = buildWareHouseTransferRequest(callbackTask); |
|||
|
|||
// 3. 调用通用移库方法(原样调用,不修改) |
|||
String result = wmsMessageService.doWareHouseForPallet(request); |
|||
|
|||
log.info("WCS回调任务处理成功:palletId={}, result={}", callbackTask.getPalletId(), result); |
|||
|
|||
// 4. 如果是入库,更新对应的wms_order_task状态 |
|||
if ("入库".equals(callbackTask.getTransTypeDesc())) { |
|||
updateOrderTaskStatusForInbound(callbackTask); |
|||
//如果更新wcs库位 |
|||
wcsIntegrationMapper.updatePalletWcsLocation(callbackTask.getSite(), callbackTask.getPalletId(), callbackTask.getToLocationId()); |
|||
} |
|||
if ("出库".equals(callbackTask.getTransTypeDesc())) { |
|||
wcsIntegrationMapper.updatePalletWcsLocation(callbackTask.getSite(), callbackTask.getPalletId(), ""); |
|||
} |
|||
|
|||
// 5. 更新任务状态为已完成 |
|||
wcsIntegrationMapper.updateWcsCallbackTaskStatus(callbackTask.getId(), "已完成", null, new Date(), null); |
|||
|
|||
} catch (Exception e) { |
|||
log.error("处理WCS回调任务失败:palletId={}, error={}", callbackTask.getPalletId(), e.getMessage()); |
|||
|
|||
// 更新重试次数 |
|||
int newRetryCount = (callbackTask.getRetryCount() == null ? 0 : callbackTask.getRetryCount()) + 1; |
|||
String status = newRetryCount >= 3 ? "处理失败" : "已录入"; // 重试3次后标记为失败 |
|||
|
|||
wcsIntegrationMapper.updateWcsCallbackTaskStatus(callbackTask.getId(), status, null, null, e.getMessage()); |
|||
wcsIntegrationMapper.updateWcsCallbackTaskRetryCount(callbackTask.getId(), newRetryCount); |
|||
|
|||
throw new RuntimeException("处理WCS回调任务失败: " + e.getMessage(), e); |
|||
} |
|||
} |
|||
|
|||
@Override |
|||
public List<WmsOrderTask> getPendingWcsPalletOutTasks(String site) { |
|||
return wcsIntegrationMapper.getWcsOrderTaskListForPalletOut(site); |
|||
} |
|||
|
|||
@Override |
|||
public void processWcsPalletOutTask(WmsOrderTask orderTask) { |
|||
try { |
|||
log.info("处理立库调栈板任务:taskNo={}, palletId={}", orderTask.getTaskNo(), orderTask.getPalletId()); |
|||
|
|||
// 1. 检查重试次数,避免无限重试 |
|||
int currentRetryCount = getCurrentRetryCount(orderTask); |
|||
if (currentRetryCount >= 3) { |
|||
log.warn("立库调栈板任务重试次数已达上限:taskNo={}, retryCount={}", orderTask.getTaskNo(), currentRetryCount); |
|||
wcsIntegrationMapper.updateOrderTaskStatusAndWmsStatus(orderTask.getId(), "处理失败", "重试次数超限"); |
|||
return; |
|||
} |
|||
|
|||
// 2. 更新状态为处理中 |
|||
wcsIntegrationMapper.updateOrderTaskStatusAndWmsStatus(orderTask.getId(), "处理中", "调用WCS中"); |
|||
|
|||
// 3. 调用WCS出库方法 |
|||
String result = callPalletOutWcs(orderTask); |
|||
|
|||
log.info("立库调栈板任务处理成功:taskNo={}, result={}", orderTask.getTaskNo(), result); |
|||
|
|||
// 4. 更新任务状态为已完成 |
|||
wcsIntegrationMapper.updateOrderTaskStatusAndWmsStatus(orderTask.getId(), "已完成", "WCS调用成功"); |
|||
|
|||
} catch (Exception e) { |
|||
log.error("处理立库调栈板任务失败:taskNo={}, error={}", orderTask.getTaskNo(), e.getMessage()); |
|||
|
|||
// 更新重试次数和错误信息 |
|||
int newRetryCount = getCurrentRetryCount(orderTask) + 1; |
|||
String status = newRetryCount >= 3 ? "处理失败" : "已创建"; // 重试3次后标记为失败 |
|||
String wmsStatus = newRetryCount >= 3 ? "重试次数超限" : "等待重试"; |
|||
|
|||
wcsIntegrationMapper.updateOrderTaskStatusAndWmsStatus(orderTask.getId(), status, wmsStatus); |
|||
wcsIntegrationMapper.updateOrderTaskErrorInfo(orderTask.getId(), "WCS_CALL_ERROR", e.getMessage()); |
|||
|
|||
throw new RuntimeException("处理立库调栈板任务失败: " + e.getMessage(), e); |
|||
} |
|||
} |
|||
|
|||
@Override |
|||
public WareHouseTransferRequest buildWareHouseTransferRequest(WcsCallbackTask callbackTask) { |
|||
WareHouseTransferRequest request = new WareHouseTransferRequest(); |
|||
|
|||
// 从回调任务中获取基本信息 |
|||
request.setSite(callbackTask.getSite()); |
|||
request.setPalletId(callbackTask.getPalletId()); |
|||
request.setToWarehouseId(callbackTask.getToWarehouseId()); |
|||
request.setToLocationId(callbackTask.getToLocationId()); |
|||
request.setTransType("移库"); |
|||
request.setToStation("*"); // 立库内的站点都为* |
|||
|
|||
// 根据transTypeDesc判断业务类型 |
|||
if ("入库".equals(callbackTask.getTransTypeDesc())) { |
|||
request.setBusinessType("立库入库"); |
|||
request.setRemark("WCS立库入库操作"); |
|||
} else if ("出库".equals(callbackTask.getTransTypeDesc())) { |
|||
request.setBusinessType("立库出库"); |
|||
request.setRemark("WCS立库出库操作"); |
|||
} else { |
|||
throw new RuntimeException("不支持的事务类型:" + callbackTask.getTransTypeDesc()); |
|||
} |
|||
|
|||
return request; |
|||
} |
|||
|
|||
/** |
|||
* 更新入库对应的订单任务状态 |
|||
* @param callbackTask WCS回调任务 |
|||
*/ |
|||
private void updateOrderTaskStatusForInbound(WcsCallbackTask callbackTask) { |
|||
try { |
|||
// 查找对应的wms_order_task记录(source_type=组盘入库,pallet_id一致,status=已创建) |
|||
List<WmsOrderTask> orderTasks = wcsIntegrationMapper.findOrderTasksByPalletAndActionType( |
|||
callbackTask.getSite(), |
|||
callbackTask.getPalletId(), |
|||
"组盘入库", |
|||
"已创建" |
|||
); |
|||
|
|||
if (orderTasks != null && !orderTasks.isEmpty()) { |
|||
for (WmsOrderTask orderTask : orderTasks) { |
|||
// 更新wms_order_task的status为已完成,wms_status为已完成 |
|||
wcsIntegrationMapper.updateOrderTaskStatusAndWmsStatus( |
|||
orderTask.getId(), "已完成", "已完成" |
|||
); |
|||
|
|||
// 更新对应的wms_order_task_detail状态为已完成 |
|||
wcsIntegrationMapper.updateOrderTaskDetailStatusByTaskNo( |
|||
orderTask.getTaskNo(), "已完成", "已完成" |
|||
); |
|||
|
|||
log.info("已更新订单任务状态:taskNo={}, palletId={}", |
|||
orderTask.getTaskNo(), callbackTask.getPalletId()); |
|||
} |
|||
} else { |
|||
log.warn("未找到对应的组盘入库订单任务:palletId={}", callbackTask.getPalletId()); |
|||
} |
|||
|
|||
} catch (Exception e) { |
|||
log.error("更新订单任务状态失败:palletId={}, error={}", |
|||
callbackTask.getPalletId(), e.getMessage()); |
|||
// 不抛出异常,避免影响主流程 |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 调用WCS出库方法 |
|||
* @param orderTask 订单任务 |
|||
* @return 调用结果 |
|||
*/ |
|||
private String callPalletOutWcs(WmsOrderTask orderTask) { |
|||
try { |
|||
// 调用具体的WCS出库接口 |
|||
log.info("调用WCS出库接口:taskNo={}, palletId={}, fromLocation={}, toLocation={}", |
|||
orderTask.getTaskNo(), orderTask.getPalletId(), orderTask.getFromLocation(), orderTask.getToLocation()); |
|||
|
|||
wcsApiService.pushWCSTaskApi(orderTask); |
|||
return "WCS出库调用成功"; |
|||
|
|||
} catch (Exception e) { |
|||
log.error("调用WCS出库接口失败:taskNo={}, error={}", orderTask.getTaskNo(), e.getMessage()); |
|||
throw new RuntimeException("WCS出库调用失败:" + e.getMessage()); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 获取当前任务的重试次数 |
|||
* @param orderTask 订单任务 |
|||
* @return 重试次数 |
|||
*/ |
|||
private int getCurrentRetryCount(WmsOrderTask orderTask) { |
|||
try { |
|||
// 通过error_msg字段来判断重试次数,或者可以增加专门的重试次数字段 |
|||
String errorMsg = orderTask.getErrorMsg(); |
|||
if (errorMsg != null && errorMsg.contains("重试次数:")) { |
|||
String retryStr = errorMsg.substring(errorMsg.indexOf("重试次数:") + 5); |
|||
return Integer.parseInt(retryStr.split(",")[0]); |
|||
} |
|||
return 0; |
|||
} catch (Exception e) { |
|||
log.warn("获取重试次数失败,默认为0:taskNo={}", orderTask.getTaskNo()); |
|||
return 0; |
|||
} |
|||
} |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue