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

---
 src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java |  831 +++++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 696 insertions(+), 135 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 9ef1cd3..a3e7df0 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;
@@ -9,6 +11,8 @@
 import com.core.exception.CoolException;
 import com.zy.asrs.entity.*;
 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.*;
@@ -16,6 +20,7 @@
 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;
@@ -23,8 +28,11 @@
 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;
 
 /**
@@ -75,8 +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
@@ -178,12 +192,107 @@
             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)
+                );
+    }
+
+    /**
+     * 妫�鏌ユ甯稿簱浣嶅墠鏂规槸鍚﹀牭濉烇紙娣卞簱浣嶈鍒欙細鍓嶆柟鎺掓槸鍚︽湁璐ф垨鍏ュ簱浠诲姟锛�
+     *
+     * 鍒ゆ柇渚濇嵁锛�
+     * 1. 鍙鏌ュ睘浜庡嚭搴撳垎缁勮鍒欏唴鐨勫簱浣嶏紙閫氳繃鍒嗙粍鐨� rowList 纭畾鑼冨洿锛�
+     * 2. 鍓嶆柟 = 鍒嗙粍涓储寮曞ぇ浜庡綋鍓嶅簱浣嶇殑鎺掞紙鍋囪鍒嗙粍 rowList 宸叉寜鍑哄簱椤哄簭鎺掑垪锛屽ぇ绱㈠紩 = 鍓嶆柟鏇存繁锛�
+     * 3. 鍫靛鏉′欢锛氬墠鏂规湁璐э紙F鐘舵�侊級鎴栨湁鍏ュ簱浠诲姟
+     *
+     * @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; // 鏃犻厤缃椂榛樿涓嶆鏌�
+        }
+
+        // 鍋囪鎵�鏈� normalMasts 鍦ㄥ悓涓�涓垎缁勶紙甯歌鎯呭喌锛岃嫢澶氬垎缁勫彲寰幆澶勭悊锛�
+        LocMast representative = normalMasts.get(0);
+        LocGroupOrder group = locGroupAscOrder.stream()
+                .filter(g -> g.getRowList() != null && g.getRowList().contains(representative.getRow1()))
+                .findFirst()
+                .orElse(null);
+
+        if (group == null || group.getRowList() == null || group.getRowList().isEmpty()) {
+            return false; // 涓嶅湪浠讳綍鍒嗙粍锛屼笉妫�鏌�
+        }
+
+        List<Integer> fullRows = group.getRowList(); // 鍒嗙粍鍐呮墍鏈夋帓鍙峰垪琛紙鎸夊嚭搴撻『搴忔帓鍒楋級
+
+        // 閬嶅巻姣忎釜姝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;
+            }
+
+            // 鍦ㄥ垎缁� rowList 涓壘鍒板綋鍓嶆帓鐨勭储寮�
+            int currentIndex = fullRows.indexOf(currentRow);
+            if (currentIndex < 0) {
+                continue; // 褰撳墠鎺掍笉鍦ㄥ垎缁勫唴锛岃烦杩�
+            }
+
+            // 鍓嶆柟 = 鍒嗙粍涓储寮曟洿澶х殑浣嶇疆锛堝亣璁惧垎缁� rowList 浠庡墠鍒板悗鎺掑垪锛屽ぇ绱㈠紩 = 鏇存繁锛�
+            // 濡傛灉浣犵殑鍒嗙粍鍒楄〃鏄�掑簭鐨勶紙浠庡悗鍒板墠锛夛紝鍒欓渶鏀逛负 currentIndex - 1 鍒� 0
+            for (int i = currentIndex + 1; i < fullRows.size(); i++) {
+                Integer frontRow = fullRows.get(i);
+                LocMast front = getLocMastByRow(frontRow, 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())
+                                .in("loc_sts", Arrays.asList("S", "Q")) // 鏀寔 loc_sts 涓� S 鎴� Q
+                );
+
+                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) {
@@ -200,79 +309,106 @@
                 dtos.add(new OutLocDto(locNo, locDetlDto));
             }
         }
-        Integer ioType = null;
+        // 浣跨敤鍑哄簱涓撶敤鍒嗙粍閰嶇疆
+        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; // 閮ㄥ垎鍑哄簱
+        }
 
-        // 鎸夊垪鍜屽眰鍒嗙粍搴撲綅
-        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;                  // 缁勫悎鎴愬敮涓�鐨勭粍鏍囪瘑
-                }));
+        // 1. 鏌ヨ鎵�鏈夐�変腑鐨勫簱浣嶄富淇℃伅
+        List<LocMast> allSelectedMasts = locMastService.selectList(
+                new EntityWrapper<LocMast>().in("loc_no", locNos)
+        );
 
-        // 閬嶅巻姣忕粍
-        for (Map.Entry<String, List<OutLocDto>> entry : locGroups.entrySet()) {
-            String groupKey = entry.getKey(); // 缁勬爣璇嗭紝渚嬪 "003-02" 琛ㄧず绗�3鍒楃2灞�
-            List<OutLocDto> groupDtos = entry.getValue();
+        if (allSelectedMasts.size() != locNos.size()) {
+            throw new CoolException("閮ㄥ垎閫変腑搴撲綅涓嶅瓨鍦ㄦ垨鏁版嵁寮傚父");
+        }
 
-            // 缁勫唴浼樺厛绾ч噸鏂颁粠100寮�濮�
-            double priority = 100;
+        // 2. 鍖哄垎姝e父搴撲綅锛堥渶瑕佷弗鏍兼繁搴撲綅妫�鏌ワ級涓庤ˉ鍏呭簱浣�
+        List<LocMast> normalMasts = new ArrayList<>();
+        List<LocMast> supplementMasts = new ArrayList<>();
 
-            // 鎺掑簭缁勫唴搴撲綅锛堟帓鍙峰�掑簭锛�
-            groupDtos.sort(Comparator.comparing((OutLocDto dto) -> Integer.valueOf(dto.getLocNo().substring(0, 2))).reversed());
+        // 鍋囪鎴戜滑鏈夋煇绉嶁�滃垎缁勮鍒欌�濓紙濡傛寜鍒楀眰鎴栨帓鑼冨洿锛夛紝杩欓噷绠�鍖栫敤涓�涓ず渚嬪垽鏂�
+        // 浣犲彲浠ユ浛鎹㈡垚瀹為檯鐨勮鍒欙紙濡� getLocGroupOrderOut() 鎴栧叾浠栵級
+        for (LocMast lm : allSelectedMasts) {
+            boolean isNormal = isInNormalRule(lm); // 鈫� 浣犻渶瑕佸疄鐜拌繖涓垽鏂柟娉�
+            if (isNormal) {
+                normalMasts.add(lm);
+            } else {
+                supplementMasts.add(lm);
+            }
+        }
 
-            for (OutLocDto dto : groupDtos) {
-                String locNo = dto.getLocNo();
+        // 3. 瀵规甯稿簱浣嶈繘琛屾繁搴撲綅鍓嶆柟妫�鏌ワ紙绫讳技涔嬪墠鐨勮繛缁 + 娓呯┖锛�
+        AtomicReference<Boolean> isLeftSideSupplement = new AtomicReference<>(false);
 
-                // 娣卞簱浣嶈鍒欐鏌ワ紝浠呮鏌ュ綋鍓嶅垪鍜屽眰鍐呯殑鍓嶅簱浣�
-                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 + " 鏈夎揣");
-                    }
+        if (!normalMasts.isEmpty()) {
+            // 杩欓噷妯℃嫙娣卞簱浣嶅墠鏂规鏌ワ紙浣犲彲浠ユ浛鎹㈡垚浣犲疄闄呯殑妫�鏌ユ柟娉曪級
+            boolean hasBlockage = checkDeepLocationBlocked(normalMasts);
 
-                    // 鍒ゆ柇鍓嶅簱浣嶆槸鍚︽湁鍏ュ簱浠诲姟
-                    WrkMast wrkMastFront = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("loc_no", frontLoc));
-                    if (!Cools.isEmpty(wrkMastFront)) {
-                        throw new CoolException(locNo + " 鐨勫墠搴撲綅 " + frontLoc + " 鏈夊叆搴撲换鍔�");
-                    }
+            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;
                 }
-
-                // 璁$畻浼樺厛绾�
-                dto.setPriority(priority);
-                priority--; // 涓嬩竴涓换鍔′紭鍏堢骇閫掑
-
-                // 鑾峰彇搴撲綅
-                LocMast locMast = locMastService.selectById(dto.getLocNo());
-                if (Cools.isEmpty(locMast)) {
-                    throw new CoolException(dto.getLocNo() + "搴撲綅涓嶅瓨鍦�");
-                }
-                if (!locMast.getLocSts().equals("F")) {
-                    throw new CoolException(dto.getLocNo() + "鎵樼洏闈炲湪搴撶姸鎬�");
-                }
-
-                // 鍒ゆ柇鍏ュ嚭搴撶被鍨�
-                if (ioWorkType == null) {
-                    ioType = dto.isAll() ? 101 : 103;
-                } else if (ioWorkType.equals(IoWorkType.CHECK_OUT)) {
-                    ioType = 107;
-                }
-                assert ioType != null;
-
-                Integer outSta = staNo.getDevNo();
-
-                // 鑾峰彇璺緞
-                StaDesc staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), outSta);
-
-                // 鐢熸垚宸ヤ綔鍙�
-                int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
-                String pick = ioType == 101 ? "N":"Y";
-
+            } else {
+                priority = basePriority - index * 1.0;
+            }
+            OutLocDto dto;
+            Integer outSta = staNo.getDevNo();
+            StaDesc staDesc = null;
+            if(ioType != 11){
+                staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), outSta);
+            }
+            LocMast locMastNew = null;
+            WrkMast wrkMast = new WrkMast();
+            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 wrkMast = new WrkMast();
                 wrkMast.setWrkNo(workNo);
                 wrkMast.setIoTime(now);
                 wrkMast.setWrkSts(0L);
@@ -281,7 +417,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");
@@ -292,11 +428,8 @@
                 wrkMast.setAppeTime(now);
                 wrkMast.setModiUser(userId);
                 wrkMast.setModiTime(now);
-                if (!wrkMastService.insert(wrkMast)) {
-                    throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐ワ紝鍑哄簱搴撲綅鍙凤細" + dto.getLocNo());
-                }
-
-                // 鐢熸垚宸ヤ綔妗f槑缁�
+                locSts = ioType != 101? "R" : "P";
+                // 鐢熸垚宸ヤ綔妗f槑缁嗭紙淇濈暀鍘熼�昏緫锛�
                 for (LocDetlDto detlDto : dto.getLocDetlDtos()) {
                     if (detlDto.getCount() == null || detlDto.getCount() <= 0.0D) {
                         continue;
@@ -316,19 +449,81 @@
                         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);
 
-                // 淇敼搴撲綅鐘舵��
-                locMast = locMastService.selectById(dto.getLocNo());
-                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());
+                        wrkDetl.setAppeTime(now);
+                        wrkDetl.setAppeUser(userId);
+                        wrkDetl.setModiTime(now);
+                        wrkDetl.setModiUser(userId);
+                        if (!wrkDetlService.insert(wrkDetl)) {
+                            throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
+                        }
+                    }
+                }
+            }
+            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(dto.getLocNo() + "搴撲綅涓嶆槸鍦ㄥ簱鐘舵��");
+                    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("棰勭害搴撲綅鐘舵�佸け璐ワ紝搴撲綅鍙凤細" + locNo);
+                }
+            } else {
+                throw new CoolException(locNo + " 搴撲綅涓嶆槸鍦ㄥ簱鐘舵��");
             }
         }
     }
@@ -474,82 +669,406 @@
         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);
-            // 鑾峰彇搴撲綅
-            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)
                     .eq("stn_no", param.getOutSite())
                     .eq("crn_no", locMast.getCrnNo());
             StaDesc staDesc = staDescService.selectOne(wrapper);
-            Integer sourceStaNo = staDesc.getCrnStn();
+            Integer sourceStaNo = staDesc != null ? staDesc.getCrnStn() : null;
+
             if (Cools.isEmpty(sourceStaNo)) {
-                throw new CoolException("妫�绱㈡簮绔欏け璐�");
+                throw new CoolException("妫�绱㈡簮绔欏け璐ワ紝搴撲綅锛�" + locNo);
             }
-            Date now = new Date();
-            // 淇濆瓨宸ヤ綔妗�
+
+            // 璁$畻浼樺厛绾э紙绀轰緥锛氳ˉ鍏呯殑浼樺厛绾х◢浣庯級
+            double BASE_PRI = 200.0;
+            double ioPri;
             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.setCrnNo(locMast.getCrnNo());
-            wrkMast.setSourceLocNo(locNo); // 婧愬簱浣�
-            wrkMast.setFullPlt("N"); // 婊℃澘锛歒
-            wrkMast.setPicking("N"); // 鎷f枡
-            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け璐�");
+            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);
             }
-            // 鏇存柊搴撲綅鐘舵�� D.绌烘澘 -> R.鍑哄簱棰勭害
-            if (locMast.getLocSts().equals("D")){
+
+            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("鏇存柊搴撲綅鐘舵�佸け璐�");
+                    throw new CoolException("鏇存柊搴撲綅鐘舵�佸け璐ワ紝搴撲綅锛�" + locNo);
                 }
+            } else {
+                throw new CoolException("搴撲綅鐘舵�佸紓甯革紝闈炵┖鏉跨姸鎬侊細" + locNo);
             }
         }
     }
@@ -910,7 +1429,7 @@
         } else if (wrkMast.getIoType() > 100 && wrkMast.getWrkSts() != 14) {
             locNo = wrkMast.getSourceLocNo();
             // 鍑哄簱 ===>> F.鍦ㄥ簱
-            if (wrkMast.getIoType() == 101 || wrkMast.getIoType() == 103) {
+            if (wrkMast.getIoType() == 101 || wrkMast.getIoType() == 103 || wrkMast.getIoType() == 107) {
                 locSts = "F";
             // 绌烘澘鍑哄簱 ===>> D.绌烘《/绌烘爤鏉�
             } else if (wrkMast.getIoType() == 110) {
@@ -1028,7 +1547,49 @@
             throw new CoolException("淇濆瓨鏁版嵁澶辫触");
         }
 
-        //wms鍙栨秷浠诲姟 鍚屾椂璋冪敤wcs浠诲姟鍙栨秷鎺ュ彛閫氱煡wcs todo
+        //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);
+            }
+        }
+
 
     }
 

--
Gitblit v1.9.1