From aa3476e8ff45d168f0bb9376ed3a114610a65f12 Mon Sep 17 00:00:00 2001
From: zhangc <zc@123>
Date: 星期三, 25 十二月 2024 08:39:12 +0800
Subject: [PATCH] 添加工厂判断逻辑及优化库位查找

---
 src/main/java/com/zy/common/service/AgvCommonService.java |  316 +++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 274 insertions(+), 42 deletions(-)

diff --git a/src/main/java/com/zy/common/service/AgvCommonService.java b/src/main/java/com/zy/common/service/AgvCommonService.java
index 579de34..76a2b87 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;
 
 /**
@@ -27,6 +29,15 @@
     private AgvLocRuleService agvLocRuleService;
     @Autowired
     private AgvLocMastService agvLocMastService;
+    @Autowired
+    private MatService matService;
+    @Autowired
+    private LocRuleService locRuleService;
+    @Autowired
+    AgvBasDevpService agvBasDevpService;
+
+    @Autowired
+    private LocUtils locUtils;
 
     public int getWorkNo(Integer wrkMk) {
         AgvWrkLastno wrkLastno = agvWrkLastnoService.selectById(wrkMk);
@@ -39,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 + "鍦ㄥ伐浣滄。涓凡瀛樺湪");
             }
         }
@@ -67,41 +78,67 @@
      * 妫�绱㈠簱浣嶅彿
      * @return locNo 妫�绱㈠埌鐨勫簱浣嶅彿
      */
-    public AgvLocMast getLocNo(List<AgvWaitPakin> agvWaitPakinList, int floor) {
+    public AgvLocMast getLocNo(int type, int floor, boolean isEmpty, boolean isCurrLev, String factory) {
         // 鐩爣搴撲綅
         AgvLocMast locMast = null;
+//        if(Cools.isEmpty(agvWaitPakinList)){
+//            return getLocNoRule(type); // 1. 闅忔満搴撲綅
+//        }
 
-        //搴撲綅瑙勫垯
-        if(!Cools.isEmpty(agvWaitPakinList)){
-            locMast = getLocByLocRule(agvWaitPakinList.get(0),floor);
-            if(!Cools.isEmpty(locMast)){
-                return locMast;
-            }
-        }
-
-        // 闈犺繎鎽嗘斁瑙勫垯 --- 鐩稿悓璁㈠崟鍙�, 鍚屽ぉ鍚岃鏍肩墿鏂�
-        locMast = getLocByProximityRule();
-        if (locMast != null) {
-            //鎵惧埌搴撲綅锛岃繑鍥瀌to
-            //return getLocNoStep6(staDescId, sourceStaNo, locMast);//杩斿洖dto
-        }
-//
-//        // 闈犺繎鎽嗘斁瑙勫垯 --- 绌烘墭
-//        locMast = getLocNoStep4(staDescId, locTypeDto);
-//        if (locMast != null) {
-//            //鎵惧埌搴撲綅锛岃繑鍥瀌to
-//            return getLocNoStep6(staDescId, sourceStaNo, locMast);//杩斿洖dto
+//        //搴撲綅瑙勫垯
+//        locMast = getLocByLocRule(agvWaitPakinList.get(0),floor); // 2. 鎸夊簱浣嶈鍒欐悳绱�
+//        if(!Cools.isEmpty(locMast)){
+//            return locMast;
 //        }
 //
-//        // 濡傛灉娌℃湁鐩歌繎鐗╂枡锛屽垯鎸夎鍒欒疆璇㈣揣鏋�
-        // 寮�濮嬫煡鎵惧簱浣� ==============================>>
-        locMast = getLocNoRule(floor);
-        if (locMast != null) {
-            return locMast;
+//
+//        //搴撲綅缂栫爜瑙勫垯
+//        locMast = getLocByLocCodeRule(agvWaitPakinList.get(0),floor);
+//        if(!Cools.isEmpty(locMast)){
+//            return locMast;
+//        }
+//
+//        // 闈犺繎鎽嗘斁瑙勫垯 --- 鐩稿悓璁㈠崟鍙�, 鍚屽ぉ鍚岃鏍肩墿鏂�
+//        locMast = getLocByProximityRule();
+//        if (locMast != null) {
+//            //鎵惧埌搴撲綅锛岃繑鍥瀌to
+//            //return getLocNoStep6(staDescId, sourceStaNo, locMast);//杩斿洖dto
+//        }
+//
+//        //鏍规嵁鐗╂枡棰戠巼鎼滅储搴撲綅锛岄鐜囬珮鍒欐悳绱㈢缂撳瓨璐ф灦鏈�杩戝簱浣嶏紝棰戠巼浣庡垯鎼滅储鏈�杩滃簱浣�
+//        Mat mat = matService.selectByMatnr(agvWaitPakinList.get(0).getMatnr());
+//        if(Cools.isEmpty(mat.getBeBatch())){
+//            mat.setBeBatch(0);
+//        }
+//        locMast = getLocByFre(mat.getBeBatch(), floor);
+//        if (locMast != null) {
+//            return locMast;
+//        }
+
+
+        try {
+            // 寮�濮嬫煡鎵惧簱浣� ==============================>>
+            // 鍥涙湡椤圭洰锛氶渶瑕佹敼鏌ユ壘搴撲綅閫昏緫
+            // 绠卞3鍏ュ簱
+            if (type == 3) {
+                //浼樺厛鍏ュ簱鍚稿1妤硷紝鍦�2妤�
+                locMast = locUtils.getLocNoRuleByFactory(type, factory);
+            } else if (type == 6) {
+                //鍗婃垚鍝佺澹冲叆搴擄紝鍏ュ埌鍚稿2妤肩殑370涓簱浣嶉噷
+                locMast = locUtils.getLocNoRuleByFloor(type, floor, 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 + "妤硷紱璇ユゼ灞傛病鏈夌┖搴撲綅");
     }
 
     /*
@@ -113,16 +150,47 @@
                 .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");
+            AgvLocMast agvLocMast = agvLocMastService.selectOne(wrapper);
+            if (!Cools.isEmpty(agvLocMast)) {
+                return agvLocMast;
+            }
+        }
+
+        return null;
+    }
+
+    /*
+    搴撲綅瑙勫垯鏌ユ壘
+     */
+    private AgvLocMast getLocByLocCodeRule(AgvWaitPakin agvWaitPakin, int floor) {
+        /*if(Cools.isEmpty(agvWaitPakin.getBrand())){
+            return null;
+        }
+
+        //搴撳尯
+        String other = "agv-" + floor;
+        List<LocRule> locRules = locRuleService.findCode(agvWaitPakin.getMatnr(), other);
+        if(Cools.isEmpty(locRules)){
+            return null;
+        }
+
+        for (LocRule agvLocRule : locRules) {
             EntityWrapper<AgvLocMast> wrapper = new EntityWrapper<>();
             wrapper.between("row1",agvLocRule.getRowBeg(),agvLocRule.getRowEnd())
                     .between("bay1",agvLocRule.getBayBeg(),agvLocRule.getBayEnd())
@@ -133,7 +201,7 @@
             if(!Cools.isEmpty(agvLocMast)){
                 return agvLocMast;
             }
-        }
+        }*/
 
         return null;
     }
@@ -141,19 +209,183 @@
     /*
     闈犺繎鎽嗘斁瑙勫垯
      */
-
-    private AgvLocMast getLocByProximityRule(){
+    private AgvLocMast getLocByProximityRule() {
         //to do
         return null;
     }
 
-    //闅忔満鍙栦竴涓揣浣�
-    private AgvLocMast getLocNoRule(int floor){
-        return agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>()
-                .eq("floor",floor)
-                .eq("loc_sts","O")
-                .eq(false,"loc_type2",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 {
+                return agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>()
+                        .eq("floor", floor)
+                        .eq("loc_sts", "O")
+                        .orderBy("bay1"));
+            }
+        }
+        if (floor == 3) {
+            if (fre == 1) {
+                return agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>()
+                        .eq("floor", floor)
+                        .eq("loc_sts", "O")
+                        .orderBy("row1", false));
+            } else {
+                return agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>()
+                        .eq("floor", floor)
+                        .eq("loc_sts", "O")
+                        .orderBy("row1"));
+            }
+        }
+
+        throw new CoolException("鎼滅储搴撲綅鏃讹紝妤煎眰鍑洪敊銆�");
     }
 
 
+    //闅忔満鍙栦竴涓揣浣�
+    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 妫�绱㈠埌鐨勫簱浣嶅彿
+     */
+    public AgvBasDevp getDevpNo(int type, int floor) {
+        // 鐩爣搴撲綅
+        AgvBasDevp basDevp = null;
+
+        // 寮�濮嬫煡鎵惧簱浣� ==============================>>
+        basDevp = getDevpNoRule(type, floor);
+        if (basDevp != null) {
+            return basDevp;
+        }
+
+        //鎵句笉鍒板簱浣嶏紝鎶涘嚭寮傚父
+        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) {
+        return agvBasDevpService.selectOne(new EntityWrapper<AgvBasDevp>()
+                .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