From 0f69561e397093b5165c4aac58530721d5c62178 Mon Sep 17 00:00:00 2001
From: zjj <3272660260@qq.com>
Date: 星期一, 25 十一月 2024 11:03:16 +0800
Subject: [PATCH] #led

---
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateMapData.java |  347 +++++++++++++++++++++++++++++++++------------------------
 1 files changed, 200 insertions(+), 147 deletions(-)

diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateMapData.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateMapData.java
index 6244431..c3139be 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateMapData.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateMapData.java
@@ -1,27 +1,36 @@
 package com.zy.asrs.wcs.core.utils;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.zy.asrs.common.wms.entity.BasMap;
-import com.zy.asrs.common.wms.entity.LocMast;
-import com.zy.asrs.common.wms.service.LocMastService;
 import com.zy.asrs.framework.common.SpringUtils;
+import com.zy.asrs.wcs.core.domain.dto.BasMapDto;
+import com.zy.asrs.wcs.core.domain.dto.RedisMapDto;
+import com.zy.asrs.wcs.core.entity.Loc;
 import com.zy.asrs.wcs.core.model.MapNode;
-import com.zy.asrs.wcs.core.model.NavigateNode;
+import com.zy.asrs.wcs.core.model.enums.MapNodeType;
 import com.zy.asrs.wcs.core.model.enums.NavigationMapType;
+import com.zy.asrs.wcs.core.service.LocService;
 import com.zy.asrs.wcs.rcs.constant.DeviceRedisConstant;
+import com.zy.asrs.wcs.system.entity.Dict;
+import com.zy.asrs.wcs.system.service.DictService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.io.*;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 /**
  * A*绠楁硶鍦板浘鑾峰彇绫�
  */
 @Component
 public class NavigateMapData {
+
+    @Autowired
+    private LocService locService;
+    @Autowired
+    private DictService dictService;
 
     private Integer lev;//鍦板浘妤煎眰
 
@@ -38,49 +47,7 @@
     }
 
     public int[][] getData() {
-        return getData(NavigationMapType.NONE.id, null, null);//榛樿璇诲彇鏃犺繃婊ょ殑鍏ㄩ儴鍦板浘鏁版嵁
-    }
-
-    public int[][] getData(Integer mapType, List<int[]> whitePoints, List<int[]> shuttlePoints) {
-        try {
-            String mapFilename = "map_" + lev + ".json";
-
-            String fileName = this.getClass().getClassLoader().getResource(mapFilename).getPath();//鑾峰彇鏂囦欢璺緞
-            File file = new File(fileName);
-            StringBuffer stringBuffer = new StringBuffer();
-            if (file.isFile() && file.exists()) {
-                InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "GBK");
-                BufferedReader br = new BufferedReader(isr);
-                String lineTxt = null;
-                while ((lineTxt = br.readLine()) != null) {
-                    stringBuffer.append(lineTxt);
-                }
-                br.close();
-
-                //瑙f瀽json鍦板浘鏁版嵁
-                ArrayList arrayList = JSON.parseObject(stringBuffer.toString(), ArrayList.class);
-                List<List<MapNode>> lists = filterMap(mapType, arrayList, lev, whitePoints, shuttlePoints);//杩囨护鍦板浘鏁版嵁
-                int[][] map = new int[lists.size()][];
-                int j = 0;
-                for (List<MapNode> list : lists) {
-                    int[] tmp = new int[list.size()];
-                    int i = 0;
-                    for (MapNode mapNode : list) {
-                        //灏嗘暟鎹坊鍔犺繘浜岀淮鏁扮粍
-                        tmp[i++] = mapNode.getValue();
-                    }
-                    //鏁版嵁娣诲姞杩涗竴缁存暟缁�
-                    map[j++] = tmp;
-                }
-
-                return map;
-            } else {
-                System.out.println("鏂囦欢涓嶅瓨鍦�!");
-            }
-        } catch (IOException ioException) {
-            ioException.printStackTrace();
-        }
-        return null;
+        return getDataFromRedis(NavigationMapType.NONE.id, null, null);//榛樿璇诲彇鏃犺繃婊ょ殑鍏ㄩ儴鍦板浘鏁版嵁
     }
 
     /**
@@ -93,7 +60,7 @@
             return null;
         }
 
-        BasMap basMap = JSON.parseObject(o.toString(), BasMap.class);
+        BasMapDto basMap = JSON.parseObject(o.toString(), BasMapDto.class);
         return this.getDataFormString(basMap.getData(), mapType, whitePoints, shuttlePoints);
     }
 
@@ -119,35 +86,177 @@
         return map;
     }
 
+    //鑾峰彇JSON鏍煎紡鏁版嵁-鍘熷鍦板浘
+    public List<List<MapNode>> getJsonDataFromDict(Integer mapType, List<int[]> whitePoints, List<int[]> shuttlePoints) {
+        List<List<MapNode>> arrayList = getMapFromDict(lev);
+        return arrayList;
+    }
+
+    //浠庢暟鎹瓧鍏镐腑瑙f瀽鎸囧畾妤煎眰鍦板浘鏁版嵁
+    public List<List<MapNode>> getMapFromDict(Integer currentLev) {
+        List<Dict> dicts = dictService.list(new LambdaQueryWrapper<Dict>()
+                .like(Dict::getFlag, "map-" + currentLev)
+                .eq(Dict::getStatus, 1));
+
+        TreeMap<Integer, ArrayList<ArrayList<MapNode>>> levData = new TreeMap<>();
+        for (Dict dict : dicts) {
+            String[] split = dict.getFlag().split("-");
+            int lev = Integer.parseInt(split[1]);
+
+            TreeMap<Integer, List<JSONObject>> rows = new TreeMap<>();
+            //鎺掑簭Row
+            JSONArray value = JSON.parseArray(dict.getValue());
+            for (Object o : value) {
+                JSONObject item = JSON.parseObject(o.toString());
+                if (item.getString("type").equals("SHELF")) {
+                    JSONObject property = JSON.parseObject(item.getString("property"));
+                    Integer row1 = property.getInteger("row");
+                    ArrayList<JSONObject> bays = new ArrayList<>();
+                    if (rows.containsKey(row1)) {
+                        bays.addAll(rows.get(row1));
+                    }
+                    bays.add(property);
+                    rows.put(row1, bays);
+                }
+            }
+
+            ArrayList<ArrayList<MapNode>> list = new ArrayList<>();
+            //鎺掑簭Bay
+            for (Map.Entry<Integer, List<JSONObject>> entry : rows.entrySet()) {
+                ArrayList<MapNode> nodes = new ArrayList<>();
+                for (JSONObject object : entry.getValue()) {
+                    MapNode mapNode = new MapNode();
+                    mapNode.setValue(object.getInteger("shelfType"));
+                    mapNode.setTop(object.getInteger("top"));
+                    mapNode.setBottom(object.getInteger("bottom"));
+                    mapNode.setLeft(object.getInteger("left"));
+                    mapNode.setRight(object.getInteger("right"));
+                    mapNode.setRow(object.getInteger("row"));
+                    mapNode.setBay(object.getInteger("bay"));
+                    mapNode.setNo(object.getString("row") + "-" + object.getString("bay"));
+                    mapNode.setXBase(object.getInteger("refx"));
+                    mapNode.setYBase(object.getInteger("refy"));
+
+                    if(mapNode.getValue() == MapNodeType.CONVEYOR.id) {
+                        //杈撻�佺嚎,鍒ゆ柇灏忚溅鏄惁鍙蛋
+                        if (object.containsKey("conveyorHasGo")) {
+                            if(object.getBoolean("conveyorHasGo")) {
+                                //灏忚溅鍙蛋
+                                mapNode.setValue(MapNodeType.CONVEYOR_CAR_GO.id);
+                            }
+                        }
+                    }
+
+                    nodes.add(mapNode);
+                }
+
+                Collections.sort(nodes, new Comparator<MapNode>() {
+                    @Override
+                    public int compare(MapNode o1, MapNode o2) {
+                        return Integer.compare(o1.getBay(), o2.getBay());
+                    }
+                });
+
+                ArrayList<MapNode> sortNodes = new ArrayList<>();
+                int defaultBay = 1;//榛樿浠�1鍒楀紑濮�
+                for (MapNode node : nodes) {
+                    if (node.getBay() == defaultBay) {
+                        defaultBay++;
+                        sortNodes.add(node);
+                        continue;
+                    }
+
+                    //瀛樺湪绌虹己鑺傜偣锛岃嚜鍔ㄨˉ瓒�
+                    for (int i = defaultBay; i < node.getBay(); i++) {
+                        MapNode mapNode = new MapNode();
+                        mapNode.setValue(MapNodeType.DISABLE.id);
+                        mapNode.setTop(1000);
+                        mapNode.setBottom(1000);
+                        mapNode.setLeft(1000);
+                        mapNode.setRight(1000);
+                        mapNode.setRow(node.getRow());
+                        mapNode.setBay(i);
+                        mapNode.setNo(node.getRow() + "-" + i);
+                        mapNode.setXBase(0);
+                        mapNode.setYBase(0);
+                        sortNodes.add(mapNode);
+                    }
+
+                    defaultBay = node.getBay() + 1;
+                    sortNodes.add(node);
+                }
+
+                list.add(sortNodes);
+            }
+
+            levData.put(lev, list);
+        }
+
+        for (Map.Entry<Integer, ArrayList<ArrayList<MapNode>>> entry : levData.entrySet()) {
+            ArrayList<ArrayList<MapNode>> lists = entry.getValue();//鑾峰彇鍦板浘
+
+            MapNode mapNode = new MapNode();
+            mapNode.setValue(MapNodeType.DISABLE.id);
+            mapNode.setTop(1000);
+            mapNode.setBottom(1000);
+            mapNode.setLeft(1000);
+            mapNode.setRight(1000);
+            mapNode.setRow(0);
+            mapNode.setBay(0);
+            mapNode.setNo("0-0");
+            mapNode.setXBase(0);
+            mapNode.setYBase(0);
+
+            //鑾峰彇鏈�闀縭ow
+            int row = 0;
+            //缁欐瘡涓猺ow棣栧熬澧炲姞-1鑺傜偣
+            for (ArrayList<MapNode> list : lists) {
+                if (list.size() > row) {
+                    row = list.size();
+                }
+
+                list.add(0, mapNode.clone());
+                list.add(mapNode.clone());
+            }
+
+            ArrayList<MapNode> headNodes = new ArrayList<>();
+            ArrayList<MapNode> footerNodes = new ArrayList<>();
+            for (int i = 0; i < row+2; i++) {
+                headNodes.add(mapNode.clone());
+                footerNodes.add(mapNode.clone());
+            }
+
+            lists.add(0, headNodes);
+            lists.add(footerNodes);
+
+            Integer lev = entry.getKey();
+            Date now = new Date();
+            RedisMapDto map = new RedisMapDto();
+            map.setData(JSON.toJSONString(lists));
+            map.setCreateTime(now);
+            map.setUpdateTime(now);
+            map.setLev(lev);
+
+            List<List<MapNode>> mapNodeList = new ArrayList<>();
+            mapNodeList.addAll(lists);
+            return mapNodeList;
+        }
+
+        return null;
+    }
+
     //鑾峰彇JSON鏍煎紡鏁版嵁
     public List<List<MapNode>> getJsonData(Integer mapType, List<int[]> whitePoints, List<int[]> shuttlePoints) {
-        try {
-            String mapFilename = "map_" + lev + ".json";
-
-            String fileName = this.getClass().getClassLoader().getResource(mapFilename).getPath();//鑾峰彇鏂囦欢璺緞
-            File file = new File(fileName);
-            StringBuffer stringBuffer = new StringBuffer();
-            if (file.isFile() && file.exists()) {
-                InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "GBK");
-                BufferedReader br = new BufferedReader(isr);
-                String lineTxt = null;
-                while ((lineTxt = br.readLine()) != null) {
-                    stringBuffer.append(lineTxt);
-                }
-                br.close();
-
-                //瑙f瀽json鍦板浘鏁版嵁
-                ArrayList arrayList = JSON.parseObject(stringBuffer.toString(), ArrayList.class);
-                List<List<MapNode>> lists = filterMap(mapType, arrayList, lev, whitePoints, shuttlePoints);//杩囨护鍦板浘鏁版嵁
-
-                return lists;
-            } else {
-                System.out.println("鏂囦欢涓嶅瓨鍦�!");
-            }
-        } catch (IOException ioException) {
-            ioException.printStackTrace();
+        RedisUtil redisUtil = SpringUtils.getBean(RedisUtil.class);
+        Object o = redisUtil.get(DeviceRedisConstant.MAP + lev);
+        if (o == null) {
+            return null;
         }
-        return null;
+
+        BasMapDto basMap = JSON.parseObject(o.toString(), BasMapDto.class);
+        ArrayList arrayList = JSON.parseObject(basMap.getData(), ArrayList.class);
+        List<List<MapNode>> lists = filterMap(mapType, arrayList, lev, whitePoints, shuttlePoints);//杩囨护鍦板浘鏁版嵁
+        return lists;
     }
 
     /**
@@ -172,13 +281,14 @@
         }
 
         //杩囨护鏁版嵁
-        LocMastService locMastService = SpringUtils.getBean(LocMastService.class);
         //鑾峰彇褰撳墠妤煎眰搴撲綅鏁版嵁
-        List<LocMast> locMasts = locMastService.list(new LambdaQueryWrapper<LocMast>()
-                .eq(LocMast::getLev1, lev));
-        for (LocMast locMast : locMasts) {
-            Integer row = locMast.getRow1();
-            Integer bay = locMast.getBay1();
+        List<Loc> locs = locService.list(new LambdaQueryWrapper<Loc>()
+                .eq(Loc::getLev, lev)
+                .eq(Loc::getStatus, 1)
+                .orderByAsc(Loc::getRow, Loc::getBay));
+        for (Loc loc : locs) {
+            Integer row = loc.getRow();
+            Integer bay = loc.getBay();
 
             boolean whiteFlag = false;//榛樿涓嶅瓨鍦ㄧ櫧鍚嶅崟
             if (whitePoints != null) {
@@ -203,18 +313,16 @@
             } else if (mapType == NavigationMapType.DFX.id) {
                 //杞﹁締鏈夎揣
                 //璇诲彇瀵瑰簲搴撲綅鏁版嵁锛屽皢DFX搴撲綅鐘舵�佺殑鑺傜偣缃负-1(闅滅鐗�)
-                if (locMast.getLocSts().equals("F")
-                        || locMast.getLocSts().equals("D")
-                        || locMast.getLocSts().equals("X")
-                        || locMast.getLocSts().equals("R")
-                        || locMast.getLocSts().equals("P")
+                if (loc.getLocStsFlag().equals("F")
+                        || loc.getLocStsFlag().equals("D")
+                        || loc.getLocStsFlag().equals("X")
                 ) {
-                    mapNode.setValue(-1);//绂佺敤鑺傜偣
+                    mapNode.setValue(MapNodeType.DISABLE.id);//绂佺敤鑺傜偣
                 }
             } else if (mapType == NavigationMapType.NORMAL.id) {
                 //杩囨护搴撲綅鐘舵�乆
-                if (locMast.getLocSts().equals("X")) {
-                    mapNode.setValue(-1);//绂佺敤鑺傜偣
+                if (loc.getLocStsFlag().equals("X")) {
+                    mapNode.setValue(MapNodeType.DISABLE.id);//绂佺敤鑺傜偣
                 }
             }
 
@@ -230,7 +338,7 @@
                 int y = points[1];
                 List<MapNode> list = lists.get(x);
                 MapNode mapNode = list.get(y);
-                mapNode.setValue(66);//璁剧疆涓鸿溅杈嗕唬鐮�66
+                mapNode.setValue(MapNodeType.CAR.id);//璁剧疆涓鸿溅杈嗕唬鐮�66
                 //鏇存柊list
                 list.set(y, mapNode);
                 lists.set(x, list);
@@ -238,61 +346,6 @@
         }
 
         return lists;
-    }
-
-    /**
-     * 閿�/瑙i攣 璺緞鑺傜偣
-     * 鍐欏叆璺緞鑺傜偣鏁版嵁鍒皉edis鍦板浘涓�
-     * lock涓簍rue 绂佺敤搴撲綅锛宭ock涓篺alse鎭㈠搴撲綅
-     */
-    public synchronized boolean writeNavigateNodeToRedisMap(List<NavigateNode> nodes, boolean lock) {
-        RedisUtil redisUtil = SpringUtils.getBean(RedisUtil.class);
-        Object o = redisUtil.get("realtimeBasMap_" + lev);
-        if (o == null) {
-            return false;
-        }
-
-        BasMap basMap = JSON.parseObject(o.toString(), BasMap.class);
-        ArrayList arrayList = JSON.parseObject(basMap.getData(), ArrayList.class);
-        List<List<MapNode>> lists = filterMap(NavigationMapType.NONE.id, arrayList, lev, null, null);//鑾峰彇鍏ㄩ儴鍦板浘鏁版嵁
-
-        // 闃叉閲嶅閿佽矾寰�
-        if (lock) {
-            for (NavigateNode node : nodes) {
-                List<MapNode> listX = lists.get(node.getX());
-                MapNode mapNode = listX.get(node.getY());
-                if (mapNode.getValue() == -999) {
-                    return false;
-                }
-            }
-        }
-
-        NavigateMapData mapData = new NavigateMapData(nodes.get(0).getZ());
-        List<List<MapNode>> realMap = mapData.getJsonData(-1, null, null);//鑾峰彇瀹屾暣鍦板浘(鍖呮嫭鍏ュ簱鍑哄簱)
-        for (NavigateNode node : nodes) {
-            if (node.getZ() != lev) {
-                continue;
-            }
-
-            List<MapNode> listX = lists.get(node.getX());
-            MapNode mapNode = listX.get(node.getY());
-            if (lock) {
-                mapNode.setValue(-999);//绂佺敤搴撲綅
-            }else {
-                //鑾峰彇鍘熷鑺傜偣鏁版嵁
-                List<MapNode> rows = realMap.get(node.getX());
-                MapNode col = rows.get(node.getY());
-                mapNode.setValue(col.getValue());//鎭㈠搴撲綅
-            }
-
-            listX.set(node.getY(), mapNode);
-            lists.set(node.getX(), listX);
-        }
-        basMap.setData(JSON.toJSONString(lists));
-        basMap.setUpdateTime(new Date());
-        //灏嗘暟鎹簱鍦板浘鏁版嵁瀛樺叆redis
-        redisUtil.set("realtimeBasMap_" + lev, JSON.toJSONString(basMap));
-        return true;
     }
 
 }

--
Gitblit v1.9.1