From 053d403d024d9f6cf578ed5ca51800e60b7894ba Mon Sep 17 00:00:00 2001
From: lty <876263681@qq.com>
Date: 星期五, 16 一月 2026 08:45:06 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java |  379 ++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 296 insertions(+), 83 deletions(-)

diff --git a/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
index 08ba104..131caf8 100644
--- a/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -190,12 +190,80 @@
             throw new CoolException("搴撳瓨涓嶅瓨鍦�");
         }
     }
+    /**
+     * 妫�鏌ユ繁搴撲綅鍓嶆柟鏄惁鍫靛锛堟寜 locGroupAscOrder 閰嶇疆鐨勫垎缁勫拰椤哄簭妫�鏌ワ級
+     * 鍙鏌ュ悓涓� bay + lev + 褰撳墠鍒嗙粍 rowList 鍐咃紝鍓嶆柟浣嶇疆鏄惁鏈夎揣(F) 鎴� 鍏ュ簱浠诲姟
+     *
+     * @param locMast 褰撳墠搴撲綅涓绘。
+     * @param locNo 褰撳墠搴撲綅鍙�
+     * @param locGroupAscOrder 鍑哄簱浼樺厛鍒嗙粍閰嶇疆
+     * @throws CoolException 濡傛灉鍓嶆柟鏈夎揣鎴栧叆搴撲换鍔�
+     */
+    private void checkDeepPositionBlocking(LocMast locMast, String locNo, List<LocGroupOrder> locGroupAscOrder) {
+        // 鏌ユ壘褰撳墠 row 鎵�灞炲垎缁�
+        LocGroupOrder currentGroup = locGroupAscOrder.stream()
+                .filter(g -> g.getRowList().contains(locMast.getRow1()))
+                .findFirst()
+                .orElseThrow(() -> new CoolException("褰撳墠鎺掍笉鍦ㄤ换浣曞嚭搴撲紭鍏堝垎缁勪腑锛屾棤娉曡繘琛屾繁搴撲綅妫�鏌�: row=" + locMast.getRow1()));
+
+        List<Integer> orderedRows = currentGroup.getRowList();
+
+        // 鏌ヨ鍚屼竴 bay + lev + 鏈粍 rowList 鍐呯殑鎵�鏈夊簱浣�
+        List<LocMast> sameBayLevLocs = locMastService.selectList(new EntityWrapper<LocMast>()
+                .eq("bay1", locMast.getBay1())
+                .eq("lev1", locMast.getLev1())
+                .in("row1", orderedRows));
+
+        // 鎸夐厤缃『搴忛噸鏂版帓鍒�
+        List<LocMast> orderedLocs = orderedRows.stream()
+                .map(row -> sameBayLevLocs.stream()
+                        .filter(lm -> lm.getRow1().equals(row))
+                        .findFirst()
+                        .orElse(null))
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+
+        // 閬嶅巻妫�鏌ュ墠鏂�
+        boolean foundSelf = false;
+        for (LocMast prevLoc : orderedLocs) {
+            if (prevLoc.getLocNo().equals(locNo)) {
+                foundSelf = true;
+                break;  // 鍒拌揪鑷繁浣嶇疆锛屽仠姝�
+            }
+
+            // 鍓嶆柟鏈夎揣锛團鐘舵�侊級
+            if ("F".equals(prevLoc.getLocSts())) {
+                throw new CoolException(locNo + " 鐨勫墠鏂逛綅缃� " + prevLoc.getLocNo() + " 鏈夎揣锛岀姝㈠嚭搴�");
+            }
+
+            // 鍓嶆柟鏈夊叆搴撲换鍔★紙鍋囪 io_type=100 涓哄叆搴擄紝鏍规嵁瀹為檯璋冩暣锛�
+            // 杩欓噷鍙煡寰呭彂閫佺殑浠诲姟锛坵rk_sts=0锛夛紝鍙牴鎹渶瑕佸姞 wrk_sts=1 绛�
+            WrkMast frontTask = wrkMastService.selectOne(
+                    new EntityWrapper<WrkMast>()
+                            .eq("source_loc_no", prevLoc.getLocNo())  // 鍏ュ簱浠诲姟鐨勬簮浣嶇疆
+                            .eq("io_type", 100)                       // 鍏ュ簱绫诲瀷锛堣纭浣犵殑绯荤粺瀹氫箟锛�
+                            .eq("wrk_sts", 0L)                        // 寰呭彂閫�
+            );
+
+            if (frontTask != null) {
+                throw new CoolException(locNo + " 鐨勫墠鏂逛綅缃� " + prevLoc.getLocNo() + " 瀛樺湪鍏ュ簱浠诲姟锛岀姝㈠嚭搴�");
+            }
+        }
+
+        if (!foundSelf) {
+            throw new CoolException("鍒嗙粍鍐呮湭鎵惧埌鐩爣搴撲綅锛岃妫�鏌ユ暟鎹竴鑷存��: " + locNo);
+        }
+    }
 
     @Override
     @Transactional
     public void stockOut(BasDevp staNo, List<LocDetlDto> locDetlDtos, IoWorkType ioWorkType, Long userId) {
         Date now = new Date();
-        // 鍚堝苟鍚岀被椤�
+
+        // 浠庨厤缃幏鍙栧垎缁勶紙鍜岀┖鏉垮嚭搴撲繚鎸佷竴鑷达級
+        List<LocGroupOrder> locGroupAscOrder = slaveProperties.getLocGroupAscOrder();
+
+        // 鍚堝苟鍚岀被椤癸紙鐩稿悓 locNo 鐨勬槑缁嗗悎骞讹級
         Set<String> locNos = new HashSet<>();
         List<OutLocDto> dtos = new ArrayList<>();
         for (LocDetlDto locDetlDto : locDetlDtos) {
@@ -212,59 +280,47 @@
                 dtos.add(new OutLocDto(locNo, locDetlDto));
             }
         }
+
         Integer ioType = null;
 
-        // 鎸夊垪鍜屽眰鍒嗙粍搴撲綅
+        // 鎸夊垪鍜屽眰鍒嗙粍搴撲綅锛坆ay + lev锛�
         Map<String, List<OutLocDto>> locGroups = dtos.stream()
                 .collect(Collectors.groupingBy(dto -> {
                     String column = dto.getLocNo().substring(3, 6); // 鍒楀彿
-                    String level = dto.getLocNo().substring(6);    // 灞傚彿
-                    return column + "-" + level;                  // 缁勫悎鎴愬敮涓�鐨勭粍鏍囪瘑
+                    String level = dto.getLocNo().substring(6);     // 灞傚彿
+                    return column + "-" + level;
                 }));
 
         // 閬嶅巻姣忕粍
         for (Map.Entry<String, List<OutLocDto>> entry : locGroups.entrySet()) {
-            String groupKey = entry.getKey(); // 缁勬爣璇嗭紝渚嬪 "003-02" 琛ㄧず绗�3鍒楃2灞�
             List<OutLocDto> groupDtos = entry.getValue();
 
-            // 缁勫唴浼樺厛绾ч噸鏂颁粠100寮�濮�
+            // 缁勫唴浼樺厛绾ч噸鏂颁粠100寮�濮嬶紙鍘熸湁閫昏緫锛�
             double priority = 100;
 
-            // 鎺掑簭缁勫唴搴撲綅锛堟帓鍙峰�掑簭锛�
+            // 鎺掑簭缁勫唴搴撲綅锛堟帓鍙峰�掑簭锛屽師鏈夐�昏緫锛�
             groupDtos.sort(Comparator.comparing((OutLocDto dto) -> Integer.valueOf(dto.getLocNo().substring(0, 2))).reversed());
 
             for (OutLocDto dto : groupDtos) {
                 String locNo = dto.getLocNo();
 
-                // 娣卞簱浣嶈鍒欐鏌ワ紝浠呮鏌ュ綋鍓嶅垪鍜屽眰鍐呯殑鍓嶅簱浣�
-                int currentRow = Integer.valueOf(locNo.substring(0, 2));
-                for (int i = currentRow + 1; i <= 5; i++) { // 娣卞簱浣嶄负 1-5 鎺�
-                    String frontLoc = String.format("%02d%s", i, locNo.substring(2));
-                    LocMast locMastFront = locMastService.selectOne(new EntityWrapper<LocMast>()
-                            .eq("loc_no", frontLoc).eq("loc_sts", "F"));
-                    if (!Cools.isEmpty(locMastFront)) {
-                        throw new CoolException(locNo + " 鐨勫墠搴撲綅 " + frontLoc + " 鏈夎揣");
-                    }
-
-                    // 鍒ゆ柇鍓嶅簱浣嶆槸鍚︽湁鍏ュ簱浠诲姟
-                    WrkMast wrkMastFront = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("loc_no", frontLoc));
-                    if (!Cools.isEmpty(wrkMastFront)) {
-                        throw new CoolException(locNo + " 鐨勫墠搴撲綅 " + frontLoc + " 鏈夊叆搴撲换鍔�");
-                    }
-                }
-
-                // 璁$畻浼樺厛绾�
-                dto.setPriority(priority);
-                priority--;
-
-                // 鑾峰彇搴撲綅
-                LocMast locMast = locMastService.selectById(dto.getLocNo());
+                // 鑾峰彇搴撲綅淇℃伅锛堟彁鍓嶈幏鍙栵紝鐢ㄤ簬妫�鏌ュ拰鍚庣画浣跨敤锛�
+                LocMast locMast = locMastService.selectById(locNo);
                 if (Cools.isEmpty(locMast)) {
-                    throw new CoolException(dto.getLocNo() + "搴撲綅涓嶅瓨鍦�");
+                    throw new CoolException(locNo + "搴撲綅涓嶅瓨鍦�");
                 }
                 if (!locMast.getLocSts().equals("F")) {
-                    throw new CoolException(dto.getLocNo() + "鎵樼洏闈炲湪搴撶姸鎬�");
+                    throw new CoolException(locNo + "鎵樼洏闈炲湪搴撶姸鎬�");
                 }
+
+                // =====================================
+                // 娣卞簱浣嶅墠鏂瑰牭濉炴鏌ワ紙鏂伴�昏緫锛屾寜鍒嗙粍椤哄簭锛�
+                checkDeepPositionBlocking(locMast, locNo, locGroupAscOrder);
+                // =====================================
+
+                // 璁$畻浼樺厛绾э紙鍘熸湁閫昏緫锛�
+                dto.setPriority(priority);
+                priority--;
 
                 // 鍒ゆ柇鍏ュ嚭搴撶被鍨�
                 if (ioWorkType == null) {
@@ -281,7 +337,7 @@
 
                 // 鐢熸垚宸ヤ綔鍙�
                 int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
-                String pick = ioType == 101 ? "N":"Y";
+                String pick = ioType == 101 ? "N" : "Y";
 
                 // 鐢熸垚宸ヤ綔妗�
                 WrkMast wrkMast = new WrkMast();
@@ -293,7 +349,7 @@
                 wrkMast.setCrnNo(locMast.getCrnNo());
                 wrkMast.setSourceStaNo(staDesc.getCrnStn());
                 wrkMast.setStaNo(staDesc.getStnNo());
-                wrkMast.setSourceLocNo(dto.getLocNo());
+                wrkMast.setSourceLocNo(locNo);
                 wrkMast.setFullPlt("Y");
                 wrkMast.setPicking(pick);
                 wrkMast.setExitMk("N");
@@ -305,7 +361,7 @@
                 wrkMast.setModiUser(userId);
                 wrkMast.setModiTime(now);
                 if (!wrkMastService.insert(wrkMast)) {
-                    throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐ワ紝鍑哄簱搴撲綅鍙凤細" + dto.getLocNo());
+                    throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐ワ紝鍑哄簱搴撲綅鍙凤細" + locNo);
                 }
 
                 // 鐢熸垚宸ヤ綔妗f槑缁�
@@ -330,16 +386,16 @@
                 }
 
                 // 淇敼搴撲綅鐘舵��
-                locMast = locMastService.selectById(dto.getLocNo());
+                locMast = locMastService.selectById(locNo);  // 閲嶆柊鑾峰彇鏈�鏂扮姸鎬�
                 if (locMast.getLocSts().equals("F")) {
                     locMast.setLocSts(ioType == 101 ? "R" : "P");
                     locMast.setModiUser(userId);
                     locMast.setModiTime(now);
                     if (!locMastService.updateById(locMast)) {
-                        throw new CoolException("棰勭害搴撲綅鐘舵�佸け璐ワ紝搴撲綅鍙凤細" + dto.getLocNo());
+                        throw new CoolException("棰勭害搴撲綅鐘舵�佸け璐ワ紝搴撲綅鍙凤細" + locNo);
                     }
                 } else {
-                    throw new CoolException(dto.getLocNo() + "搴撲綅涓嶆槸鍦ㄥ簱鐘舵��");
+                    throw new CoolException(locNo + "搴撲綅涓嶆槸鍦ㄥ簱鐘舵��");
                 }
             }
         }
@@ -485,40 +541,174 @@
         }
         return dto.getLocNo();
     }
+    /**
+     * 妫�鏌ョ┖鏉垮嚭搴撳垎缁勫唴閫変腑杩炵画娈电殑鍙屽悜鍓嶆柟娓呯┖鎯呭喌锛屽苟杩斿洖鍑哄簱鏂瑰悜涓庢帓搴忓悗鐨勫簱浣嶅垪琛�
+     *
+     * @param selectedLocNos 閫変腑鐨勫簱浣嶅彿鍒楄〃
+     * @param locGroupAscOrder 鍑哄簱鍒嗙粍閰嶇疆
+     * @return LockingCheckResultParam 鍖呭惈鏍¢獙缁撴灉銆佹柟鍚戙�佹帓搴忓悗搴撲綅鍒楄〃
+     */
+    private LockingCheckResultParam checkEmptyPlateBlocking(
+            List<String> selectedLocNos,
+            List<LocGroupOrder> locGroupAscOrder) {
 
+        if (Cools.isEmpty(selectedLocNos)) {
+            return LockingCheckResultParam.success(Collections.emptyList());
+        }
+
+        // 1. 鏌ヨ鎵�鏈夐�変腑鐨勫簱浣嶄俊鎭�
+        List<LocMast> selectedMasts = locMastService.selectList(
+                new EntityWrapper<LocMast>().in("loc_no", selectedLocNos)
+        );
+
+        if (selectedMasts.size() != selectedLocNos.size()) {
+            return LockingCheckResultParam.fail("閮ㄥ垎閫変腑搴撲綅涓嶅瓨鍦ㄦ垨鏁版嵁寮傚父");
+        }
+
+        // 2. 鎸夊垎缁勮仛鍚堥�変腑鐨勫簱浣嶏紙鏀寔澶氬垎缁勶級
+        Map<LocGroupOrder, List<LocMast>> groupSelected = new HashMap<>();
+        for (LocMast lm : selectedMasts) {
+            LocGroupOrder group = locGroupAscOrder.stream()
+                    .filter(g -> g.getRowList().contains(lm.getRow1()))
+                    .findFirst()
+                    .orElseThrow(() -> new CoolException("鎺掍笉鍦ㄥ嚭搴撳垎缁勯厤缃腑: row=" + lm.getRow1()));
+
+            groupSelected.computeIfAbsent(group, k -> new ArrayList<>()).add(lm);
+        }
+
+        // 鐢变簬閫氬父涓�娆¤姹傚湪涓�涓垎缁勫唴锛岃繖閲屽彇绗竴涓垎缁勭殑缁撴灉
+        // 濡傛灉闇�瑕佹敮鎸佸鍒嗙粍鍚屾椂鍑哄簱锛屽彲鏀逛负杩斿洖 Map<LocGroupOrder, LockingCheckResultParam>
+        LockingCheckResultParam result = null;
+
+        for (Map.Entry<LocGroupOrder, List<LocMast>> entry : groupSelected.entrySet()) {
+            LocGroupOrder group = entry.getKey();
+            List<LocMast> selected = entry.getValue();
+
+            List<Integer> fullRows = group.getRowList();  // 濡� [3,4,5,6,7,8,9,10]
+
+            // 鑾峰彇閫変腑鐨� row锛屽苟鎸夊垎缁勯『搴忔帓搴�
+            List<Integer> selectedRows = selected.stream()
+                    .map(LocMast::getRow1)
+                    .distinct()
+                    .sorted(Comparator.comparingInt(fullRows::indexOf))
+                    .collect(Collectors.toList());
+
+            // 妫�鏌ユ槸鍚﹂噸澶嶆垨鏃犳晥
+            if (selectedRows.size() != selected.size()) {
+                return LockingCheckResultParam.fail("閫変腑搴撲綅瀛樺湪閲嶅鎴栨棤鏁堟帓");
+            }
+
+            int minIndex = fullRows.indexOf(selectedRows.get(0));
+            int maxIndex = fullRows.indexOf(selectedRows.get(selectedRows.size() - 1));
+
+            // 1. 蹇呴』鏄繛缁锛堟棤缂哄彛锛�
+            if (maxIndex - minIndex + 1 != selectedRows.size()) {
+                return LockingCheckResultParam.fail(
+                        "閫変腑鎺掑繀椤昏繛缁紝鏃犵己鍙c�備粠 " + fullRows.get(minIndex) + " 鍒� " + fullRows.get(maxIndex)
+                );
+            }
+
+            // 2. 妫�鏌ュ乏鍓嶆柟锛堟搴忔柟鍚戯細浠庡乏鍒板彸锛屽墠鏂规槸绱㈠紩灏忕殑浣嶇疆锛�
+            boolean leftClear = true;
+            for (int i = 0; i < minIndex; i++) {
+                LocMast prev = getLocMastByRow(fullRows.get(i), selected.get(0).getBay1(), selected.get(0).getLev1());
+                if (prev != null && ("D".equals(prev.getLocSts()) || "F".equals(prev.getLocSts()))) {
+                    leftClear = false;
+                    break;
+                }
+            }
+
+            // 3. 妫�鏌ュ彸鍓嶆柟锛堝�掑簭鏂瑰悜锛氫粠鍙冲埌宸︼紝鍓嶆柟鏄储寮曞ぇ鐨勪綅缃級
+            boolean rightClear = true;
+            for (int i = maxIndex + 1; i < fullRows.size(); i++) {
+                LocMast prev = getLocMastByRow(fullRows.get(i), selected.get(0).getBay1(), selected.get(0).getLev1());
+                if (prev != null && ("D".equals(prev.getLocSts()) || "F".equals(prev.getLocSts()))) {
+                    rightClear = false;
+                    break;
+                }
+            }
+
+            // 4. 鑷冲皯鏈変竴渚ф竻绌烘墠鍏佽鍑哄簱
+            if (!leftClear && !rightClear) {
+                return LockingCheckResultParam.fail(
+                        "閫変腑娈� " + fullRows.get(minIndex) + "~" + fullRows.get(maxIndex) +
+                                " 涓や晶鍓嶆柟閮芥湁绌烘澘/鏁呴殰锛屾棤娉曞嚭搴擄紙姝e簭鎴栧�掑簭鏂瑰悜閮藉牭濉烇級"
+                );
+            }
+
+            // 5. 閫変腑娈靛唴鎵�鏈夊簱浣嶅繀椤绘槸 D 鐘舵��
+            for (LocMast lm : selected) {
+                if (!"D".equals(lm.getLocSts())) {
+                    return LockingCheckResultParam.fail("閫変腑搴撲綅闈炵┖鏉跨姸鎬�: " + lm.getLocNo());
+                }
+            }
+
+            // 6. 鍐冲畾鍑哄簱鏂瑰悜鍜屾帓搴忛『搴�
+            String direction;
+            List<LocMast> sortedSelected;
+
+            // 浼樺厛閫夋嫨姝e簭锛堝鏋滀袱渚ч兘娓呯┖锛岄粯璁ゆ搴忥級
+            if (leftClear) {
+                direction = "ASC";
+                sortedSelected = selected.stream()
+                        .sorted(Comparator.comparingInt(m -> fullRows.indexOf(m.getRow1())))
+                        .collect(Collectors.toList());
+            } else {
+                direction = "DESC";
+                sortedSelected = selected.stream()
+                        .sorted(Comparator.comparingInt(m -> -fullRows.indexOf(m.getRow1()))) // 鍊掑簭
+                        .collect(Collectors.toList());
+            }
+
+            result = LockingCheckResultParam.success(direction, sortedSelected);
+        }
+
+        // 濡傛灉娌℃湁鍒嗙粍锛堢悊璁轰笂涓嶄細鍙戠敓锛夛紝杩斿洖榛樿鎴愬姛
+        return result != null ? result : LockingCheckResultParam.success(Collections.emptyList());
+    }
+
+    // 杈呭姪鏂规硶锛氭牴鎹� row 鑾峰彇 LocMast
+    private LocMast getLocMastByRow(Integer row, Integer bay1, Integer lev1) {
+        return locMastService.selectOne(new EntityWrapper<LocMast>()
+                .eq("bay1", bay1)
+                .eq("lev1", lev1)
+                .eq("row1", row));
+    }
     @Override
     @Transactional
     public void emptyPlateOut(EmptyPlateOutParam param, Long userId) {
         if (Cools.isEmpty(param.getOutSite())) {
             throw new CoolException("绔欑偣涓嶅瓨鍦�");
         }
-        for (String locNo : param.getLocNos()) {
+
+        // 浣跨敤鏂扮殑鍑哄簱涓撶敤鍒嗙粍閰嶇疆
+        List<LocGroupOrder> locGroupAscOrder = slaveProperties.getLocGroupAscOrderOut();
+
+        // 1. 鍏堣繘琛屾暣浣撻樆濉炴鏌ワ紙鍖呭惈杩炵画鎬� + 鍙屽悜鍓嶆柟娓呯┖鏍¢獙锛�
+        LockingCheckResultParam checkResult = checkEmptyPlateBlocking(param.getLocNos(), locGroupAscOrder);
+
+        if (!checkResult.isSuccess()) {
+            throw new CoolException(checkResult.getErrorMessage());
+        }
+
+        // 2. 鑾峰彇鎸夊嚭搴撴柟鍚戞帓搴忓ソ鐨勫簱浣嶅垪琛�
+        List<LocMast> orderedLocMasts = checkResult.getSortedSelected();
+
+        // 3. 浼樺厛绾у熀纭�鍙傛暟锛堟暟鍊艰秺澶т紭鍏堢骇瓒婇珮锛�
+        double BASE_PRI = 10.0;          // 鏈�浣庝紭鍏堢骇缁勫熀鍑嗭紙鏁板�兼渶澶э級
+        double GROUP_STEP = 100.0;       // 缁勯棿宸窛
+        double IN_GROUP_STEP = 1.0;      // 缁勫唴浣嶇疆宸窛
+
+        Date now = new Date();
+
+        // 4. 閫愪釜澶勭悊鎺掑簭鍚庣殑搴撲綅锛岀敓鎴愬嚭搴撲换鍔�
+        for (int index = orderedLocMasts.size(); index > 0; index--) {
+            LocMast locMast = orderedLocMasts.get(index);
+            String locNo = locMast.getLocNo();
+
             // 鑾峰彇宸ヤ綔鍙�
             int workNo = commonService.getWorkNo(WorkNoType.PAKOUT.type);
-            // 鑾峰彇搴撲綅
-            LocMast locMast = locMastService.selectById(locNo);
-            if (Cools.isEmpty(locMast)) {
-                throw new CoolException(locNo+"搴撲綅涓嶅瓨鍦�");
-            }
-            if (!locMast.getLocSts().equals("D")){
-                throw new CoolException("鎵�閫夊簱浣嶅瓨鍦ㄧ姸鎬佷笉涓篋鐨勫簱浣嶏紝搴撲綅鍙凤細"+locMast.getLocNo()+" 銆佸綋鍓嶇姸鎬侊細"+locMast.getLocSts()+"-"+locMast.getLocSts$());
-            }
-            boolean res1 = true;
-            if(param.getOutSite()==100){
-                res1 = false;
-            }
-            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
-                    .eq("bay1", locMast.getBay1())
-                    .eq("lev1",locMast.getLev1())
-                    .orderBy("row1",res1));
-            for (LocMast locMast1 : locMasts) {
-                if (locMast1.getLocNo().equals(locMast.getLocNo())) {
-                    break;
-                }
-                if (locMast1.getLocSts().equals("D") || locMast1.getLocSts().equals("F")) {
-                    throw new CoolException(locNo+"搴撲綅鍫靛锛岀姝㈠嚭搴�");
-                }
-            }
+
             // 鑾峰彇婧愮珯
             Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
                     .eq("type_no", 110)
@@ -527,45 +717,68 @@
             StaDesc staDesc = staDescService.selectOne(wrapper);
             Integer sourceStaNo = staDesc.getCrnStn();
             if (Cools.isEmpty(sourceStaNo)) {
-                throw new CoolException("妫�绱㈡簮绔欏け璐�");
+                throw new CoolException("妫�绱㈡簮绔欏け璐ワ紝搴撲綅锛�" + locNo);
             }
-            Date now = new Date();
-            // 淇濆瓨宸ヤ綔妗�
+
+            // 璁$畻鍔ㄦ�佷紭鍏堢骇锛堢粍浼樺厛绾� + 缁勫唴椤哄簭鍋忕Щ锛�
+            // 杩欓噷鍋囪鎵�鏈夐�変腑鐨勫簱浣嶅湪鍚屼竴涓垎缁勶紙澶氬垎缁勫彲鍐嶇粏鍒嗭級
+            int groupIndex = locGroupAscOrder.indexOf(
+                    locGroupAscOrder.stream()
+                            .filter(g -> g.getRowList().contains(locMast.getRow1()))
+                            .findFirst()
+                            .orElse(null)
+            );
+
+            if (groupIndex == -1) {
+                throw new CoolException("鍒嗙粍绱㈠紩寮傚父: " + locNo);
+            }
+
+            double groupBasePri = BASE_PRI + (locGroupAscOrder.size() + 1 - groupIndex) * GROUP_STEP;
+
+            // 缁勫唴鍋忕Щ锛氭寜鍑哄簱椤哄簭锛坕ndex瓒婂皬瓒婂厛鍑猴紝浼樺厛绾ц秺楂� 鈫� 鏁板�艰秺澶э級
+            // 濡傛灉鏄� DESC 鏂瑰悜锛宨ndex 宸茬粡鏄�掑簭鐨勶紝鎵�浠ョ洿鎺ョ敤
+            double inGroupOffset = index * IN_GROUP_STEP;
+
+            double ioPri = groupBasePri + inGroupOffset;  // 鏁板�艰秺澶т紭鍏堢骇瓒婇珮
+
+            // 鐢熸垚宸ヤ綔妗�
             WrkMast wrkMast = new WrkMast();
             wrkMast.setWrkNo(workNo);
             wrkMast.setIoTime(now);
-            wrkMast.setWrkSts(0L); // 宸ヤ綔鐘舵�侊細0.寰呭彂閫�
-            wrkMast.setIoType(110); // 鍏ュ嚭搴撶姸鎬侊細 110.绌烘澘鍑哄簱
-            wrkMast.setIoPri(10D);
-            wrkMast.setSourceStaNo(sourceStaNo); // 婧愮珯
-            wrkMast.setStaNo(param.getOutSite()); // 鐩爣绔�
+            wrkMast.setWrkSts(0L);           // 寰呭彂閫�
+            wrkMast.setIoType(110);          // 绌烘澘鍑哄簱
+            wrkMast.setIoPri(ioPri);
+            wrkMast.setSourceStaNo(sourceStaNo);
+            wrkMast.setStaNo(param.getOutSite());
             wrkMast.setCrnNo(locMast.getCrnNo());
-            wrkMast.setSourceLocNo(locNo); // 婧愬簱浣�
-            wrkMast.setFullPlt("N"); // 婊℃澘锛歒
-            wrkMast.setPicking("N"); // 鎷f枡
-            wrkMast.setExitMk("N"); // 閫�鍑�
-            wrkMast.setEmptyMk("Y"); // 绌烘澘
+            wrkMast.setSourceLocNo(locNo);
+            wrkMast.setFullPlt("N");
+            wrkMast.setPicking("N");
+            wrkMast.setExitMk("N");
+            wrkMast.setEmptyMk("Y");
             wrkMast.setLinkMis("N");
             wrkMast.setAppeUser(userId);
             wrkMast.setAppeTime(now);
             wrkMast.setModiUser(userId);
             wrkMast.setModiTime(now);
-            boolean res = wrkMastService.insert(wrkMast);
-            if (!res) {
-                throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐�");
+
+            if (!wrkMastService.insert(wrkMast)) {
+                throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐ワ紝搴撲綅锛�" + locNo);
             }
-            // 鏇存柊搴撲綅鐘舵�� D.绌烘澘 -> R.鍑哄簱棰勭害
-            if (locMast.getLocSts().equals("D")){
+
+            // 鏇存柊搴撲綅鐘舵�� D 鈫� R锛堝嚭搴撻绾︼級
+            if ("D".equals(locMast.getLocSts())) {
                 locMast.setLocSts("R");
                 locMast.setModiUser(userId);
                 locMast.setModiTime(now);
                 if (!locMastService.updateById(locMast)) {
-                    throw new CoolException("鏇存柊搴撲綅鐘舵�佸け璐�");
+                    throw new CoolException("鏇存柊搴撲綅鐘舵�佸け璐ワ紝搴撲綅锛�" + locNo);
                 }
+            } else {
+                throw new CoolException("搴撲綅鐘舵�佸紓甯革紝闈炵┖鏉跨姸鎬侊細" + locNo);
             }
         }
     }
-
     @Override
     @Transactional
     public WrkMast emptyPlateOut(EmptyPlateOutParam param) {

--
Gitblit v1.9.1