| | |
| | | <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> |
| | |
| | | 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 |
| | |
| | | |
| | | @Autowired |
| | | private BasMapService basMapService; |
| | | @Autowired |
| | | private BasShuttleChargeService basShuttleChargeService; |
| | | @Autowired |
| | | private RedisUtil redisUtil; |
| | | |
| | | @RequestMapping(value = "/basMap/{id}/auth") |
| | | @ManagerAuth |
| | |
| | | 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(); |
| | | } |
| | | |
| | | } |
| | |
| | | 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; |
| | |
| | | private LocMastService locMastService; |
| | | @Autowired |
| | | private BasMapService basMapService; |
| | | @Autowired |
| | | private BasShuttleChargeService basShuttleChargeService; |
| | | |
| | | @RequestMapping(value = "/locMast/{id}/auth") |
| | | @ManagerAuth |
| | |
| | | @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(); |
| | | } |
| | | |
New file |
| | |
| | | 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; |
| | | } |
| | | } |
New file |
| | |
| | | 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); |
| | | } |
| | | |
| | | } |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | |
| | | 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; |
| | | } |
| | | } |
| | | } |
| | |
| | | @Data |
| | | public class MapNode implements Cloneable { |
| | | |
| | | private String id; |
| | | |
| | | /** |
| | | * -1 禁用 |
| | | * 0 子轨道 |
| | |
| | | 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); |
| | |
| | | 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], |
| | |
| | | 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', |
| | |
| | | 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; |
| | |
| | | // 监听头工具栏事件 |
| | | 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); |
| | |
| | | } |
| | | }); |
| | | var exportData = {}; |
| | | $.each($('#search-box [name]').serializeArray(), function() { |
| | | $.each($('#search-box [name]').serializeArray(), function () { |
| | | exportData[this.name] = this.value; |
| | | }); |
| | | var param = { |
| | |
| | | '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}) |
| | | } |
| | |
| | | }); |
| | | |
| | | // 监听行工具事件 |
| | | table.on('tool(basMap)', function(obj){ |
| | | table.on('tool(basMap)', function (obj) { |
| | | var data = obj.data; |
| | | switch (obj.event) { |
| | | case 'edit': |
| | |
| | | case "del": |
| | | del([data.id]); |
| | | break; |
| | | case "initLocMast": |
| | | initLocMast(data); |
| | | break; |
| | | } |
| | | }); |
| | | |
| | | function initLocMast(data) { |
| | | function initLocMast() { |
| | | layer.confirm('确定初始化库位数据吗?', { |
| | | skin: 'layui-layer-admin', |
| | | shade: .1 |
| | |
| | | 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}); |
| | | } |
| | |
| | | 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}); |
| | | } |
| | | } |
| | |
| | | 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}); |
| | | } |
| | |
| | | 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(); |
| | | |
| | | }); |
| | |
| | | <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> |