From 061ef4050eaeed3e7a79d4b94159b376351634b4 Mon Sep 17 00:00:00 2001 From: liangzhou <594755172@qq.com> Date: Sat, 7 Sep 2024 15:08:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9B=B4=E6=96=B0=EF=BC=9A?= =?UTF-8?q?=201.=E5=A2=9E=E5=8A=A0=E4=BB=BB=E5=8A=A1=E4=B8=8B=E5=8F=91?= =?UTF-8?q?=E6=97=B6=E7=9A=84=E9=80=BB=E8=BE=91=202.=E4=BF=AE=E6=94=B9or()?= =?UTF-8?q?.eq=E7=9A=84=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wms/constants/enums/ConfigMapKeyEnum.java | 1 + .../java/com/wms/controller/JobComponent.java | 4 +- .../com/wms/controller/StockController.java | 2 +- .../com/wms/controller/TaskController.java | 3 +- .../app/request/StockUpdateRecordQuery.java | 65 +++++++- .../entity/app/vo/StockUpdateRecordVo.java | 38 ++--- .../WmsJobServiceImplements.java | 145 ++++++++++++++---- .../WmsTaskServiceImplements.java | 10 +- .../WorkServiceImplements.java | 3 +- 9 files changed, 214 insertions(+), 57 deletions(-) diff --git a/src/main/java/com/wms/constants/enums/ConfigMapKeyEnum.java b/src/main/java/com/wms/constants/enums/ConfigMapKeyEnum.java index 11e5dec..7f25554 100644 --- a/src/main/java/com/wms/constants/enums/ConfigMapKeyEnum.java +++ b/src/main/java/com/wms/constants/enums/ConfigMapKeyEnum.java @@ -7,6 +7,7 @@ public enum ConfigMapKeyEnum { URL_WCS_PICK_TASK("URL_WCS_PICK_TASK"), URL_WCS_E_TASK("URL_WCS_E_TASK"), URL_WCS_DISPOSE_VEHICLE("URL_WCS_DISPOSE_VEHICLE"), + CREATE_WORK("CREATE_WORK"), START_WORK("START_WORK"), SEND_TASK("SEND_TASK"), MAX_VEHICLE_NUMS("MAX_VEHICLE_NUMS"), diff --git a/src/main/java/com/wms/controller/JobComponent.java b/src/main/java/com/wms/controller/JobComponent.java index 6257e42..a3d56ad 100644 --- a/src/main/java/com/wms/controller/JobComponent.java +++ b/src/main/java/com/wms/controller/JobComponent.java @@ -109,8 +109,8 @@ public class JobComponent { @Scheduled(fixedDelay = 2000) @Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED) public void createWork() { - String startWork = configMap.get(ConfigMapKeyEnum.START_WORK.getConfigKey()); - if (StringUtils.isEmpty(startWork) || !startWork.equals("1")) { + String createWork = configMap.get(ConfigMapKeyEnum.CREATE_WORK.getConfigKey()); + if (StringUtils.isEmpty(createWork) || !createWork.equals("1")) { return; } // 轮询工作站台,判断是否需要下发任务 diff --git a/src/main/java/com/wms/controller/StockController.java b/src/main/java/com/wms/controller/StockController.java index 0f62603..beaeb3b 100644 --- a/src/main/java/com/wms/controller/StockController.java +++ b/src/main/java/com/wms/controller/StockController.java @@ -127,7 +127,7 @@ public class StockController { for (Stock stock : stocks) { sumNum = sumNum.add(stock.getGoodsRelated().getRemainNum()); } - // 没有库存 + // 设定数量 stockVo.setRemainNum(sumNum); logger.info("物料{}无库存", stockQuery.getGoodsId()); } diff --git a/src/main/java/com/wms/controller/TaskController.java b/src/main/java/com/wms/controller/TaskController.java index a49c68d..5efffbd 100644 --- a/src/main/java/com/wms/controller/TaskController.java +++ b/src/main/java/com/wms/controller/TaskController.java @@ -1178,8 +1178,7 @@ public class TaskController { GoodsToStation goodsToStation = goodsToStationService.getOne(new LambdaQueryWrapper() .eq(GoodsToStation::getWorkStation, workFlow.getWorkStation()) .eq(GoodsToStation::getGoodsId, workFlow.getGoodsId()) - .eq(GoodsToStation::getDistributeStatus, 0) - .or().eq(GoodsToStation::getDistributeStatus, 1) + .lt(GoodsToStation::getDistributeStatus, 2) .last("limit 1")); if (goodsToStation != null) { // 更新站台要料数量 diff --git a/src/main/java/com/wms/entity/app/request/StockUpdateRecordQuery.java b/src/main/java/com/wms/entity/app/request/StockUpdateRecordQuery.java index fe633da..86b5aa1 100644 --- a/src/main/java/com/wms/entity/app/request/StockUpdateRecordQuery.java +++ b/src/main/java/com/wms/entity/app/request/StockUpdateRecordQuery.java @@ -1,10 +1,73 @@ package com.wms.entity.app.request; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import java.math.BigDecimal; +import java.time.LocalDateTime; + @EqualsAndHashCode(callSuper = true) @Data public class StockUpdateRecordQuery extends PageQuery { - + /** + * 记录编号 + */ + @JsonProperty("recordId") + private String recordId; + /** + * 库存编号 + */ + @JsonProperty("stockId") + private String stockId; + /** + * 料箱编号 + */ + @JsonProperty("vehicleId") + private String vehicleId; + /** + * 料号 + */ + @JsonProperty("goodsId") + private String goodsId; + /** + * 物料名称 + */ + @JsonProperty("goodsName") + private String goodsName; + /** + * 原来库位 + */ + @JsonProperty("locationBefore") + private String locationBefore; + /** + * 后来库位 + */ + @JsonProperty("locationAfter") + private String locationAfter; + /** + * 原来数量 + */ + @JsonProperty("quantityBefore") + private BigDecimal quantityBefore; + /** + * 后来数量 + */ + @JsonProperty("quantityAfter") + private BigDecimal quantityAfter; + /** + * 原因 + */ + @JsonProperty("reason") + private String reason; + /** + * 更新时间 + */ + @JsonProperty("updateTime") + private LocalDateTime updateTime; + /** + * 更新用户 + */ + @JsonProperty("updateUser") + private String updateUser; } diff --git a/src/main/java/com/wms/entity/app/vo/StockUpdateRecordVo.java b/src/main/java/com/wms/entity/app/vo/StockUpdateRecordVo.java index d758bbd..6287e07 100644 --- a/src/main/java/com/wms/entity/app/vo/StockUpdateRecordVo.java +++ b/src/main/java/com/wms/entity/app/vo/StockUpdateRecordVo.java @@ -12,52 +12,52 @@ import java.time.LocalDateTime; @Data public class StockUpdateRecordVo { /** - * 库存编号 + * 记录编号 */ - @JsonProperty("record_id") + @JsonProperty("recordId") private String recordId; /** - * 库位ID + * 库存编号 */ - @JsonProperty("stock_id") + @JsonProperty("stockId") private String stockId; /** - * 库位ID + * 料箱编号 */ - @JsonProperty("vehicle_id") + @JsonProperty("vehicleId") private String vehicleId; /** - * 库位ID + * 料号 */ - @JsonProperty("goods_id") + @JsonProperty("goodsId") private String goodsId; /** - * 库位ID + * 物料名称 */ - @JsonProperty("goods_name") + @JsonProperty("goodsName") private String goodsName; /** - * 库位ID + * 原来库位 */ - @JsonProperty("location_before") + @JsonProperty("locationBefore") private String locationBefore; /** - * 库位ID + * 后来库位 */ - @JsonProperty("location_after") + @JsonProperty("locationAfter") private String locationAfter; /** - * 库位ID + * 原来数量 */ - @JsonProperty("quantity_before") + @JsonProperty("quantityBefore") private BigDecimal quantityBefore; /** - * 库位ID + * 后来数量 */ - @JsonProperty("quantity_after") + @JsonProperty("quantityAfter") private BigDecimal quantityAfter; /** - * 库位ID + * 原因 */ @JsonProperty("reason") private String reason; 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 f9d5fdb..b8c146f 100644 --- a/src/main/java/com/wms/service/business/serviceImplements/WmsJobServiceImplements.java +++ b/src/main/java/com/wms/service/business/serviceImplements/WmsJobServiceImplements.java @@ -46,37 +46,49 @@ public class WmsJobServiceImplements implements IWmsJobService { private final TaskService taskService;// 任务服务 private final PickTaskService pickTaskService;// 拣选任务服务 private final OutsideVehiclesService outsideVehiclesService;// 流转中箱子服务 + /** * 发送正常的任务 */ @Override public void sendCommonTasks() throws Exception { try { - String max_vehicle_nums = configMap.get(ConfigMapKeyEnum.MAX_VEHICLE_NUMS.getConfigKey()); - String max_wcs_accept_nums = configMap.get(ConfigMapKeyEnum.MAX_WCS_ACCEPT_NUMS.getConfigKey()); - if (StringUtils.isEmpty(max_vehicle_nums) || StringUtils.isEmpty(max_wcs_accept_nums)) { - logger.error("配置未生成"); - return; - } - int maxVehicleNums = Integer.parseInt(max_vehicle_nums); - int maxWcsAcceptNums = Integer.parseInt(max_wcs_accept_nums); - List outsideVehicles = outsideVehiclesService.selectDistinctVehicles(); - if (outsideVehicles == null || outsideVehicles.isEmpty()) { - outsideVehicles = Collections.emptyList(); - } - int remainVehicleNums = maxVehicleNums - outsideVehicles.size(); - // 检索任务表---新建未下发的任务 LambdaQueryWrapper waitForDistributeTaskQuery = new LambdaQueryWrapper() .eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode()); List allTasks = taskService.list(waitForDistributeTaskQuery); - // 需要发送给wcs的任务列表 - List request = new ArrayList<>(); - // 已经下发的任务组列表 - List taskGroupIds = new ArrayList<>(); - // 本次生成的环线任务 - List pickVehicleIds = new ArrayList<>(); 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()); + if (StringUtils.isEmpty(max_vehicle_nums) || StringUtils.isEmpty(max_wcs_accept_nums)) { + logger.error("配置未生成"); + return; + } + int maxVehicleNums = Integer.parseInt(max_vehicle_nums); + int maxWcsAcceptNums = Integer.parseInt(max_wcs_accept_nums); + List outsideVehicles = outsideVehiclesService.selectDistinctVehicles(); + if (outsideVehicles == null || outsideVehicles.isEmpty()) { + outsideVehicles = Collections.emptyList(); + } + int remainVehicleNums = maxVehicleNums - outsideVehicles.size(); + + // 需要发送给wcs的任务列表 + List request = new ArrayList<>(); + // 已经下发的任务组列表 + List taskGroupIds = new ArrayList<>(); + // 本次生成的环线任务 + List pickVehicleIds = new ArrayList<>(); + // 查找所有已经出库的站台拣选任务 + List standPickTasks = pickTaskService.list(); + // 生成一个Map,计算每个站台已经出库的拣选任务 + Map outPickTaskMap = new HashMap<>(); + standPickTasks.forEach(pickTask -> { + if (!Objects.equals(pickTask.getPickStatus(), PickTaskStatusEnum.TEMP.getCode())) { + outPickTaskMap.put(pickTask.getStandId(), + outPickTaskMap.getOrDefault(pickTask.getStandId(), 0) + 1); + } + }); + // 这里单独处理站台拣选出库以外的任务 for (Task task : allTasks) { if (taskGroupIds.size() >= maxWcsAcceptNums) { // 每次给wcs下发数量 @@ -93,15 +105,8 @@ public class WmsJobServiceImplements implements IWmsJobService { } } if (Objects.equals(task.getTaskType(), TaskType.OUT.getCode()) - && task.getIsPicking() == 1 && StringUtils.isNotEmpty(task.getPickStand())) { - // 去站台的拣选任务 - if (!pickVehicleIds.contains(task.getVehicleId())) { - if (pickVehicleIds.size() >= remainVehicleNums) { - continue; - } else { - pickVehicleIds.add(task.getVehicleId()); - } - } + && task.getIsPicking() == 1 && StringUtils.isNotEmpty(task.getPickStand())) { + continue; } // 创建发送的任务 WcsTaskRequest tempTask = new WcsTaskRequest(); @@ -121,6 +126,88 @@ public class WmsJobServiceImplements implements IWmsJobService { // 已经发送过的任务组 taskGroupIds.add(task.getTaskGroup()); } + // 处理站台拣选出库任务 + while (taskGroupIds.size() < maxWcsAcceptNums && pickVehicleIds.size() < remainVehicleNums) { + // 先找出目前数量最少的站台 + String standId = outPickTaskMap.entrySet().stream() + .min(Comparator.comparingInt(Map.Entry::getValue)) + .map(Map.Entry::getKey) + .orElse(""); + List vehicleIds; + if (StringUtils.isNotEmpty(standId)) { + // 查找这个站台未下发的料箱 + vehicleIds = standPickTasks.stream() + .filter(pickTask -> pickTask.getStandId().equals(standId) && pickTask.getPickStatus().equals(PickTaskStatusEnum.TEMP.getCode()) && !pickVehicleIds.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())) + .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 vehicleId = vehicleStandsMap.entrySet().stream() + .max(Comparator.comparingInt(Map.Entry::getValue)) + .map(Map.Entry::getKey) + .orElse(""); + // 更新每个站台的拣选箱数量 + List standIds = standPickTasks.stream() + .filter(pickTask -> pickTask.getVehicleId().equals(vehicleId)) + .map(PickTask::getStandId) + .distinct() + .toList(); + if (!standIds.isEmpty()) { + standIds.forEach(tempStandId -> outPickTaskMap.put(tempStandId, outPickTaskMap.getOrDefault(tempStandId, 0) + 1)); + } + // 找到这个箱子的任务 + List outPickTasks = allTasks.stream().filter(task -> + task.getVehicleId().equals(vehicleId) && Objects.equals(task.getTaskType(), TaskType.OUT.getCode()) + && task.getIsPicking() == 1 && StringUtils.isNotEmpty(task.getPickStand())).toList(); + 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()); + } + pickVehicleIds.add(vehicleId); + } if (request.size() == 0) { // 没有新任务发送 return; diff --git a/src/main/java/com/wms/service/business/serviceImplements/WmsTaskServiceImplements.java b/src/main/java/com/wms/service/business/serviceImplements/WmsTaskServiceImplements.java index d8b7e07..671fcbd 100644 --- a/src/main/java/com/wms/service/business/serviceImplements/WmsTaskServiceImplements.java +++ b/src/main/java/com/wms/service/business/serviceImplements/WmsTaskServiceImplements.java @@ -473,6 +473,10 @@ public class WmsTaskServiceImplements implements IWmsTaskService { if (!Objects.equals(pickStatus, PickTaskStatusEnum.TEMP.getCode()) && !Objects.equals(pickStatus, PickTaskStatusEnum.NEW.getCode())) { return; } + // 这里查询所有暂存的任务 + List tempPickTasks = pickTaskService.list(new LambdaQueryWrapper() + .eq(PickTask::getPickStatus, PickTaskStatusEnum.TEMP.getCode())); + List tempPickVehicles = tempPickTasks.stream().map(PickTask::getVehicleId).distinct().toList(); // 拣选任务暂存列表 List pickTasks = new ArrayList<>(); vehicleIds.forEach(vehicleId -> { @@ -481,7 +485,11 @@ public class WmsTaskServiceImplements implements IWmsTaskService { tempPickTask.setPickTaskId(generateId("PICK_")); tempPickTask.setVehicleId(vehicleId); tempPickTask.setStandId(workStation); - tempPickTask.setPickStatus(pickStatus); + if (tempPickVehicles.contains(vehicleId)) { + tempPickTask.setPickStatus(PickTaskStatusEnum.TEMP.getCode()); + } else { + tempPickTask.setPickStatus(pickStatus); + } tempPickTask.setLastUpdateTime(LocalDateTime.now()); pickTasks.add(tempPickTask); }); 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 77b8e97..a3da185 100644 --- a/src/main/java/com/wms/service/business/serviceImplements/WorkServiceImplements.java +++ b/src/main/java/com/wms/service/business/serviceImplements/WorkServiceImplements.java @@ -191,8 +191,7 @@ public class WorkServiceImplements implements IWorkService { // 查站台要料表---未分配以及分配但未完全分配 List goodsToStationList = goodsToStationService.list(new LambdaQueryWrapper() .eq(GoodsToStation::getWorkStation, workStation) - .eq(GoodsToStation::getDistributeStatus, 0) - .or().eq(GoodsToStation::getDistributeStatus, 1)); + .lt(GoodsToStation::getDistributeStatus, 2)); if (goodsToStationList == null || goodsToStationList.isEmpty()) { // 查询是否还有这个站台的拣选任务 if (!pickTaskService.exists(new LambdaQueryWrapper()