From a1db2ea6ccdafdffdf2ed4e52844179e72dc77a5 Mon Sep 17 00:00:00 2001
From: lty <876263681@qq.com>
Date: 星期二, 20 一月 2026 10:25:09 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java |  992 +++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 902 insertions(+), 90 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 3ebff2a..d3b8244 100644
--- a/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -1,5 +1,7 @@
 package com.zy.asrs.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.mapper.Wrapper;
 import com.core.common.BaseRes;
@@ -8,10 +10,9 @@
 import com.core.common.SnowflakeIdWorker;
 import com.core.exception.CoolException;
 import com.zy.asrs.entity.*;
-import com.zy.asrs.entity.param.EmptyPlateOutParam;
-import com.zy.asrs.entity.param.FullStoreParam;
-import com.zy.asrs.entity.param.LocDetlAdjustParam;
-import com.zy.asrs.entity.param.StockOutParam;
+import com.zy.asrs.entity.param.*;
+import com.zy.asrs.entity.result.FindLocNoAttributeVo;
+import com.zy.asrs.entity.result.WrkCancel;
 import com.zy.asrs.service.*;
 import com.zy.asrs.utils.Utils;
 import com.zy.common.model.*;
@@ -19,14 +20,19 @@
 import com.zy.common.model.enums.WorkNoType;
 import com.zy.common.properties.SlaveProperties;
 import com.zy.common.service.CommonService;
+import com.zy.common.utils.HttpHandler;
 import com.zy.common.web.WcsController;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
 /**
@@ -77,6 +83,14 @@
     private SlaveProperties slaveProperties;
     @Autowired
     private WaitPakinService waitPakinService;
+    @Autowired
+    private ApiLogService apiLogService;
+    @Value("${wcs-slave.cancel}")
+    private String cancel;
+    @Value("${wcs-slave.url}")
+    private String url;
+    @Value("${wcs-slave.warehouse}")
+    private String warehouse;
 
     @Override
     @Transactional
@@ -91,7 +105,11 @@
         // 妫�绱㈠簱浣�
         LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
         List<String> matnrs = param.getList().stream().map(FullStoreParam.MatCodeStore::getMatnr).distinct().collect(Collectors.toList());
-        StartupDto dto = commonService.getLocNo(DEFAULT_ROW_NO_TYPE, 1, param.getDevpNo(), matnrs, locTypeDto, 0);
+//        List<String> batchs = param.getList().stream().map(FullStoreParam.MatCodeStore::getBatch).distinct().collect(Collectors.toList());
+        StartupDto dto = commonService.getLocNo(1, param.getDevpNo(), matnrs.get(0), null, null,locTypeDto);
+        if (Cools.isEmpty(dto)){
+            throw new CoolException("鏌ヨ搴撲綅澶辫触锛侊紒==銆媠tartupFullPutStore ==銆� commonService.getLocNo");
+        }
         // 鐢熸垚宸ヤ綔鍙�
         int workNo = dto.getWorkNo();
         // 鐢熸垚宸ヤ綔妗�
@@ -174,12 +192,84 @@
             throw new CoolException("搴撳瓨涓嶅瓨鍦�");
         }
     }
+    private boolean isInNormalRule(LocMast lm) {
+        List<LocGroupOrder> locGroupAscOrder = slaveProperties.getLocGroupAscOrder();
+        if (locGroupAscOrder == null || locGroupAscOrder.isEmpty()) {
+            return false;
+        }
+        Integer row = lm.getRow1();
+        if (row == null) return false;
 
+        return locGroupAscOrder.stream()
+                .anyMatch(group ->
+                        group.getRowList() != null &&
+                                group.getRowList().contains(row)
+                );
+    }
+
+    /**
+     * 妫�鏌ユ甯稿簱浣嶅墠鏂规槸鍚﹀牭濉烇紙娣卞簱浣嶈鍒欙細鍓嶆柟鎺掓槸鍚︽湁璐ф垨鍏ュ簱浠诲姟锛�
+     *
+     * 鍙灞炰簬鍑哄簱鍒嗙粍瑙勫垯鍐呯殑搴撲綅杩涜妫�鏌�
+     * 濡傛灉搴撲綅涓嶅湪鍒嗙粍瑙勫垯鍐咃紝鍒欒涓轰笉闇�瑕佷弗鏍兼鏌ワ紙杩斿洖 false锛屼笉瑙﹀彂琛ラ綈锛�
+     *
+     * @param normalMasts 闇�瑕佹鏌ョ殑姝e父搴撲綅鍒楄〃锛堝凡閫氳繃 isInNormalRule 杩囨护锛�
+     * @return true = 鍓嶆柟鏈夊牭濉烇紙闇�瑕佽ˉ榻愶級锛宖alse = 鍓嶆柟娓呯┖鎴栨棤闇�妫�鏌�
+     */
+    private boolean checkDeepLocationBlocked(List<LocMast> normalMasts) {
+        if (normalMasts == null || normalMasts.isEmpty()) {
+            return false;
+        }
+        // 鑾峰彇鍑哄簱鍒嗙粍閰嶇疆锛堢敤浜庣‘璁よ鍒欒寖鍥达級
+        List<LocGroupOrder> locGroupAscOrder = slaveProperties.getLocGroupAscOrder();
+        if (locGroupAscOrder == null || locGroupAscOrder.isEmpty()) {
+            return false; // 鏃犻厤缃椂榛樿涓嶆鏌�
+        }
+
+        // 閬嶅巻姣忎釜姝e父搴撲綅
+        for (LocMast lm : normalMasts) {
+            Integer currentRow = lm.getRow1();
+            Integer bay1 = lm.getBay1();
+            Integer lev1 = lm.getLev1();
+
+            if (currentRow == null || bay1 == null || lev1 == null) {
+                continue;
+            }
+
+            // 娣卞簱浣嶆鏌ユ柟鍚戯細鍋囪 row 瓒婂ぇ瓒婃繁锛堝墠鏂规槸鏇村ぇ row 鐨勪綅缃級
+            // 浣犲彲浠ユ牴鎹疄闄呭嚭搴撴柟鍚戣皟鏁村惊鐜潯浠讹紙渚嬪浠庡皬 row 鍒板ぇ row 鎴栧弽涔嬶級
+            for (int row = currentRow + 1; row <= 5; row++) { // 鍋囪娣卞簱浣嶈寖鍥村埌 5 鎺掞紝鍙皟鏁�
+                LocMast front = getLocMastByRow(row, bay1, lev1);
+                if (front == null) {
+                    continue;
+                }
+
+                // 鏈夎揣锛團鐘舵�侊級 鈫� 鍫靛
+                if ("F".equals(front.getLocSts())) {
+                    return true;
+                }
+
+                // 鏈夊叆搴撲换鍔� 鈫� 鍫靛
+                WrkMast frontTask = wrkMastService.selectOne(
+                        new EntityWrapper<WrkMast>()
+                                .eq("source_loc_no", front.getLocNo())
+                                .eq("io_type", 100) // 鍋囪 100 涓哄叆搴撶被鍨嬶紝鍙皟鏁�
+                );
+                if (frontTask != null) {
+                    return true;
+                }
+            }
+        }
+
+        // 鎵�鏈夋甯稿簱浣嶅墠鏂归兘娓呯┖锛堟垨鏃犲墠鏂癸級
+        return false;
+    }
     @Override
     @Transactional
     public void stockOut(BasDevp staNo, List<LocDetlDto> locDetlDtos, IoWorkType ioWorkType, Long userId) {
         Date now = new Date();
-        // 鍚堝苟鍚岀被椤�
+
+        // 淇濈暀锛氬悎骞跺悓绫婚」锛堝悓涓�搴撲綅鍚堝苟鏄庣粏锛�
         Set<String> locNos = new HashSet<>();
         List<OutLocDto> dtos = new ArrayList<>();
         for (LocDetlDto locDetlDto : locDetlDtos) {
@@ -196,82 +286,316 @@
                 dtos.add(new OutLocDto(locNo, locDetlDto));
             }
         }
-        Integer ioType = null;
-        // 鐢熸垚宸ヤ綔妗�
-        for (OutLocDto dto : dtos) {
-            // 鍒ゆ柇鍏ュ嚭搴撶被鍨嬶細101.鍏ㄦ澘鍑哄簱 or 103.鎷f枡鍑哄簱
-            if (ioWorkType == null) {
-                ioType = dto.isAll() ? 101 : 103;
-            } else if (ioWorkType.equals(IoWorkType.CHECK_OUT)) {
-                ioType = 107;
-            }
-            assert ioType != null;
-            // 鑾峰彇搴撲綅
-            LocMast locMast = locMastService.selectById(dto.getLocNo());
+        // 浣跨敤鍑哄簱涓撶敤鍒嗙粍閰嶇疆
+        List<LocGroupOrder> locGroupAscOrder = slaveProperties.getLocGroupAscOrder();
+        // 纭畾姝e父鍑哄簱绫诲瀷锛堝拰鍘熸潵淇濇寔绫讳技锛�
+        int ioTypeNormal = 101; // 榛樿鏁存墭鍑哄簱
+        if (ioWorkType != null && ioWorkType.equals(IoWorkType.CHECK_OUT)) {
+            ioTypeNormal = 107;
+        } else if (!dtos.isEmpty() && !dtos.get(0).isAll()) {
+            ioTypeNormal = 103; // 閮ㄥ垎鍑哄簱
+        }
 
+        // 1. 鏌ヨ鎵�鏈夐�変腑鐨勫簱浣嶄富淇℃伅
+        List<LocMast> allSelectedMasts = locMastService.selectList(
+                new EntityWrapper<LocMast>().in("loc_no", locNos)
+        );
+
+        if (allSelectedMasts.size() != locNos.size()) {
+            throw new CoolException("閮ㄥ垎閫変腑搴撲綅涓嶅瓨鍦ㄦ垨鏁版嵁寮傚父");
+        }
+
+        // 2. 鍖哄垎姝e父搴撲綅锛堥渶瑕佷弗鏍兼繁搴撲綅妫�鏌ワ級涓庤ˉ鍏呭簱浣�
+        List<LocMast> normalMasts = new ArrayList<>();
+        List<LocMast> supplementMasts = new ArrayList<>();
+
+        // 鍋囪鎴戜滑鏈夋煇绉嶁�滃垎缁勮鍒欌�濓紙濡傛寜鍒楀眰鎴栨帓鑼冨洿锛夛紝杩欓噷绠�鍖栫敤涓�涓ず渚嬪垽鏂�
+        // 浣犲彲浠ユ浛鎹㈡垚瀹為檯鐨勮鍒欙紙濡� getLocGroupOrderOut() 鎴栧叾浠栵級
+        for (LocMast lm : allSelectedMasts) {
+            boolean isNormal = isInNormalRule(lm); // 鈫� 浣犻渶瑕佸疄鐜拌繖涓垽鏂柟娉�
+            if (isNormal) {
+                normalMasts.add(lm);
+            } else {
+                supplementMasts.add(lm);
+            }
+        }
+
+        // 3. 瀵规甯稿簱浣嶈繘琛屾繁搴撲綅鍓嶆柟妫�鏌ワ紙绫讳技涔嬪墠鐨勮繛缁 + 娓呯┖锛�
+        AtomicReference<Boolean> isLeftSideSupplement = new AtomicReference<>(false);
+
+        if (!normalMasts.isEmpty()) {
+            // 杩欓噷妯℃嫙娣卞簱浣嶅墠鏂规鏌ワ紙浣犲彲浠ユ浛鎹㈡垚浣犲疄闄呯殑妫�鏌ユ柟娉曪級
+            boolean hasBlockage = checkDeepLocationBlocked(normalMasts);
+
+            if (hasBlockage) {
+                // 鍓嶆柟鍫靛 鈫� 鑷姩琛ュ厖鏈�灏戜竴渚�
+                supplementBothSidesBlocked(normalMasts, locGroupAscOrder, supplementMasts, isLeftSideSupplement);
+            }
+        }
+
+        // 4. 鍚堝苟鎵�鏈夎鍑哄簱鐨勫簱浣�
+        List<LocMast> allMasts = new ArrayList<>();
+        allMasts.addAll(normalMasts);
+        allMasts.addAll(supplementMasts);
+
+        if (allMasts.isEmpty()) {
+            throw new CoolException("娌℃湁鏈夋晥鐨勫嚭搴撳簱浣�");
+        }
+
+        // 5. 缁熶竴鎸夋帓鍙凤紙row锛夊�掑簭鎺掑簭锛堥珮鎺掑厛鍑猴級
+        List<LocMast> sortedAll = allMasts.stream()
+                .sorted(Comparator.comparing(LocMast::getRow1, Comparator.reverseOrder()))
+                .collect(Collectors.toList());
+
+        // 6. 鐢熸垚浠诲姟锛堜粠鍚庡線鍓嶉亶鍘嗭級
+        double basePriority = 100.0;
+        for (int index = sortedAll.size() - 1; index >= 0; index--) {
+            LocMast locMast = sortedAll.get(index);
+            String locNo = locMast.getLocNo();
+
+            boolean isSupplement = supplementMasts.contains(locMast);
+            int ioType = isSupplement ? 11 : ioTypeNormal;
+            // 浼樺厛绾ц绠�
+            double priority;
+            if (isSupplement) {
+                if (Boolean.TRUE.equals(isLeftSideSupplement.get())) {
+                    // 宸︿晶琛ュ厖 鈫� 鏅氬嚭
+                    priority = basePriority - index * 1.0;
+                } else {
+                    // 鍙充晶琛ュ厖 鈫� 鏃╁嚭
+                    priority = basePriority + index * 1.0;
+                }
+            } else {
+                priority = basePriority - index * 1.0;
+            }
+            OutLocDto dto;
             Integer outSta = staNo.getDevNo();
-            //2鍙峰爢鍨涙満鍏ㄦ澘鍑哄簱绔欐寚瀹氫负204绔欙紝鎷f枡绔欐寚瀹氫负202
-            if(locMast.getCrnNo()==2){
-                outSta = ioType == 101 ? 204 : 202;
+            StaDesc staDesc = null;
+            if(ioType != 11){
+                staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), outSta);
             }
-
-            // 鑾峰彇璺緞
-            StaDesc staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), outSta);
-            // 鐢熸垚宸ヤ綔鍙�
-            int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
-            // 鐢熸垚宸ヤ綔妗�
+            LocMast locMastNew = null;
             WrkMast wrkMast = new WrkMast();
-            wrkMast.setWrkNo(workNo);
-            wrkMast.setIoTime(now);
-            wrkMast.setWrkSts(11L); // 宸ヤ綔鐘舵�侊細11.鐢熸垚鍑哄簱ID
-            wrkMast.setIoType(ioType); // 鍏ュ嚭搴撶姸鎬�
-            wrkMast.setIoPri(13D); // 浼樺厛绾э細13
-            wrkMast.setCrnNo(locMast.getCrnNo());
-            wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 婧愮珯
-            wrkMast.setStaNo(staDesc.getStnNo()); // 鐩爣绔�
-            wrkMast.setSourceLocNo(dto.getLocNo()); // 婧愬簱浣�
-            wrkMast.setFullPlt("Y"); // 婊℃澘锛歒
-            wrkMast.setPicking("N"); // 鎷f枡
-            wrkMast.setExitMk("N"); // 閫�鍑�
-            wrkMast.setEmptyMk("N"); // 绌烘澘
-            wrkMast.setLinkMis("N");
-            wrkMast.setBarcode(locMast.getBarcode());
-            wrkMast.setAppeUser(userId); // 鎿嶄綔浜哄憳鏁版嵁
-            wrkMast.setAppeTime(now);
-            wrkMast.setModiUser(userId);
-            wrkMast.setModiTime(now);
-            if (!wrkMastService.insert(wrkMast)) {
-                throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐ワ紝鍑哄簱搴撲綅鍙凤細"+dto.getLocNo());
-            }
-            // 鐢熸垚宸ヤ綔妗f槑缁�
-            for (LocDetlDto detlDto : dto.getLocDetlDtos()) {
-                if (detlDto.getCount()==null || detlDto.getCount() <= 0.0D) {continue;}
-                WrkDetl wrkDetl = new WrkDetl();
-                wrkDetl.sync(detlDto.getLocDetl());
-                wrkDetl.setOrderNo(""); // 鎵嬪姩鍑哄簱涓嶉渶瑕佸甫鍑哄簱瀛樹腑鐨勫崟鎹紪鍙�
-                wrkDetl.setWrkNo(workNo);
-                wrkDetl.setIoTime(now);
-                Double anfme = ioType==101?detlDto.getLocDetl().getAnfme():detlDto.getCount();
-                wrkDetl.setAnfme(anfme); // 鏁伴噺
-                wrkDetl.setAppeTime(now);
-                wrkDetl.setAppeUser(userId);
-                wrkDetl.setModiTime(now);
-                wrkDetl.setModiUser(userId);
-                if (!wrkDetlService.insert(wrkDetl)) {
-                    throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
+            String locSts;
+            int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
+            String pick = (ioType == 101) ? "N" : "Y";
+            if((ioType == 101 || ioType == 103 || ioType == 107) && staDesc != null) {
+                // 鎵惧埌瀵瑰簲鐨� OutLocDto
+                dto = dtos.stream()
+                        .filter(d -> d.getLocNo().equals(locNo))
+                        .findFirst()
+                        .orElseThrow(() -> new CoolException("鎵句笉鍒板搴旂殑鍑哄簱鏄庣粏锛�" + locNo));
+                // 鐢熸垚宸ヤ綔妗�
+                wrkMast.setWrkNo(workNo);
+                wrkMast.setIoTime(now);
+                wrkMast.setWrkSts(0L);
+                wrkMast.setIoType(ioType);
+                wrkMast.setIoPri(priority);
+                wrkMast.setCrnNo(locMast.getCrnNo());
+                wrkMast.setSourceStaNo(staDesc.getCrnStn());
+                wrkMast.setStaNo(staDesc.getStnNo());
+                wrkMast.setSourceLocNo(locNo);
+                wrkMast.setFullPlt("Y");
+                wrkMast.setPicking(pick);
+                wrkMast.setExitMk("N");
+                wrkMast.setEmptyMk("N");
+                wrkMast.setLinkMis("N");
+                wrkMast.setBarcode(locMast.getBarcode());
+                wrkMast.setAppeUser(userId);
+                wrkMast.setAppeTime(now);
+                wrkMast.setModiUser(userId);
+                wrkMast.setModiTime(now);
+                locSts = ioType != 101? "R" : "P";
+                // 鐢熸垚宸ヤ綔妗f槑缁嗭紙淇濈暀鍘熼�昏緫锛�
+                for (LocDetlDto detlDto : dto.getLocDetlDtos()) {
+                    if (detlDto.getCount() == null || detlDto.getCount() <= 0.0D) {
+                        continue;
+                    }
+                    WrkDetl wrkDetl = new WrkDetl();
+                    wrkDetl.sync(detlDto.getLocDetl());
+                    wrkDetl.setOrderNo("");
+                    wrkDetl.setWrkNo(workNo);
+                    wrkDetl.setIoTime(now);
+                    Double anfme = ioType == 101 ? detlDto.getLocDetl().getAnfme() : detlDto.getCount();
+                    wrkDetl.setAnfme(anfme);
+                    wrkDetl.setAppeTime(now);
+                    wrkDetl.setAppeUser(userId);
+                    wrkDetl.setModiTime(now);
+                    wrkDetl.setModiUser(userId);
+                    if (!wrkDetlService.insert(wrkDetl)) {
+                        throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
+                    }
+                }
+            }else{
+                List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no",locNo));
+                FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
+                findLocNoAttributeVo.setMatnr(locDetls.get(0).getMatnr());
+                findLocNoAttributeVo.setBatch(locDetls.get(0).getBatch());
+                LocTypeDto locTypeDto = new LocTypeDto();
+                locTypeDto.setLocType1(locMast.getLocType1());
+                locMastNew = commonService.searchMaxPallet(findLocNoAttributeVo,locTypeDto);
+                // 鐢熸垚宸ヤ綔妗�
+                wrkMast.setWrkNo(workNo);
+                wrkMast.setIoTime(now);
+                wrkMast.setWrkSts(0L);
+                wrkMast.setIoType(ioType);
+                wrkMast.setIoPri(priority);
+                wrkMast.setCrnNo(locMast.getCrnNo());
+                wrkMast.setSourceStaNo(null);
+                wrkMast.setStaNo(null);
+                wrkMast.setSourceLocNo(locNo);
+                wrkMast.setLocNo(locMastNew.getLocNo());
+                wrkMast.setFullPlt("Y");
+                wrkMast.setPicking(pick);
+                wrkMast.setExitMk("N");
+                wrkMast.setEmptyMk("N");
+                wrkMast.setLinkMis("N");
+                wrkMast.setBarcode(locMast.getBarcode());
+                wrkMast.setAppeUser(userId);
+                wrkMast.setAppeTime(now);
+                wrkMast.setModiUser(userId);
+                wrkMast.setModiTime(now);
+                locSts = "R";
+                // 鐢熸垚宸ヤ綔妗f槑缁嗭紙淇濈暀鍘熼�昏緫锛�
+                if(locDetls != null && locDetls.size() > 0) {
+                    for (LocDetl locDetl : locDetls) {
+                        WrkDetl wrkDetl = new WrkDetl();
+                        wrkDetl.sync(locDetl);
+                        wrkDetl.setWrkNo(workNo);
+                        wrkDetl.setIoTime(now);
+
+                        wrkDetl.setAppeTime(now);
+                        wrkDetl.setAppeUser(userId);
+                        wrkDetl.setModiTime(now);
+                        wrkDetl.setModiUser(userId);
+                        if (!wrkDetlService.insert(wrkDetl)) {
+                            throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
+                        }
+                    }
                 }
             }
-            // 淇敼搴撲綅鐘舵��:   F.鍦ㄥ簱 ====>>> R.鍑哄簱棰勭害/P.鎷f枡/鐩樼偣/骞舵澘鍑哄簱涓�
-            locMast = locMastService.selectById(dto.getLocNo());
-            if (locMast.getLocSts().equals("F")) {
-                locMast.setLocSts(ioType==101?"R":"P");
+            if (!wrkMastService.insert(wrkMast)) {
+                throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐ワ紝搴撲綅锛�" + locNo);
+            }
+
+            if(locMastNew != null){
+                if ("O".equals(locMastNew.getLocSts())) {
+                    locMastNew.setLocSts("S");
+                    locMastNew.setModiUser(userId);
+                    locMastNew.setModiTime(now);
+                    if (!locMastService.updateById(locMastNew)) {
+                        throw new CoolException("鏇存柊搴撲綅鐘舵�佸け璐ワ紝搴撲綅锛�" + locNo);
+                    }
+                } else {
+                    throw new CoolException("搴撲綅鐘舵�佸紓甯革紝闈炵┖鏉跨姸鎬侊細" + locNo);
+                }
+            }
+            // 鏇存柊搴撲綅鐘舵��
+            locMast = locMastService.selectById(locNo);
+            if ("F".equals(locMast.getLocSts())) {
+                locMast.setLocSts(locSts);
                 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 + " 搴撲綅涓嶆槸鍦ㄥ簱鐘舵��");
+            }
+        }
+    }
+
+    private void supplementBothSidesBlocked(
+            List<LocMast> normalMasts,
+            List<LocMast> supplementMasts,
+            AtomicReference<Boolean> isLeftSideSupplement) {
+
+        if (normalMasts.isEmpty()) {
+            isLeftSideSupplement.set(true); // 榛樿宸︿晶
+            return;
+        }
+
+        // 鍋囪鎵�鏈� normalMasts 鍦ㄥ悓涓� bay/lev锛堝缁勬儏鍐靛彲寰幆澶勭悊锛�
+        LocMast rep = normalMasts.get(0);
+        Integer bay1 = rep.getBay1();
+        Integer lev1 = rep.getLev1();
+
+        if (bay1 == null || lev1 == null) {
+            throw new CoolException("搴撲綅 bay1 鎴� lev1 涓虹┖锛屾棤娉曡ˉ榻愬墠鏂�");
+        }
+
+        // 鎵惧嚭閫変腑娈电殑鏈�灏�/鏈�澶ф帓鍙�
+        int minRow = normalMasts.stream()
+                .mapToInt(LocMast::getRow1)
+                .min()
+                .orElseThrow(() -> new CoolException("姝e父搴撲綅鍒楄〃涓虹┖锛屾棤娉曡幏鍙栨渶灏忔帓鍙�"));
+
+        int maxRow = normalMasts.stream()
+                .mapToInt(LocMast::getRow1)
+                .max()
+                .orElseThrow(() -> new CoolException("姝e父搴撲綅鍒楄〃涓虹┖锛屾棤娉曡幏鍙栨渶澶ф帓鍙�"));
+
+        // 鍋囪娣卞簱浣嶈寖鍥达細1~5 鎺掞紙鍙牴鎹疄闄呰皟鏁达級
+        final int MIN_ROW = 1;
+        final int MAX_ROW = 5;
+
+        // ---------------- 璁$畻宸︿晶锛堝皬鎺掑彿鏂瑰悜锛岃緝娴呬綅缃級闇�瑕佽ˉ澶氬皯 ----------------
+        int leftCount = 0;
+        List<LocMast> leftToAdd = new ArrayList<>();
+        for (int r = minRow - 1; r >= MIN_ROW; r--) {
+            LocMast loc = getLocMastByRow(r, bay1, lev1);
+            if (loc == null) continue;
+
+            // 鍙ˉ绌烘澘锛圖鐘舵�侊級
+            if ("D".equals(loc.getLocSts())) {
+                leftCount++;
+                leftToAdd.add(loc);
+            }
+            // 鍙�夛細閬囧埌鍏朵粬闃诲鐘舵�佸彲鍋滄锛堣涓氬姟闇�姹傦級
+            // else if ("F".equals(loc.getLocSts()) || "鍏朵粬闃诲".equals(...)) break;
+        }
+
+        // ---------------- 璁$畻鍙充晶锛堝ぇ鎺掑彿鏂瑰悜锛屾洿娣变綅缃級闇�瑕佽ˉ澶氬皯 ----------------
+        int rightCount = 0;
+        List<LocMast> rightToAdd = new ArrayList<>();
+        for (int r = maxRow + 1; r <= MAX_ROW; r++) {
+            LocMast loc = getLocMastByRow(r, bay1, lev1);
+            if (loc == null) continue;
+
+            if ("D".equals(loc.getLocSts())) {
+                rightCount++;
+                rightToAdd.add(loc);
+            }
+            // else if (闃诲鐘舵��) break;
+        }
+
+        // ---------------- 閫夋嫨琛ュ摢涓�杈� ----------------
+        List<LocMast> chosen;
+        boolean chooseLeft;
+
+        if (leftCount == 0 && rightCount == 0) {
+            // 涓や晶閮芥病绌烘澘鍙ˉ 鈫� 鏃犳硶鎵撻��
+            throw new CoolException("鍓嶆柟涓や晶鍧囨棤绌烘澘鍙ˉ鍏咃紝鏃犳硶鎵撻�氬嚭搴撹矾寰�");
+        }
+
+        if (leftCount <= rightCount) {
+            // 宸︿晶琛ユ洿灏戯紙鎴栫浉绛夐粯璁ゅ乏渚э級
+            chosen = leftToAdd;
+            chooseLeft = true;
+            log.info("閫夋嫨琛ュ厖宸︿晶锛堝皬鎺掓柟鍚戯級锛屽叡 {} 涓┖鏉垮簱浣�", leftCount);
+        } else {
+            chosen = rightToAdd;
+            chooseLeft = false;
+            log.info("閫夋嫨琛ュ厖鍙充晶锛堝ぇ鎺掓柟鍚戯級锛屽叡 {} 涓┖鏉垮簱浣�", rightCount);
+        }
+
+        // 璁剧疆鏍囪锛堢敤浜庡悗缁紭鍏堢骇璋冩暣锛�
+        isLeftSideSupplement.set(chooseLeft);
+
+        // 鍔犲叆琛ュ厖鍒楄〃锛堝幓閲嶏級
+        for (LocMast supp : chosen) {
+            if (!supplementMasts.contains(supp) && !normalMasts.contains(supp)) {
+                supplementMasts.add(supp);
             }
         }
     }
@@ -340,7 +664,7 @@
                 throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
             }
             // 淇敼璁㈠崟鏄庣粏
-            if (!orderDetlService.increase(orderDetl.getOrderId(), orderDetl.getMatnr(), orderDetl.getBatch(), locDto.getAnfme())) {
+            if (!orderDetlService.increaseWorkQty(orderDetl.getOrderId(), orderDetl.getMatnr(), orderDetl.getBatch(), locDto.getAnfme())) {
                 throw new CoolException("淇敼璁㈠崟鏄庣粏鏁伴噺澶辫触");
             }
             orderService.updateSettle(orderDetl.getOrderId(), 2L, userId);
@@ -366,7 +690,7 @@
         BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
         // 妫�绱㈠簱浣�
         LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
-        StartupDto dto = commonService.getLocNo(DEFAULT_ROW_NO_TYPE, 10, devpNo, null, locTypeDto, 0);
+        StartupDto dto = commonService.getLocNo( 10, devpNo, null,null,null, locTypeDto);
         int workNo = dto.getWorkNo();
         Date now = new Date();
         // 鐢熸垚宸ヤ綔妗�
@@ -417,15 +741,420 @@
         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簭鎴栧�掑簭鏂瑰悜閮藉牭濉烇級"
+//                );
+//            }
+            if (!leftClear ) {
+                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));
+    }
+
+    /**
+     * 褰撻�変腑娈典袱渚у墠鏂归兘鍫靛鏃讹紝鍒ゆ柇琛ュ摢涓�渚ч渶瑕佺殑绌烘澘鏈�灏戯紝骞舵妸閭d簺搴撲綅鍔犲叆琛ュ厖鍒楄〃
+     */
+    private void supplementBothSidesBlocked(
+            List<LocMast> normalMasts,
+            List<LocGroupOrder> locGroupAscOrder,
+            List<LocMast> supplementMasts,
+            AtomicReference<Boolean> isLeftSideSupplement) {
+
+        // 鍋囪鎵�鏈� normalMasts 鍦ㄥ悓涓�涓垎缁勶紙濡傛灉澶氬垎缁勶紝鍙惊鐜鐞嗘瘡涓垎缁勶級
+        LocGroupOrder group = locGroupAscOrder.stream()
+                .filter(g -> g.getRowList().contains(normalMasts.get(0).getRow1()))
+                .findFirst()
+                .orElseThrow(() -> new CoolException("鍒嗙粍寮傚父"));
+
+        List<Integer> fullRows = group.getRowList();
+
+        // 鍙栭�変腑娈电殑 min/max row
+        Set<Integer> selectedRowSet = normalMasts.stream()
+                .map(LocMast::getRow1)
+                .collect(Collectors.toSet());
+
+        int minRow = Collections.min(selectedRowSet);
+        int maxRow = Collections.max(selectedRowSet);
+
+        int minIndex = fullRows.indexOf(minRow);
+        int maxIndex = fullRows.indexOf(maxRow);
+
+        // 鍋囪鎵�鏈夊簱浣嶅湪鍚� bay 鍜� lev
+        Integer bay1 = normalMasts.get(0).getBay1();
+        Integer lev1 = normalMasts.get(0).getLev1();
+
+        // 璁$畻宸︿晶鍓嶆柟闇�瑕佽ˉ鍏呯殑 D 鐘舵�佸簱浣嶆暟閲忥紙浠� 0 鍒� minIndex-1 鐨� D 鐘舵�佸簱浣嶏級
+        int leftSupplementCount = 0;
+        List<LocMast> leftSupplementLocs = new ArrayList<>();
+        for (int i = 0; i < minIndex; i++) {
+            LocMast loc = getLocMastByRow(fullRows.get(i), bay1, lev1);
+            if (loc != null && ("D".equals(loc.getLocSts()) || "F".equals(loc.getLocSts()))) {
+                leftSupplementCount++;
+                leftSupplementLocs.add(loc);
+            }
+        }
+
+//        // 璁$畻鍙充晶鍓嶆柟闇�瑕佽ˉ鍏呯殑 D 鐘舵�佸簱浣嶆暟閲忥紙浠� maxIndex+1 鍒� end 鐨� D 鐘舵�佸簱浣嶏級
+//        int rightSupplementCount = 0;
+//        List<LocMast> rightSupplementLocs = new ArrayList<>();
+//        for (int i = maxIndex + 1; i < fullRows.size(); i++) {
+//            LocMast loc = getLocMastByRow(fullRows.get(i), bay1, lev1);
+//            if (loc != null && "D".equals(loc.getLocSts())) {
+//                rightSupplementCount++;
+//                rightSupplementLocs.add(loc);
+//            }
+//        }
+
+        // 閫夋嫨闇�瑕佽ˉ鍏呮渶灏戠殑涓�渚э紙濡傛灉鐩哥瓑锛屼紭鍏堝乏渚э級
+        List<LocMast> chosenSupplementLocs;
+        boolean isLeft = false;
+        if (true) {
+            chosenSupplementLocs = leftSupplementLocs;
+            isLeft = true;
+            log.info("閫夋嫨琛ュ厖宸︿晶鍓嶆柟锛屽叡 {} 涓簱浣�", leftSupplementCount);
+        }
+//        else {
+//            chosenSupplementLocs = rightSupplementLocs;
+//            isLeft = false;
+//            log.info("閫夋嫨琛ュ厖鍙充晶鍓嶆柟锛屽叡 {} 涓簱浣�", rightSupplementCount);
+//        }
+        // 璁板綍閫夋嫨鐨勪晶
+        isLeftSideSupplement.set(isLeft);
+        // 娣诲姞鍒� supplementMasts锛堥伩鍏嶉噸澶嶆坊鍔狅級
+        for (LocMast supp : chosenSupplementLocs) {
+            if (!supplementMasts.contains(supp) && !normalMasts.contains(supp)) {
+                supplementMasts.add(supp);
+            }
+        }
+    }
+
     @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.getLocGroupAscOrder();
+
+        // 1. 鏌ヨ鎵�鏈夐�変腑鐨勫簱浣嶄俊鎭�
+        List<LocMast> selectedMasts = locMastService.selectList(
+                new EntityWrapper<LocMast>().in("loc_no", param.getLocNos())
+        );
+
+        if (selectedMasts.size() != param.getLocNos().size()) {
+            throw new CoolException("閮ㄥ垎閫変腑搴撲綅涓嶅瓨鍦ㄦ垨鏁版嵁寮傚父");
+        }
+
+        // 2. 鍖哄垎姝e父鍒嗙粍鍐呯殑搴撲綅 鍜� 闇�瑕佽ˉ鍏呯殑搴撲綅锛堣鍒欏鐨勶級
+        List<LocMast> normalMasts = new ArrayList<>();
+        List<LocMast> supplementMasts = new ArrayList<>();
+        for (LocMast lm : selectedMasts) {
+            boolean inAnyGroup = locGroupAscOrder.stream()
+                    .anyMatch(g -> g.getRowList().contains(lm.getRow1()));
+            if (inAnyGroup) {
+                normalMasts.add(lm);
+            } else {
+                supplementMasts.add(lm);
+            }
+        }
+        // 鏂板锛氳褰曟槸鍚﹀洜涓哄乏渚у墠鏂硅琛ュ厖
+        AtomicReference<Boolean> isLeftSideSupplement = new AtomicReference<>(false);
+        // 3. 瀵规甯稿垎缁勫唴鐨勫簱浣嶈繘琛屾鏌ワ紙鏀惧涓や晶鍫靛瑙勫垯锛�
+        if (!normalMasts.isEmpty()) {
+            List<String> normalLocNos = normalMasts.stream()
+                    .map(LocMast::getLocNo)
+                    .collect(Collectors.toList());
+
+            LockingCheckResultParam checkResult = checkEmptyPlateBlocking(
+                    normalLocNos,
+                    locGroupAscOrder
+            );
+
+            if (!checkResult.isSuccess()) {
+                String errMsg = checkResult.getErrorMessage();
+                if (errMsg.contains("涓や晶鍓嶆柟閮芥湁绌烘澘/鏁呴殰")) {
+                    // 涓や晶閮藉牭 鈫� 杩涘叆琛ラ綈閫昏緫
+                    supplementBothSidesBlocked(normalMasts, locGroupAscOrder, supplementMasts, isLeftSideSupplement);
+                } else {
+                    // 鍏朵粬閿欒锛堝涓嶈繛缁�侀潪D鐘舵�侊級鎶涘嚭
+                    throw new CoolException(errMsg);
+                }
+            }
+            // 濡傛灉鏈変竴渚ф竻绌猴紝鍒欐甯哥户缁�
+        }
+
+        // 4. 鍚堝苟鎵�鏈夊簱浣嶏紙姝e父 + 琛ュ厖鐨勶紝鍖呮嫭瑙勫垯澶栫殑鍜屽墠鏂硅ˉ鐨勶級
+        List<LocMast> allMasts = new ArrayList<>();
+        allMasts.addAll(normalMasts);
+        allMasts.addAll(supplementMasts);
+
+        if (allMasts.isEmpty()) {
+            throw new CoolException("娌℃湁鏈夋晥鐨勭┖鏉垮簱浣嶅彲鍑哄簱");
+        }
+
+        // 5. 缁熶竴鎸� row 鈫� bay 鈫� lev 鎺掑簭锛堜粠灏忓埌澶э級
+        List<LocMast> sortedAll = allMasts.stream()
+                .sorted(Comparator.comparing(LocMast::getRow1)
+                        .thenComparing(LocMast::getBay1)
+                        .thenComparing(LocMast::getLev1))
+                .collect(Collectors.toList());
+
+        Date now = new Date();
+
+        // 6. 鎸夋帓搴忓悗鐨勯『搴忕敓鎴愬嚭搴撲换鍔★紙浠庡悗寰�鍓嶇敓鎴愶級
+        for (int index = 0; index <sortedAll.size() ; index ++) {
+            LocMast locMast = sortedAll.get(index);
+            String locNo = locMast.getLocNo();
+
+            // 鍒ゆ柇鏄惁涓鸿ˉ鍏呭簱浣嶏紙瑙勫垯澶栫殑 鎴� 鍓嶆柟琛ョ殑锛�
+            boolean isSupplement = supplementMasts.contains(locMast);
+
+            int ioType = isSupplement ? 11 : 110;
+
             // 鑾峰彇宸ヤ綔鍙�
             int workNo = commonService.getWorkNo(WorkNoType.PAKOUT.type);
+
+            // 鑾峰彇婧愮珯
+            Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
+                    .eq("type_no", 110)
+                    .eq("stn_no", param.getOutSite())
+                    .eq("crn_no", locMast.getCrnNo());
+            StaDesc staDesc = staDescService.selectOne(wrapper);
+            Integer sourceStaNo = staDesc != null ? staDesc.getCrnStn() : null;
+
+            if (Cools.isEmpty(sourceStaNo)) {
+                throw new CoolException("妫�绱㈡簮绔欏け璐ワ紝搴撲綅锛�" + locNo);
+            }
+
+            // 璁$畻浼樺厛绾э紙绀轰緥锛氳ˉ鍏呯殑浼樺厛绾х◢浣庯級
+            double BASE_PRI = 200.0;
+            double ioPri;
+            WrkMast wrkMast = new WrkMast();
+            LocMast locMastNew = null;
+            if(isSupplement){
+                // 琛ュ厖鐨勫簱浣嶏細鏍规嵁鏄乏渚ц繕鏄彸渚цˉ鍏咃紝鍐冲畾浼樺厛绾ф柟鍚�
+                if (Boolean.TRUE.equals(isLeftSideSupplement.get())) {
+                    // 宸︿晶琛ュ厖 鈫� 浼樺厛绾ц緝浣庯紙鏅氬嚭锛�
+                    ioPri = BASE_PRI + index * 1.0;
+                } else {
+                    // 鍙充晶琛ュ厖 鈫� 浼樺厛绾ц緝楂橈紙鏃╁嚭锛�
+                    ioPri = BASE_PRI - index * 1.0;
+                }
+                locMastNew = commonService.searchEmptyPallet(null);
+                wrkMast.setWrkNo(workNo);
+                wrkMast.setIoTime(now);
+                wrkMast.setWrkSts(0L);
+                wrkMast.setIoType(ioType);
+                wrkMast.setIoPri(ioPri);
+                wrkMast.setSourceStaNo(null);
+                wrkMast.setLocNo(locMastNew.getLocNo());
+                wrkMast.setStaNo(null);
+                wrkMast.setCrnNo(locMast.getCrnNo());
+                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);
+            }else{
+                ioPri = BASE_PRI + index * 1.0;
+                wrkMast.setWrkNo(workNo);
+                wrkMast.setIoTime(now);
+                wrkMast.setWrkSts(0L);
+                wrkMast.setIoType(ioType);
+                wrkMast.setIoPri(ioPri);
+                wrkMast.setSourceStaNo(sourceStaNo);
+                wrkMast.setStaNo(param.getOutSite());
+                wrkMast.setCrnNo(locMast.getCrnNo());
+                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);
+            }
+
+            if (!wrkMastService.insert(wrkMast)) {
+                throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐ワ紝搴撲綅锛�" + locNo);
+            }
+
+            if(locMastNew != null){
+                if ("O".equals(locMastNew.getLocSts())) {
+                    locMastNew.setLocSts("S");
+                    locMastNew.setModiUser(userId);
+                    locMastNew.setModiTime(now);
+                    if (!locMastService.updateById(locMastNew)) {
+                        throw new CoolException("鏇存柊搴撲綅鐘舵�佸け璐ワ紝搴撲綅锛�" + locNo);
+                    }
+                } else {
+                    throw new CoolException("搴撲綅鐘舵�佸紓甯革紝闈炵┖鏉跨姸鎬侊細" + locNo);
+                }
+            }
+
+            // 鏇存柊搴撲綅鐘舵�� D 鈫� R
+            if ("D".equals(locMast.getLocSts())) {
+                locMast.setLocSts("R");
+                locMast.setModiUser(userId);
+                locMast.setModiTime(now);
+                if (!locMastService.updateById(locMast)) {
+                    throw new CoolException("鏇存柊搴撲綅鐘舵�佸け璐ワ紝搴撲綅锛�" + locNo);
+                }
+            } else {
+                throw new CoolException("搴撲綅鐘舵�佸紓甯革紝闈炵┖鏉跨姸鎬侊細" + locNo);
+            }
+        }
+    }
+
+    @Override
+    @Transactional
+    public WrkMast emptyPlateOut(EmptyPlateOutParam param) {
+        WrkMast wrkMast = new WrkMast();
+        if (Cools.isEmpty(param.getOutSite())) {
+            throw new CoolException("绔欑偣涓嶅瓨鍦�");
+        }
+        for (String locNo : param.getLocNos()) {
+            // 鑾峰彇宸ヤ綔鍙�
+            int workNo = commonService.getWorkNo(0);
             // 鑾峰彇搴撲綅
             LocMast locMast = locMastService.selectById(locNo);
             if (Cools.isEmpty(locMast)) {
@@ -443,7 +1172,7 @@
             }
             Date now = new Date();
             // 淇濆瓨宸ヤ綔妗�
-            WrkMast wrkMast = new WrkMast();
+
             wrkMast.setWrkNo(workNo);
             wrkMast.setIoTime(now);
             wrkMast.setWrkSts(11L); // 宸ヤ綔鐘舵�侊細11.鐢熸垚鍑哄簱ID
@@ -458,10 +1187,11 @@
             wrkMast.setExitMk("N"); // 閫�鍑�
             wrkMast.setEmptyMk("Y"); // 绌烘澘
             wrkMast.setLinkMis("N");
-            wrkMast.setAppeUser(userId);
+            wrkMast.setAppeUser(1L);
             wrkMast.setAppeTime(now);
-            wrkMast.setModiUser(userId);
+            wrkMast.setModiUser(1L);
             wrkMast.setModiTime(now);
+            wrkMast.setMemo("鐢熸垚鑷姩绌烘澘鍑哄簱");
             boolean res = wrkMastService.insert(wrkMast);
             if (!res) {
                 throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐�");
@@ -469,13 +1199,14 @@
             // 鏇存柊搴撲綅鐘舵�� D.绌烘澘 -> R.鍑哄簱棰勭害
             if (locMast.getLocSts().equals("D")){
                 locMast.setLocSts("R");
-                locMast.setModiUser(userId);
+                locMast.setModiUser(1L);
                 locMast.setModiTime(now);
                 if (!locMastService.updateById(locMast)) {
                     throw new CoolException("鏇存柊搴撲綅鐘舵�佸け璐�");
                 }
             }
         }
+        return wrkMast;
     }
 
     @Override
@@ -492,8 +1223,13 @@
             }
         }
         if (!locDetlDtos.isEmpty()) {
-            // 鍚姩鍑哄簱寮�濮� 107.鐩樼偣鍑哄簱
-            stockOut(staNo, locDetlDtos, IoWorkType.CHECK_OUT, userId);
+            LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetlDtos.get(0).getLocDetl().getLocNo()));
+            if (locMast.getLocSts().equals("F")){
+                // 鍚姩鍑哄簱寮�濮� 107.鐩樼偣鍑哄簱
+                stockOut(staNo, locDetlDtos, IoWorkType.CHECK_OUT, userId);
+            }else {
+                throw new CoolException("鎵�閫夊簱浣嶅瓨鍦ㄧ姸鎬佷笉涓篎鐨勫簱浣嶏紝搴撲綅鍙凤細"+locMast.getLocNo()+" 銆佸綋鍓嶇姸鎬侊細"+locMast.getLocSts()+"-"+locMast.getLocSts$());
+            }
         } else {
             throw new CoolException("搴撲綅鐗╂枡涓嶅瓨鍦�");
         }
@@ -510,6 +1246,9 @@
         LocMast loc = locMastService.selectById(locNo);
         if (Cools.isEmpty(loc)){
             throw new CoolException("鏈壘鍒板簱浣�");
+        }
+        if (!loc.getLocSts().equals("O") || (!sourceLoc.getLocSts().equals("F") && !sourceLoc.getLocSts().equals("D"))){
+            throw new CoolException("搴撲綅鐘舵�佸凡鏀瑰彉");
         }
         if (!sourceLoc.getCrnNo().equals(loc.getCrnNo())) {
             throw new CoolException("绉昏浆搴撲綅灞炰簬涓嶅悓鍫嗗灈鏈�");
@@ -590,12 +1329,13 @@
         if (wrkMast.getWrkSts() == 4 || wrkMast.getWrkSts() == 14) {
             throw new CoolException("褰撳墠宸ヤ綔妗e凡瀹屾垚");
         }
-        // 鍏ュ簱 + 搴撲綅杞Щ
-        if (wrkMast.getWrkSts() < 4 || (wrkMast.getWrkSts() > 10 && wrkMast.getIoType()==11)) {
-            wrkMast.setWrkSts(4L);
         // 鍑哄簱
-        } else if (wrkMast.getWrkSts() > 10) {
+        if (wrkMast.getIoType() > 100) {
             wrkMast.setWrkSts(14L);
+            // 鍏ュ簱 + 搴撲綅杞Щ
+        } else if (wrkMast.getIoType()==1 || wrkMast.getIoType()==10 || wrkMast.getIoType()==11) {
+            wrkMast.setWrkSts(4L);
+
         }
         Date now = new Date();
         wrkMast.setCrnStrTime(DateUtils.calculate(now, 1L, TimeUnit.SECONDS, true));
@@ -741,7 +1481,7 @@
         String locNo = ""; // 寰呬慨鏀圭洰鏍囧簱浣�
         String locSts = ""; // 寰呬慨鏀圭洰鏍囧簱浣嶇姸鎬�
         // 鍏ュ簱鍙栨秷锛堜慨鏀圭洰鏍囧簱浣嶏級
-        if (wrkMast.getWrkSts() < 4) {
+        if (wrkMast.getIoType() < 100) {
             locNo = wrkMast.getLocNo();
             locSts = "O";
 
@@ -758,10 +1498,10 @@
                 locMastService.updateById(locMast);
             }
         // 鍑哄簱鍙栨秷锛堜慨鏀规簮搴撲綅锛�
-        } else if (wrkMast.getWrkSts() > 10 && wrkMast.getWrkSts() != 14) {
+        } else if (wrkMast.getIoType() > 100 && wrkMast.getWrkSts() != 14) {
             locNo = wrkMast.getSourceLocNo();
             // 鍑哄簱 ===>> F.鍦ㄥ簱
-            if (wrkMast.getIoType() > 100 && wrkMast.getIoType() != 110) {
+            if (wrkMast.getIoType() == 101 || wrkMast.getIoType() == 103 || wrkMast.getIoType() == 107) {
                 locSts = "F";
             // 绌烘澘鍑哄簱 ===>> D.绌烘《/绌烘爤鏉�
             } else if (wrkMast.getIoType() == 110) {
@@ -791,9 +1531,9 @@
                     waitPakin.setIoStatus("N");
                     waitPakin.setLocNo("");
                     waitPakinService.update(waitPakin, new EntityWrapper<WaitPakin>()
-                            .eq("order_no", waitPakin.getOrderNo())
-                            .eq("matnr", waitPakin.getMatnr())
-                            .eq("batch", waitPakin.getBatch()));
+//                            .eq("order_no", waitPakin.getOrderNo())
+                            .eq("zpallet",waitPakin.getZpallet())
+                            .eq("matnr", waitPakin.getMatnr()));
                 }
             }
         }
@@ -878,6 +1618,51 @@
         if (!wrkMastRes || !locMastRes) {
             throw new CoolException("淇濆瓨鏁版嵁澶辫触");
         }
+
+        //wms鍙栨秷浠诲姟 鍚屾椂璋冪敤wcs浠诲姟鍙栨秷鎺ュ彛閫氱煡wcs
+        WrkCancel wrkCancel = new WrkCancel();
+        Date date = new Date();
+        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        wrkCancel.setTaskId(workNo); // 浠诲姟鍙�
+        wrkCancel.setMsgTime(dateFormat.format(date)); // 鍙栨秷鏃堕棿
+        wrkCancel.setWarehouse(warehouse); // 浠撳簱缂栫爜
+
+        String response = "";
+        boolean flag = false;
+        try {
+            response = new HttpHandler.Builder()
+                    .setUri(url)
+                    .setPath(cancel)
+                    .setJson(JSON.toJSONString(wrkCancel))
+                    .build()
+                    .doPost();
+            JSONObject jsonObject = JSON.parseObject(response);
+            if (jsonObject.getInteger("returnStatus") == 0){
+                flag = true;
+            }else {
+                log.error("wms鍙栨秷浠诲姟涓嬪彂wcs澶辫触--->url锛歿}锛況equest锛歿}锛況esponse锛歿}", url+"/"+cancel, JSON.toJSONString(wrkCancel), response);
+                throw new CoolException("wms鍙栨秷浠诲姟涓嬪彂wcs澶辫触");
+            }
+        }catch (Exception e){
+            log.error("fail", e);
+        }finally {
+            try {
+                //淇濆瓨鎺ュ彛鏃ュ織
+                apiLogService.save(
+                        "wms涓嬪彂浠诲姟缁檞cs",
+                        url+"/"+cancel,
+                        null,
+                        "127.0.0.1",
+                        JSON.toJSONString(wrkCancel),
+                        response,
+                        flag
+                );
+            }catch (Exception e){
+                log.error("",e);
+            }
+        }
+
+
     }
 
     @Override
@@ -1042,4 +1827,31 @@
         return targetLoc.getLocNo();
     }
 
+    @Override
+    @Transactional
+    public void turnMatLocDetl(EmptyPlateOutParam param, Long userId) {
+        Mat mat = matService.selectOne(new EntityWrapper<Mat>().eq("id", param.getMatId()));
+        if (Cools.isEmpty(mat)){
+            throw new CoolException("鐩爣搴撲綅鍟嗗搧缂栫爜鏈夎锛�");
+        }
+        List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("matnr", param.getLocDetls().get(0).getMatnr()));
+        if (Cools.isEmpty(locDetls) || locDetls.size()<1){
+            throw new CoolException("寰呬慨鏀瑰晢鍝佹棤搴撳瓨锛屾棤闇�淇敼锛�  鍝佸彿锛�"+param.getLocDetls().get(0).getMatnr());
+        }
+        try {
+            locDetlService.updateMatTurn(param.getLocDetls().get(0).getMatnr(),mat.getMatnr());
+        }catch (Exception e){
+            throw new CoolException("瀵规暟鎹簱淇敼鍑洪敊锛�");
+        }
+        for (LocDetl locDetl:locDetls){
+            // 淇濆瓨璋冩暣璁板綍
+            AdjDetl adjDetl = new AdjDetl();
+            adjDetl.setLocNo(locDetl.getLocNo());
+            adjDetl.setMatnr(mat.getMatnr());
+            adjDetl.setMatnrOld(param.getLocDetls().get(0).getMatnr());
+            adjDetl.setAdjQty(locDetl.getAnfme());
+            adjDetlService.save(adjDetl, userId);
+        }
+    }
+
 }

--
Gitblit v1.9.1