From b176072388747abb438990157bfa305b215b4b90 Mon Sep 17 00:00:00 2001
From: zwl <1051256694@qq.com>
Date: 星期二, 14 四月 2026 21:59:39 +0800
Subject: [PATCH] 我们现在讨论一下系统找库位方案, 如何实现,对现有找库位规则进行整改,数据库也要整改 1、要能方便的填写单伸堆垛机或双伸堆垛机的深浅库位配置 2、根据设备状态分配库位,离线设备不分配 3、库位分配要均衡到每一个设备  4、库位高度需要匹配到对应库位信息,低库位能向上兼容  5、空托盘优先放在locType2库位=1的库位,没有这种库位了,允许放到其他库位 6、给入库站点设置有限去那些堆垛机,其次去那些堆垛机,弄成页面可以配置入库站点 7、在系统配置新增优先放前几列的配置,当入库的货物是高频货物时放在前几列 8、组托中会标识该托盘是高频还是低频,如果是高频则从前往后找库位,如果是低频则从后往前找库位 9、找库位时locMast中whsType字段无用

---
 src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java |   56 +++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 43 insertions(+), 13 deletions(-)

diff --git a/src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java b/src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java
index fd6422b..582ec1d 100644
--- a/src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java
+++ b/src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java
@@ -706,19 +706,26 @@
             return R.error("褰撳墠鐩爣搴撲綅涓嶅瓨鍦�");
         }
 
-        Integer preferredArea = resolveReassignArea(wrkMast, currentLoc);
-        if (preferredArea == null) {
+        LocTypeDto locTypeDto = buildReassignLocTypeDto(currentLoc);
+        List<Integer> areaOrder = buildReassignAreaOrder(wrkMast, currentLoc);
+        if (Cools.isEmpty(areaOrder)) {
             return R.error("鏃犳硶纭畾浠诲姟鎵�灞炲簱鍖�");
         }
 
-        List<Integer> candidateCrnNos = buildReassignCandidateCrnNos(preferredArea, wrkMast.getCrnNo());
-        if (candidateCrnNos.isEmpty()) {
-            return R.error("褰撳墠搴撳尯娌℃湁鍏朵粬鍫嗗灈鏈哄彲渚涢噸鍒嗛厤");
+        StartupDto startupDto = null;
+        Integer preferredArea = null;
+        for (Integer area : areaOrder) {
+            List<Integer> candidateCrnNos = buildReassignCandidateCrnNos(area, wrkMast.getCrnNo());
+            if (candidateCrnNos.isEmpty()) {
+                continue;
+            }
+            startupDto = commonService.findRun2InboundLocByCandidateCrnNos(
+                    wrkMast.getSourceStaNo(), wrkMast.getIoType(), area, candidateCrnNos, locTypeDto);
+            if (startupDto != null && !Cools.isEmpty(startupDto.getLocNo())) {
+                preferredArea = area;
+                break;
+            }
         }
-
-        LocTypeDto locTypeDto = buildReassignLocTypeDto(currentLoc);
-        StartupDto startupDto = commonService.findRun2InboundLocByCandidateCrnNos(
-                wrkMast.getSourceStaNo(), wrkMast.getIoType(), preferredArea, candidateCrnNos, locTypeDto);
         if (startupDto == null || Cools.isEmpty(startupDto.getLocNo())) {
             return R.error("褰撳墠搴撳尯娌℃湁鍙噸鏂板垎閰嶇殑绌哄簱浣�");
         }
@@ -801,15 +808,19 @@
     }
 
     private Integer resolveReassignArea(WrkMast wrkMast, LocMast currentLoc) {
-        Integer stationArea = Utils.getStationStorageArea(wrkMast.getSourceStaNo());
-        if (belongsToArea(stationArea, wrkMast.getCrnNo(), currentLoc)) {
-            return stationArea;
+        List<Integer> stationAreas = Utils.getStationStorageAreas(wrkMast.getSourceStaNo());
+        if (!Cools.isEmpty(stationAreas)) {
+            for (Integer area : stationAreas) {
+                if (belongsToArea(area, wrkMast.getCrnNo(), currentLoc)) {
+                    return area;
+                }
+            }
         }
         Integer fallbackArea = findAreaByCurrentTask(wrkMast.getCrnNo(), currentLoc);
         if (fallbackArea != null) {
             return fallbackArea;
         }
-        return stationArea;
+        return Utils.getStationStorageArea(wrkMast.getSourceStaNo());
     }
 
     private Integer findAreaByCurrentTask(Integer currentCrnNo, LocMast currentLoc) {
@@ -821,6 +832,25 @@
         return null;
     }
 
+    private List<Integer> buildReassignAreaOrder(WrkMast wrkMast, LocMast currentLoc) {
+        LinkedHashSet<Integer> areaOrder = new LinkedHashSet<>();
+        List<Integer> stationAreas = Utils.getStationStorageAreas(wrkMast.getSourceStaNo());
+        if (!Cools.isEmpty(stationAreas)) {
+            areaOrder.addAll(stationAreas);
+        }
+        Integer currentArea = findAreaByCurrentTask(wrkMast.getCrnNo(), currentLoc);
+        if (currentArea != null) {
+            areaOrder.add(currentArea);
+        }
+        if (areaOrder.isEmpty()) {
+            Integer resolvedArea = resolveReassignArea(wrkMast, currentLoc);
+            if (resolvedArea != null) {
+                areaOrder.add(resolvedArea);
+            }
+        }
+        return new ArrayList<>(areaOrder);
+    }
+
     private boolean belongsToArea(Integer area, Integer currentCrnNo, LocMast currentLoc) {
         if (area == null || area <= 0) {
             return false;

--
Gitblit v1.9.1