From b7d562f09526fc5d1fddc3a692f47aeb3ac956f6 Mon Sep 17 00:00:00 2001
From: lty <876263681@qq.com>
Date: 星期二, 28 四月 2026 04:09:14 +0800
Subject: [PATCH] #退库优化/自动跨巷道移库V1

---
 src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java |  229 ++++++++++++++++++++++++++++++++-------------------------
 1 files changed, 128 insertions(+), 101 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 7f30861..904b3ff 100644
--- a/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -27,6 +27,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
 import javax.annotation.Resource;
 import java.util.*;
@@ -44,6 +45,7 @@
     private static final int DEFAULT_WORK_NO_TYPE = 0;
     // 搴撲綅鎺掑彿鍒嗛厤榛樿绫诲埆
     private static final int DEFAULT_ROW_NO_TYPE = 1;
+    private static final String BACK_LOC_OPERATION_V2_SCENE = "璺ㄥ贩閬撳洖搴撳嚭搴�";
 
     @Autowired
     private MatService matService;
@@ -1586,111 +1588,136 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public R backLocOperationV2(String workNo, Long userId) {
-        WrkMast wrkMast = wrkMastService.selectById(workNo);
-        if (Cools.isEmpty(wrkMast)) {
-            return R.error(workNo+"宸ヤ綔妗d笉瀛樺湪");
-        }
-        if (wrkMast.getWrkSts() != 15) {
-            return R.error("褰撳墠浠诲姟鐘舵�佷笉鑳芥墽琛屾鎿嶄綔锛�");
-        }
-
-        Integer ioType = 101;
-        Integer wokNo;
-
-        if (Objects.isNull(wrkMast.getIsSuplus())) {
-            return R.error("鍥炲簱绫诲瀷涓嶈兘涓虹┖锛侊紒");
-        }
-
-        wokNo = commonService.getWorkNo(0);
-        LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", wrkMast.getLocNo()));
-
-        // 鑾峰彇鐩爣绔�
-        Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
-                .eq("type_no", ioType)
-                .eq("stn_no", 1070) // 1070
-                .eq("crn_no", locMast1.getCrnNo()); // 鍫嗗灈鏈哄彿
-        StaDesc staDesc = staDescService.selectOne(wrapper);
-        if (Cools.isEmpty(staDesc)) {
-            return R.error("鍑哄簱璺緞涓嶅瓨鍦�");
-        }
-
-        int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("barcode", wrkMast.getBarcode()));
-        if (count >= 2) {
-            return R.error("浠诲姟妗e凡鐢熸垚锛屼笉鍙互閲嶅鐢熸垚鐩稿悓鐨勫瓙浠诲姟锛侊紒");
-        }
-
-        WrkDetl detl = wrkDetlService.selectOne(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
-        LocDetl locDetl = new LocDetl();
-        BeanUtils.copyProperties(detl, locDetl);
-        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(locDetl);
-
-        // 婧愮珯鐐圭姸鎬佹娴�
-        BasDevp sourceStaNo = basDevpService.checkSiteStatus(staDesc.getCrnStn(), false);
-        sourceStaNo.setLocType1((short) 1);
-        LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
-        String locNo = wrkMast.getSourceLocNo();
-
-        if(Cools.isEmpty(locNo)) {
-            return R.error("娌℃湁绌哄簱浣�");
-        }
-
-        Date now = new Date();
-        // 鍫嗗灈鏈虹珯鐐�(鐩爣绔�)
-        Integer staNo = staDesc.getCrnStn();
-        WrkMast mast = new WrkMast();
-        BeanUtils.copyProperties(wrkMast, mast);
-        mast.setWrkNo(wokNo);
-        // 鏇存柊宸ヤ綔妗f暟鎹姸鎬�
-        mast.setIoType(ioType); // 110鍏堝嚭搴撳埌1070
-        mast.setWrkSts(11L); // 鐢熸垚鍑哄簱id
-        mast.setSourceStaNo(String.valueOf(staDesc.getCrnStn())); // 婧愮珯
-        mast.setStaNo(String.valueOf(staDesc.getStnNo())); // 鐩爣绔�
-        mast.setSourceLocNo(wrkMast.getLocNo()); //鍑哄簱浣�
-        mast.setLocNo(locNo); // 鐩爣搴撲綅 = 鍑哄簱鏃剁殑婧愬簱浣嶏紝鐢ㄤ簬鍒ゆ柇宸烽亾
-        mast.setOnlineYn(null);
-        mast.setModiTime(now);
-        mast.setWrkCode(null);
-        mast.setPacked(workNo);
-        mast.setModiUser(userId);
-        if (!wrkMastService.insert(mast)) {
-            return R.error("鏇存柊宸ヤ綔妗f暟鎹姸鎬佸け璐�");
-        }
-        List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
-        if (Cools.isEmpty(wrkDetls)) {
-            return R.error("鏁版嵁閿欒锛屼换鍔℃。鏄庣粏涓嶅瓨鍦� 锛侊紒");
-        }
-
-        LocAroundBind aroundBind = locAroundBindService.selectOne(new EntityWrapper<LocAroundBind>().eq("b_loc_no", mast.getSourceLocNo()));
-        if (!Objects.isNull(aroundBind)) {
-            aroundBind.setLocType(LocStsType.LOC_STS_TYPE_R.type);
-            if (!locAroundBindService.updateById(aroundBind)) {
-                return R.error("宸ヤ綅鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+        final String scene = BACK_LOC_OPERATION_V2_SCENE;
+        String locNo = null;
+        String sourceLocNo = null;
+        String barcode = null;
+        Integer sourceStaNo = null;
+        Integer staNo = null;
+        try {
+            WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", workNo));
+            if (Cools.isEmpty(wrkMast)) {
+                return R.error(workNo + "宸ヤ綔妗d笉瀛樺湪");
             }
-        }
-
-
-        wrkDetls.forEach(wrkDetl -> {
-            WrkDetl wrkDetl1 = new WrkDetl();
-            BeanUtils.copyProperties(wrkDetl, wrkDetl1);
-            wrkDetl1.setAnfme(wrkDetl.getStockQty() - wrkDetl.getAnfme());
-            wrkDetl1.setWrkNo(wokNo);
-            if (!wrkDetlService.insert(wrkDetl1)) {
-                throw new CoolException("浠诲姟妗f槑缁嗕繚瀛樺け璐ワ紒锛�");
+            if (!Objects.equals(wrkMast.getWrkSts(), 15L)) {
+                return R.error("褰撳墠浠诲姟鐘舵�佷笉鑳芥墽琛屾鎿嶄綔锛�");
             }
-        });
+            if (Objects.isNull(wrkMast.getIsSuplus())) {
+                return R.error("鍥炲簱绫诲瀷涓嶈兘涓虹┖锛侊紒");
+            }
 
-        //淇敼浣滀笟搴撲綅鐘舵��
-        LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
-        locMast.setLocSts("R");
-        locMast.setModiTime(now);
-        locMast.setModiUser(userId);
-        if (!locMastService.updateById(locMast)) {
-            return R.error("淇敼搴撲綅鐘舵�佸け璐�");
+            barcode = wrkMast.getBarcode();
+            sourceLocNo = wrkMast.getLocNo();
+
+            LocMast sourceLoc = locMastService.selectById(sourceLocNo);
+            if (Cools.isEmpty(sourceLoc)) {
+                return R.error("浣滀笟搴撲綅涓嶅瓨鍦�");
+            }
+
+            List<Integer> outStaNos = staDescService.queryOutStaNosByLocNo(sourceLocNo, 101);
+            if (Cools.isEmpty(outStaNos)) {
+                return R.error("鍑哄簱璺緞涓嶅瓨鍦�");
+            }
+            sourceStaNo = outStaNos.get(0);
+
+            LocTypeDto locTypeDto = new LocTypeDto();
+            locTypeDto.setLocType1((short) 1);
+            StartupDto dto = commonService.getLocNoV2(1, sourceStaNo, wrkMast, locTypeDto);
+            if (Cools.isEmpty(dto) || Cools.isEmpty(dto.getLocNo())) {
+                throw new CoolException("娌℃湁鎵惧埌搴撲綅");
+            }
+
+            locNo = dto.getLocNo();
+            List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkMast.getWrkNo());
+            if (Cools.isEmpty(wrkDetls)) {
+                throw new CoolException("宸ヤ綔鏄庣粏涓嶅瓨鍦�");
+            }
+            List<Integer> inStaNos = staDescService.queryOutStaNosByLocNo(locNo, 1);
+            if (Cools.isEmpty(inStaNos)) {
+                throw new CoolException("鍏ュ簱璺緞涓嶅瓨鍦�");
+            }
+            staNo = inStaNos.get(0);
+
+
+            int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("barcode", barcode));
+            if (count >= 2) {
+                return R.error("浠诲姟妗e凡鐢熸垚锛屼笉鍙互閲嶅鐢熸垚鐩稿悓鐨勫瓙浠诲姟锛侊紒");
+            }
+
+            WrkDetl detl = wrkDetlService.selectOne(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
+            if (Cools.isEmpty(detl)) {
+                return R.error("鏁版嵁閿欒锛屼换鍔℃。鏄庣粏涓嶅瓨鍦� 锛侊紒");
+            }
+
+            LocDetl locDetl = new LocDetl();
+            BeanUtils.copyProperties(detl, locDetl);
+            new FindLocNoAttributeVo(locDetl);
+
+            int newWorkNo = dto.getWorkNo();
+            Date now = new Date();
+
+            WrkMast mast = new WrkMast();
+            BeanUtils.copyProperties(wrkMast, mast);
+            mast.setWrkNo(newWorkNo);
+            mast.setIoType(101);
+            mast.setWrkSts(11L);
+            mast.setSourceStaNo(String.valueOf(sourceStaNo));
+            mast.setStaNo(String.valueOf(staNo));
+            mast.setSourceLocNo(sourceLocNo);
+            mast.setLocNo(locNo);
+            mast.setOnlineYn("N");
+            mast.setModiTime(now);
+            mast.setWrkCode(null);
+            mast.setPacked(workNo);
+            mast.setModiUser(userId);
+            if (!wrkMastService.insert(mast)) {
+                return R.error("鏇存柊宸ヤ綔妗f暟鎹姸鎬佸け璐�");
+            }
+
+            LocAroundBind aroundBind = locAroundBindService.selectOne(new EntityWrapper<LocAroundBind>().eq("b_loc_no", mast.getSourceLocNo()));
+            if (!Objects.isNull(aroundBind)) {
+                aroundBind.setLocType(LocStsType.LOC_STS_TYPE_R.type);
+                if (!locAroundBindService.updateById(aroundBind)) {
+                    return R.error("宸ヤ綅鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+                }
+            }
+
+            for (WrkDetl wrkDetl : wrkDetls) {
+                WrkDetl wrkDetl1 = new WrkDetl();
+                BeanUtils.copyProperties(wrkDetl, wrkDetl1);
+                wrkDetl1.setAnfme(wrkDetl.getStockQty() - wrkDetl.getAnfme());
+                wrkDetl1.setWrkNo(newWorkNo);
+                if (!wrkDetlService.insert(wrkDetl1)) {
+                    throw new CoolException("浠诲姟妗f槑缁嗕繚瀛樺け璐ワ紒锛�");
+                }
+            }
+
+            LocMast locMast1 = locMastService.selectById(sourceLocNo);
+            locMast1.setLocSts("R");
+            locMast1.setModiTime(now);
+            locMast1.setModiUser(userId);
+            LocMast locMast2 = locMastService.selectById(locNo);
+            locMast2.setLocSts("S");
+            locMast2.setModiTime(now);
+            locMast2.setModiUser(userId);
+            if (!locMastService.updateById(locMast1)) {
+                return R.error("淇敼鍑哄簱搴撲綅鐘舵�佸け璐�");
+            }
+            if (!locMastService.updateById(locMast2)) {
+                return R.error("淇敼鍏ュ簱搴撲綅鐘舵�佸け璐�");
+            }
+
+            if (Cools.isEmpty(mast)) {
+                return R.error("娌℃湁鐢熸垚浠诲姟");
+            }
+            return R.ok("鐢熸垚鍥炲簱浠诲姟鎴愬姛锛侊紒");
+        } catch (Exception e) {
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            String reason = Cools.isEmpty(e.getMessage()) ? e.getClass().getSimpleName() : e.getMessage();
+            log.error("{}澶辫触[workNo={}, barcode={}, sourceLocNo={}, locNo={}, sourceStaNo={}, staNo={}, userId={}]锛屽師鍥�: {}",
+                    scene, workNo, barcode, sourceLocNo, locNo, sourceStaNo, staNo, userId, reason, e);
+            return R.error(reason);
         }
-        if (Cools.isEmpty(mast)) {
-            return R.error("娌℃湁鐢熸垚浠诲姟");
-        }
-        return R.ok("鐢熸垚鍥炲簱浠诲姟鎴愬姛锛侊紒");
     }
 
 

--
Gitblit v1.9.1