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