From ce43df438a4bbef5b9ffaed0a33a97db6e88fbf1 Mon Sep 17 00:00:00 2001
From: zhangc <zc@123>
Date: 星期二, 14 一月 2025 14:57:07 +0800
Subject: [PATCH] 优化异常处理及订单同步逻辑

---
 src/main/java/com/zy/common/service/AgvCommonService.java |  222 +++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 174 insertions(+), 48 deletions(-)

diff --git a/src/main/java/com/zy/common/service/AgvCommonService.java b/src/main/java/com/zy/common/service/AgvCommonService.java
index d8e1dff..5be7c9a 100644
--- a/src/main/java/com/zy/common/service/AgvCommonService.java
+++ b/src/main/java/com/zy/common/service/AgvCommonService.java
@@ -5,10 +5,12 @@
 import com.core.exception.CoolException;
 import com.zy.asrs.entity.*;
 import com.zy.asrs.service.*;
+import com.zy.asrs.utils.LocUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -34,6 +36,9 @@
     @Autowired
     AgvBasDevpService agvBasDevpService;
 
+    @Autowired
+    private LocUtils locUtils;
+
     public int getWorkNo(Integer wrkMk) {
         AgvWrkLastno wrkLastno = agvWrkLastnoService.selectById(wrkMk);
         if (Cools.isEmpty(wrkLastno)) {
@@ -45,24 +50,24 @@
         int sNo = wrkLastno.getSNo();
         int eNo = wrkLastno.getENo();
 
-        workNo = workNo>=eNo ? sNo : workNo+1;
+        workNo = workNo >= eNo ? sNo : workNo + 1;
 
         while (true) {
             AgvWrkMast wrkMast = agvWrkMastService.selectById(workNo);
             if (null != wrkMast) {
-                workNo = workNo>=eNo ? sNo : workNo+1;
+                workNo = workNo >= eNo ? sNo : workNo + 1;
             } else {
                 break;
             }
         }
-        if (workNo > 0){
+        if (workNo > 0) {
             wrkLastno.setWrkNo(workNo);
             agvWrkLastnoService.updateById(wrkLastno);
         }
         if (workNo == 0) {
             throw new CoolException("鐢熸垚宸ヤ綔鍙峰け璐ワ紝璇疯仈绯荤鐞嗗憳");
         } else {
-            if (agvWrkMastService.selectById(workNo)!=null) {
+            if (agvWrkMastService.selectById(workNo) != null) {
                 throw new CoolException("鐢熸垚宸ヤ綔鍙�" + workNo + "鍦ㄥ伐浣滄。涓凡瀛樺湪");
             }
         }
@@ -73,7 +78,7 @@
      * 妫�绱㈠簱浣嶅彿
      * @return locNo 妫�绱㈠埌鐨勫簱浣嶅彿
      */
-    public AgvLocMast getLocNo(int type, int floor) {
+    public AgvLocMast getLocNo(int type, int floor, boolean isEmpty, boolean isCurrLev, String factory) {
         // 鐩爣搴撲綅
         AgvLocMast locMast = null;
 //        if(Cools.isEmpty(agvWaitPakinList)){
@@ -111,14 +116,29 @@
 //        }
 
 
-        // 寮�濮嬫煡鎵惧簱浣� ==============================>>
-        locMast = getLocNoRule(type,floor);
-        if (locMast != null) {
-            return locMast;
+        try {
+            // 寮�濮嬫煡鎵惧簱浣� ==============================>>
+            // 鍥涙湡椤圭洰锛氶渶瑕佹敼鏌ユ壘搴撲綅閫昏緫
+            // 绠卞3鍏ュ簱
+            if (type == 3 && factory != null) {
+                //浼樺厛鍏ュ簱鍚稿1妤硷紝鍦�2妤�
+                locMast = locUtils.getLocNoRuleByFactory(type, isEmpty, factory);
+            } else if (type == 6) {
+                //鍗婃垚鍝佺澹冲叆搴擄紝鍏ュ埌鍚稿2妤肩殑370涓簱浣嶉噷
+                locMast = locUtils.getLocNoRuleByFloor(type, floor, isEmpty, 2);
+            } else {
+                //涓嶅姩杩欎釜閫昏緫
+                locMast = getLocNoRule(type, floor, isEmpty, isCurrLev);
+            }
+            if (locMast != null) {
+                return locMast;
+            }
+        } catch (Exception e) {
+            throw new CoolException(floor + "妤硷紱璇ユゼ灞傛病鏈夌┖搴撲綅===>" + e.getMessage());
         }
 
         //鎵句笉鍒板簱浣嶏紝鎶涘嚭寮傚父
-        throw new CoolException("璇ユゼ灞傛病鏈夌┖搴撲綅");
+        throw new CoolException(floor + "妤硷紱璇ユゼ灞傛病鏈夌┖搴撲綅");
     }
 
     /*
@@ -130,24 +150,24 @@
                 .eq("matnr", agvWaitPakin.getMatnr())
                 .eq("batch", agvWaitPakin.getModel())
                 .eq("floor", floor));
-        if(Cools.isEmpty(agvLocRules)){
+        if (Cools.isEmpty(agvLocRules)) {
             agvLocRules = agvLocRuleService.selectList(new EntityWrapper<AgvLocRule>()
                     .eq("matnr", agvWaitPakin.getMatnr())
                     .eq("floor", floor));
         }
-        if(Cools.isEmpty(agvLocRules)){
+        if (Cools.isEmpty(agvLocRules)) {
             return null;
         }
 
         for (AgvLocRule agvLocRule : agvLocRules) {
             EntityWrapper<AgvLocMast> wrapper = new EntityWrapper<>();
-            wrapper.between("row1",agvLocRule.getRowBeg(),agvLocRule.getRowEnd())
-                    .between("bay1",agvLocRule.getBayBeg(),agvLocRule.getBayEnd())
-                    .between("lev1",agvLocRule.getLevBeg(),agvLocRule.getLevEnd())
-                    .eq("floor",floor)
-                    .eq("loc_sts","O");
+            wrapper.between("row1", agvLocRule.getRowBeg(), agvLocRule.getRowEnd())
+                    .between("bay1", agvLocRule.getBayBeg(), agvLocRule.getBayEnd())
+                    .between("lev1", agvLocRule.getLevBeg(), agvLocRule.getLevEnd())
+                    .eq("floor", floor)
+                    .eq("loc_sts", "O");
             AgvLocMast agvLocMast = agvLocMastService.selectOne(wrapper);
-            if(!Cools.isEmpty(agvLocMast)){
+            if (!Cools.isEmpty(agvLocMast)) {
                 return agvLocMast;
             }
         }
@@ -189,7 +209,7 @@
     /*
     闈犺繎鎽嗘斁瑙勫垯
      */
-    private AgvLocMast getLocByProximityRule(){
+    private AgvLocMast getLocByProximityRule() {
         //to do
         return null;
     }
@@ -197,30 +217,30 @@
     /*
     鏍规嵁鐗╂枡棰戠巼鏌ユ壘
      */
-    private AgvLocMast getLocByFre(int fre, int floor){
-        if(floor == 1){
-            if(fre == 1){
+    private AgvLocMast getLocByFre(int fre, int floor) {
+        if (floor == 1) {
+            if (fre == 1) {
                 return agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>()
-                        .eq("floor",floor)
-                        .eq("loc_sts","O")
-                        .orderBy("bay1",false));
-            }else{
+                        .eq("floor", floor)
+                        .eq("loc_sts", "O")
+                        .orderBy("bay1", false));
+            } else {
                 return agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>()
-                        .eq("floor",floor)
-                        .eq("loc_sts","O")
+                        .eq("floor", floor)
+                        .eq("loc_sts", "O")
                         .orderBy("bay1"));
             }
         }
-        if(floor == 3){
-            if(fre == 1){
+        if (floor == 3) {
+            if (fre == 1) {
                 return agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>()
-                        .eq("floor",floor)
-                        .eq("loc_sts","O")
-                        .orderBy("row1",false));
-            }else{
+                        .eq("floor", floor)
+                        .eq("loc_sts", "O")
+                        .orderBy("row1", false));
+            } else {
                 return agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>()
-                        .eq("floor",floor)
-                        .eq("loc_sts","O")
+                        .eq("floor", floor)
+                        .eq("loc_sts", "O")
                         .orderBy("row1"));
             }
         }
@@ -228,13 +248,62 @@
         throw new CoolException("鎼滅储搴撲綅鏃讹紝妤煎眰鍑洪敊銆�");
     }
 
+
     //闅忔満鍙栦竴涓揣浣�
-    private AgvLocMast getLocNoRule(int type,int floor){
-        return agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>()
-                .eq("loc_sts","O")
-                .eq("floor",floor)
-                .eq("loc_type1",type));
+    private AgvLocMast getLocNoRule(int type, int floor, boolean isEmpty, boolean isCurrLev) {
+        Boolean orderBy = false;
+        int levCount = 0;
+        int times = 1;
+        if (floor == 1 || floor >= 4) {
+            if (floor >= 4) {
+                floor = 1;
+            }
+            orderBy = true;
+            levCount = 2;
+        } else {
+            orderBy = false;
+            levCount = 1;
+        }
+        try {
+            EntityWrapper<AgvLocMast> wrapper = new EntityWrapper<>();
+            wrapper.eq("loc_sts", "O").eq("loc_type1", type);
+            List<AgvLocMast> agvLocMasts = new ArrayList<>();
+            //涓嶆槸绌烘澘浼樺厛鎵�2灞�
+            if (isEmpty) {
+                wrapper.eq("floor", floor).eq("lev1", 1);
+            } else {
+                if (isCurrLev) {
+                    wrapper.eq("floor", floor).eq("lev1", 1);
+                } else {
+                    wrapper.eq("floor", floor).orderBy("lev1", !orderBy);
+                }
+            }
+
+
+            //褰撶洰鏍囧簱浣嶆槸1妤�
+            if (floor == 1) {
+                wrapper.orderBy("loc_no", false);
+            }
+            agvLocMasts = agvLocMastService.selectList(wrapper);
+            //鏄惁褰撳墠灞�
+            if (Cools.isEmpty(agvLocMasts) && !isCurrLev) {
+                if (times < levCount) {
+                    times++;
+                    return getLocNoRule(type, floor, isEmpty, isCurrLev);
+                }
+            }
+            for (AgvLocMast agvLocMast : agvLocMasts) {
+                AgvLocMast agvLocMast1 = agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>().eq("loc_no", agvLocMast.getLocNo()));
+                if (agvLocMast1.getLocSts().equals("O")) {
+                    return agvLocMast1;
+                }
+            }
+            throw new CoolException("鎼滅储搴撲綅鏃讹紝鏈壘鍒板彲鍏ュ簱搴撲綅銆�");
+        } catch (Exception e) {
+            throw new CoolException("鎼滅储搴撲綅鏃讹紝鏈壘鍒板彲鍏ュ簱搴撲綅銆�");
+        }
     }
+
     /**
      * 妫�绱㈠簱浣嶅彿
      * @return locNo 妫�绱㈠埌鐨勫簱浣嶅彿
@@ -244,22 +313,79 @@
         AgvBasDevp basDevp = null;
 
         // 寮�濮嬫煡鎵惧簱浣� ==============================>>
-        basDevp = getDevpNoRule(type,floor);
+        basDevp = getDevpNoRule(type, floor);
         if (basDevp != null) {
             return basDevp;
         }
 
         //鎵句笉鍒板簱浣嶏紝鎶涘嚭寮傚父
-        throw new CoolException("璇ユゼ灞傛病鏈夌┖搴撲綅");
+        throw new CoolException("妤煎眰鍙凤細" + floor + "锛涜妤煎眰娌℃湁绌烘帴椹充綅");
+    }
+
+
+    /**
+     * 妫�绱㈠簱浣嶅彿
+     * @return locNo 妫�绱㈣嚜鍔ㄦ帴椹充綅
+     */
+    public AgvBasDevp getDevpNo(int type, int floor, String auto) {
+        // 鐩爣搴撲綅
+        AgvBasDevp basDevp = null;
+
+        // 寮�濮嬫煡鎵惧簱浣� ==============================>>
+        basDevp = getDevpNoAuto(type, floor, auto);
+        if (basDevp != null) {
+            return basDevp;
+        }
+
+        //鎵句笉鍒板簱浣嶏紝鎶涘嚭寮傚父
+        throw new CoolException("妤煎眰鍙凤細" + floor + "锛涜妤煎眰娌℃湁绌烘帴椹充綅");
+    }
+
+    /**
+     * 妫�绱㈠簱浣嶅彿
+     * @return locNo 妫�绱㈠彲鍏ユ帴椹充綅
+     */
+    public AgvBasDevp getDevpNo(int type, int floor, String auto, String inEable) {
+        // 鐩爣搴撲綅
+        AgvBasDevp basDevp = null;
+
+        // 寮�濮嬫煡鎵惧簱浣� ==============================>>
+        basDevp = getDevpNoInEable(type, floor, inEable);
+        if (basDevp != null) {
+            return basDevp;
+        }
+
+        //鎵句笉鍒板簱浣嶏紝鎶涘嚭寮傚父
+        return basDevp;
     }
 
     //闅忔満鍙栦竴涓揣浣�
-    private AgvBasDevp getDevpNoRule(int type,int floor){
+    private AgvBasDevp getDevpNoRule(int type, int floor) {
         return agvBasDevpService.selectOne(new EntityWrapper<AgvBasDevp>()
-                .eq("loc_sts","O")
-                .eq("floor",floor)
-                .eq("loc_type1",type)
-                .like("dev_no","DB"));
+                .eq("loc_sts", "O")
+                .eq("floor", floor)
+                .eq("loc_type1", type)
+                .like("dev_no", "DB"));
+    }
+
+    //闅忔満鍙栦竴涓揣浣�
+    private AgvBasDevp getDevpNoAuto(int type, int floor, String auto) {
+        return agvBasDevpService.selectOne(new EntityWrapper<AgvBasDevp>()
+                .eq("loc_sts", "O")
+                .eq("floor", floor)
+                .eq("loc_type1", type)
+                .eq("autoing", auto)
+                .like("dev_no", "DB"));
+    }
+
+    //闅忔満鍙栦竴涓揣浣�
+    private AgvBasDevp getDevpNoInEable(int type, int floor, String inEable) {
+        return agvBasDevpService.selectOne(new EntityWrapper<AgvBasDevp>()
+                .eq("loc_sts", "O")
+                .eq("floor", floor)
+                .eq("loc_type1", type)
+                .eq("in_enable", inEable)
+                .like("dev_no", "DB"));
     }
 
 }

--
Gitblit v1.9.1