diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/base/controller/AreaController.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/base/controller/AreaController.java index f57320d..b933a5f 100644 --- a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/base/controller/AreaController.java +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/base/controller/AreaController.java @@ -67,6 +67,7 @@ public class AreaController extends JeecgController { List areaCodes= Arrays.asList(areaCode.split(",")); queryWrapper.in("area_code", areaCodes); } + queryWrapper.orderByAsc("create_time"); Page page = new Page(pageNo, pageSize); IPage pageList = areaService.page(page, queryWrapper); return Result.OK(pageList); diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/constant/enums/AreaTypeEnum.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/constant/enums/AreaTypeEnum.java index d8cf9a5..4cea205 100644 --- a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/constant/enums/AreaTypeEnum.java +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/constant/enums/AreaTypeEnum.java @@ -15,9 +15,15 @@ public enum AreaTypeEnum { MJCCQ("MJCCQ", "模具存储区"), - RK_DOCK("RK_DOCK", "入库工作站"), + RK_DOCK("RK_DOCK", "成品入库工作站"), + + CK_DOCK("CK_DOCK", "成品出库工作站"), + + MJRK_DOCK("MJRK_DOCK", "模具入库工作站"), + + MJCK_DOCK("MJCK_DOCK", "模具出库工作站"), + - CK_DOCK("CK_DOCK", "出库工作站"), ; /** * 值 diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/constant/enums/CommonStatusEnum.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/constant/enums/CommonStatusEnum.java index aa34fd2..65910fb 100644 --- a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/constant/enums/CommonStatusEnum.java +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/constant/enums/CommonStatusEnum.java @@ -18,6 +18,10 @@ public enum CommonStatusEnum { TWO(2, "二层"), + THREE(3, "三层"), + + FOUR(4, "四层"), + ; /** * 值 diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/conveyorLine/service/processor/ScanTrayProcessor.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/conveyorLine/service/processor/ScanTrayProcessor.java index bb56715..57003a1 100644 --- a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/conveyorLine/service/processor/ScanTrayProcessor.java +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/conveyorLine/service/processor/ScanTrayProcessor.java @@ -199,6 +199,23 @@ public class ScanTrayProcessor { * @return 目标库位 */ public Point allocatePoint(List itemKeys, Point station, String areaCode, String type) { + if(AreaTypeEnum.CPCCQ.getValue().equals(areaCode)){ + return allocateCpPoint(itemKeys, station, areaCode, type); + }else{ + return allocateMjPoint(itemKeys, station, areaCode, type); + } + } + + /** + * 智能库位分配成品库位 + * + * @param itemKeys 物料属性 + * @param station 工作站 + * @param areaCode 库区 + * @param type 业务类型 + * @return 目标库位 + */ + private Point allocateCpPoint(List itemKeys, Point station, String areaCode,String type){ // 1. 获取可用库位 List availablePoints = getAvailablePoints(itemKeys, areaCode, type); if (CollectionUtils.isEmpty(availablePoints)) { @@ -231,10 +248,74 @@ public class ScanTrayProcessor { } //合并获取最优库位 - List scoredPoints = Stream.concat( - firstScoredPoints.stream(), - secondScoredPoints.stream() - ) + List scoredPoints = Stream.of(firstScoredPoints, secondScoredPoints) + .flatMap(List::stream) + .sorted(Comparator.comparing(PointScore::getScore).reversed()) + .toList(); + + if (CollectionUtils.isNotEmpty(scoredPoints)) { + log.info("最优【{}】库位评分结果:{}", scoredPoints.get(0).getPoint().getPointCode(), scoredPoints.get(0).getScore()); + return scoredPoints.get(0).getPoint(); + } + + throw new RuntimeException("系统无可用库位"); + } + + + /** + * 智能库位分配模具库位 + * + * @param itemKeys 物料属性 + * @param station 工作站 + * @param areaCode 库区 + * @param type 业务类型 + * @return 目标库位 + */ + private Point allocateMjPoint(List itemKeys, Point station, String areaCode,String type){ + // 1. 获取可用库位 + List availablePoints = getAvailablePoints(itemKeys, areaCode, type); + if (CollectionUtils.isEmpty(availablePoints)) { + throw new RuntimeException("系统无可用库位"); + } + + //根据巷道分组,得到每个巷道有多个库位,<巷道编号,库位个数> + Map colMap = getColMap(areaCode); + + //获取每个巷道已占用的库位 + Map colUsedMap = getColUsedMap(areaCode); + + //根据layerNum层来分组 + Map> layerMap = availablePoints.stream().collect(Collectors.groupingBy(Point::getLayerNum)); + + List firstScoredPoints; + List secondScoredPoints = new ArrayList<>(); + List thirdScoredPoints = new ArrayList<>(); + List fourthScoredPoints = new ArrayList<>(); + + //移位选择最优库位 + if (type.equals(BusinessTypeEnum.MOVE.getValue())) { + firstScoredPoints = selectBestPointForMove(station, itemKeys, colMap, layerMap, colUsedMap); + } else { + //计算第一层的库位分数 + Station firstStation = new Station(4878, 36395); + firstScoredPoints = selectBestPointForStorage(firstStation, itemKeys, CommonStatusEnum.ONE.getValue(), colMap, layerMap, colUsedMap); + + //计算第二层的库位分数 + Station secondStation = new Station(4878, 38395); + secondScoredPoints = selectBestPointForStorage(secondStation, itemKeys, CommonStatusEnum.TWO.getValue(), colMap, layerMap, colUsedMap); + + //计算第三层的库位分数 + Station thirdStation = new Station(4878, 40395); + thirdScoredPoints = selectBestPointForStorage(thirdStation, itemKeys, CommonStatusEnum.THREE.getValue(), colMap, layerMap, colUsedMap); + + //计算第四层的库位分数 + Station fourthStation = new Station(4878, 42395); + fourthScoredPoints = selectBestPointForStorage(fourthStation, itemKeys, CommonStatusEnum.FOUR.getValue(), colMap, layerMap, colUsedMap); + } + + //合并获取最优库位 + List scoredPoints = Stream.of(firstScoredPoints, secondScoredPoints, thirdScoredPoints, fourthScoredPoints) + .flatMap(List::stream) .sorted(Comparator.comparing(PointScore::getScore).reversed()) .toList(); diff --git a/cpte-module-system/cpte-system-start/src/main/resources/application-prod.yml b/cpte-module-system/cpte-system-start/src/main/resources/application-prod.yml index 726c0bd..bc060fd 100644 --- a/cpte-module-system/cpte-system-start/src/main/resources/application-prod.yml +++ b/cpte-module-system/cpte-system-start/src/main/resources/application-prod.yml @@ -64,7 +64,7 @@ spring: clusterCheckinInterval: 15000 threadPool: class: org.quartz.simpl.SimpleThreadPool - threadCount: 10 + threadCount: 32 threadPriority: 5 threadsInheritContextClassLoaderOfInitializingThread: true #json 时间戳统一转换