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 c90d647..567071b 100644 --- a/src/main/java/com/wms/service/business/serviceImplements/WorkServiceImplements.java +++ b/src/main/java/com/wms/service/business/serviceImplements/WorkServiceImplements.java @@ -53,140 +53,11 @@ public class WorkServiceImplements implements IWorkService { private final List workDoingStations = new ArrayList<>();// 当前正在执行任务的站台 private final List workFinishingStations = new ArrayList<>();// 当前正在完成任务的站台 -// /** -// * 新版创建工作 -// * @param workStation 工作站台 -// * @throws Exception 异常 -// */ -// @Override -// @Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED) -// public void createWork(String workStation) throws Exception { -// if (workCreatingStations.contains(workStation)) { -// // 当前站台正在创建任务 -// return; -// } else { -// // 添加站台 -// workCreatingStations.add(workStation); -// } -// if (StringUtils.isEmpty(workStation)) { -// // 站台号为空 -// return; -// } -// try { -// // 先判断当日是否是工作日 -// if (!localWorkDateList.contains(LocalDate.now())) { -// return; -// } -// // 先查看当前站台已经生成的工作流是否为空 -// List currentWorkFlowList = workFlowService.list(new LambdaQueryWrapper() -// .eq(WorkFlow::getWorkStation, workStation)); -// // 当前站台的工作流中还存在其他任务 -// if (currentWorkFlowList != null && !currentWorkFlowList.isEmpty()) { -// return; -// } -// // 当前站台分配的工位 -// List currentStationWorkFlows = new ArrayList<>(); -// // 先找MWL机型 -// findWorks(workStation, currentStationWorkFlows, "MWL"); -// if (currentStationWorkFlows.isEmpty()) { -// // 找非MWL机型 -// findWorks(workStation, currentStationWorkFlows, "NOT_MWL"); -// } -// // 如果当前站台有任务 -// if (!currentStationWorkFlows.isEmpty()) { -// // 将工作流列表添加进数据库 -// workFlowService.saveBatch(currentStationWorkFlows); -// // 获得工单列表 -// List workOrderList = new ArrayList<>(); -// // 获得工单以及小工位列表 -// List boxNoList = new ArrayList<>(); -// // 要料Map -// Map needGoodsMap = new HashMap<>(); -// for (WorkFlow tempWorkflow : currentStationWorkFlows) { -// // 添加工单 -// if (!workOrderList.contains(tempWorkflow.getWorkOrder())) { -// workOrderList.add(tempWorkflow.getWorkOrder()); -// } -// // 添加盒子配置 -// String boxNo = tempWorkflow.getWorkOrder() + "@" + tempWorkflow.getWorkCenter(); -// if (!boxNoList.contains(boxNo)) { -// boxNoList.add(boxNo); -// } -// // 添加要料信息 -// if (!needGoodsMap.containsKey(tempWorkflow.getGoodsId())) { -// // 添加物料信息 -// needGoodsMap.put(tempWorkflow.getGoodsId(), tempWorkflow.getNeedNum()); -// } else { -// // 增加需求数量 -// needGoodsMap.replace(tempWorkflow.getGoodsId(), needGoodsMap.get(tempWorkflow.getGoodsId()).add(tempWorkflow.getNeedNum())); -// } -// } -// // 站台要料 -// List goodsToStationList = new ArrayList<>(); -// for (String goodsId : needGoodsMap.keySet()) { -// GoodsToStation goodsToStation = new GoodsToStation(); -// goodsToStation.setGoodsId(goodsId); -// goodsToStation.setWorkStation(workStation); -// goodsToStation.setDistributeStatus(0); -// goodsToStation.setDistributedNum(BigDecimal.ZERO); -// goodsToStation.setTotalNum(needGoodsMap.get(goodsId)); -// goodsToStationList.add(goodsToStation); -// } -// // 将站台要料列表存进数据库 -// goodsToStationService.saveBatch(goodsToStationList); -// // 更新工单表 -// List orderIds = currentStationWorkFlows.stream().map(WorkFlow::getOrderId).distinct().toList(); -// if (!orderIds.isEmpty()) { -// kateOrdersService.update(new LambdaUpdateWrapper() -// .set(KateOrders::getOrderStatus, 1) -// .in(KateOrders::getOrderId, orderIds) -// .eq(KateOrders::getOrderStatus, 0)); -// } -// // 更新dbs表 -// if (!workOrderList.isEmpty()) { -// kateDBSService.update(new LambdaUpdateWrapper() -// .set(KateDBS::getDbsStatus, 1) -// .in(KateDBS::getWorkOrder, workOrderList) -// .eq(KateDBS::getDbsStatus, 0)); -// } -// // 电子标签库位配置 -// List eLocationConfigList = new ArrayList<>(); -// // 查找到当前站台所有可用的电子标签 -// List eTagLocationList = eTagLocationService.list(new LambdaQueryWrapper() -// .eq(ETagLocation::getWorkStation, workStation) -// .eq(ETagLocation::getELocationStatus, 0) -// .orderByAsc(ETagLocation::getSequenceId)); -// if (eTagLocationList.isEmpty() || eTagLocationList.size() < boxNoList.size()) { -// throw new Exception("站台:" + workStation + "没有足够可用的电子标签位!"); -// } -// for (ETagLocation eTagLocation : eTagLocationList) { -// if (!boxNoList.isEmpty()) { -// String tempBoxNo = boxNoList.get(0); -// ELocationConfig eLocationConfig = new ELocationConfig(); -// eLocationConfig.setWorkOrder(tempBoxNo.split("@")[0]); -// eLocationConfig.setWorkCenter(tempBoxNo.split("@")[1]); -// eLocationConfig.setWorkStation(workStation); -// eLocationConfig.setELocationId(eTagLocation.getELocationId()); -// eLocationConfig.setOrderBoxNo(tempBoxNo); -// // 添加配置 -// eLocationConfigList.add(eLocationConfig); -// // 移除已经分配的盒子 -// boxNoList.remove(tempBoxNo); -// } -// } -// // 将电子标签库位配置存进数据库 -// eLocationConfigService.saveBatch(eLocationConfigList); -// } -// } catch (Exception e) { -// logger.error("创建站台:{}工作发生异常:{}", workStation, convertJsonString(e)); -// // 回滚事务 -// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); -// } finally { -// // 当前站台创建任务完成 -// workCreatingStations.remove(workStation); -// } -// } - + /** + * 新版创建工作 + * @param workStation 工作站台 + * @throws Exception 异常 + */ @Override @Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED) public void createWork(String workStation) throws Exception { @@ -202,31 +73,40 @@ public class WorkServiceImplements implements IWorkService { return; } try { + // 先判断当日是否是工作日 + if (!localWorkDateList.contains(LocalDate.now())) { + return; + } // 先查看当前站台已经生成的工作流是否为空 List currentWorkFlowList = workFlowService.list(new LambdaQueryWrapper() - .eq(WorkFlow::getWorkStation, workStation) - .ne(WorkFlow::getWorkStatus, 0)); + .eq(WorkFlow::getWorkStation, workStation)); // 当前站台的工作流中还存在其他任务 if (currentWorkFlowList != null && !currentWorkFlowList.isEmpty()) { return; } - // 查询是否有已经分配好的电子标签库位信息 - List oldELocationConfigList = eLocationConfigService.list(new LambdaQueryWrapper() - .eq(ELocationConfig::getWorkStation, workStation)); - if (oldELocationConfigList != null && !oldELocationConfigList.isEmpty()) { - return; + // 当前站台分配的工位 + List currentStationWorkFlows = new ArrayList<>(); + // 先找MWL机型 + findWorks(workStation, currentStationWorkFlows, "MWL"); + if (currentStationWorkFlows.isEmpty()) { + // 找非MWL机型 + findWorks(workStation, currentStationWorkFlows, "NOT_MWL"); } - // 查询所有待下发的 - List currentStationWorkFlows = workFlowService.list(new LambdaQueryWrapper() - .eq(WorkFlow::getWorkStatus, 0) - .eq(WorkFlow::getWorkStation, workStation)); // 如果当前站台有任务 if (!currentStationWorkFlows.isEmpty()) { + // 将工作流列表添加进数据库 + workFlowService.saveBatch(currentStationWorkFlows); + // 获得工单列表 + List workOrderList = new ArrayList<>(); // 获得工单以及小工位列表 List boxNoList = new ArrayList<>(); // 要料Map Map needGoodsMap = new HashMap<>(); for (WorkFlow tempWorkflow : currentStationWorkFlows) { + // 添加工单 + if (!workOrderList.contains(tempWorkflow.getWorkOrder())) { + workOrderList.add(tempWorkflow.getWorkOrder()); + } // 添加盒子配置 String boxNo = tempWorkflow.getWorkOrder() + "@" + tempWorkflow.getWorkCenter(); if (!boxNoList.contains(boxNo)) { @@ -245,7 +125,6 @@ public class WorkServiceImplements implements IWorkService { List goodsToStationList = new ArrayList<>(); for (String goodsId : needGoodsMap.keySet()) { GoodsToStation goodsToStation = new GoodsToStation(); - goodsToStation.setConfigId(goodsId + "_" + workStation); goodsToStation.setGoodsId(goodsId); goodsToStation.setWorkStation(workStation); goodsToStation.setDistributeStatus(0); @@ -254,7 +133,22 @@ public class WorkServiceImplements implements IWorkService { goodsToStationList.add(goodsToStation); } // 将站台要料列表存进数据库 - goodsToStationService.saveOrUpdateBatch(goodsToStationList); + goodsToStationService.saveBatch(goodsToStationList); + // 更新工单表 + List orderIds = currentStationWorkFlows.stream().map(WorkFlow::getOrderId).distinct().toList(); + if (!orderIds.isEmpty()) { + kateOrdersService.update(new LambdaUpdateWrapper() + .set(KateOrders::getOrderStatus, 1) + .in(KateOrders::getOrderId, orderIds) + .eq(KateOrders::getOrderStatus, 0)); + } + // 更新dbs表 + if (!workOrderList.isEmpty()) { + kateDBSService.update(new LambdaUpdateWrapper() + .set(KateDBS::getDbsStatus, 1) + .in(KateDBS::getWorkOrder, workOrderList) + .eq(KateDBS::getDbsStatus, 0)); + } // 电子标签库位配置 List eLocationConfigList = new ArrayList<>(); // 查找到当前站台所有可用的电子标签 @@ -282,12 +176,6 @@ public class WorkServiceImplements implements IWorkService { } // 将电子标签库位配置存进数据库 eLocationConfigService.saveBatch(eLocationConfigList); - // 更新工作流状态 - List workFlowIds = currentStationWorkFlows.stream().map(WorkFlow::getWorkFlowId).distinct().toList(); - workFlowService.update(new LambdaUpdateWrapper() - .set(WorkFlow::getWorkStatus, 1) - .in(WorkFlow::getWorkFlowId, workFlowIds) - .eq(WorkFlow::getWorkStatus, 0)); } } catch (Exception e) { logger.error("创建站台:{}工作发生异常:{}", workStation, convertJsonString(e)); @@ -299,158 +187,123 @@ public class WorkServiceImplements implements IWorkService { } } -// /** -// * 新版开始工作 -// * @param workStation 工作站台 -// * @throws Exception 异常 -// */ // @Override // @Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED) -// public void doWork(String workStation) throws Exception { -// if (workDoingStations.contains(workStation)) { +// public void createWork(String workStation) throws Exception { +// if (workCreatingStations.contains(workStation)) { // // 当前站台正在创建任务 // return; // } else { // // 添加站台 -// workDoingStations.add(workStation); +// workCreatingStations.add(workStation); +// } +// if (StringUtils.isEmpty(workStation)) { +// // 站台号为空 +// return; // } // try { -// // 查找当前站台未开始的工作流 +// // 先查看当前站台已经生成的工作流是否为空 // List currentWorkFlowList = workFlowService.list(new LambdaQueryWrapper() // .eq(WorkFlow::getWorkStation, workStation) -// .ne(WorkFlow::getWorkStatus, 2)); -// // 没有可做的任务 -// if (currentWorkFlowList == null || currentWorkFlowList.isEmpty()) { +// .ne(WorkFlow::getWorkStatus, 0)); +// // 当前站台的工作流中还存在其他任务 +// if (currentWorkFlowList != null && !currentWorkFlowList.isEmpty()) { // return; // } -// // 查站台要料表---未分配以及分配但未完全分配 -// List goodsToStationList = goodsToStationService.list(new LambdaQueryWrapper() -// .eq(GoodsToStation::getWorkStation, workStation)); -// List notFinishedGoodsList = goodsToStationList.stream().filter(goodsToStation -> goodsToStation.getDistributeStatus() < 2).toList(); -// if (notFinishedGoodsList.isEmpty()) { -// // 查询是否还有这个站台的拣选任务 -// if (!pickTaskService.exists(new LambdaQueryWrapper() -// .eq(PickTask::getStandId, workStation))) { -// // 需要重新分配的goodsToStationsList -// Map needDistributeGoodsMap = new HashMap<>(); -// // 需要完成的工作流 -// List needFinishWorkFlowList = new ArrayList<>(); -// // 所有缺料的分配 -// List lackGoodsIdList = goodsToStationList.stream().filter(goodsToStation -> goodsToStation.getDistributeStatus() == 3).map(GoodsToStation::getGoodsId).distinct().toList(); -// // 不缺料的分配 -// Map noLackGoodsMap = goodsToStationList.stream().filter(goodsToStation -> goodsToStation.getDistributeStatus() == 2).collect(Collectors.toMap(GoodsToStation::getGoodsId, goodsToStation -> goodsToStation)); -// // 查询当前工作流中所有缺料的数据行 -// for (WorkFlow notFinishedWorkFlow : currentWorkFlowList) { -// if (notFinishedWorkFlow.getPickedNum().compareTo(notFinishedWorkFlow.getNeedNum()) < 0) { -// // 缺料时,判断是否当前物料在缺料列表中 -// if (lackGoodsIdList.contains(notFinishedWorkFlow.getGoodsId())) { -// // 缺料,添加到需要分配的列表中 -// notFinishedWorkFlow.setWorkStatus(2); -// notFinishedWorkFlow.setFinishTime(LocalDateTime.now()); -// notFinishedWorkFlow.setOpUser("系统自动完成"); -// needFinishWorkFlowList.add(notFinishedWorkFlow); -// } else { -// BigDecimal needNum = notFinishedWorkFlow.getNeedNum().subtract(notFinishedWorkFlow.getPickedNum()); -// if (needDistributeGoodsMap.containsKey(notFinishedWorkFlow.getGoodsId())) { -// // 减少分配数量 -// GoodsToStation oldGoodsToStation = needDistributeGoodsMap.get(notFinishedWorkFlow.getGoodsId()); -// oldGoodsToStation.setDistributedNum(oldGoodsToStation.getDistributedNum().subtract(needNum)); -// oldGoodsToStation.setDistributeStatus(1); -// needDistributeGoodsMap.replace(notFinishedWorkFlow.getGoodsId(), oldGoodsToStation); -// } else { -// if (noLackGoodsMap.containsKey(notFinishedWorkFlow.getGoodsId())) { -// GoodsToStation newGoodsToStation = noLackGoodsMap.get(notFinishedWorkFlow.getGoodsId()); -// newGoodsToStation.setDistributedNum(newGoodsToStation.getDistributedNum().subtract(needNum)); -// newGoodsToStation.setDistributeStatus(1); -// needDistributeGoodsMap.put(notFinishedWorkFlow.getGoodsId(), newGoodsToStation); -// } else { -// GoodsToStation goodsToStation = new GoodsToStation(); -// goodsToStation.setConfigId(notFinishedWorkFlow.getGoodsId() + "_" + workStation); -// goodsToStation.setGoodsId(notFinishedWorkFlow.getGoodsId()); -// goodsToStation.setWorkStation(workStation); -// goodsToStation.setDistributeStatus(0); -// goodsToStation.setDistributedNum(BigDecimal.ZERO); -// goodsToStation.setTotalNum(needNum); -// needDistributeGoodsMap.put(notFinishedWorkFlow.getGoodsId(), goodsToStation); -// } -// } -// } -// } else { -// // 不缺料,直接完成 -// notFinishedWorkFlow.setWorkStatus(2); -// notFinishedWorkFlow.setFinishTime(LocalDateTime.now()); -// notFinishedWorkFlow.setOpUser("系统自动完成"); -// needFinishWorkFlowList.add(notFinishedWorkFlow); -// } +// // 查询是否有已经分配好的电子标签库位信息 +// List oldELocationConfigList = eLocationConfigService.list(new LambdaQueryWrapper() +// .eq(ELocationConfig::getWorkStation, workStation)); +// if (oldELocationConfigList != null && !oldELocationConfigList.isEmpty()) { +// return; +// } +// // 查询所有待下发的 +// List currentStationWorkFlows = workFlowService.list(new LambdaQueryWrapper() +// .eq(WorkFlow::getWorkStatus, 0) +// .eq(WorkFlow::getWorkStation, workStation)); +// // 如果当前站台有任务 +// if (!currentStationWorkFlows.isEmpty()) { +// // 获得工单以及小工位列表 +// List boxNoList = new ArrayList<>(); +// // 要料Map +// Map needGoodsMap = new HashMap<>(); +// for (WorkFlow tempWorkflow : currentStationWorkFlows) { +// // 添加盒子配置 +// String boxNo = tempWorkflow.getWorkOrder() + "@" + tempWorkflow.getWorkCenter(); +// if (!boxNoList.contains(boxNo)) { +// boxNoList.add(boxNo); // } -// // 保存重新分配的goodsToStationList -// goodsToStationService.saveOrUpdateBatch(needDistributeGoodsMap.values()); -// // 保存需要完成的工作流 -// workFlowService.updateBatchById(needFinishWorkFlowList); -// } -// return; -// } -// for (GoodsToStation goodsToStation : notFinishedGoodsList) { -// // 当前物料当前站台需求数量 -// BigDecimal needNum = goodsToStation.getTotalNum().subtract(goodsToStation.getDistributedNum()); -// if (needNum.compareTo(BigDecimal.ZERO) == 0) { -// // 需求数量为0 -// continue; -// } -// // 判断实际库存是否充足 -// List stockList = stockService.list(new LambdaQueryWrapper() -// .apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, goodsToStation.getGoodsId()) -// .apply("goods_related ->> '$.remainNum' > 0")); -// if (stockList == null || stockList.isEmpty()) { -// goodsToStation.setDistributeStatus(3); -// continue; -// } -// // 判断当前物料是否在流转中 -// needNum = wmsTaskService.callGoods(goodsToStation.getGoodsId(), needNum, workStation); -// // 判断此时需求数量是否为0 -// if (needNum.compareTo(BigDecimal.ZERO) <= 0) { -// // 分配完成 -// goodsToStation.setDistributeStatus(2); -// } else { -// needNum = wmsTaskService.callStocks(goodsToStation.getGoodsId(), needNum, workStation); -// if (needNum.compareTo(BigDecimal.ZERO) > 0) { -// // 已分配但未完全分配 -// goodsToStation.setDistributeStatus(1); +// // 添加要料信息 +// if (!needGoodsMap.containsKey(tempWorkflow.getGoodsId())) { +// // 添加物料信息 +// needGoodsMap.put(tempWorkflow.getGoodsId(), tempWorkflow.getNeedNum()); // } else { -// // 分配完成 -// goodsToStation.setDistributeStatus(2); +// // 增加需求数量 +// needGoodsMap.replace(tempWorkflow.getGoodsId(), needGoodsMap.get(tempWorkflow.getGoodsId()).add(tempWorkflow.getNeedNum())); // } // } -// // 更新已分配数量 -// goodsToStation.setDistributedNum(goodsToStation.getTotalNum().subtract(needNum)); +// // 站台要料 +// List goodsToStationList = new ArrayList<>(); +// for (String goodsId : needGoodsMap.keySet()) { +// GoodsToStation goodsToStation = new GoodsToStation(); +// goodsToStation.setConfigId(goodsId + "_" + workStation); +// goodsToStation.setGoodsId(goodsId); +// goodsToStation.setWorkStation(workStation); +// goodsToStation.setDistributeStatus(0); +// goodsToStation.setDistributedNum(BigDecimal.ZERO); +// goodsToStation.setTotalNum(needGoodsMap.get(goodsId)); +// goodsToStationList.add(goodsToStation); +// } +// // 将站台要料列表存进数据库 +// goodsToStationService.saveOrUpdateBatch(goodsToStationList); +// // 电子标签库位配置 +// List eLocationConfigList = new ArrayList<>(); +// // 查找到当前站台所有可用的电子标签 +// List eTagLocationList = eTagLocationService.list(new LambdaQueryWrapper() +// .eq(ETagLocation::getWorkStation, workStation) +// .eq(ETagLocation::getELocationStatus, 0) +// .orderByAsc(ETagLocation::getSequenceId)); +// if (eTagLocationList.isEmpty() || eTagLocationList.size() < boxNoList.size()) { +// throw new Exception("站台:" + workStation + "没有足够可用的电子标签位!"); +// } +// for (ETagLocation eTagLocation : eTagLocationList) { +// if (!boxNoList.isEmpty()) { +// String tempBoxNo = boxNoList.get(0); +// ELocationConfig eLocationConfig = new ELocationConfig(); +// eLocationConfig.setWorkOrder(tempBoxNo.split("@")[0]); +// eLocationConfig.setWorkCenter(tempBoxNo.split("@")[1]); +// eLocationConfig.setWorkStation(workStation); +// eLocationConfig.setELocationId(eTagLocation.getELocationId()); +// eLocationConfig.setOrderBoxNo(tempBoxNo); +// // 添加配置 +// eLocationConfigList.add(eLocationConfig); +// // 移除已经分配的盒子 +// boxNoList.remove(tempBoxNo); +// } +// } +// // 将电子标签库位配置存进数据库 +// eLocationConfigService.saveBatch(eLocationConfigList); +// // 更新工作流状态 +// List workFlowIds = currentStationWorkFlows.stream().map(WorkFlow::getWorkFlowId).distinct().toList(); +// workFlowService.update(new LambdaUpdateWrapper() +// .set(WorkFlow::getWorkStatus, 1) +// .in(WorkFlow::getWorkFlowId, workFlowIds) +// .eq(WorkFlow::getWorkStatus, 0)); // } -// goodsToStationService.updateBatchById(notFinishedGoodsList); -// // 更新工作流状态 -// List workFlowIds = currentWorkFlowList.stream().map(WorkFlow::getWorkFlowId).distinct().toList(); -// List orderIds = currentWorkFlowList.stream().map(WorkFlow::getOrderId).distinct().toList(); -// List goodsIds = currentWorkFlowList.stream().map(WorkFlow::getGoodsId).distinct().toList(); -// List smallBoxes = currentWorkFlowList.stream().map(WorkFlow::getWorkCenter).distinct().toList(); -// workFlowService.update(new LambdaUpdateWrapper() -// .set(WorkFlow::getWorkStatus, 1) -// .in(WorkFlow::getWorkFlowId, workFlowIds) -// .eq(WorkFlow::getWorkStatus, 0)); -// // 更新工单表状态 -// kateOrdersService.update(new LambdaUpdateWrapper() -// .set(KateOrders::getOrderStatus, 2) -// .in(KateOrders::getOrderId, orderIds) -// .in(KateOrders::getGoodsId, goodsIds) -// .in(KateOrders::getSupplyArea, smallBoxes) -// .eq(KateOrders::getOrderStatus, 1)); // } catch (Exception e) { -// logger.error("执行站台:{}工作发生异常:{}", workStation, convertJsonString(e)); +// logger.error("创建站台:{}工作发生异常:{}", workStation, convertJsonString(e)); // // 回滚事务 // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); // } finally { // // 当前站台创建任务完成 -// workDoingStations.remove(workStation); +// workCreatingStations.remove(workStation); // } // } + /** + * 新版开始工作 + * @param workStation 工作站台 + * @throws Exception 异常 + */ @Override @Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED) public void doWork(String workStation) throws Exception { @@ -465,7 +318,7 @@ public class WorkServiceImplements implements IWorkService { // 查找当前站台未开始的工作流 List currentWorkFlowList = workFlowService.list(new LambdaQueryWrapper() .eq(WorkFlow::getWorkStation, workStation) - .eq(WorkFlow::getWorkStatus, 1)); + .ne(WorkFlow::getWorkStatus, 2)); // 没有可做的任务 if (currentWorkFlowList == null || currentWorkFlowList.isEmpty()) { return; @@ -572,6 +425,22 @@ public class WorkServiceImplements implements IWorkService { goodsToStation.setDistributedNum(goodsToStation.getTotalNum().subtract(needNum)); } goodsToStationService.updateBatchById(notFinishedGoodsList); + // 更新工作流状态 + List workFlowIds = currentWorkFlowList.stream().map(WorkFlow::getWorkFlowId).distinct().toList(); + List orderIds = currentWorkFlowList.stream().map(WorkFlow::getOrderId).distinct().toList(); + List goodsIds = currentWorkFlowList.stream().map(WorkFlow::getGoodsId).distinct().toList(); + List smallBoxes = currentWorkFlowList.stream().map(WorkFlow::getWorkCenter).distinct().toList(); + workFlowService.update(new LambdaUpdateWrapper() + .set(WorkFlow::getWorkStatus, 1) + .in(WorkFlow::getWorkFlowId, workFlowIds) + .eq(WorkFlow::getWorkStatus, 0)); + // 更新工单表状态 + kateOrdersService.update(new LambdaUpdateWrapper() + .set(KateOrders::getOrderStatus, 2) + .in(KateOrders::getOrderId, orderIds) + .in(KateOrders::getGoodsId, goodsIds) + .in(KateOrders::getSupplyArea, smallBoxes) + .eq(KateOrders::getOrderStatus, 1)); } catch (Exception e) { logger.error("执行站台:{}工作发生异常:{}", workStation, convertJsonString(e)); // 回滚事务 @@ -582,114 +451,143 @@ public class WorkServiceImplements implements IWorkService { } } -// /** -// * 新版完成工作 -// * @param workStation 工作站台 -// * @return 结果 -// * @throws Exception 异常 -// */ // @Override -// public String finishWork(String workStation) throws Exception { -// if (workFinishingStations.contains(workStation)) { -// // 当前站台正在完成工作 -// return "当前站台正在完成工作,请勿重复操作"; +// @Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED) +// public void doWork(String workStation) throws Exception { +// if (workDoingStations.contains(workStation)) { +// // 当前站台正在创建任务 +// return; // } else { // // 添加站台 -// workFinishingStations.add(workStation); +// workDoingStations.add(workStation); // } // try { -// if (workFlowService.exists(new LambdaQueryWrapper() +// // 查找当前站台未开始的工作流 +// List currentWorkFlowList = workFlowService.list(new LambdaQueryWrapper() // .eq(WorkFlow::getWorkStation, workStation) -// .ne(WorkFlow::getWorkStatus, 2))) { -// // 当前站台工作未全部完成 -// return "工作未全部做完,不允许确认完成。"; +// .eq(WorkFlow::getWorkStatus, 1)); +// // 没有可做的任务 +// if (currentWorkFlowList == null || currentWorkFlowList.isEmpty()) { +// return; // } -// if (eLocationConfigService.exists(new LambdaQueryWrapper() -// .eq(ELocationConfig::getWorkStation, workStation) -// .eq(ELocationConfig::getPrintStatus, 0))) { -// // 有标签未打印 -// return "有标签未打印"; -// } -// if (!eLocationConfigService.exists(new LambdaQueryWrapper() -// .eq(ELocationConfig::getWorkStation, workStation))) { -// // 没有标签,说明点过确认。 -// return "没有可以确认完成的工作,请勿重复点击。"; -// } -// // 查找当前站台的标签配置 -// List eLocationConfigList = eLocationConfigService.list(new LambdaQueryWrapper() -// .eq(ELocationConfig::getWorkStation, workStation)); -// // 保存一下记录 -// List eLocationConfigLastList = ELocationConfig.toLocationsConfigLastList(eLocationConfigList); -// // 先清空之前的 -// eLocationConfigLastService.remove(new LambdaQueryWrapper() -// .eq(ELocationConfigLast::getWorkStation, workStation)); -// eLocationConfigLastService.saveBatch(eLocationConfigLastList); -// // 删除所有的标签配置 -// eLocationConfigService.remove(new LambdaQueryWrapper() -// .eq(ELocationConfig::getWorkStation, workStation)); -// // 查询当前站台的所有工作流列表 -// List workFlowList = workFlowService.list(new LambdaQueryWrapper() -// .eq(WorkFlow::getWorkStation, workStation) -// .eq(WorkFlow::getWorkStatus, 2)); -// // workSummary列表 -// List workSummaryList = new ArrayList<>(); -// for (WorkFlow workFlow : workFlowList) { -// WorkSummary summary = new WorkSummary(); -// summary.setWorkFlowId(workFlow.getWorkFlowId()); -// summary.setWorkStation(workFlow.getWorkStation()); -// summary.setWorkOrder(workFlow.getWorkOrder()); -// summary.setWorkCenter(workFlow.getWorkCenter()); -// summary.setGoodsId(workFlow.getGoodsId()); -// summary.setPickedNum(workFlow.getPickedNum()); -// summary.setNeedNum(workFlow.getNeedNum()); -// summary.setLackNum(workFlow.getNeedNum().subtract(workFlow.getPickedNum())); -// summary.setWorkDate(workFlow.getCreateTime().toLocalDate().atStartOfDay()); -// summary.setWorkStatus(workFlow.getWorkStatus()); -// summary.setLackStatus(summary.getLackNum().compareTo(BigDecimal.ZERO) > 0 ? 1 : 0); -// summary.setFinishTime(workFlow.getFinishTime()); -// summary.setOpUser(workFlow.getOpUser()); -// // 设置电子标签位置 -// List currentBoxELocationList = eLocationConfigList.stream().filter(e -> -// e.getWorkOrder().equals(workFlow.getWorkOrder()) -// && e.getWorkCenter().equals(workFlow.getWorkCenter())).toList(); -// summary.setELocationId(currentBoxELocationList.size() > 0 ? currentBoxELocationList.get(0).getELocationId() : ""); -// workSummaryList.add(summary); -// // 更新工单表 -// kateOrdersService.update(new LambdaUpdateWrapper() -// .set(KateOrders::getOrderStatus, 4) -// .set(KateOrders::getFinishTime, LocalDateTime.now()) -// .set(KateOrders::getPickedQuantity, workFlow.getPickedNum()) -// .set(KateOrders::getLackQuantity, workFlow.getNeedNum().subtract(workFlow.getPickedNum())) -// .eq(KateOrders::getOrderId, workFlow.getOrderId()) -// .eq(KateOrders::getSupplyArea, workFlow.getWorkCenter()) -// .eq(KateOrders::getGoodsId, workFlow.getGoodsId())); -// // 如果当前工单已经没有未完成的工作,更新DBS状态完成 -// if (!kateOrdersService.exists(new LambdaQueryWrapper() -// .eq(KateOrders::getOrderId, workFlow.getOrderId()) -// .ne(KateOrders::getOrderStatus, 4))) { -// kateDBSService.update(new LambdaUpdateWrapper() -// .set(KateDBS::getDbsStatus, 2) -// .set(KateDBS::getLastUpdateTime, LocalDateTime.now()) -// .eq(KateDBS::getWorkOrder, workFlow.getOrderId())); -// } -// } -// workSummaryService.saveBatch(workSummaryList); -// // 移除工作流 -// workFlowService.remove(new LambdaQueryWrapper() -// .eq(WorkFlow::getWorkStation, workStation)); -// // 移库站台要料 -// goodsToStationService.remove(new LambdaQueryWrapper() +// // 查站台要料表---未分配以及分配但未完全分配 +// List goodsToStationList = goodsToStationService.list(new LambdaQueryWrapper() // .eq(GoodsToStation::getWorkStation, workStation)); +// List notFinishedGoodsList = goodsToStationList.stream().filter(goodsToStation -> goodsToStation.getDistributeStatus() < 2).toList(); +// if (notFinishedGoodsList.isEmpty()) { +// // 查询是否还有这个站台的拣选任务 +// if (!pickTaskService.exists(new LambdaQueryWrapper() +// .eq(PickTask::getStandId, workStation))) { +// // 需要重新分配的goodsToStationsList +// Map needDistributeGoodsMap = new HashMap<>(); +// // 需要完成的工作流 +// List needFinishWorkFlowList = new ArrayList<>(); +// // 所有缺料的分配 +// List lackGoodsIdList = goodsToStationList.stream().filter(goodsToStation -> goodsToStation.getDistributeStatus() == 3).map(GoodsToStation::getGoodsId).distinct().toList(); +// // 不缺料的分配 +// Map noLackGoodsMap = goodsToStationList.stream().filter(goodsToStation -> goodsToStation.getDistributeStatus() == 2).collect(Collectors.toMap(GoodsToStation::getGoodsId, goodsToStation -> goodsToStation)); +// // 查询当前工作流中所有缺料的数据行 +// for (WorkFlow notFinishedWorkFlow : currentWorkFlowList) { +// if (notFinishedWorkFlow.getPickedNum().compareTo(notFinishedWorkFlow.getNeedNum()) < 0) { +// // 缺料时,判断是否当前物料在缺料列表中 +// if (lackGoodsIdList.contains(notFinishedWorkFlow.getGoodsId())) { +// // 缺料,添加到需要分配的列表中 +// notFinishedWorkFlow.setWorkStatus(2); +// notFinishedWorkFlow.setFinishTime(LocalDateTime.now()); +// notFinishedWorkFlow.setOpUser("系统自动完成"); +// needFinishWorkFlowList.add(notFinishedWorkFlow); +// } else { +// BigDecimal needNum = notFinishedWorkFlow.getNeedNum().subtract(notFinishedWorkFlow.getPickedNum()); +// if (needDistributeGoodsMap.containsKey(notFinishedWorkFlow.getGoodsId())) { +// // 减少分配数量 +// GoodsToStation oldGoodsToStation = needDistributeGoodsMap.get(notFinishedWorkFlow.getGoodsId()); +// oldGoodsToStation.setDistributedNum(oldGoodsToStation.getDistributedNum().subtract(needNum)); +// oldGoodsToStation.setDistributeStatus(1); +// needDistributeGoodsMap.replace(notFinishedWorkFlow.getGoodsId(), oldGoodsToStation); +// } else { +// if (noLackGoodsMap.containsKey(notFinishedWorkFlow.getGoodsId())) { +// GoodsToStation newGoodsToStation = noLackGoodsMap.get(notFinishedWorkFlow.getGoodsId()); +// newGoodsToStation.setDistributedNum(newGoodsToStation.getDistributedNum().subtract(needNum)); +// newGoodsToStation.setDistributeStatus(1); +// needDistributeGoodsMap.put(notFinishedWorkFlow.getGoodsId(), newGoodsToStation); +// } else { +// GoodsToStation goodsToStation = new GoodsToStation(); +// goodsToStation.setConfigId(notFinishedWorkFlow.getGoodsId() + "_" + workStation); +// goodsToStation.setGoodsId(notFinishedWorkFlow.getGoodsId()); +// goodsToStation.setWorkStation(workStation); +// goodsToStation.setDistributeStatus(0); +// goodsToStation.setDistributedNum(BigDecimal.ZERO); +// goodsToStation.setTotalNum(needNum); +// needDistributeGoodsMap.put(notFinishedWorkFlow.getGoodsId(), goodsToStation); +// } +// } +// } +// } else { +// // 不缺料,直接完成 +// notFinishedWorkFlow.setWorkStatus(2); +// notFinishedWorkFlow.setFinishTime(LocalDateTime.now()); +// notFinishedWorkFlow.setOpUser("系统自动完成"); +// needFinishWorkFlowList.add(notFinishedWorkFlow); +// } +// } +// // 保存重新分配的goodsToStationList +// goodsToStationService.saveOrUpdateBatch(needDistributeGoodsMap.values()); +// // 保存需要完成的工作流 +// workFlowService.updateBatchById(needFinishWorkFlowList); +// } +// return; +// } +// for (GoodsToStation goodsToStation : notFinishedGoodsList) { +// // 当前物料当前站台需求数量 +// BigDecimal needNum = goodsToStation.getTotalNum().subtract(goodsToStation.getDistributedNum()); +// if (needNum.compareTo(BigDecimal.ZERO) == 0) { +// // 需求数量为0 +// continue; +// } +// // 判断实际库存是否充足 +// List stockList = stockService.list(new LambdaQueryWrapper() +// .apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, goodsToStation.getGoodsId()) +// .apply("goods_related ->> '$.remainNum' > 0")); +// if (stockList == null || stockList.isEmpty()) { +// goodsToStation.setDistributeStatus(3); +// continue; +// } +// // 判断当前物料是否在流转中 +// needNum = wmsTaskService.callGoods(goodsToStation.getGoodsId(), needNum, workStation); +// // 判断此时需求数量是否为0 +// if (needNum.compareTo(BigDecimal.ZERO) <= 0) { +// // 分配完成 +// goodsToStation.setDistributeStatus(2); +// } else { +// needNum = wmsTaskService.callStocks(goodsToStation.getGoodsId(), needNum, workStation); +// if (needNum.compareTo(BigDecimal.ZERO) > 0) { +// // 已分配但未完全分配 +// goodsToStation.setDistributeStatus(1); +// } else { +// // 分配完成 +// goodsToStation.setDistributeStatus(2); +// } +// } +// // 更新已分配数量 +// goodsToStation.setDistributedNum(goodsToStation.getTotalNum().subtract(needNum)); +// } +// goodsToStationService.updateBatchById(notFinishedGoodsList); // } catch (Exception e) { -// logger.error("完成站台:{}工作发生异常:{}", workStation, convertJsonString(e)); -// throw new Exception("完成站台:" + workStation + "工作发生异常!"); +// logger.error("执行站台:{}工作发生异常:{}", workStation, convertJsonString(e)); +// // 回滚事务 +// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); // } finally { -// // 当前站台工作完成 -// workFinishingStations.remove(workStation); +// // 当前站台创建任务完成 +// workDoingStations.remove(workStation); // } -// return ""; // } + /** + * 新版完成工作 + * @param workStation 工作站台 + * @return 结果 + * @throws Exception 异常 + */ @Override public String finishWork(String workStation) throws Exception { if (workFinishingStations.contains(workStation)) { @@ -702,7 +600,7 @@ public class WorkServiceImplements implements IWorkService { try { if (workFlowService.exists(new LambdaQueryWrapper() .eq(WorkFlow::getWorkStation, workStation) - .eq(WorkFlow::getWorkStatus, 1))) { + .ne(WorkFlow::getWorkStatus, 2))) { // 当前站台工作未全部完成 return "工作未全部做完,不允许确认完成。"; } @@ -756,6 +654,24 @@ public class WorkServiceImplements implements IWorkService { && e.getWorkCenter().equals(workFlow.getWorkCenter())).toList(); summary.setELocationId(currentBoxELocationList.size() > 0 ? currentBoxELocationList.get(0).getELocationId() : ""); workSummaryList.add(summary); + // 更新工单表 + kateOrdersService.update(new LambdaUpdateWrapper() + .set(KateOrders::getOrderStatus, 4) + .set(KateOrders::getFinishTime, LocalDateTime.now()) + .set(KateOrders::getPickedQuantity, workFlow.getPickedNum()) + .set(KateOrders::getLackQuantity, workFlow.getNeedNum().subtract(workFlow.getPickedNum())) + .eq(KateOrders::getOrderId, workFlow.getOrderId()) + .eq(KateOrders::getSupplyArea, workFlow.getWorkCenter()) + .eq(KateOrders::getGoodsId, workFlow.getGoodsId())); + // 如果当前工单已经没有未完成的工作,更新DBS状态完成 + if (!kateOrdersService.exists(new LambdaQueryWrapper() + .eq(KateOrders::getOrderId, workFlow.getOrderId()) + .ne(KateOrders::getOrderStatus, 4))) { + kateDBSService.update(new LambdaUpdateWrapper() + .set(KateDBS::getDbsStatus, 2) + .set(KateDBS::getLastUpdateTime, LocalDateTime.now()) + .eq(KateDBS::getWorkOrder, workFlow.getOrderId())); + } } workSummaryService.saveBatch(workSummaryList); // 移除工作流 @@ -774,6 +690,90 @@ public class WorkServiceImplements implements IWorkService { return ""; } +// @Override +// public String finishWork(String workStation) throws Exception { +// if (workFinishingStations.contains(workStation)) { +// // 当前站台正在完成工作 +// return "当前站台正在完成工作,请勿重复操作"; +// } else { +// // 添加站台 +// workFinishingStations.add(workStation); +// } +// try { +// if (workFlowService.exists(new LambdaQueryWrapper() +// .eq(WorkFlow::getWorkStation, workStation) +// .eq(WorkFlow::getWorkStatus, 1))) { +// // 当前站台工作未全部完成 +// return "工作未全部做完,不允许确认完成。"; +// } +// if (eLocationConfigService.exists(new LambdaQueryWrapper() +// .eq(ELocationConfig::getWorkStation, workStation) +// .eq(ELocationConfig::getPrintStatus, 0))) { +// // 有标签未打印 +// return "有标签未打印"; +// } +// if (!eLocationConfigService.exists(new LambdaQueryWrapper() +// .eq(ELocationConfig::getWorkStation, workStation))) { +// // 没有标签,说明点过确认。 +// return "没有可以确认完成的工作,请勿重复点击。"; +// } +// // 查找当前站台的标签配置 +// List eLocationConfigList = eLocationConfigService.list(new LambdaQueryWrapper() +// .eq(ELocationConfig::getWorkStation, workStation)); +// // 保存一下记录 +// List eLocationConfigLastList = ELocationConfig.toLocationsConfigLastList(eLocationConfigList); +// // 先清空之前的 +// eLocationConfigLastService.remove(new LambdaQueryWrapper() +// .eq(ELocationConfigLast::getWorkStation, workStation)); +// eLocationConfigLastService.saveBatch(eLocationConfigLastList); +// // 删除所有的标签配置 +// eLocationConfigService.remove(new LambdaQueryWrapper() +// .eq(ELocationConfig::getWorkStation, workStation)); +// // 查询当前站台的所有工作流列表 +// List workFlowList = workFlowService.list(new LambdaQueryWrapper() +// .eq(WorkFlow::getWorkStation, workStation) +// .eq(WorkFlow::getWorkStatus, 2)); +// // workSummary列表 +// List workSummaryList = new ArrayList<>(); +// for (WorkFlow workFlow : workFlowList) { +// WorkSummary summary = new WorkSummary(); +// summary.setWorkFlowId(workFlow.getWorkFlowId()); +// summary.setWorkStation(workFlow.getWorkStation()); +// summary.setWorkOrder(workFlow.getWorkOrder()); +// summary.setWorkCenter(workFlow.getWorkCenter()); +// summary.setGoodsId(workFlow.getGoodsId()); +// summary.setPickedNum(workFlow.getPickedNum()); +// summary.setNeedNum(workFlow.getNeedNum()); +// summary.setLackNum(workFlow.getNeedNum().subtract(workFlow.getPickedNum())); +// summary.setWorkDate(workFlow.getCreateTime().toLocalDate().atStartOfDay()); +// summary.setWorkStatus(workFlow.getWorkStatus()); +// summary.setLackStatus(summary.getLackNum().compareTo(BigDecimal.ZERO) > 0 ? 1 : 0); +// summary.setFinishTime(workFlow.getFinishTime()); +// summary.setOpUser(workFlow.getOpUser()); +// // 设置电子标签位置 +// List currentBoxELocationList = eLocationConfigList.stream().filter(e -> +// e.getWorkOrder().equals(workFlow.getWorkOrder()) +// && e.getWorkCenter().equals(workFlow.getWorkCenter())).toList(); +// summary.setELocationId(currentBoxELocationList.size() > 0 ? currentBoxELocationList.get(0).getELocationId() : ""); +// workSummaryList.add(summary); +// } +// workSummaryService.saveBatch(workSummaryList); +// // 移除工作流 +// workFlowService.remove(new LambdaQueryWrapper() +// .eq(WorkFlow::getWorkStation, workStation)); +// // 移库站台要料 +// goodsToStationService.remove(new LambdaQueryWrapper() +// .eq(GoodsToStation::getWorkStation, workStation)); +// } catch (Exception e) { +// logger.error("完成站台:{}工作发生异常:{}", workStation, convertJsonString(e)); +// throw new Exception("完成站台:" + workStation + "工作发生异常!"); +// } finally { +// // 当前站台工作完成 +// workFinishingStations.remove(workStation); +// } +// return ""; +// } + /** * 先找到MWL的小工位的配置 *