From b4c6f129662be7fb14f71235817a24e15f824449 Mon Sep 17 00:00:00 2001
From: skyouc <creaycat@gmail.com>
Date: 星期五, 19 十二月 2025 16:25:38 +0800
Subject: [PATCH] AGV呼叫,回传功能优化

---
 src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java |   96 ++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 88 insertions(+), 8 deletions(-)

diff --git a/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
index b938865..582a0ea 100644
--- a/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -1540,7 +1540,7 @@
             station.setModiTime(new Date());
             station.setModiUser(userId);
             if (!basStationService.updateById(station)) {
-                throw new CoolException("鏇存柊鐩爣搴撲綅鐘舵�佸け璐�");
+                throw new CoolException("鏇存柊鐩爣绔欑偣鐘舵�佸け璐�");
             }
         } else {
             throw new CoolException("绉昏浆澶辫触锛岀洰鏍囧簱浣嶇姸鎬侊細" + station.getLocSts());
@@ -1741,6 +1741,7 @@
                     throw new CoolException("鏁版嵁閿欒锛岀珯鐐逛笉瀛樺湪锛侊紒");
                 }
                 station.setLocSts(LocStsType.LOC_STS_TYPE_O.type);
+                station.setBarcode(null);
                 if (!basStationService.updateById(station)) {
                     throw new CoolException("绔欑偣鐘舵�佹洿鏂板け璐ワ紒锛�");
                 }
@@ -1785,6 +1786,7 @@
         }
 
         station.setLocSts(LocStsType.LOC_STS_TYPE_O.type);
+        station.setBarcode(null);
         if (!basStationService.updateById(station)) {
             throw new CoolException("绔欑偣鐘舵�佷慨鏀瑰け璐�!");
         }
@@ -1806,6 +1808,13 @@
         generateCrnInTask(waitPakins, station, param.getLocType1(), userId);
     }
 
+    /**
+     * SO/EO 鍖虹粍鎵�
+     * @author Ryan
+     * @date 2025/12/18 15:19
+     * @param params
+     * @return com.core.common.R
+     */
     @Override
     @Transactional(rollbackFor = Exception.class)
     public R collectionPakin(CollectionPakinParams params, Long userId) {
@@ -2178,8 +2187,8 @@
 
         // 鍒ゆ柇鏍规嵁鍒嗘嫞鍑哄簱鍚�,杩橀渶瑕佸嚭澶氬皯鎵樼洏鎴栨枡绠�;濡傛灉浣欐枡澶т簬0, 鍑烘柊鎵樼洏鎴栨枡绠�
         if (totalOut.get().compareTo(0.0) > 0) {
-            generateTask(locMasts, TaskIOType.MERGE_OUT.type, basDevp, userId);
-            //TODO 缁嗗寲鍖哄垎锛屽綋鍓嶅嚭搴撴墭鐩樻槸婊炴弧瓒虫嫞璐ф暟閲�
+            generateTask(locMasts, TaskIOType.MERGE_OUT.type, basDevp, userId, station);
+            //TODO 缁嗗寲鍖哄垎锛屽綋鍓嶅嚭搴撴墭鐩樻槸婊¤冻鎷h揣鏁伴噺
         } else {
             LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
                     // todo 鏍规嵁鐗╂枡绉嶇被,鍖哄垎搴撳尯绫诲瀷
@@ -2189,7 +2198,7 @@
             CrnTaskDetlDTO crnTaskDetlDTO = new CrnTaskDetlDTO().setLocNo(locMast.getLocNo()).setLocDetlList(locDetls);
             locMasts.add(crnTaskDetlDTO);
             // 绌烘澘鍑哄簱
-            generateTask(locMasts, TaskIOType.MERGE_OUT.type, basDevp, userId);
+            generateTask(locMasts, TaskIOType.MERGE_OUT.type, basDevp, userId, station);
         }
     }
 
@@ -2197,11 +2206,12 @@
      * 鐢熸垚鍫嗗灈鏈哄嚭搴撲换鍔�
      *
      * @param locMasts
+     * @param station
      * @author Ryan
      * @date 2025/12/6 14:44
      */
     @Transactional(rollbackFor = Exception.class)
-    public void generateTask(List<CrnTaskDetlDTO> locMasts, Integer ioType, BasDevp devp, Long userId) {
+    public void generateTask(List<CrnTaskDetlDTO> locMasts, Integer ioType, BasDevp devp, Long userId, BasStation station) {
         Date now = new Date();
 
         for (CrnTaskDetlDTO crnTaskDetlDTO : locMasts) {
@@ -2228,6 +2238,9 @@
                 wrkMast.setSourceStaNo(staDesc.getCrnStn() + ""); // 婧愮珯
                 wrkMast.setStaNo(staDesc.getStnNo() + ""); // 鐩爣绔�
                 wrkMast.setSourceLocNo(locMast.getLocNo()); // 婧愬簱浣�
+                //灏忔澗椤圭洰锛岀紦瀛樺嚭搴揂GV绔欑偣锛岀敤浜庢竻绌虹紦瀛樺尯搴撳瓨
+                wrkMast.setPauseMk(station.getDevNo());
+//                wrkMast.setAvgSta(station.getDevNo());;
                 wrkMast.setFullPlt("Y"); // 婊℃澘锛歒
                 wrkMast.setPicking("N"); // 鎷f枡
                 wrkMast.setExitMk("N"); // 閫�鍑�
@@ -2251,6 +2264,8 @@
                 wrkDetl.setOrderNo(""); // 鎵嬪姩鍑哄簱涓嶉渶瑕佸甫鍑哄簱瀛樹腑鐨勫崟鎹紪鍙�
                 wrkDetl.setWrkNo(workNo);
                 wrkDetl.setIoTime(now);
+                wrkDetl.setZpallet(null);
+                wrkDetl.setBarcode(null);
                 wrkDetl.setAppeTime(now);
                 wrkDetl.setAppeUser(userId);
                 wrkDetl.setModiTime(now);
@@ -2289,7 +2304,7 @@
         Task task = new Task();
         task.setWrkNo(workNo)
                 .setIoTime(new Date())
-                .setWrkSts(11L) // 宸ヤ綔鐘舵�侊細11.鐢熸垚鍑哄簱ID
+                .setWrkSts(301L) // 宸ヤ綔鐘舵�侊細11.鐢熸垚鍑哄簱ID
                 .setIoType(loc.getLocSts().equals("D") ? 110 : 101) // 鍏ュ嚭搴撶姸鎬侊細 11.搴撴牸绉昏浇
                 .setTaskType("agv")
                 .setIoPri(10D)
@@ -2381,7 +2396,7 @@
         Task task = new Task();
         task.setWrkNo(workNo)
                 .setIoTime(new Date())
-                .setWrkSts(1L) // 宸ヤ綔鐘舵�侊細11.鐢熸垚鍑哄簱ID
+                .setWrkSts(201L) // 宸ヤ綔鐘舵�侊細11.鐢熸垚鍑哄簱ID
                 .setIoType(1) // 鍏ュ嚭搴撶姸鎬侊細 11.搴撴牸绉昏浇
                 .setTaskType("agv")
                 .setIoPri(10D)
@@ -2450,7 +2465,7 @@
 
         if (station.getLocSts().equals(LocStsType.LOC_STS_TYPE_O.type)) {
             station.setLocSts("R"); // S.鍏ュ簱棰勭害
-            station.setBarcode(barcode);
+//            station.setBarcode(barcode);
             station.setModiTime(new Date());
             station.setModiUser(userId);
             if (!basStationService.updateById(station)) {
@@ -2514,4 +2529,69 @@
         }
         return result;
     }
+
+    /**
+     * 鍛煎彨AGV杩斿洖
+     * @author Ryan
+     * @date 2025/9/24
+     * @param callAgvBackParam
+     * @return com.core.common.R
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R agvCallback(AgvCallParams callAgvBackParam, Long userId) {
+        if (Objects.isNull(callAgvBackParam.getOrgSite())) {
+            return R.error("鍙傛暟涓嶈兘涓虹┖!!");
+        }
+
+        // 鎸夊綋鍓嶆煡鎵惧簱浣嶉『搴忥紝鏌ュ埌涓�涓悗锛屼笉鍐嶅線涓嬫煡璇�
+        LocCache locCache = findPriorityLocCache();
+        
+        if (Objects.isNull(locCache)) {
+            return R.error("鏈煡璇㈠埌鍙敤搴撲綅");
+        }
+        
+        try {
+            generateAgvTask("agv", locCache, callAgvBackParam.getOrgSite(), callAgvBackParam.getBarcode(), userId);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error(e.getMessage());
+        }
+
+        return R.ok(locCache);
+    }
+
+    /**
+     * 鎸変紭鍏堢骇鏌ユ壘鍙敤搴撲綅
+     * 椤哄簭锛氬叆搴撶紦瀛樺尯 -> SO鍖� -> EO鍖�
+     */
+    private LocCache findPriorityLocCache() {
+        // 1. Try Inbound Cache Area
+        LocCache loc = findAvailableLocByAreaType(LocAreaType.LOC_AREA_TYPE_IN_CACHE);
+        if (loc != null) return loc;
+
+        // 2. Try SO Area
+        loc = findAvailableLocByAreaType(LocAreaType.LOC_AREA_TYPE_SO);
+        if (loc != null) return loc;
+
+        // 3. Try EO Area
+        loc = findAvailableLocByAreaType(LocAreaType.LOC_AREA_TYPE_EO);
+        return loc;
+    }
+
+    /**
+     * 鏍规嵁鍖哄煙绫诲瀷鏌ユ壘鍙敤搴撲綅
+     */
+    private LocCache findAvailableLocByAreaType(LocAreaType areaType) {
+        BasAreas area = basAreasService.selectOne(new EntityWrapper<BasAreas>().eq("whs_type_id", areaType.type));
+        if (area == null) {
+            return null;
+        }
+        return locCacheService.selectOne(new EntityWrapper<LocCache>()
+                .eq("area_id", area.getId())
+                .eq("frozen", 0)
+                .eq("loc_sts", LocStsType.LOC_STS_TYPE_O.type)
+                .orderAsc(Arrays.asList("loc_no"))
+                .last("OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY"));
+    }
 }

--
Gitblit v1.9.1