#
Junjie
10 小时以前 8a1f312d9f7842bb02c97b200e017926f0af63a5
#
9个文件已修改
2个文件已添加
795 ■■■■ 已修改文件
pom.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/BasMapController.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/LocMastController.java 202 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/enums/MapExcelNodeType.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/MapExcelUtils.java 311 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/ShuttleTaskUtils.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/Utils.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/MapNode.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/ServerBootstrap.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/basMap/basMap.js 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/admin/basMap/basMap.html 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -111,6 +111,17 @@
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.13</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.13</version>
        </dependency>
    </dependencies>
    <build>
src/main/java/com/zy/asrs/controller/BasMapController.java
@@ -1,20 +1,31 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.common.DateUtils;
import com.zy.asrs.entity.BasMap;
import com.zy.asrs.entity.BasShuttleCharge;
import com.zy.asrs.service.BasMapService;
import com.core.annotations.ManagerAuth;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.asrs.service.BasShuttleChargeService;
import com.zy.asrs.utils.MapExcelUtils;
import com.zy.common.model.MapNode;
import com.zy.common.utils.RedisUtil;
import com.zy.common.web.BaseController;
import com.zy.core.enums.RedisKeyType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.*;
@RestController
@@ -22,6 +33,10 @@
    @Autowired
    private BasMapService basMapService;
    @Autowired
    private BasShuttleChargeService basShuttleChargeService;
    @Autowired
    private RedisUtil redisUtil;
    @RequestMapping(value = "/basMap/{id}/auth")
    @ManagerAuth
@@ -122,4 +137,39 @@
        return R.ok();
    }
    @Autowired
    private MapExcelUtils mapExcelUtils;
    @PostMapping("/basMap/upload")
    public R uploadExcel(@RequestParam("file") MultipartFile file) throws IOException {
        // 保存上传的文件到临时位置
        String tempFilePath = System.getProperty("java.io.tmpdir") + file.getOriginalFilename();
        file.transferTo(new File(tempFilePath));
        HashMap<Integer, List<List<HashMap<String, Object>>>> dataMap = mapExcelUtils.readExcel(tempFilePath);
        HashMap<Integer, List<List<MapNode>>> levMap = mapExcelUtils.processExcelData(dataMap);
        // 删除临时文件
        new File(tempFilePath).delete();
        basMapService.delete(new EntityWrapper<>());
        for (Map.Entry<Integer, List<List<MapNode>>> entry : levMap.entrySet()) {
            Integer lev = entry.getKey();
            List<List<MapNode>> map = entry.getValue();
            Date now = new Date();
            BasMap basMap = new BasMap();
            basMap.setLev(lev);
            basMap.setOriginData(JSON.toJSONString(map, SerializerFeature.DisableCircularReferenceDetect));
            basMap.setCreateTime(now);
            basMap.setUpdateTime(now);
            basMapService.insert(basMap);
            redisUtil.del(RedisKeyType.MAP.key + lev);
        }
        return R.ok();
    }
}
src/main/java/com/zy/asrs/controller/LocMastController.java
@@ -13,8 +13,10 @@
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.entity.BasMap;
import com.zy.asrs.entity.BasShuttleCharge;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.service.BasMapService;
import com.zy.asrs.service.BasShuttleChargeService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.utils.Utils;
import com.zy.common.model.MapNode;
@@ -41,6 +43,8 @@
    private LocMastService locMastService;
    @Autowired
    private BasMapService basMapService;
    @Autowired
    private BasShuttleChargeService basShuttleChargeService;
    @RequestMapping(value = "/locMast/{id}/auth")
    @ManagerAuth
@@ -145,81 +149,147 @@
    @PostMapping("/locMast/init")
    @ManagerAuth(memo = "初始化库位")
    @Transactional
    public R locMastInit(@RequestParam Integer lev) {
        BasMap basMap = basMapService.selectLatestMap(lev);
        locMastService.delete(new EntityWrapper<>(new LocMast())
                .eq("lev1", lev));
        List<List<MapNode>> lists = navigateMapData.getJsonData(lev, NavigationMapType.getMapTypes(NavigationMapType.NONE), null, null);//获取完整地图(包括入库出库)
        for (int row = 0; row < lists.size(); row++) {
            List<MapNode> nodeList = lists.get(row);
            for (int bay = 0; bay < nodeList.size(); bay++) {
                MapNode mapNode = nodeList.get(bay);
    public R locMastInit() {
        List<BasMap> basMaps = basMapService.selectList(new EntityWrapper<BasMap>().orderBy("lev", true));
        basShuttleChargeService.delete(new EntityWrapper<>());
        int chargeNo = 1;
        for (BasMap basMap : basMaps) {
            Integer lev = basMap.getLev();
            locMastService.delete(new EntityWrapper<>(new LocMast())
                    .eq("lev1", lev));
            List<List<MapNode>> lists = navigateMapData.getJsonData(lev, NavigationMapType.getMapTypes(NavigationMapType.NONE), null, null);//获取完整地图(包括入库出库)
            for (int row = 0; row < lists.size(); row++) {
                List<MapNode> nodeList = lists.get(row);
                for (int bay = 0; bay < nodeList.size(); bay++) {
                    MapNode mapNode = nodeList.get(bay);
                if (mapNode.getValue() == MapNodeType.DISABLE.id) {
                    continue;
                }
                String locNo = Utils.getLocNo(row, bay, lev);
                LocMast locMast = new LocMast();
                locMast.setLocNo(locNo);
                locMast.setRow1(row);
                locMast.setBay1(bay);
                locMast.setLev1(lev);
                locMast.setStatus(1);
                if (mapNode.getValue() == MapNodeType.NORMAL_PATH.id) {
                    locMast.setLocSts(LocStsType.O.toString());
                } else if (mapNode.getValue() == MapNodeType.MAIN_PATH.id) {
                    locMast.setLocSts(LocStsType.W.toString());
                }
                locMastService.insert(locMast);
            }
        }
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("lev1", lev).orderBy("row1", false));
        Integer rowMax = locMast.getRow1();
        Integer baseRow = basMap.getBaseRow();
        Integer baseRowCode = basMap.getBaseRowCode();
        for (int i = baseRow; i <= rowMax; i++) {
            Integer baseBayCode = basMap.getBaseBayCode();
            if (basMap.getBaseBay() > 0) {
                for (int j = 1; j <= basMap.getBaseBay(); j++) {
                    String locNo = Utils.getLocNo(i, j, lev);
                    LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>()
                            .eq("loc_no", locNo));
                    if (locMast1 != null) {
                        HashMap<String, Object> point = new HashMap<>();
                        point.put("y", baseRowCode);
                        point.put("x", baseBayCode);
                        point.put("z", lev);
                        locMast1.setQrCodeValue(JSON.toJSONString(point));
                        locMastService.updateById(locMast1);
                    if (mapNode.getValue() == MapNodeType.DISABLE.id) {
                        continue;
                    }
                    baseBayCode += 1;
                    String locNo = Utils.getLocNo(row, bay, lev);
                    LocMast locMast = new LocMast();
                    locMast.setLocNo(locNo);
                    locMast.setRow1(row);
                    locMast.setBay1(bay);
                    locMast.setLev1(lev);
                    locMast.setStatus(1);
                    if (mapNode.getValue() == MapNodeType.NORMAL_PATH.id) {
                        locMast.setLocSts(LocStsType.O.toString());
                    } else if (mapNode.getValue() == MapNodeType.MAIN_PATH.id) {
                        locMast.setLocSts(LocStsType.W.toString());
                    } else if (mapNode.getValue() == MapNodeType.CHARGE.id) {
                        locMast.setLocSts(LocStsType.C.toString());
                        BasShuttleCharge basShuttleCharge = new BasShuttleCharge();
                        basShuttleCharge.setChargeId(chargeNo++);
                        basShuttleCharge.setLocNo(locNo);
                        basShuttleCharge.setWaitLocNo(locNo);
                        basShuttleCharge.setStatus(1);
                        basShuttleCharge.setCreateTime(new Date());
                        basShuttleCharge.setUpdateTime(new Date());
                        basShuttleChargeService.insert(basShuttleCharge);
                    } else if (mapNode.getValue() == MapNodeType.CONVEYOR.id) {
                        locMast.setLocSts(LocStsType.E.toString());
                    } else if (mapNode.getValue() == MapNodeType.LIFT.id) {
                        locMast.setLocSts(LocStsType.E.toString());
                    }
                    locMastService.insert(locMast);
                }
            }
            LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("lev1", lev).orderBy("row1", false));
            Integer rowMax = locMast.getRow1();
            LocMast locMast2 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("lev1", lev).orderBy("bay1", false));
            Integer bayMax = locMast2.getBay1();
            Integer baseRow = basMap.getBaseRow();
            Integer baseRowCode = basMap.getBaseRowCode();
            if (baseRow > 0) {
                for (int i = baseRow; i <= rowMax; i++) {
                    Integer baseBayCode = basMap.getBaseBayCode();
                    if (basMap.getBaseBay() > 0) {
                        for (int j = basMap.getBaseBay(); j <= bayMax; j++) {
                            String locNo = Utils.getLocNo(i, j, lev);
                            LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>()
                                    .eq("loc_no", locNo));
                            if (locMast1 != null) {
                                HashMap<String, Object> point = new HashMap<>();
                                point.put("y", baseRowCode);
                                point.put("x", baseBayCode);
                                point.put("z", lev);
                                locMast1.setQrCodeValue(JSON.toJSONString(point));
                                locMastService.updateById(locMast1);
                            }
                            baseBayCode += 1;
                        }
                    }else {
                        int baseBay = basMap.getBaseBay() * -1;
                        for (int j = baseBay; j > 0; j--) {
                            String locNo = Utils.getLocNo(i, j, lev);
                            LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>()
                                    .eq("loc_no", locNo));
                            if (locMast1 != null) {
                                HashMap<String, Object> point = new HashMap<>();
                                point.put("y", baseRowCode);
                                point.put("x", baseBayCode);
                                point.put("z", lev);
                                locMast1.setQrCodeValue(JSON.toJSONString(point));
                                locMastService.updateById(locMast1);
                            }
                            baseBayCode += 1;
                        }
                    }
                    baseRowCode += 1;
                }
            }else {
                int baseBay = basMap.getBaseBay() * -1;
                for (int j = baseBay; j > 0; j--) {
                    String locNo = Utils.getLocNo(i, j, lev);
                baseRow = baseRow * -1;
                for (int i = baseRow; i > 0; i--) {
                    Integer baseBayCode = basMap.getBaseBayCode();
                    if (basMap.getBaseBay() > 0) {
                        for (int j = basMap.getBaseBay(); j <= bayMax; j++) {
                            String locNo = Utils.getLocNo(i, j, lev);
                    LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>()
                            .eq("loc_no", locNo));
                    if (locMast1 != null) {
                        HashMap<String, Object> point = new HashMap<>();
                        point.put("y", baseRowCode);
                        point.put("x", baseBayCode);
                        point.put("z", lev);
                        locMast1.setQrCodeValue(JSON.toJSONString(point));
                        locMastService.updateById(locMast1);
                            LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>()
                                    .eq("loc_no", locNo));
                            if (locMast1 != null) {
                                HashMap<String, Object> point = new HashMap<>();
                                point.put("y", baseRowCode);
                                point.put("x", baseBayCode);
                                point.put("z", lev);
                                locMast1.setQrCodeValue(JSON.toJSONString(point));
                                locMastService.updateById(locMast1);
                            }
                            baseBayCode += 1;
                        }
                    }else {
                        int baseBay = basMap.getBaseBay() * -1;
                        for (int j = baseBay; j > 0; j--) {
                            String locNo = Utils.getLocNo(i, j, lev);
                            LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>()
                                    .eq("loc_no", locNo));
                            if (locMast1 != null) {
                                HashMap<String, Object> point = new HashMap<>();
                                point.put("y", baseRowCode);
                                point.put("x", baseBayCode);
                                point.put("z", lev);
                                locMast1.setQrCodeValue(JSON.toJSONString(point));
                                locMastService.updateById(locMast1);
                            }
                            baseBayCode += 1;
                        }
                    }
                    baseBayCode += 1;
                    baseRowCode += 1;
                }
            }
            baseRowCode += 1;
        }
        return R.ok();
    }
src/main/java/com/zy/asrs/domain/enums/MapExcelNodeType.java
New file
@@ -0,0 +1,43 @@
package com.zy.asrs.domain.enums;
public enum MapExcelNodeType {
    LIFT("RGB(255,192,0)", "提升机"),
    CHARGE("RGB(255,0,0)", "充电桩"),
    STATION("RGB(0,112,192)", "站点"),
    MAIN_PATH("RGB(255,255,0)", "主轨道"),
    NORMAL_PATH("RGB(0,176,80)", "子轨道"),
    ;
    public String flag;
    public String desc;
    MapExcelNodeType(String flag, String desc) {
        this.flag = flag;
        this.desc = desc;
    }
    public static MapExcelNodeType get(String flag) {
        if (null == flag) {
            return null;
        }
        for (MapExcelNodeType type : MapExcelNodeType.values()) {
            if (type.flag.equals(flag)) {
                return type;
            }
        }
        return null;
    }
    public static MapExcelNodeType get(MapExcelNodeType type) {
        if (null == type) {
            return null;
        }
        for (MapExcelNodeType type2 : MapExcelNodeType.values()) {
            if (type2 == type) {
                return type2;
            }
        }
        return null;
    }
}
src/main/java/com/zy/asrs/utils/MapExcelUtils.java
New file
@@ -0,0 +1,311 @@
package com.zy.asrs.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.core.common.Cools;
import com.zy.asrs.domain.enums.MapExcelNodeType;
import com.zy.common.model.MapNode;
import com.zy.core.enums.MapNodeType;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
public class MapExcelUtils {
    public HashMap<Integer, List<List<MapNode>>> processExcelData(HashMap<Integer, List<List<HashMap<String, Object>>>> dataMap) {
        HashMap<Integer, List<List<MapNode>>> levMap = new HashMap<>();
        for (Map.Entry<Integer, List<List<HashMap<String, Object>>>> entry : dataMap.entrySet()) {
            Integer lev = entry.getKey();
            List<List<HashMap<String, Object>>> excelData = entry.getValue();
            HashMap<Integer, JSONObject> rowMap = new HashMap<>();
            HashMap<Integer, JSONObject> bayMap = new HashMap<>();
            int finalRow = -1;
            int finalBay = -1;
            //获取列数据
            List<HashMap<String, Object>> tmpList0 = excelData.get(0);
            List<HashMap<String, Object>> tmpList1 = excelData.get(1);
            for (int i = 2; i < tmpList1.size(); i++) {
                HashMap<String, Object> tmpBayMap = tmpList1.get(i);
                if (Cools.isEmpty(tmpBayMap.get("value"))) {
                    continue;
                }
                HashMap<String, Object> tmpDistanceMap = tmpList0.get(i);
                int bay = (int) Double.parseDouble(tmpBayMap.get("value").toString());
                JSONObject distanceData = JSON.parseObject(tmpDistanceMap.get("value").toString());
                bayMap.put(bay, distanceData);
                finalBay = bay;
            }
            //获取排数据
            for (int i = 2; i < excelData.size(); i++) {
                List<HashMap<String, Object>> rowData = excelData.get(i);
                HashMap<String, Object> tmpRowMap = rowData.get(1);
                if (Cools.isEmpty(tmpRowMap.get("value"))) {
                    continue;
                }
                HashMap<String, Object> tmpDistanceMap = rowData.get(0);
                int row = (int) Double.parseDouble(tmpRowMap.get("value").toString());
                JSONObject distanceData = JSON.parseObject(tmpDistanceMap.get("value").toString());
                rowMap.put(row, distanceData);
                finalRow = row;
            }
            List<List<MapNode>> mapList = new ArrayList<>();
            //生成二维坐标
            for (int row = 1; row <= finalRow; row++) {
                List<MapNode> rows = new ArrayList<>();
                for (int bay = 1; bay <= finalBay; bay++) {
                    MapNode node = new MapNode();
                    node.setId(row + "-" + bay);
                    HashMap<String, Object> nodeData = excelData.get(row + 1).get(bay + 1);
                    String nodeType = nodeData.get("bgColor").toString();
                    String data = "";
                    if (nodeType.equals(MapExcelNodeType.MAIN_PATH.flag)) {
                        node.setValue(MapNodeType.MAIN_PATH.id);
                    } else if (nodeType.equals(MapExcelNodeType.NORMAL_PATH.flag)) {
                        node.setValue(MapNodeType.NORMAL_PATH.id);
                    } else if (nodeType.equals(MapExcelNodeType.LIFT.flag)) {
                        node.setValue(MapNodeType.LIFT.id);
                        JSONObject jsonData = JSON.parseObject(nodeData.get("value").toString());
                        data = jsonData.getString("value");
                    } else if (nodeType.equals(MapExcelNodeType.CHARGE.flag)) {
                        node.setValue(MapNodeType.CHARGE.id);
                        JSONObject jsonData = JSON.parseObject(nodeData.get("value").toString());
                        data = jsonData.getString("value");
                    } else if (nodeType.equals(MapExcelNodeType.STATION.flag)) {
                        node.setValue(MapNodeType.CONVEYOR.id);
                        JSONObject jsonData = JSON.parseObject(nodeData.get("value").toString());
                        data = jsonData.getString("value");
                    }else {
                        node.setValue(MapNodeType.DISABLE.id);
                    }
                    node.setData(data);
                    rows.add(node);
                }
                mapList.add(rows);
            }
            //生成小车地图坐标间距数据
            for (int row = 1; row <= finalRow; row++) {
                for (int bay = 1; bay <= finalBay; bay++) {
                    MapNode mapNode = mapList.get(row - 1).get(bay - 1);
                    JSONObject rowData = rowMap.get(row);
                    JSONObject bayData = bayMap.get(bay);
                    Integer top = rowData.getInteger("top");
                    Integer bottom = rowData.getInteger("bottom");
                    Integer left = bayData.getInteger("left");
                    Integer right = bayData.getInteger("right");
                    mapNode.setTop(top);
                    mapNode.setBottom(bottom);
                    mapNode.setLeft(left);
                    mapNode.setRight(right);
                }
            }
            //生成牛眼Y坐标基准数据
            for (int bay = 1; bay <= finalBay; bay++) {
                int yBase = 10000;
                for (int row = 1; row <= finalRow; row++) {
                    MapNode mapNode = mapList.get(row - 1).get(bay - 1);
                    HashMap<String, Object> nodeData = excelData.get(row + 1).get(bay + 1);
                    JSONObject rowData = rowMap.get(row);
                    Integer bottom = rowData.getInteger("bottom");
                    String nodeValue = nodeData.get("value").toString();
                    if (Utils.isJSON(nodeValue)) {
                        JSONObject jsonData = JSON.parseObject(nodeValue);
                        if (jsonData.containsKey("bottom")) {
                            bottom = jsonData.getInteger("bottom");
                        }
                    }
                    if (row != 1) {
                        yBase += bottom;
                    }
                    mapNode.setYBase(yBase);
                }
            }
            //生成牛眼X坐标基准数据
            for (int row = 1; row <= finalRow; row++) {
                int xBase = 10000;
                for (int bay = 1; bay <= finalBay; bay++) {
                    MapNode mapNode = mapList.get(row - 1).get(bay - 1);
                    HashMap<String, Object> nodeData = excelData.get(row + 1).get(bay + 1);
                    JSONObject bayData = bayMap.get(bay);
                    Integer right = bayData.getInteger("right");
                    String nodeValue = nodeData.get("value").toString();
                    if (Utils.isJSON(nodeValue)) {
                        JSONObject jsonData = JSON.parseObject(nodeValue);
                        if (jsonData.containsKey("right")) {
                            right = jsonData.getInteger("right");
                        }
                    }
                    if (bay != 1) {
                        xBase += right;
                    }
                    mapNode.setXBase(xBase);
                }
            }
            //生成四向车地图所需格式
            MapNode disableNode = new MapNode();
            disableNode.setId("0-0");
            disableNode.setValue(MapNodeType.DISABLE.id);
            disableNode.setLeft(0);
            disableNode.setRight(0);
            disableNode.setTop(0);
            disableNode.setBottom(0);
            List<MapNode> disableRow = new ArrayList<>();
            for (int bay = 1; bay <= finalBay; bay++) {
                disableRow.add(disableNode);
            }
            disableRow.add(0, disableNode);
            disableRow.add(disableNode);
            for (List<MapNode> mapNodes : mapList) {
                mapNodes.add(0, disableNode);
                mapNodes.add(disableNode);
            }
            mapList.add(0, disableRow);
            mapList.add(disableRow);
            System.out.println(JSON.toJSONString(mapList, SerializerFeature.DisableCircularReferenceDetect));
            levMap.put(lev, mapList);
        }
        return levMap;
    }
    public HashMap<Integer, List<List<HashMap<String, Object>>>> readExcel(String filePath) throws IOException {
        HashMap<Integer, List<List<HashMap<String, Object>>>> dataMap = new HashMap<>();
        FileInputStream inputStream = new FileInputStream(new File(filePath));
        Workbook workbook;
        if (filePath.endsWith(".xlsx")) {
            workbook = new XSSFWorkbook(inputStream);
        } else if (filePath.endsWith(".xls")) {
            throw new IllegalArgumentException("文件格式不支持");
        } else {
            throw new IllegalArgumentException("文件格式不支持");
        }
        int numberOfSheets = workbook.getNumberOfSheets();
        System.out.println("总共有 " + numberOfSheets + " 个Sheet");
        // 遍历所有Sheet
        for (int i = 0; i < numberOfSheets; i++) {
            Sheet sheet = workbook.getSheetAt(i);
            String sheetName = sheet.getSheetName();
            List<List<HashMap<String, Object>>> data = new ArrayList<>();
            if (sheetName.contains("F")) {
                String[] split = sheetName.split("F");
                String levStr = split[0];
                Integer lev = Integer.parseInt(levStr);
                for (Row row : sheet) {
                    List<HashMap<String, Object>> rowData = new ArrayList<>();
                    for (Cell cell : row) {
                        rowData.add(getCellValue(cell));
                    }
                    data.add(rowData);
                }
                dataMap.put(lev, data);
            }
        }
        workbook.close();
        inputStream.close();
        return dataMap;
    }
    private HashMap<String, Object> getCellValue(Cell cell) {
        if (cell == null) {
            return null;
        }
        HashMap<String, Object> map = new HashMap<>();
        String bgColor = getCellBackgroundColor(cell);
        map.put("bgColor", bgColor);
        String value = "";
        switch (cell.getCellType()) {
            case Cell.CELL_TYPE_STRING:
                value = cell.getStringCellValue();
                break;
            case Cell.CELL_TYPE_NUMERIC:
                value = String.valueOf(cell.getNumericCellValue());
                break;
            case Cell.CELL_TYPE_BOOLEAN:
                value = String.valueOf(cell.getBooleanCellValue());
                break;
            case Cell.CELL_TYPE_FORMULA:
                value = cell.getCellFormula();
                break;
            case Cell.CELL_TYPE_BLANK:
                value = "";
                break;
            default:
                value = "";
        }
        map.put("value", value);
        return map;
    }
    public String getCellBackgroundColor(Cell cell) {
        if (cell == null) {
            return "无单元格";
        }
        CellStyle style = cell.getCellStyle();
        short bgColorIndex = style.getFillForegroundColor(); // 获取前景色(实际是底色)
        return getXSSFBackgroundColor(style);
    }
    // 处理XSSF (.xlsx) 颜色
    private String getXSSFBackgroundColor(CellStyle style) {
        XSSFColor color = (XSSFColor) style.getFillForegroundColorColor();
        if (color == null) {
            return "default";
        }
        byte[] rgb = color.getRGB();
        if (rgb == null) {
            return "default";
        }
        return String.format("RGB(%d,%d,%d)",
                rgb[0] & 0xFF,
                rgb[1] & 0xFF,
                rgb[2] & 0xFF);
    }
}
src/main/java/com/zy/asrs/utils/ShuttleTaskUtils.java
@@ -65,45 +65,45 @@
                        if (wrkMast.getWrkSts() == WrkStsType.INBOUND_SHUTTLE_RUN.sts) {
                            //5.小车搬运中 ==> 9.入库完成
                            wrkMast.setWrkSts(WrkStsType.COMPLETE_INBOUND.sts);
                            shuttleThread.setSyncTaskNo(0);
                            shuttleThread.setTaskNo(0);
                        } else if (wrkMast.getWrkSts() == WrkStsType.OUTBOUND_SHUTTLE_RUN.sts) {
                            //102.小车搬运中 ==> 103.小车搬运完成
                            wrkMast.setWrkSts(WrkStsType.OUTBOUND_SHUTTLE_RUN_COMPLETE.sts);
                            shuttleThread.setSyncTaskNo(0);
                            shuttleThread.setTaskNo(0);
                        } else if (wrkMast.getWrkSts() == WrkStsType.MOVE_NEARBY.sts) {
                            //302.小车移动至近点中 ==> 303.小车移动至近点完成
                            wrkMast.setWrkSts(WrkStsType.MOVE_NEARBY_COMPLETE.sts);
                            shuttleThread.setSyncTaskNo(0);
                            shuttleThread.setTaskNo(0);
                        } else if (wrkMast.getWrkSts() == WrkStsType.MOVE_IN_LIFT.sts) {
                            //304.小车迁入提升机中 ==> 305.小车迁入提升机完成
                            wrkMast.setWrkSts(WrkStsType.MOVE_IN_LIFT_COMPLETE.sts);
                            shuttleThread.setSyncTaskNo(0);
                            shuttleThread.setTaskNo(0);
                        } else if (wrkMast.getWrkSts() == WrkStsType.MOVE_OUT_LIFT.sts) {
                            //308.小车迁出提升机中 ==> 309.小车迁出提升机完成
                            if (Utils.getLev(shuttleProtocol.getCurrentLocNo()) != Utils.getLev(wrkMast.getLocNo())) {
                                continue;//小车未到达目标层
                            }
                            wrkMast.setWrkSts(WrkStsType.MOVE_OUT_LIFT_COMPLETE.sts);
                            shuttleThread.setSyncTaskNo(0);
                            shuttleThread.setTaskNo(0);
                        } else if (wrkMast.getWrkSts() == WrkStsType.MOVE_SHUTTLE.sts) {
                            //310.小车移动中 ==> 311.小车移动完成
                            wrkMast.setWrkSts(WrkStsType.COMPLETE_MOVE.sts);
                            shuttleThread.setSyncTaskNo(0);
                            shuttleThread.setTaskNo(0);
                            notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.SHUTTLE_MOVE_COMPLETE);//触发通知
                        } else if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_START_CHARGING.sts) {
                            //204.小车开启充电中 ==> 205.小车充电中
                            wrkMast.setWrkSts(WrkStsType.CHARGE_SHUTTLE_CHARGING.sts);
                            shuttleThread.setSyncTaskNo(0);
                            shuttleThread.setTaskNo(0);
                            notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.SHUTTLE_POWER_COMPLETE);//触发通知
                        } else if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_CHARGING.sts) {
                            //205.小车充电中 ==> 206.小车充电完成
                            wrkMast.setWrkSts(WrkStsType.CHARGE_SHUTTLE_CHARGING_COMPLETE.sts);
                            shuttleThread.setSyncTaskNo(0);
                            shuttleThread.setTaskNo(0);
                            notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.SHUTTLE_POWER_COMPLETE);//触发通知
                        } else if (wrkMast.getWrkSts() == WrkStsType.LOC_MOVE_SHUTTLE_RUN.sts) {
                            //502.小车搬运中 ==> 509.移库完成
                            wrkMast.setWrkSts(WrkStsType.COMPLETE_LOC_MOVE.sts);
                            shuttleThread.setSyncTaskNo(0);
                            shuttleThread.setTaskNo(0);
                            notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.SHUTTLE_DELIVERY);//触发通知
                        } else {
                            continue;
src/main/java/com/zy/asrs/utils/Utils.java
@@ -1,5 +1,7 @@
package com.zy.asrs.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Arith;
import com.core.common.Cools;
@@ -293,4 +295,16 @@
        return recentLocNo;
    }
    public static boolean isJSON(String value) {
        try {
            JSONObject jsonData = JSON.parseObject(value);
            if (jsonData == null) {
                return false;
            }
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}
src/main/java/com/zy/common/model/MapNode.java
@@ -8,6 +8,8 @@
@Data
public class MapNode implements Cloneable {
    private String id;
    /**
     * -1 禁用
     * 0 子轨道
src/main/java/com/zy/core/ServerBootstrap.java
@@ -150,6 +150,9 @@
            String locNo = Utils.getLocNo(basLift.getPoint$().getRow(), basLift.getPoint$().getBay(), 1);
            LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locNo));
            JSONObject point = JSON.parseObject(locMast.getQrCodeValue());
            if (point == null) {
                continue;
            }
            deviceConfig.setOtherData(point.getInteger("x") + "-" + point.getInteger("y"));
            if (deviceConfig.getFake() == 1) {
                fakeDevices.add(deviceConfig);
src/main/webapp/static/js/basMap/basMap.js
@@ -1,19 +1,20 @@
var pageCurr;
layui.config({
    base: baseUrl + "/static/layui/lay/modules/"
}).use(['table','laydate', 'form', 'admin'], function(){
}).use(['table', 'laydate', 'form', 'admin', 'upload'], function () {
    var table = layui.table;
    var $ = layui.jquery;
    var layer = layui.layer;
    var layDate = layui.laydate;
    var form = layui.form;
    var admin = layui.admin;
    var upload = layui.upload;
    // 数据渲染
    tableIns = table.render({
        elem: '#basMap',
        headers: {token: localStorage.getItem('token')},
        url: baseUrl+'/basMap/list/auth',
        url: baseUrl + '/basMap/list/auth',
        page: true,
        limit: 15,
        limits: [15, 30, 50, 100, 200, 500],
@@ -23,18 +24,18 @@
        cols: [[
            {type: 'checkbox'}
            // ,{field: 'id', align: 'center',title: '#'}
            ,{field: 'lev', align: 'center',title: '层数'}
            ,{field: 'data', align: 'center',title: '实时数据'}
            ,{field: 'createTime$', align: 'center',title: '创建时间'}
            ,{field: 'updateTime$', align: 'center',title: '更新时间'}
            ,{field: 'lastData', align: 'center',title: '最近数据'}
            ,{field: 'originData', align: 'center',title: '原始地图'}
            ,{field: 'baseRow', align: 'center',title: '基准排'}
            ,{field: 'baseRowCode', align: 'center',title: '基准排-code'}
            ,{field: 'baseBay', align: 'center',title: '基准列'}
            ,{field: 'baseBayCode', align: 'center',title: '基准列-code'}
            , {field: 'lev', align: 'center', title: '层数'}
            , {field: 'data', align: 'center', title: '实时数据'}
            , {field: 'createTime$', align: 'center', title: '创建时间'}
            , {field: 'updateTime$', align: 'center', title: '更新时间'}
            , {field: 'lastData', align: 'center', title: '最近数据'}
            , {field: 'originData', align: 'center', title: '原始地图'}
            , {field: 'baseRow', align: 'center', title: '基准排'}
            , {field: 'baseRowCode', align: 'center', title: '基准排-code'}
            , {field: 'baseBay', align: 'center', title: '基准列'}
            , {field: 'baseBayCode', align: 'center', title: '基准列-code'}
            ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width:240}
            , {fixed: 'right', title: '操作', align: 'center', toolbar: '#operate', width: 120}
        ]],
        request: {
            pageName: 'curr',
@@ -51,19 +52,34 @@
        response: {
            statusCode: 200
        },
        done: function(res, curr, count) {
        done: function (res, curr, count) {
            if (res.code === 403) {
                top.location.href = baseUrl+"/";
                top.location.href = baseUrl + "/";
            }
            pageCurr=curr;
            pageCurr = curr;
            limit();
        }
    });
    // 渲染
    upload.render({
        elem: '.demo-class-accept', // 绑定多个元素
        url: baseUrl + "/basMap/upload", // 此处配置你自己的上传接口即可
        accept: 'file', // 普通文件
        done: function (res) {
            if (res.code == 200) {
                layer.msg('导入成功');
                tableReload()
            }else {
                layer.msg(res.msg, {icon: 2})
            }
        }
    });
    // 监听排序事件
    table.on('sort(basMap)', function (obj) {
        var searchData = {};
        $.each($('#search-box [name]').serializeArray(), function() {
        $.each($('#search-box [name]').serializeArray(), function () {
            searchData[this.name] = this.value;
        });
        searchData['orderByField'] = obj.field;
@@ -77,23 +93,26 @@
    // 监听头工具栏事件
    table.on('toolbar(basMap)', function (obj) {
        var checkStatus = table.checkStatus(obj.config.id).data;
        switch(obj.event) {
        switch (obj.event) {
            case 'addData':
                showEditModel();
                break;
            case 'deleteData':
               if (checkStatus.length === 0) {
                   layer.msg('请选择要删除的数据', {icon: 2});
                   return;
               }
               del(checkStatus.map(function (d) {
                   return d.id;
               }));
               break;
                if (checkStatus.length === 0) {
                    layer.msg('请选择要删除的数据', {icon: 2});
                    return;
                }
                del(checkStatus.map(function (d) {
                    return d.id;
                }));
                break;
            case 'initLocMast':
                initLocMast()
                break;
            case 'exportData':
                admin.confirm('确定导出Excel吗', {shadeClose: true}, function(){
                    var titles=[];
                    var fields=[];
                admin.confirm('确定导出Excel吗', {shadeClose: true}, function () {
                    var titles = [];
                    var fields = [];
                    obj.config.cols[0].map(function (col) {
                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
                            titles.push(col.title);
@@ -101,7 +120,7 @@
                        }
                    });
                    var exportData = {};
                    $.each($('#search-box [name]').serializeArray(), function() {
                    $.each($('#search-box [name]').serializeArray(), function () {
                        exportData[this.name] = this.value;
                    });
                    var param = {
@@ -109,18 +128,18 @@
                        'fields': fields
                    };
                    $.ajax({
                        url: baseUrl+"/basMap/export/auth",
                        url: baseUrl + "/basMap/export/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: JSON.stringify(param),
                        dataType:'json',
                        contentType:'application/json;charset=UTF-8',
                        dataType: 'json',
                        contentType: 'application/json;charset=UTF-8',
                        method: 'POST',
                        success: function (res) {
                            layer.closeAll();
                            if (res.code === 200) {
                                table.exportFile(titles,res.data,'xls');
                                table.exportFile(titles, res.data, 'xls');
                            } else if (res.code === 403) {
                                top.location.href = baseUrl+"/";
                                top.location.href = baseUrl + "/";
                            } else {
                                layer.msg(res.msg, {icon: 2})
                            }
@@ -132,7 +151,7 @@
    });
    // 监听行工具事件
    table.on('tool(basMap)', function(obj){
    table.on('tool(basMap)', function (obj) {
        var data = obj.data;
        switch (obj.event) {
            case 'edit':
@@ -141,13 +160,10 @@
            case "del":
                del([data.id]);
                break;
            case "initLocMast":
                initLocMast(data);
                break;
        }
    });
    function initLocMast(data) {
    function initLocMast() {
        layer.confirm('确定初始化库位数据吗?', {
            skin: 'layui-layer-admin',
            shade: .1
@@ -155,19 +171,17 @@
            layer.close(i);
            var loadIndex = layer.load(2);
            $.ajax({
                url: baseUrl+"/locMast/init",
                url: baseUrl + "/locMast/init",
                headers: {'token': localStorage.getItem('token')},
                data: {
                    lev: data.lev
                },
                data: {},
                method: 'POST',
                success: function (res) {
                    layer.close(loadIndex);
                    if (res.code === 200){
                    if (res.code === 200) {
                        layer.msg(res.msg, {icon: 1});
                        tableReload();
                    } else if (res.code === 403){
                        top.location.href = baseUrl+"/";
                    } else if (res.code === 403) {
                        top.location.href = baseUrl + "/";
                    } else {
                        layer.msg(res.msg, {icon: 2});
                    }
@@ -189,19 +203,19 @@
                form.on('submit(editSubmit)', function (data) {
                    var loadIndex = layer.load(2);
                    $.ajax({
                        url: baseUrl+"/basMap/"+(mData?'update':'add')+"/auth",
                        url: baseUrl + "/basMap/" + (mData ? 'update' : 'add') + "/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: data.field,
                        method: 'POST',
                        success: function (res) {
                            layer.close(loadIndex);
                            if (res.code === 200){
                            if (res.code === 200) {
                                layer.close(dIndex);
                                layer.msg(res.msg, {icon: 1});
                                tableReload();
                            } else if (res.code === 403){
                                top.location.href = baseUrl+"/";
                            }else {
                            } else if (res.code === 403) {
                                top.location.href = baseUrl + "/";
                            } else {
                                layer.msg(res.msg, {icon: 2});
                            }
                        }
@@ -223,17 +237,17 @@
            layer.close(i);
            var loadIndex = layer.load(2);
            $.ajax({
                url: baseUrl+"/basMap/delete/auth",
                url: baseUrl + "/basMap/delete/auth",
                headers: {'token': localStorage.getItem('token')},
                data: {ids: ids},
                method: 'POST',
                success: function (res) {
                    layer.close(loadIndex);
                    if (res.code === 200){
                    if (res.code === 200) {
                        layer.msg(res.msg, {icon: 1});
                        tableReload();
                    } else if (res.code === 403){
                        top.location.href = baseUrl+"/";
                    } else if (res.code === 403) {
                        top.location.href = baseUrl + "/";
                    } else {
                        layer.msg(res.msg, {icon: 2});
                    }
@@ -260,22 +274,23 @@
        setTimeout(function () {
            layDate.render({
                elem: '.layui-laydate-range'
                ,type: 'datetime'
                ,range: true
                , type: 'datetime'
                , range: true
            });
            layDate.render({
                elem: '#createTime\\$',
                type: 'datetime',
                value: data!==undefined?data['createTime\\$']:null
                value: data !== undefined ? data['createTime\\$'] : null
            });
            layDate.render({
                elem: '#updateTime\\$',
                type: 'datetime',
                value: data!==undefined?data['updateTime\\$']:null
                value: data !== undefined ? data['updateTime\\$'] : null
            });
        }, 300);
    }
    layDateRender();
});
src/main/webapp/views/admin/basMap/basMap.html
@@ -51,12 +51,16 @@
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">新增</button>
        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">删除</button>
        <button type="button" class="layui-btn demo-class-accept" lay-options="{accept: 'file'}">
            <i class="layui-icon layui-icon-upload"></i>
            导入地图
        </button>
        <button class="layui-btn layui-btn-sm layui-btn-primary" id="btn-initLocMast" lay-event="initLocMast">初始化库位</button>
        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">导出</button>
    </div>
</script>
<script type="text/html" id="operate">
    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="initLocMast">初始化库位</a>
    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">修改</a>
    <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">删除</a>
</script>