From dc62dd9cfa250505b070d0b6f2201bb68cd10cd7 Mon Sep 17 00:00:00 2001 From: liangzhou <594755172@qq.com> Date: Thu, 13 Nov 2025 10:48:09 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug=EF=BC=8C=E5=9B=9E?= =?UTF-8?q?=E9=80=80=E6=B5=8B=E8=AF=95=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/wms/controller/TaskController.java | 184 ++----- .../quartz/job_executor/KateWorkExecutor.java | 4 +- .../WmsJobServiceImplements.java | 490 +++--------------- .../WorkServiceImplements.java | 13 +- 4 files changed, 120 insertions(+), 571 deletions(-) diff --git a/src/main/java/com/wms/controller/TaskController.java b/src/main/java/com/wms/controller/TaskController.java index e939f2c..85f788d 100644 --- a/src/main/java/com/wms/controller/TaskController.java +++ b/src/main/java/com/wms/controller/TaskController.java @@ -490,8 +490,6 @@ public class TaskController { taskService.remove(new LambdaQueryWrapper().eq(Task::getTaskId, inTask.getTaskId())); // 移除当前料箱所有的拣选任务 pickTaskService.remove(new LambdaQueryWrapper().eq(PickTask::getVehicleId, inTask.getVehicleId())); - // 移除当前料箱所有的outsideVehicles---todo 这张表已经废弃不用 -// outsideVehiclesService.remove(new LambdaQueryWrapper().eq(OutsideVehicles::getVehicleId, inTask.getVehicleId())); // 清除当前料箱的所有盘点任务 inventoryService.remove(new LambdaQueryWrapper().eq(InventoryList::getVehicleId, inTask.getVehicleId())); } @@ -512,22 +510,16 @@ public class TaskController { .set(Vehicle::getVehicleStatus, VehicleStatus.OUT.getCode()) .eq(Vehicle::getVehicleId, outTask.getVehicleId()) .ne(Vehicle::getVehicleStatus, VehicleStatus.OUT.getCode())); - // 当前载具上所有库存状态设置为拣选---todo 是否要更改为outed状态 + // 当前载具上所有库存状态设置为拣选 stockService.update(new LambdaUpdateWrapper() - .set(Stock::getStockStatus, StockStatus.PICKING.getCode()) + .set(Stock::getStockStatus, StockStatus.OUTED.getCode()) .eq(Stock::getVehicleId, outTask.getVehicleId()) - .ne(Stock::getStockStatus, StockStatus.PICKING.getCode())); + .ne(Stock::getStockStatus, StockStatus.OUTED.getCode())); // 将该载具对应的拣选任务设置为可发送状态 pickTaskService.update(new LambdaUpdateWrapper() .set(PickTask::getPickStatus, PickTaskStatusEnum.NEW.getCode()) .eq(PickTask::getVehicleId, outTask.getVehicleId()) .eq(PickTask::getPickStatus, PickTaskStatusEnum.TEMP.getCode())); - // 设置特殊---todo 此表废弃 -// standStackerTaskService.update(new LambdaUpdateWrapper() -// .set(StandStackerTask::getTaskStatus, 1) -// .set(StandStackerTask::getFinishTime, LocalDateTime.now()) -// .eq(StandStackerTask::getVehicleId, outTask.getVehicleId()) -// .ne(StandStackerTask::getTaskStatus, 1)); } else {// 代表整出 // 删除当前载具上所有库存 List removeStocks = stockService.list(new LambdaQueryWrapper().eq(Stock::getVehicleId, outTask.getVehicleId())); @@ -912,7 +904,7 @@ public class TaskController { .set(PickTask::getLastUpdateTime, LocalDateTime.now()) .eq(PickTask::getVehicleId, boxArriveRequest.getVehicleNo()) .eq(PickTask::getPickStatus, PickTaskStatusEnum.TEMP.getCode())); - // 重置当前站台非当前箱子的已完成拣选任务 todo + // 重置当前站台非当前箱子的已完成拣选任务 pickTaskService.update(new LambdaUpdateWrapper() .set(PickTask::getPickStatus, PickTaskStatusEnum.NEW.getCode()) .set(PickTask::getLastUpdateTime, LocalDateTime.now()) @@ -923,6 +915,11 @@ public class TaskController { standService.update(new LambdaUpdateWrapper() .set(Stand::getPickVehicle, boxArriveRequest.getVehicleNo()) .eq(Stand::getStandId, pickTask.getStandId())); + // 更新库存为拣选中 + stockService.update(new LambdaUpdateWrapper() + .set(Stock::getStockStatus, StockStatus.PICKING.getCode()) + .eq(Stock::getVehicleId, boxArriveRequest.getVehicleNo()) + .ne(Stock::getStockStatus, StockStatus.PICKING.getCode())); response.setCode(ResponseCode.OK.getCode()); response.setMessage("上报成功"); @@ -1084,46 +1081,33 @@ public class TaskController { wcsETaskRequest.setOrderId(generateId(workQuery.getGoodsId() + "_")); wcsETaskRequest.setVehicleNo(vehicleId); String sendToWcsETaskUrl = configMap.get(ConfigMapKeyEnum.URL_WCS_E_TASK.getConfigKey()); - - // TODO 这里是模拟的 - // 更新workFlow数据 - workFlowService.updateBatchById(workFlows); - // 更新亮灯数据 - etagLocationService.update(new LambdaUpdateWrapper() - .set(ETagLocation::getPickStatus, 1) - .set(ETagLocation::getTaskType, wcsETaskRequest.getTaskType()) - .set(ETagLocation::getVehicleNo, wcsETaskRequest.getVehicleNo()) - .in(ETagLocation::getELocationId, eTaskDataList.stream().map(ETaskData::getLocation).collect(Collectors.toList()))); - - - // TODO 模拟结束要去掉注释 -// if (StringUtils.isEmpty(sendToWcsETaskUrl)) { -// // url地址为空 -// logger.error("向Wcs发送电子标签亮灯任务的地址为空"); -// throw new Exception("向Wcs发送电子标签亮灯任务的地址为空"); -// } else { -// // 发送信息 -// logger.info("发送电子标签亮灯请求:{}", convertJsonString(wcsETaskRequest)); -// ResponseEntity result = JSON.parseObject(HttpUtils.sendHttpPostWithoutToken(sendToWcsETaskUrl, convertJsonString(wcsETaskRequest)), ResponseEntity.class); -// try { -// logService.save(new WmsLog(WmsUtils.generateId("LOG_"), "发送电子标签任务", "eTagTask", convertJsonString(wcsETaskRequest), convertJsonString(result), sendToWcsETaskUrl, LocalDateTime.now(), "WMS")); -// } catch (Exception e) { -// logger.error("插入日志错误"); -// } -// if (result == null || !Objects.equals(result.getCode(), ResponseCode.OK.getCode())) { -// logger.error("发送电子标签亮灯任务失败:{}", convertJsonString(result)); -// throw new Exception("发送电子标签亮灯任务失败"); -// } else { -// // 更新workFlow数据 -// workFlowService.updateBatchById(workFlows); -// // 更新亮灯数据 -// etagLocationService.update(new LambdaUpdateWrapper() -// .set(ETagLocation::getPickStatus, 1) -// .set(ETagLocation::getTaskType, wcsETaskRequest.getTaskType()) -// .set(ETagLocation::getVehicleNo, wcsETaskRequest.getVehicleNo()) -// .in(ETagLocation::getELocationId, eTaskDataList.stream().map(ETaskData::getLocation).collect(Collectors.toList()))); -// } -// } + if (StringUtils.isEmpty(sendToWcsETaskUrl)) { + // url地址为空 + logger.error("向Wcs发送电子标签亮灯任务的地址为空"); + throw new Exception("向Wcs发送电子标签亮灯任务的地址为空"); + } else { + // 发送信息 + logger.info("发送电子标签亮灯请求:{}", convertJsonString(wcsETaskRequest)); + ResponseEntity result = JSON.parseObject(HttpUtils.sendHttpPostWithoutToken(sendToWcsETaskUrl, convertJsonString(wcsETaskRequest)), ResponseEntity.class); + try { + logService.save(new WmsLog(WmsUtils.generateId("LOG_"), "发送电子标签任务", "eTagTask", convertJsonString(wcsETaskRequest), convertJsonString(result), sendToWcsETaskUrl, LocalDateTime.now(), "WMS")); + } catch (Exception e) { + logger.error("插入日志错误"); + } + if (result == null || !Objects.equals(result.getCode(), ResponseCode.OK.getCode())) { + logger.error("发送电子标签亮灯任务失败:{}", convertJsonString(result)); + throw new Exception("发送电子标签亮灯任务失败"); + } else { + // 更新workFlow数据 + workFlowService.updateBatchById(workFlows); + // 更新亮灯数据 + etagLocationService.update(new LambdaUpdateWrapper() + .set(ETagLocation::getPickStatus, 1) + .set(ETagLocation::getTaskType, wcsETaskRequest.getTaskType()) + .set(ETagLocation::getVehicleNo, wcsETaskRequest.getVehicleNo()) + .in(ETagLocation::getELocationId, eTaskDataList.stream().map(ETaskData::getLocation).collect(Collectors.toList()))); + } + } } // 更新站台数据 standService.update(new LambdaUpdateWrapper() @@ -1412,49 +1396,6 @@ public class TaskController { } // 更新实际拣选数量 workFlow.setPickedNum(workFlow.getPickedNum().add(BigDecimal.valueOf(eTaskFeedbackRequest.getConfirmNum()))); - // todo---下面两张表废弃使用 -// if (eTaskFeedbackRequest.getConfirmNum().compareTo(eTaskFeedbackRequest.getNeedNum()) < 0) { -// int diffNum = eTaskFeedbackRequest.getNeedNum() - eTaskFeedbackRequest.getConfirmNum(); -// // 查站台要料表---未分配以及分配但未完全分配 -// GoodsToStation goodsToStation = goodsToStationService.getOne(new LambdaQueryWrapper() -// .eq(GoodsToStation::getWorkStation, workFlow.getWorkStation()) -// .eq(GoodsToStation::getGoodsId, workFlow.getGoodsId()) -// .last("limit 1")); -// if (goodsToStation != null) { -// // 更新站台要料数量 -// BigDecimal newDistributeNum = goodsToStation.getDistributedNum().subtract(BigDecimal.valueOf(diffNum)); -// goodsToStation.setDistributedNum(newDistributeNum.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : newDistributeNum); -// goodsToStation.setDistributeStatus(1); -// goodsToStationService.updateById(goodsToStation); -// } -// // 查询当前站台的拣货任务 -// PickTask pickTask = pickTaskService.getOne(new LambdaQueryWrapper() -// .eq(PickTask::getStandId, workFlow.getWorkStation()) -// .eq(PickTask::getPickStatus, PickTaskStatusEnum.FINISH.getCode()) -// .last("limit 1")); -// if (pickTask != null) { -// // 更新当前的outsideVehicles状态为一个新状态,拉取任务时不拉取它 -// List outsideVehiclesList = outsideVehiclesService.list(new LambdaQueryWrapper() -// .eq(OutsideVehicles::getVehicleId, pickTask.getVehicleId()) -// .eq(OutsideVehicles::getGoodsId, workFlow.getGoodsId())); -// for (OutsideVehicles outsideVehicles : outsideVehiclesList) { -// outsideVehicles.setOutStatus(2); -// } -// outsideVehiclesService.updateBatchById(outsideVehiclesList); -// } -// // 更新workFlow状态 -// workFlow.setLightStatus(0);// 未亮灯 -// workFlow.setWorkStatus(1);// 正在做 -// } else { -// if (workFlow.getPickedNum().compareTo(workFlow.getNeedNum()) < 0) { -// // 缺料未完成 -// workFlow.setLightStatus(0);// 未亮灯 -// workFlow.setWorkStatus(1);// 正在做 -// } else { -// workFlow.setLightStatus(2);// 已拍灯 -// workFlow.setWorkStatus(2);// 已完成 -// } -// } if (workFlow.getPickedNum().compareTo(workFlow.getNeedNum()) < 0) { // 缺料未完成 workFlow.setLightStatus(0);// 未亮灯 @@ -1582,8 +1523,8 @@ public class TaskController { .last("limit 1")); if (pickTask == null) { // 没有拣货任务,直接放行 - // 调用Wcs的放行接口 TODO 测试时注释 -// wcsService.sendWcsDisposeVehicle(new WcsDisposeVehicleRequest(standId, null)); + // 调用Wcs的放行接口 + wcsService.sendWcsDisposeVehicle(new WcsDisposeVehicleRequest(standId, null)); // 更新站台信息 standService.update(new LambdaUpdateWrapper() .set(Stand::getLastUseTime, LocalDateTime.now()) @@ -1609,25 +1550,6 @@ public class TaskController { stockService.updateById(existStock); stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, StockUpdateReasonEnum.CONFIRM_UPDATE.getReason(), workConfirmRequest.getUserName(), quantityBefore); } - // todo---此表废弃使用 -// OutsideVehicles currentGoodsVehicle = outsideVehiclesService.getOne(new LambdaQueryWrapper() -// .eq(OutsideVehicles::getVehicleId, pickTask.getVehicleId()) -// .eq(OutsideVehicles::getGoodsId, workConfirmRequest.getGoodsId()) -// .last("limit 1")); -// if (workConfirmRequest.getRemainNumReal().compareTo(BigDecimal.ZERO) == 0) {// 实际剩余数量为0 -// // 更新流转载具表剩余数量 -// if (currentGoodsVehicle != null) { -// currentGoodsVehicle.setRemainNum(BigDecimal.ZERO); -// currentGoodsVehicle.setOutStatus(2); -// outsideVehiclesService.updateById(currentGoodsVehicle); -// } -// } else { -// // 更新流转载具表剩余数量 todo -// if (currentGoodsVehicle != null) { -// currentGoodsVehicle.setRemainNum(currentGoodsVehicle.getRemainNum().add(workConfirmRequest.getRemainNumReal().subtract(workConfirmRequest.getRemainNumOrigin()))); -// outsideVehiclesService.updateById(currentGoodsVehicle); -// } -// } } else { if (existStock != null && existStock.getGoodsRelated() != null) { if (workConfirmRequest.getRemainNumOrigin().compareTo(BigDecimal.ZERO) == 0) { @@ -1638,14 +1560,6 @@ public class TaskController { existStock.setGoodsRelated(goodsDetail); stockService.updateById(existStock); stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, StockUpdateReasonEnum.CONFIRM_UPDATE.getReason(), workConfirmRequest.getUserName(), quantityBefore); - // todo---此表废弃使用 -// OutsideVehicles currentGoodsVehicle = outsideVehiclesService.getOne(new LambdaQueryWrapper() -// .eq(OutsideVehicles::getVehicleId, pickTask.getVehicleId()) -// .eq(OutsideVehicles::getGoodsId, workConfirmRequest.getGoodsId()) -// .last("limit 1")); -// currentGoodsVehicle.setRemainNum(BigDecimal.ZERO); -// currentGoodsVehicle.setOutStatus(2); -// outsideVehiclesService.updateById(currentGoodsVehicle); } } } @@ -1689,8 +1603,8 @@ public class TaskController { pickTaskRecordService.save(pickTaskRecord); // 删除当前拣选任务 pickTaskService.removeById(pickTask); - // 不需要,放行 TODO 测试时注释 -// wcsService.sendWcsDisposeVehicle(new WcsDisposeVehicleRequest(standId, pickTask.getVehicleId())); + // 不需要,放行 + wcsService.sendWcsDisposeVehicle(new WcsDisposeVehicleRequest(standId, pickTask.getVehicleId())); // 判断是不是已经完成工作 if (workFlowService.exists(new LambdaQueryWrapper() .eq(WorkFlow::getWorkStation, standId) @@ -1728,8 +1642,8 @@ public class TaskController { pickTaskRecordService.save(pickTaskRecord); // 删除当前拣选任务 pickTaskService.removeById(pickTask); - // 放行 TODO 测试时注释 -// wcsService.sendWcsDisposeVehicle(new WcsDisposeVehicleRequest(standId, pickTask.getVehicleId())); + // 放行 + wcsService.sendWcsDisposeVehicle(new WcsDisposeVehicleRequest(standId, pickTask.getVehicleId())); // 判断是不是已经完成工作 if (workFlowService.exists(new LambdaQueryWrapper() .eq(WorkFlow::getWorkStation, standId) @@ -2855,7 +2769,7 @@ public class TaskController { return convertJsonString(response); } - // TODO 以下是非计划领料变动 + // 以下是非计划领料变动 // 1. 判断当前站台是否允许非计划 if (targetStand.getAllowNoPlan() != 1) { logger.error("当前站台不允许非计划领料:{}。", targetStand.getStandId()); @@ -2889,11 +2803,10 @@ public class TaskController { // 出库任务列表 List outTasks = new ArrayList<>(); - // TODO 非计划变动 + // 非计划变动 // 拣选任务列表 List pickTasks = new ArrayList<>(); - // 尝试生成出库任务 List pickStandIds = new ArrayList<>(); for (Stock tempStock : stockList) { @@ -2931,7 +2844,7 @@ public class TaskController { tempOutTask.setIsPicking(1); outTasks.add(tempOutTask); - // TODO 非计划变动 + // 非计划变动 // 只有备料站台才下发拣选任务 if (targetStand.getStandType() == 2) { // 创建拣选任务 @@ -2973,7 +2886,7 @@ public class TaskController { .eq(Task::getVehicleId, tempStock.getVehicleId()) .eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode())); - // TODO 非计划变动 + // 非计划变动 if (targetStand.getStandType() == 1) { // 入库站台 thisVehiclePickTasks.forEach(pickTask -> { @@ -3004,7 +2917,7 @@ public class TaskController { // 保存出库任务 taskService.saveBatch(outTasks); - // TODO 非计划变动 + // 非计划变动 // 保存拣选任务 if (!pickTasks.isEmpty()) { pickTaskService.saveBatch(pickTasks); @@ -3284,9 +3197,6 @@ public class TaskController { } } - - // TODO 以下是盘点待做 - /** * 盘点请求 * diff --git a/src/main/java/com/wms/quartz/job_executor/KateWorkExecutor.java b/src/main/java/com/wms/quartz/job_executor/KateWorkExecutor.java index 934c55b..cf02d17 100644 --- a/src/main/java/com/wms/quartz/job_executor/KateWorkExecutor.java +++ b/src/main/java/com/wms/quartz/job_executor/KateWorkExecutor.java @@ -39,10 +39,10 @@ public class KateWorkExecutor implements Job { public void execute(JobExecutionContext jobExecutionContext) { // 创建工作 createWork(); - // 执行工作 - doWork(); // 修复工作 repairWork(); + // 执行工作 + doWork(); } /** diff --git a/src/main/java/com/wms/service/business/serviceImplements/WmsJobServiceImplements.java b/src/main/java/com/wms/service/business/serviceImplements/WmsJobServiceImplements.java index cbb1e4e..994438a 100644 --- a/src/main/java/com/wms/service/business/serviceImplements/WmsJobServiceImplements.java +++ b/src/main/java/com/wms/service/business/serviceImplements/WmsJobServiceImplements.java @@ -105,12 +105,6 @@ public class WmsJobServiceImplements implements IWmsJobService { continue; } } -// if (task.getTaskPriority() == 1) { -// if (Objects.equals(task.getTaskType(), TaskType.OUT.getCode()) -// && task.getIsPicking() == 1 && StringUtils.isNotEmpty(task.getPickStand())) { -// continue; -// } -// } // 创建发送的任务 WcsTaskRequest tempTask = new WcsTaskRequest(); tempTask.setTaskId(task.getTaskGroup()); @@ -134,45 +128,45 @@ public class WmsJobServiceImplements implements IWmsJobService { return; } // 下面这行代码模拟wcs下发成功 - simulateSendPickOutTasks(taskGroupIds, Collections.emptyList(), Collections.emptyList(), Collections.emptyList()); -// // 发送任务 -// String url = configMap.get(ConfigMapKeyEnum.URL_WCS_TASK.getConfigKey()); -// if (url != null) { -// logger.info("向WCS发送任务,地址:{},请求详情:{}", url, convertJsonString(request)); -// ResponseEntity result = JSON.parseObject(HttpUtils.sendHttpPostWithoutToken(url, convertJsonString(request)), ResponseEntity.class); -// try { -// logService.save(new WmsLog(WmsUtils.generateId("LOG_"), "向WCS发送任务", "SetStackerTask", JSON.toJSONString(request), JSON.toJSONString(result), url, LocalDateTime.now(), "WMS")); -// } catch (Exception e) { -// logger.error("保存发送任务的日志错误。"); -// } -// if (result == null) { -// logger.error("发送任务异常。"); -// } else { -// if (Objects.equals(ResponseCode.OK.getCode(), result.getCode())) { -// logger.info("发送WCS任务成功。"); -// taskService.update(new LambdaUpdateWrapper() -// .set(Task::getTaskStatus, WmsTaskStatus.WAIT.getCode()) -// .in(Task::getTaskGroup, taskGroupIds) -// .eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode())); -// } else { -// // 判断returnData的数据 -// if (result.getReturnData() != null) { -// List errorTasks = JSON.parseArray(result.getReturnData().toString(), WcsTaskRequest.class); -// if (!errorTasks.isEmpty()) { -// List failedTaskIds = errorTasks.stream().map(WcsTaskRequest::getTaskId).distinct().toList(); -// // 更新任务状态为异常 -// taskService.update(new LambdaUpdateWrapper() -// .set(Task::getTaskStatus, WmsTaskStatus.EXCEPTION.getCode()) -// .in(Task::getTaskGroup, failedTaskIds) -// .eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode())); -// } -// } -// logger.error("发送任务错误:{}", convertJsonString(result)); -// } -// } -// } else { -// logger.error("WCS发送任务地址为空。"); -// } +// simulateSendPickOutTasks(taskGroupIds, Collections.emptyList(), Collections.emptyList(), Collections.emptyList()); + // 发送任务 + String url = configMap.get(ConfigMapKeyEnum.URL_WCS_TASK.getConfigKey()); + if (url != null) { + logger.info("向WCS发送任务,地址:{},请求详情:{}", url, convertJsonString(request)); + ResponseEntity result = JSON.parseObject(HttpUtils.sendHttpPostWithoutToken(url, convertJsonString(request)), ResponseEntity.class); + try { + logService.save(new WmsLog(WmsUtils.generateId("LOG_"), "向WCS发送任务", "SetStackerTask", JSON.toJSONString(request), JSON.toJSONString(result), url, LocalDateTime.now(), "WMS")); + } catch (Exception e) { + logger.error("保存发送任务的日志错误。"); + } + if (result == null) { + logger.error("发送任务异常。"); + } else { + if (Objects.equals(ResponseCode.OK.getCode(), result.getCode())) { + logger.info("发送WCS任务成功。"); + taskService.update(new LambdaUpdateWrapper() + .set(Task::getTaskStatus, WmsTaskStatus.WAIT.getCode()) + .in(Task::getTaskGroup, taskGroupIds) + .eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode())); + } else { + // 判断returnData的数据 + if (result.getReturnData() != null) { + List errorTasks = JSON.parseArray(result.getReturnData().toString(), WcsTaskRequest.class); + if (!errorTasks.isEmpty()) { + List failedTaskIds = errorTasks.stream().map(WcsTaskRequest::getTaskId).distinct().toList(); + // 更新任务状态为异常 + taskService.update(new LambdaUpdateWrapper() + .set(Task::getTaskStatus, WmsTaskStatus.EXCEPTION.getCode()) + .in(Task::getTaskGroup, failedTaskIds) + .eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode())); + } + } + logger.error("发送任务错误:{}", convertJsonString(result)); + } + } + } else { + logger.error("WCS发送任务地址为空。"); + } } } catch (Exception exception) { logger.error("向WCS发送任务时发生异常:{}", convertJsonString(exception)); @@ -180,362 +174,6 @@ public class WmsJobServiceImplements implements IWmsJobService { } } - /** - * 发送PickOut任务 - * @throws Exception 异常 - */ -// @Override -// public void sendPickOutTasks() throws Exception { -// try { -// // 检索任务表---新建未下发的任务 -// LambdaQueryWrapper waitForDistributeTaskQuery = new LambdaQueryWrapper() -// .eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode()) -// .eq(Task::getTaskType, TaskType.OUT.getCode()) -// .eq(Task::getTaskPriority, 1); -// List allTasks = taskService.list(waitForDistributeTaskQuery); -// if (!allTasks.isEmpty()) { -// String max_vehicle_nums = configMap.get(ConfigMapKeyEnum.MAX_VEHICLE_NUMS.getConfigKey()); -// String max_wcs_accept_nums = configMap.get(ConfigMapKeyEnum.MAX_WCS_ACCEPT_NUMS.getConfigKey()); -// String max_stand_vehicle_nums = configMap.get(ConfigMapKeyEnum.MAX_STAND_VEHICLE_NUMS.getConfigKey()); -// if (StringUtils.isEmpty(max_vehicle_nums) || StringUtils.isEmpty(max_wcs_accept_nums) || StringUtils.isEmpty(max_stand_vehicle_nums)) { -// logger.error("配置未生成"); -// return; -// } -// int maxVehicleNums = Integer.parseInt(max_vehicle_nums);// 线体最大箱子数量 -// int maxWcsAcceptNums = Integer.parseInt(max_wcs_accept_nums);// wcs最大一次性可接受任务数量 -// int maxStandVehicleNums = Integer.parseInt(max_stand_vehicle_nums);// 每个站台最大箱子数量 -// List outsideVehicles = outsideVehiclesService.selectDistinctVehicles(); -// if (outsideVehicles == null || outsideVehicles.isEmpty()) { -// outsideVehicles = Collections.emptyList(); -// } -// int remainVehicleNums = maxVehicleNums - outsideVehicles.size();// 线体剩余箱子数量 -// if (remainVehicleNums <= 0) { -// return; -// } -// -// // 需要发送给wcs的任务列表 -// List request = new ArrayList<>(); -// // 已经下发的任务组列表 -// List taskGroupIds = new ArrayList<>(); -// // 本次生成的箱子 -// List pickVehicleIds = new ArrayList<>(); -// // 本次跳过的箱子 -// List skipVehicleIds = new ArrayList<>(); -// // 查找所有站台拣选任务 -// List standPickTasks = pickTaskService.list(); -// // 生成一个Map,计算每个站台已经出库的拣选任务 -// Map outPickTaskMap = new HashMap<>(); -// Map updatedOutPickTaskMap = new HashMap<>(); -// // 轮询工作站台,判断是否需要下发任务 -// List stands = standService.list(new LambdaQueryWrapper() -// .eq(Stand::getIsLock, 0).eq(Stand::getStandStatus, 0) -// .eq(Stand::getStandType, 2)); -// for (Stand workStation : stands) { -// outPickTaskMap.put(workStation.getStandId(), workStation.getPickVehicleCount()); -// updatedOutPickTaskMap.put(workStation.getStandId(), workStation.getPickVehicleCount()); -// } -// // 轮询堆垛机状态 -// List stackerList = standService.list(new LambdaQueryWrapper() -// .eq(Stand::getIsLock, 0).eq(Stand::getStandStatus, 0) -// .eq(Stand::getStandType, 3)); -// List stackRunningTasks = taskService.list(new LambdaQueryWrapper() -// .eq(Task::getTaskType, TaskType.OUT.getCode()) -// .and(wrapper -> wrapper.eq(Task::getTaskStatus, WmsTaskStatus.WAIT.getCode()) -// .or().eq(Task::getTaskStatus, WmsTaskStatus.RUN.getCode()))); -// Map runningTaskNumToEquipmentMap = new HashMap<>(); -// for (Stand stacker : stackerList) { -// // 找这台堆垛机正在执行的拣选出库任务数量 -// runningTaskNumToEquipmentMap.put(stacker.getEquipmentId(), 0); -// } -// // 生成堆垛机可用列表 -// for (Task tempStackRunningTask : stackRunningTasks) { -// if (instantLocationMap.containsKey(tempStackRunningTask.getOrigin())) { -// int key = instantLocationMap.get(tempStackRunningTask.getOrigin()).getEquipmentId(); -// if (runningTaskNumToEquipmentMap.isEmpty()) { -// // 没有可用堆垛机 -// break; -// } -// if (runningTaskNumToEquipmentMap.containsKey(key)) { -// if (runningTaskNumToEquipmentMap.get(key) >= 3) { -// runningTaskNumToEquipmentMap.remove(key); -// } else { -// runningTaskNumToEquipmentMap.replace(key, runningTaskNumToEquipmentMap.get(key) + 1); -// } -// } -// } -// } -// if (runningTaskNumToEquipmentMap.isEmpty()) { -// // 没有可用堆垛机 -// return; -// } -// // 还有可用堆垛机 -// while(!runningTaskNumToEquipmentMap.isEmpty()) { -// if (request.size() >= maxWcsAcceptNums || remainVehicleNums <= 0) { -// // 超过wcs一次可接受数量 -// break; -// } -// if (outPickTaskMap.isEmpty()) { -// // 没有站台可以使用 -// break; -// } -// // 先找出目前数量最少的站台 -// String standId = outPickTaskMap.entrySet().stream() -// .min(Comparator.comparingInt(Map.Entry::getValue)) -// .map(Map.Entry::getKey) -// .orElse(""); -// List vehicleIds; -// if (StringUtils.isNotEmpty(standId)) { -// // 如果这个站台箱子数量超过最大每个站台的箱子数量,则跳过 -// if (outPickTaskMap.get(standId) >= maxStandVehicleNums) { -// outPickTaskMap.remove(standId); -// continue; -// } -// // 查找这个站台未下发的料箱 -// vehicleIds = standPickTasks.stream() -// .filter(pickTask -> pickTask.getStandId().equals(standId) && pickTask.getPickStatus().equals(PickTaskStatusEnum.TEMP.getCode()) -// && !pickVehicleIds.contains(pickTask.getVehicleId()) -// && !skipVehicleIds.contains(pickTask.getVehicleId())) -// .map(PickTask::getVehicleId) -// .distinct() -// .toList(); -// if (vehicleIds.isEmpty()) { -// outPickTaskMap.remove(standId); -// continue; -// } -// } else { -// vehicleIds = standPickTasks.stream() -// .filter(pickTask -> pickTask.getPickStatus().equals(PickTaskStatusEnum.TEMP.getCode()) -// && !pickVehicleIds.contains(pickTask.getVehicleId()) -// && !skipVehicleIds.contains(pickTask.getVehicleId())) -// .map(PickTask::getVehicleId) -// .distinct() -// .toList(); -// if (vehicleIds.isEmpty()) { -// break; -// } -// } -// // 生成箱子-站台数量的Map -// Map vehicleStandsMap = new HashMap<>(); -// standPickTasks.forEach(pickTask -> { -// if (vehicleIds.contains(pickTask.getVehicleId())) { -// vehicleStandsMap.put(pickTask.getVehicleId(), -// vehicleStandsMap.getOrDefault(pickTask.getVehicleId(), 0) + 1); -// } -// }); -// // 最多使用的箱子 -// String maxVehicleId = vehicleStandsMap.entrySet().stream() -// .max(Comparator.comparingInt(Map.Entry::getValue)) -// .map(Map.Entry::getKey) -// .orElse(""); -// if (!StringUtils.isEmpty(maxVehicleId)) { -// // 找到这个箱子的任务 -// List outPickTasks = allTasks.stream().filter(task -> task.getVehicleId().equals(maxVehicleId) && !pickVehicleIds.contains(task.getVehicleId()) -// && task.getIsPicking() == 1 && StringUtils.isNotEmpty(task.getPickStand())).toList(); -// if (!outPickTasks.isEmpty()) { -// // 更新每个站台的拣选箱数量 -// List maxStandIds = standPickTasks.stream() -// .filter(pickTask -> pickTask.getVehicleId().equals(maxVehicleId)) -// .map(PickTask::getStandId) -// .distinct() -// .toList(); -// // 给当前设备号+1 -// int equipmentId = instantLocationMap.get(outPickTasks.get(0).getOrigin()).getEquipmentId(); -// if (runningTaskNumToEquipmentMap.containsKey(equipmentId)) { -// boolean flag = false; -// for (Task task : outPickTasks) { -// if (taskGroupIds.contains(task.getTaskGroup())) { -// // 该任务组已经下发 -// continue; -// } -// if (StringUtils.isNotEmpty(task.getPreTask())) {// 当前任务具有前置任务 -// // 查询一下前置的任务有没有存在,存在则不下发 -// if (taskService.exists(new LambdaQueryWrapper().eq(Task::getTaskId, task.getPreTask()))) { -// continue; -// } -// } -// // 创建发送的任务 -// WcsTaskRequest tempTask = new WcsTaskRequest(); -// tempTask.setTaskId(task.getTaskGroup()); -// tempTask.setTaskType(task.getTaskType()); -// tempTask.setOrigin(task.getOrigin()); -// tempTask.setDestination(task.getDestination()); -// tempTask.setVehicleNo(task.getVehicleId()); -// tempTask.setVehicleSize(task.getVehicleSize()); -// tempTask.setWeight(task.getWeight()); -// tempTask.setPriority(task.getTaskPriority()); -// request.add(tempTask); -// // 已经发送过的任务组 -// taskGroupIds.add(task.getTaskGroup()); -// flag = true; -// } -// if (flag) { -// if (!maxStandIds.isEmpty()) { -// maxStandIds.forEach(tempStandId -> { -// outPickTaskMap.put(tempStandId, outPickTaskMap.getOrDefault(tempStandId, 0) + 1); -// updatedOutPickTaskMap.put(tempStandId, updatedOutPickTaskMap.getOrDefault(tempStandId, 0) + 1); -// }); -// } -// runningTaskNumToEquipmentMap.replace(equipmentId, runningTaskNumToEquipmentMap.get(equipmentId) + 1); -// // 已经发送过的vehicleId -// pickVehicleIds.add(maxVehicleId); -// vehicleStandsMap.remove(maxVehicleId); -// // 剩余线体可继续出库料箱数量 -// remainVehicleNums--; -// } -// } else { -// if (!skipVehicleIds.contains(maxVehicleId)) { -// skipVehicleIds.add(maxVehicleId); -// } -// } -// } else { -// if (!skipVehicleIds.contains(maxVehicleId)) { -// skipVehicleIds.add(maxVehicleId); -// } -// } -// } -// // 最少使用的箱子 -// String minVehicleId = vehicleStandsMap.entrySet().stream() -// .min(Comparator.comparingInt(Map.Entry::getValue)) -// .map(Map.Entry::getKey) -// .orElse(""); -// if (!StringUtils.isEmpty(minVehicleId)) { -// // 找到这个箱子的任务 -// List outPickTasks = allTasks.stream().filter(task -> task.getVehicleId().equals(minVehicleId) && !pickVehicleIds.contains(task.getVehicleId()) -// && task.getIsPicking() == 1 && StringUtils.isNotEmpty(task.getPickStand())).toList(); -// if (!outPickTasks.isEmpty()) { -// // 更新每个站台的拣选箱数量 -// List minStandIds = standPickTasks.stream() -// .filter(pickTask -> pickTask.getVehicleId().equals(minVehicleId)) -// .map(PickTask::getStandId) -// .distinct() -// .toList(); -// // 给当前设备号+1 -// int equipmentId = instantLocationMap.get(outPickTasks.get(0).getOrigin()).getEquipmentId(); -// if (runningTaskNumToEquipmentMap.containsKey(equipmentId)) { -// boolean flag = false; -// for (Task task : outPickTasks) { -// if (taskGroupIds.contains(task.getTaskGroup())) { -// // 该任务组已经下发 -// continue; -// } -// if (StringUtils.isNotEmpty(task.getPreTask())) {// 当前任务具有前置任务 -// // 查询一下前置的任务有没有存在,存在则不下发 -// if (taskService.exists(new LambdaQueryWrapper().eq(Task::getTaskId, task.getPreTask()))) { -// continue; -// } -// } -// // 创建发送的任务 -// WcsTaskRequest tempTask = new WcsTaskRequest(); -// tempTask.setTaskId(task.getTaskGroup()); -// tempTask.setTaskType(task.getTaskType()); -// tempTask.setOrigin(task.getOrigin()); -// tempTask.setDestination(task.getDestination()); -// tempTask.setVehicleNo(task.getVehicleId()); -// tempTask.setVehicleSize(task.getVehicleSize()); -// tempTask.setWeight(task.getWeight()); -// tempTask.setPriority(task.getTaskPriority()); -// request.add(tempTask); -// // 已经发送过的任务组 -// taskGroupIds.add(task.getTaskGroup()); -// flag = true; -// } -// if (flag) { -// if (!minStandIds.isEmpty()) { -// minStandIds.forEach(tempStandId -> { -// outPickTaskMap.put(tempStandId, outPickTaskMap.getOrDefault(tempStandId, 0) + 1); -// updatedOutPickTaskMap.put(tempStandId, updatedOutPickTaskMap.getOrDefault(tempStandId, 0) + 1); -// }); -// } -// runningTaskNumToEquipmentMap.replace(equipmentId, runningTaskNumToEquipmentMap.get(equipmentId) + 1); -// // 已经发送过的vehicleId -// pickVehicleIds.add(minVehicleId); -// vehicleStandsMap.remove(minVehicleId); -// // 剩余线体可继续出库料箱数量 -// remainVehicleNums--; -// } -// } else { -// if (!skipVehicleIds.contains(minVehicleId)) { -// skipVehicleIds.add(minVehicleId); -// } -// } -// } else { -// if (!skipVehicleIds.contains(minVehicleId)) { -// skipVehicleIds.add(minVehicleId); -// } -// } -// } -// List removeKeys = new ArrayList<>(runningTaskNumToEquipmentMap.keySet().stream().toList()); -// for (int equipmentId : removeKeys) { -// // 剩余任务有没有这台堆垛机的 -// List remainTasks = allTasks.stream().filter(task -> !skipVehicleIds.contains(task.getVehicleId()) && !pickVehicleIds.contains(task.getVehicleId()) -// && task.getIsPicking() == 1 && StringUtils.isNotEmpty(task.getPickStand())).toList(); -// if (remainTasks.isEmpty() || runningTaskNumToEquipmentMap.get(equipmentId) >= 3) { -// runningTaskNumToEquipmentMap.remove(equipmentId); -// } -// } -// } -// -// if (request.size() == 0) { -// // 没有新任务发送 -// return; -// } -// // 发送任务 -// String url = configMap.get(ConfigMapKeyEnum.URL_WCS_TASK.getConfigKey()); -// if (url != null) { -// logger.info("向WCS发送拣选出库任务,地址:{},请求详情:{}", url, convertJsonString(request)); -// ResponseEntity result = JSON.parseObject(HttpUtils.sendHttpPostWithoutToken(url, convertJsonString(request)), ResponseEntity.class); -// try { -// logService.save(new WmsLog(WmsUtils.generateId("LOG_"), "向WCS发送任务", "SetStackerTask", JSON.toJSONString(request), JSON.toJSONString(result), url, LocalDateTime.now(), "WMS")); -// } catch (Exception e) { -// logger.error("插入日志错误。"); -// } -// if (result == null) { -// logger.error("发送拣选出库任务异常。"); -// } else { -// if (Objects.equals(ResponseCode.OK.getCode(), result.getCode())) { -// logger.info("发送WCS拣选出库任务成功。"); -// taskService.update(new LambdaUpdateWrapper() -// .set(Task::getTaskStatus, WmsTaskStatus.WAIT.getCode()) -// .in(Task::getTaskGroup, taskGroupIds) -// .eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode())); -// // 流转载具状态变更 -// if (!pickVehicleIds.isEmpty()) { -// outsideVehiclesService.update(new LambdaUpdateWrapper() -// .set(OutsideVehicles::getOutStatus, 1) -// .in(OutsideVehicles::getVehicleId, pickVehicleIds)); -// // 更新站台拣选箱数 -// for (String tempStandId : updatedOutPickTaskMap.keySet()) { -// standService.update(new LambdaUpdateWrapper() -// .set(Stand::getPickVehicleCount, updatedOutPickTaskMap.get(tempStandId)) -// .eq(Stand::getStandId, tempStandId)); -// } -// } -// } else { -// // 判断returnData的数据 -// if (result.getReturnData() != null) { -// List errorTasks = JSON.parseArray(result.getReturnData().toString(), WcsTaskRequest.class); -// if (!errorTasks.isEmpty()) { -// List failedTaskIds = errorTasks.stream().map(WcsTaskRequest::getTaskId).distinct().toList(); -// // 更新任务状态为异常 -// taskService.update(new LambdaUpdateWrapper() -// .set(Task::getTaskStatus, WmsTaskStatus.EXCEPTION.getCode()) -// .in(Task::getTaskGroup, failedTaskIds) -// .eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode())); -// } -// } -// logger.error("发送拣选出库任务错误:{}", convertJsonString(result)); -// } -// } -// } else { -// logger.error("WCS发送任务地址为空。"); -// } -// } -// } catch (Exception exception) { -// logger.error("向WCS发送拣选出库任务时发生异常:{}", convertJsonString(exception)); -// throw new Exception("向WCS发送拣选出库任务时发生异常。"); -// } -// } - /** * 发送拣选任务 */ @@ -577,31 +215,31 @@ public class WmsJobServiceImplements implements IWmsJobService { request.add(requestSingle); } // 下面是模拟发送wcs拣选任务 - simulateSendPickTasks(vehicleAndStansMap.keySet().stream().toList()); -// if (!request.isEmpty()) { -// // 发送任务 -// String url = configMap.get(ConfigMapKeyEnum.URL_WCS_PICK_TASK.getConfigKey()); -// if (url != null) { -// logger.info("向WCS发送拣选任务,地址:{},请求详情:{}", url, convertJsonString(request)); -// ResponseEntity result = JSON.parseObject(HttpUtils.sendHttpPostWithoutToken(url, convertJsonString(request)), ResponseEntity.class); -// try { -// logService.save(new WmsLog(WmsUtils.generateId("LOG_"), "向WCS发送拣选任务", "setConveyTask", convertJsonString(request), convertJsonString(result), url, LocalDateTime.now(), "WMS")); -// } catch (Exception e) { -// logger.error("插入日志错误。"); -// } -// if (result != null && Objects.equals(ResponseCode.OK.getCode(), result.getCode())) { -// logger.info("发送拣选任务成功。"); -// pickTaskService.update(new LambdaUpdateWrapper() -// .set(PickTask::getPickStatus, PickTaskStatusEnum.SEND.getCode()) -// .in(PickTask::getVehicleId, vehicleAndStansMap.keySet()) -// .eq(PickTask::getPickStatus, PickTaskStatusEnum.NEW.getCode())); -// } else { -// logger.error("发送拣选任务错误:{}", convertJsonString(result)); -// } -// } else { -// logger.error("WCS发送拣选任务地址为空。"); -// } -// } +// simulateSendPickTasks(vehicleAndStansMap.keySet().stream().toList()); + if (!request.isEmpty()) { + // 发送任务 + String url = configMap.get(ConfigMapKeyEnum.URL_WCS_PICK_TASK.getConfigKey()); + if (url != null) { + logger.info("向WCS发送拣选任务,地址:{},请求详情:{}", url, convertJsonString(request)); + ResponseEntity result = JSON.parseObject(HttpUtils.sendHttpPostWithoutToken(url, convertJsonString(request)), ResponseEntity.class); + try { + logService.save(new WmsLog(WmsUtils.generateId("LOG_"), "向WCS发送拣选任务", "setConveyTask", convertJsonString(request), convertJsonString(result), url, LocalDateTime.now(), "WMS")); + } catch (Exception e) { + logger.error("插入日志错误。"); + } + if (result != null && Objects.equals(ResponseCode.OK.getCode(), result.getCode())) { + logger.info("发送拣选任务成功。"); + pickTaskService.update(new LambdaUpdateWrapper() + .set(PickTask::getPickStatus, PickTaskStatusEnum.SEND.getCode()) + .in(PickTask::getVehicleId, vehicleAndStansMap.keySet()) + .eq(PickTask::getPickStatus, PickTaskStatusEnum.NEW.getCode())); + } else { + logger.error("发送拣选任务错误:{}", convertJsonString(result)); + } + } else { + logger.error("WCS发送拣选任务地址为空。"); + } + } } catch (Exception exception) { logger.error("向WCS发送拣选任务时发生异常:{}", convertJsonString(exception)); throw new Exception("向WCS发送拣选任务时发生异常。"); diff --git a/src/main/java/com/wms/service/business/serviceImplements/WorkServiceImplements.java b/src/main/java/com/wms/service/business/serviceImplements/WorkServiceImplements.java index 88f863e..3350eec 100644 --- a/src/main/java/com/wms/service/business/serviceImplements/WorkServiceImplements.java +++ b/src/main/java/com/wms/service/business/serviceImplements/WorkServiceImplements.java @@ -393,7 +393,7 @@ public class WorkServiceImplements implements IWorkService { // 分出在库的物料 List onStockStockList = allStockList.stream().filter(stock -> Objects.equals(stock.getStockStatus(), StockStatus.OK.getCode())).sorted(Comparator.comparing(Stock::getCreateTime)).toList(); for (String standId : canUseStandIdList) { - Map equipVehicleOfThisStandMap = new HashMap<>(); + Map equipTaskOfThisStandMap = new HashMap<>(); // 生成这个站台在这个设备出库的箱子 for (Task task : outTaskList) { if (StringUtils.isEmpty(task.getPickStand())) { @@ -401,9 +401,9 @@ public class WorkServiceImplements implements IWorkService { continue; } int equipmentId = getStackerIdByLocationId(task.getOrigin()); - if (equipmentId != 0 && !equipVehicleOfThisStandMap.containsKey(equipmentId) && Objects.equals(task.getPickStand(), standId)) { + if (equipmentId != 0 && Objects.equals(task.getPickStand(), standId)) { // 当前设备当前站台的任务 - equipVehicleOfThisStandMap.put(equipmentId, task.getVehicleId()); + equipTaskOfThisStandMap.put(equipmentId, equipTaskOfThisStandMap.getOrDefault(equipmentId, 0) + 1); } } Map thisStandOutVehicleMap = new HashMap<>();// 键为载具号,值为库存id @@ -433,8 +433,8 @@ public class WorkServiceImplements implements IWorkService { continue; } // 判断这个设备能否出库 - if (equipVehicleOfThisStandMap.containsKey(equipmentId)) { - // 这个站台在这台设备已经生成过任务,不再重复生成 + if (equipTaskOfThisStandMap.containsKey(equipmentId) && equipTaskOfThisStandMap.get(equipmentId) >= 2) { + // 这个站台在这台设备已经生成过两条任务,不再生成 continue; } // 判断这个库存是否被当前站台需要 @@ -505,7 +505,7 @@ public class WorkServiceImplements implements IWorkService { // 添加本次出库载具 thisTimeOutVehicleIds.add(stock.getVehicleId()); // 添加设备 - equipVehicleOfThisStandMap.put(equipmentId, stock.getVehicleId()); + equipTaskOfThisStandMap.put(equipmentId, equipTaskOfThisStandMap.getOrDefault(equipmentId, 0) + 1); // 此处是为了将同一个载具尽量在同一个站台捡完 thisStandOutVehicleMap.put(stock.getVehicleId(), stock.getStockId()); } @@ -1076,6 +1076,7 @@ public class WorkServiceImplements implements IWorkService { continue; } workFlow.setWorkStatus(-1);// 设置暂存状态 + workFlow.setDistributedNum(BigDecimal.ZERO); finalWorkFlows.add(workFlow); } if (!finalWorkFlows.isEmpty()) {