From 73e42333948a8143c54218cd26435c2233daf279 Mon Sep 17 00:00:00 2001
From: chen.llin <1442464845@qq.comm>
Date: 星期五, 16 一月 2026 14:13:14 +0800
Subject: [PATCH] agv出入库逻辑

---
 src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java |  136 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 136 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java b/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
index 0ab2769..bd754ab 100644
--- a/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
+++ b/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -9,6 +9,9 @@
 import com.zy.asrs.service.impl.BasStationServiceImpl;
 import com.zy.asrs.task.AbstractHandler;
 import com.zy.asrs.task.core.ReturnT;
+import com.zy.common.model.enums.WorkNoType;
+import com.zy.common.properties.AgvProperties;
+import com.zy.common.service.CommonService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -16,6 +19,7 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
@@ -59,6 +63,12 @@
 
     @Autowired
     private LocCacheDetlService locCacheDetlService;
+    
+    @Autowired
+    private CommonService commonService;
+    
+    @Autowired
+    private AgvProperties agvProperties;
 
     public ReturnT<String> start(WrkMast wrkMast) {
         // 4.鍏ュ簱瀹屾垚
@@ -590,6 +600,9 @@
             // 14.鍑哄簱瀹屾垚
         } else if (task.getWrkSts() == 14) {
             return agvDoOut(task);
+            // 15.鍑哄簱鏇存柊瀹屾垚 - 鐢熸垚绌烘墭/婊℃墭鍑哄簱浠诲姟
+        } else if (task.getWrkSts() == 15) {
+            return generateEmptyOrFullPalletOutTaskForCompleted(task);
         }
         return SUCCESS;
     }
@@ -636,6 +649,7 @@
             if (!taskService.updateById(task)) {
                 throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
             }
+            // 娉ㄦ剰锛氱敓鎴愮┖鎵�/婊℃墭鍑哄簱浠诲姟鐨勯�昏緫宸茬Щ鑷崇姸鎬�15鐨勫鐞嗘柟娉曚腑
         } else if(task.getIoType().equals(53) || task.getIoType().equals(54) || task.getIoType().equals(57)){
             LocCache locCache = locCacheService.selectOne(new EntityWrapper<LocCache>().eq("loc_no", task.getSourceLocNo()));
             if (Objects.isNull(locCache)) {
@@ -669,6 +683,128 @@
         return SUCCESS;
     }
 
+    /**
+     * 鐘舵��15锛堝嚭搴撴洿鏂板畬鎴愶級鏃讹紝鐢熸垚绌烘墭鍑哄簱鎴栨弧鎵樺嚭搴撲换鍔★紝灏嗘墭鐩樻斁鍏ョ紦瀛樺簱浣�
+     * @param completedTask 宸插畬鎴愬嚭搴撴洿鏂扮殑浠诲姟锛堢姸鎬�15锛�
+     * @return 澶勭悊缁撴灉
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public ReturnT<String> generateEmptyOrFullPalletOutTaskForCompleted(Task completedTask) {
+        // 鍙鐞唅oType=101鐨勫叏鏉垮嚭搴撲换鍔�
+        if (!completedTask.getIoType().equals(101)) {
+            return SUCCESS;
+        }
+        
+        // 妫�鏌ユ槸鍚﹀凡缁忕敓鎴愯繃绌烘墭/婊℃墭鍑哄簱浠诲姟锛堥伩鍏嶉噸澶嶇敓鎴愶級
+        List<Task> existingTasks = taskService.selectList(new EntityWrapper<Task>()
+                .eq("barcode", completedTask.getBarcode())
+                .in("io_type", 110, 101) // 绌烘澘鍑哄簱鎴栧叏鏉垮嚭搴�
+                .eq("wrk_sts", 7) // 寰呭懠鍙獳GV鐘舵��
+        );
+        if (!existingTasks.isEmpty()) {
+            log.info("浠诲姟ID锛歿}鐨勬墭鐩樼爜锛歿}宸插瓨鍦ㄧ┖鎵�/婊℃墭鍑哄簱浠诲姟锛岃烦杩囩敓鎴�", completedTask.getId(), completedTask.getBarcode());
+            return SUCCESS;
+        }
+        
+        try {
+            generateEmptyOrFullPalletOutTask(completedTask, null);
+            return SUCCESS;
+        } catch (Exception e) {
+            log.error("鐘舵��15鏃剁敓鎴愮┖鎵�/婊℃墭鍑哄簱浠诲姟澶辫触锛屼换鍔D锛歿}锛岄敊璇細{}", completedTask.getId(), e.getMessage(), e);
+            return FAIL.setMsg("鐢熸垚绌烘墭/婊℃墭鍑哄簱浠诲姟澶辫触锛�" + e.getMessage());
+        }
+    }
+
+    /**
+     * 鍑哄簱瀹屾垚鍚庯紝鐢熸垚绌烘墭鍑哄簱鎴栨弧鎵樺嚭搴撲换鍔★紝灏嗘墭鐩樻斁鍏ョ紦瀛樺簱浣�
+     * @param outTask 鍑哄簱浠诲姟
+     * @param sourceLocCache 婧愬簱浣嶏紙鍙负null锛�
+     */
+    private void generateEmptyOrFullPalletOutTask(Task outTask, LocCache sourceLocCache) {
+        // 鍒ゆ柇鎵樼洏绫诲瀷锛氱┖鎵樻垨婊℃墭
+        boolean isEmptyPallet = "Y".equals(outTask.getEmptyMk());
+        Integer ioType = isEmptyPallet ? 110 : 101; // 110=绌烘澘鍑哄簱锛�101=鍏ㄦ澘鍑哄簱锛堟弧鎵樺嚭搴擄級
+        
+        log.info("鍑哄簱浠诲姟瀹屾垚锛岀敓鎴恵}浠诲姟锛屼换鍔D锛歿}锛屾墭鐩樼爜锛歿}", isEmptyPallet ? "绌烘墭鍑哄簱" : "婊℃墭鍑哄簱", outTask.getId(), outTask.getBarcode());
+        
+        // 鍒嗛厤缂撳瓨搴撲綅锛坵hs_type=2锛�
+        LocCache cacheLoc = locCacheService.selectOne(new EntityWrapper<LocCache>()
+                .eq("whs_type", agvProperties.getWhsTypeMapping().getCacheArea()) // whs_type=2 缂撳瓨鍖�
+                .eq("frozen", 0)
+                .eq("loc_sts", LocStsType.LOC_STS_TYPE_O.type) // O.闂茬疆
+                .ne("full_plt", isEmptyPallet ? "Y" : "N") // 绌烘墭涓嶉�夋弧鏉垮簱浣嶏紝婊℃墭涓嶉�夌┖鏉垮簱浣�
+                .orderAsc(Arrays.asList("row1", "bay1", "lev1"))
+                .last("OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY"));
+        
+        if (cacheLoc == null) {
+            log.warn("娌℃湁鍙敤鐨勭紦瀛樺簱浣嶏紝鏃犳硶鐢熸垚{}浠诲姟锛屼换鍔D锛歿}", isEmptyPallet ? "绌烘墭鍑哄簱" : "婊℃墭鍑哄簱", outTask.getId());
+            return;
+        }
+        
+        // 鑾峰彇鍑哄簱绔欑偣锛堝嚭搴撲换鍔$殑staNo鏄嚭搴撶珯鐐癸紝灏嗕綔涓虹┖鎵�/婊℃墭鍑哄簱浠诲姟鐨勬簮绔欑偣锛�
+        String outboundStaNo = outTask.getStaNo();
+        if (outboundStaNo == null || outboundStaNo.isEmpty()) {
+            log.warn("鍑哄簱浠诲姟娌℃湁鍑哄簱绔欑偣锛屾棤娉曠敓鎴恵}浠诲姟锛屼换鍔D锛歿}", isEmptyPallet ? "绌烘墭鍑哄簱" : "婊℃墭鍑哄簱", outTask.getId());
+            return;
+        }
+        
+        // 鏍规嵁缂撳瓨鍖洪厤缃�夋嫨绔欑偣鍜屾満鍣ㄤ汉缁勶紙瑗夸晶锛�
+        List<String> cacheStations = agvProperties.getWestStations();
+        String robotGroup = agvProperties.getRobotGroupWest();
+        
+        if (cacheStations.isEmpty()) {
+            log.warn("缂撳瓨鍖烘病鏈夐厤缃珯鐐癸紝鏃犳硶鐢熸垚{}浠诲姟锛屼换鍔D锛歿}", isEmptyPallet ? "绌烘墭鍑哄簱" : "婊℃墭鍑哄簱", outTask.getId());
+            return;
+        }
+        
+        // 閫夋嫨缂撳瓨鍖虹洰鏍囩珯鐐癸紙浣跨敤绗竴涓彲鐢ㄧ珯鐐癸紝鎴栧彲浠ヤ紭鍖栦负閫夋嫨浠诲姟鏈�灏戠殑绔欑偣锛�
+        String cacheStaNo = cacheStations.get(0);
+        
+        // 鐢熸垚宸ヤ綔鍙�
+        int workNo = commonService.getWorkNo(WorkNoType.PAKOUT.type);
+        
+        // 鍒涘缓绌烘墭鍑哄簱/婊℃墭鍑哄簱浠诲姟
+        Task cacheTask = new Task();
+        Date now = new Date();
+        cacheTask.setWrkNo(workNo)
+                .setIoTime(now)
+                .setWrkSts(7L) // 宸ヤ綔鐘舵�侊細7.寰呭懠鍙獳GV
+                .setIoType(ioType) // 110=绌烘澘鍑哄簱锛�101=鍏ㄦ澘鍑哄簱
+                .setTaskType("agv")
+                .setIoPri(10D)
+                .setStaNo(cacheStaNo) // 鐩爣绔欑偣锛堢紦瀛樺尯绔欑偣锛�
+                .setSourceStaNo(outboundStaNo) // 婧愮珯鐐癸紙鍑哄簱绔欑偣锛�
+                .setInvWh(robotGroup) // 鏈哄櫒浜虹粍锛堣タ渚э級
+                .setFullPlt(isEmptyPallet ? "N" : "Y") // 婊℃澘锛氱┖鎵�=N锛屾弧鎵�=Y
+                .setPicking("N")
+                .setExitMk("N")
+                .setSourceLocNo(null) // 鍑哄簱浠诲姟涓嶉渶瑕佹簮搴撲綅
+                .setLocNo(cacheLoc.getLocNo()) // 鐩爣搴撲綅锛堢紦瀛樺簱浣嶏級
+                .setEmptyMk(isEmptyPallet ? "Y" : "N") // 绌烘澘鏍囪
+                .setBarcode(outTask.getBarcode()) // 鎵樼洏鐮�
+                .setLinkMis("N")
+                .setAppeTime(now)
+                .setModiTime(now);
+        
+        if (!taskService.insert(cacheTask)) {
+            log.error("鐢熸垚{}浠诲姟澶辫触锛屼换鍔D锛歿}", isEmptyPallet ? "绌烘墭鍑哄簱" : "婊℃墭鍑哄簱", outTask.getId());
+            return;
+        }
+        
+        // 鏇存柊缂撳瓨搴撲綅鐘舵�侊細O.闂茬疆 鈫� S.鍏ュ簱棰勭害
+        cacheLoc.setLocSts(LocStsType.LOC_STS_TYPE_S.type);
+        cacheLoc.setBarcode(outTask.getBarcode());
+        cacheLoc.setModiTime(now);
+        if (!locCacheService.updateById(cacheLoc)) {
+            log.error("鏇存柊缂撳瓨搴撲綅鐘舵�佸け璐ワ紝搴撲綅锛歿}", cacheLoc.getLocNo());
+            // 鍥炴粴浠诲姟
+            taskService.deleteById(cacheTask.getId());
+            return;
+        }
+        
+        log.info("鎴愬姛鐢熸垚{}浠诲姟锛屼换鍔D锛歿}锛屽伐浣滃彿锛歿}锛屾簮绔欑偣锛歿}锛岀洰鏍囩珯鐐癸細{}锛岀紦瀛樺簱浣嶏細{}", 
+                isEmptyPallet ? "绌烘墭鍑哄簱" : "婊℃墭鍑哄簱", cacheTask.getId(), workNo, outboundStaNo, cacheStaNo, cacheLoc.getLocNo());
+    }
 
     @Transactional(rollbackFor = Exception.class)
     public ReturnT<String> agvDoIn(Task wrkMast) {

--
Gitblit v1.9.1