#1
dubin
2026-01-04 97c788f31a57b4e8c3fc8091dc29aab598adeebb
#1
10个文件已修改
703 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/SiteController.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkDetl.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 398 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/MatDto.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/LedThread.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/console.map.js 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/SiteController.java
@@ -14,6 +14,7 @@
import com.zy.core.enums.SlaveType;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.Task;
import com.zy.core.model.command.LiftCommand;
import com.zy.core.model.protocol.StaProtocol;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.DevpThread;
@@ -175,23 +176,27 @@
            Map<Integer, StaProtocol> station = devpThread.getStation();
            for (Map.Entry<Integer, StaProtocol> entry : station.entrySet()) {
                if (siteId.equals(entry.getKey())) {
                    StaProtocol staProtocol = entry.getValue();
                    if (staProtocol == null) {
                        continue;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    if (workNo != null) {
                        staProtocol.setWorkNo(workNo);
                    }
                    if (staNo != null) {
                        staProtocol.setStaNo(staNo);
                    }
                    if (pakMk != null) {
                        staProtocol.setPakMk(pakMk.equals("Y"));
                    }
//                    StaProtocol staProtocol = entry.getValue();
//                    if (staProtocol == null) {
//                        continue;
//                    } else {
//                        staProtocol = staProtocol.clone();
//                    }
//                    if (workNo != null) {
//                        staProtocol.setWorkNo(workNo);
//                    }
//                    if (staNo != null) {
//                        staProtocol.setStaNo(staNo);
//                    }
//                    if (pakMk != null) {
//                        staProtocol.setPakMk(pakMk.equals("Y"));
//                    }
                    LiftCommand command = new LiftCommand();
                    command.setWorkNo(Integer.valueOf(workNo));
                    command.setSourceStaNo(siteId);
                    command.setTargetStaNo(Integer.valueOf(staNo));
                    boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                    boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, command));
                    if (result) {
                        return R.ok();
                    } else {
src/main/java/com/zy/asrs/entity/WrkDetl.java
@@ -424,14 +424,14 @@
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.appeTime);
    }
    public String getCstateid$() {
        KcztMapService service = SpringUtils.getBean(KcztMapService.class);
        KcztMap kcztMap = service.selectOne(new EntityWrapper<KcztMap>().eq("cstateid", this.cstateid));
        if (!Cools.isEmpty(kcztMap)){
            return String.valueOf(kcztMap.getVname());
        }
        return String.valueOf(this.cstateid);
    }
//    public String getCstateid$() {
//        KcztMapService service = SpringUtils.getBean(KcztMapService.class);
//        KcztMap kcztMap = service.selectOne(new EntityWrapper<KcztMap>().eq("cstateid", this.cstateid));
//        if (!Cools.isEmpty(kcztMap)){
//            return String.valueOf(kcztMap.getVname());
//        }
//        return String.valueOf(this.cstateid);
//    }
    public void sync(Object source) {
        Synchro.Copy(source, this);
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -36,6 +36,7 @@
import com.zy.core.thread.LedThread;
import com.zy.core.thread.SiemensDevpThread;
import com.zy.system.service.ConfigService;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -43,6 +44,7 @@
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.util.*;
import java.util.stream.Collectors;
/**
 * 立体仓库WCS系统主流程业务
@@ -122,6 +124,11 @@
                    continue;
                }
                String barcode = barcodeThread.getBarcode();
                if (Cools.isEmpty(barcode)){
                    continue;
                }
                if (staProtocol.isAutoing()
                        && staProtocol.isInEnable()
                        && !staProtocol.isEmptyMk()
@@ -129,10 +136,10 @@
                        && staProtocol.isPakMk()) {
                    News.warnNoLog("" + mark + " - 0" + " - 开始执行");
                    String barcode = barcodeThread.getBarcode();
                    if (!Cools.isEmpty(barcode)) {
                        News.info("" + mark + " - 1" + " - {}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode);
                        if ("NG".endsWith(barcode) || "NoRead".equals(barcode) || "empty".equals(barcode)) {
                        if ("NG".endsWith(barcode) || "No Read".equals(barcode) || "empty".equals(barcode)) {
                            News.info("" + mark + " - 2" + " - 扫码失败1 ===>> {}号条码扫描器检测条码信息:{},站点:{}", inSta.getBarcode(), barcode, inSta.getStaNo());
                            // led 异常显示
                            if (ledThread != null) {
@@ -156,12 +163,12 @@
                    //过滤判断,防止拣料再入库货物,经过入库站再入库时,被退回到退库站
                    WrkMast wrkMast1 = wrkMastMapper.selectPakInStepBarcode(barcode);
                    if (wrkMast1 != null) {
                        if (wrkMast1.getIoType() == 103 || wrkMast1.getIoType() == 107 || wrkMast1.getIoType() == 104) {
                        if (wrkMast1.getIoType() == 103 || wrkMast1.getIoType() == 107 || wrkMast1.getIoType() == 104|| wrkMast1.getIoType() == 53 || wrkMast1.getIoType() == 57 || wrkMast1.getIoType() == 54) {
                            continue;
                        }
                    }
                    if (wrkMast != null) {
                        News.error("" + mark + " - 4" + " - 工作档中已存在该站状态为( 2.设备上走 )的数据,工作号={}", wrkMast.getWrkNo());
                        News.error("" + mark + " - 4" + " - 工作档中已存在该站状态为( 3.开始执行入库任务 )的数据,工作号={}", wrkMast.getWrkNo());
                        // led 异常显示
                        if (ledThread != null) {
@@ -220,6 +227,9 @@
                            barcodeThread.setBarcode("");
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, command));
                            if (result) {
                                News.info("WCS--->PLC下发任务成功:{}",command.toString());
                            }
                            if (!result) {
                                throw new CoolException("更新plc站点信息失败");
                            }
@@ -227,6 +237,7 @@
                            currentWrkMast.setWrkSts(3L);// 3.设备执行中
                            currentWrkMast.setCrnStrTime(new Date());
                            wrkMastService.updateById(currentWrkMast);
                            Thread.sleep(3000); // 延时3S
                        } else {
                            News.error("" + mark + " - 5" + " - 请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response);
@@ -234,6 +245,19 @@
                            if (ledThread != null) {
                                String errorMsg = jsonObject.getString("msg");
                                MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(5, errorMsg));
                            }
                            //托盘退回
//                            LiftCommand command = new LiftCommand();
//                            command.setWorkNo(9998);
//                            command.setSourceStaNo(inSta.getStaNo());
//                            command.setTargetStaNo(inSta.getBackSta());
                            Integer back = 999;
                            barcodeThread.setBarcode("");
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(4, back));
                            if (!result) {
                                throw new CoolException("更新plc站点信息失败");
                            }
                        }
@@ -293,17 +317,18 @@
                            continue;
                        }
                    WrkMast wrkMast = wrkMastMapper.selectPickStep(barcode);
                        WrkMast wrkMast = wrkMastMapper.selectPickStep(barcode);
//                        WrkMast wrkMast = wrkMastMapper.selectPakInStep3(staProtocol.getWorkNo().intValue());
//                        if (wrkMast == null) {
//                            // 无拣料数据
//                            continue;
//                        }
                        if (wrkMast == null) {
                            // 无拣料数据
                            continue;
                        }
                        if ((wrkMast.getIoType() != 103 && wrkMast.getIoType() != 104 && wrkMast.getIoType() != 107)
                                || Cools.isEmpty(wrkMast.getStaNo()) || Cools.isEmpty(wrkMast.getSourceStaNo())) {
                            continue;
                        }
                        // 获取目标站
                        Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
@@ -348,7 +373,7 @@
                            param.setLocType1(locTypeDto.getLocType1());
                            String response = new HttpHandler.Builder()
                                    .setUri(wmsUrl)
                                    .setPath("/rpc/pakin/pick/loc/v1")
                                    .setPath("/rpc/pakin/loc/returnWarehouse")
                                    .setJson(JSON.toJSONString(param))
                                    .build()
                                    .doPost();
@@ -361,12 +386,12 @@
                                    continue;
                                }
                                if(newWrkMast.getWrkSts() != 53 && newWrkMast.getWrkSts() != 57) {
                                if(newWrkMast.getIoType() != 53 && newWrkMast.getIoType() != 57) {
                                    News.error("" + mark + " - 3" + " - 拣选盘点回库工作档类型异常!!! [plc编号:{}]", devp.getId());
                                    continue;
                                }
                                if (wrkMast.getWrkSts() != 2) {
                                if (newWrkMast.getWrkSts() != 2) {
                                    News.error("" + mark + " - 3" + " - 拣选盘点回库工作档状态异常!!! [plc编号:{}]", devp.getId());
                                    continue;
                                }
@@ -445,9 +470,9 @@
            return;
        }
        if (!staProtocol.isOutEnable()) {
            return;
        }
//        if (!staProtocol.isOutEnable()) {
//            return;
//        }
        //检查是否有正在执行的任务
        List<WrkMast> workingWrkMast = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("wrk_sts", 3, 12));
@@ -494,9 +519,9 @@
                continue;
            }
            if (liftProtocol.getWorkNo() <= 0) {
                continue;
            }
//            if (liftProtocol.getWorkNo() <= 0) {
//                continue;
//            }
            if (liftProtocol.getMode() != 1) {
                continue;
@@ -506,23 +531,37 @@
                continue;
            }
            WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", liftProtocol.getWorkNo()));
            if (wrkMast == null) {
                continue;
            }
//            WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", liftProtocol.getWorkNo()));
//            if (wrkMast == null) {
//                continue;
//            }
            if (wrkMast.getWrkSts() == 3) {
                wrkMast.setWrkSts(4L);
                wrkMast.setCrnEndTime(new Date());
                wrkMast.setIoTime(new Date());
                wrkMastService.updateById(wrkMast);
            }else if (wrkMast.getWrkSts() == 12) {
                wrkMast.setWrkSts(14L);
                wrkMast.setCrnEndTime(new Date());
                wrkMast.setIoTime(new Date());
                wrkMastService.updateById(wrkMast);
            }else {
                News.error("未知的工作状态");
            List<WrkMast> wrkMastList = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("wrk_sts", 3,12));
            for (WrkMast wrkMast : wrkMastList) {
                if (wrkMast.getWrkSts() == 3) {
                    String locNo = wrkMast.getLocNo();
                    Integer staNo = Utils.getStaNoByLocNo(locNo);
                    StaProtocol staProtocol = devpThread.getStation().get(staNo);
                    if (staProtocol.getWorkNo() <= 0 || !staProtocol.isLoading() || !staProtocol.isAutoing() || !Integer.valueOf(staProtocol.getWorkNo()).equals(wrkMast.getWrkNo())){
                        continue;
                    }
                    wrkMast.setWrkSts(4L);
                    wrkMast.setCrnEndTime(new Date());
                    //wrkMast.setIoTime(new Date());
                    wrkMastService.updateById(wrkMast);
                }else if (wrkMast.getWrkSts() == 12) {
                    Integer targetStaNo = wrkMast.getStaNo();
                    StaProtocol staProtocol = devpThread.getStation().get(targetStaNo);
                    if (staProtocol.getWorkNo() <= 0 || !staProtocol.isLoading() || !staProtocol.isAutoing() || !Integer.valueOf(staProtocol.getWorkNo()).equals(wrkMast.getWrkNo())){
                        continue;
                    }
                    wrkMast.setWrkSts(14L);
                    wrkMast.setCrnEndTime(new Date());
                    //wrkMast.setIoTime(new Date());
                    wrkMastService.updateById(wrkMast);
                }else {
                    News.error("未知的工作状态");
                }
            }
        }
    }
@@ -659,8 +698,6 @@
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId());
            // 命令集合
            List<LedCommand> commands = new ArrayList<>();
//            // 工作档集合
//            List<WrkMast> wrkMasts = new ArrayList<>();
            List<Integer> workNoList = new ArrayList<>();
            for (Integer staNo : led.getStaArr()) {
                // 获取叉车站点
@@ -678,8 +715,7 @@
                String barcode = null;
                // 获取工作档数据
                WrkMast wrkMast = wrkMastMapper.selectById(staProtocol.getWorkNo());
//                if (null == wrkMast || wrkMast.getWrkSts() < 14 || wrkMast.getIoType() < 100) { continue; }
                WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no",staProtocol.getWorkNo()).in("io_type",101,103,104,107));
                if (null == wrkMast) {
                    List<WrkMastLog> wrkMastLogs = wrkMastLogService.selectList(new EntityWrapper<WrkMastLog>()
                            .eq("wrk_no", staProtocol.getWorkNo())
@@ -751,63 +787,47 @@
                ledCommand.setLocNo(locNo);
                ledCommand.setStaNo(targetStaNo);
                ledCommand.setBarcode(barcode);
//                ledCommand.setSourceStaNo(wrkMast.getSourceStaNo());
                // 修改开始:处理多个wrkDetl,不合并
                if (ioType != 110 && ioType != 10) {
                    List<WrkDetl> wrkDetls = wrkDetlService.findByWorkNo(wrkNo);
                    if (!wrkDetls.isEmpty()) {
                        WrkDetl wrkDetl = wrkDetls.get(0);
                        double anfme = 0D;
                        double weight = 0D;
                        for (WrkDetl detl : wrkDetls) {
                            anfme += detl.getAnfme();
                            weight += detl.getWeight();
                            wrkDetl.setAnfme(anfme);
                            wrkDetl.setWeight(weight);
                        }
                        // 获取库存信息
                        List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>()
                                .eq("loc_no", wrkMast.getSourceLocNo()));
                        double totalAnfme = 0D;
                        double totalWeight = 0D;
                        for (LocDetl locDetl : locDetls) {
                            totalAnfme += locDetl.getAnfme();
                            totalWeight += locDetl.getWeight();
//                        totalWeight += locDetl.getWeight();
                        }
                        wrkDetl.setStockNum(totalAnfme);
                        wrkDetl.setStockNum2(totalWeight);
                        ledCommand.getMatDtos().add(new MatDto(
                                wrkDetl.getMatnr()
                                , wrkDetl.getMaktx()
                                , wrkDetl.getAnfme()
                                , wrkDetl.getWeight()
                                , wrkDetl.getStockNum()
                                , wrkDetl.getStockNum2()
                                , wrkDetl.getSpecs()
                                , wrkDetl.getSku()
                                , wrkDetl.getZpallet()
                                , wrkDetl.getModel()
                                , wrkDetl.getSupp()
                                , wrkDetl.getKpCstmrName()
                                , wrkDetl.getOrderNo()
                                , wrkDetl.getCstateid$()
                        ));
                    }else {
                        // 为每个WrkDetl创建独立的MatDto
                        for (WrkDetl wrkDetl : wrkDetls) {
                            // 注意:这里使用每个wrkDetl的原始数据,不合并
                            ledCommand.getMatDtos().add(new MatDto(
                                    wrkDetl.getMatnr()
                                    , wrkDetl.getMaktx()
                                    , wrkDetl.getAnfme()  // 使用单个物料的数量,不累加
                                    , wrkDetl.getWeight() // 使用单个物料的重量,不累加
                                    , totalAnfme          // 库存总数(这个是正常的)
                                    , totalWeight         // 库存总重量(这个是正常的)
                                    , wrkDetl.getSpecs()
                                    , wrkDetl.getSku()
                                    , wrkDetl.getZpallet()
                                    , wrkDetl.getModel()
                                    , wrkDetl.getSupp()
                                    , wrkDetl.getKpCstmrName()
                                    , wrkDetl.getOrderNo()
                                    , wrkDetl.getBatch()
//                                , wrkDetl.getCstateid$()
                            ));
                        }
                    } else {
                        List<WrkDetlLog> wrkDetlLogs = wrkDetlLogService.selectTodayByWrkNo(wrkNo);
                        if(!wrkDetlLogs.isEmpty()) {
                            WrkDetlLog wrkDetlLog = wrkDetlLogs.get(0);
                            double anfme = 0D;
                            double weight = 0D;
                            for (WrkDetlLog detl : wrkDetlLogs) {
                                anfme += detl.getAnfme();
                                weight += detl.getWeight();
                                wrkDetlLog.setAnfme(anfme);
                                wrkDetlLog.setWeight(weight);
                            }
                        if (!wrkDetlLogs.isEmpty()) {
                            // 获取库存信息
                            List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>()
                                    .eq("loc_no", sourceLocNo));
                            double totalAnfme = 0D;
@@ -816,29 +836,33 @@
                                totalAnfme += locDetl.getAnfme();
                                totalWeight += locDetl.getWeight();
                            }
                            wrkDetlLog.setStockNum(totalAnfme);
                            wrkDetlLog.setStockNum2(totalWeight);
                            ledCommand.getMatDtos().add(new MatDto(
                                    wrkDetlLog.getMatnr()
                                    , wrkDetlLog.getMaktx()
                                    , wrkDetlLog.getAnfme()
                                    , wrkDetlLog.getWeight()
                                    , wrkDetlLog.getStockNum()
                                    , wrkDetlLog.getStockNum2()
                                    , wrkDetlLog.getSpecs()
                                    , wrkDetlLog.getSku()
                                    , wrkDetlLog.getZpallet()
                                    , wrkDetlLog.getModel()
                                    , wrkDetlLog.getSupp()
                                    , wrkDetlLog.getKpCstmrName()
                                    , wrkDetlLog.getOrderNo()
                                    , wrkDetlLog.getCstateid$()
                            ));
                            // 为每个WrkDetlLog创建独立的MatDto
                            for (WrkDetlLog wrkDetlLog : wrkDetlLogs) {
                                // 注意:这里使用每个wrkDetlLog的原始数据,不合并
                                ledCommand.getMatDtos().add(new MatDto(
                                        wrkDetlLog.getMatnr()
                                        , wrkDetlLog.getMaktx()
                                        , wrkDetlLog.getAnfme()  // 使用单个物料的数量,不累加
                                        , wrkDetlLog.getWeight() // 使用单个物料的重量,不累加
                                        , totalAnfme              // 库存总数
                                        , totalWeight             // 库存总重量
                                        , wrkDetlLog.getSpecs()
                                        , wrkDetlLog.getSku()
                                        , wrkDetlLog.getZpallet()
                                        , wrkDetlLog.getModel()
                                        , wrkDetlLog.getSupp()
                                        , wrkDetlLog.getKpCstmrName()
                                        , wrkDetlLog.getOrderNo()
                                        , wrkDetlLog.getBatch()
//                                    , wrkDetlLog.getCstateid$()
                                ));
                            }
                        }
                    }
                }
                // 修改结束
                commands.add(ledCommand);
            }
            Set<Integer> workNos = new HashSet<>(workNoList);
@@ -848,29 +872,11 @@
            if (CollectionUtils.equals(ledThread.getWorkNos(), workNos)) {
                continue;
            }
//             命令下发 -------------------------------------------------------------------------------
//            if (!commands.isEmpty()) {
//                if (led.getId() < 7) {
//                    if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, commands))) {
//                        News.error(""+mark+" - 2"+" - {}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
//                        continue;
//                    } else {
//                        ledThread.setLedMk(false);
//                    }
//                } else {
//                    if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(1, commands))) {
//                        News.error(""+mark+" - 3"+" - {}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
//                        continue;
//                    } else {
//                        ledThread.setLedMk(false);
//                    }
//                }
//
//            }
            // 命令下发 -------------------------------------------------------------------------------
            if (!commands.isEmpty()) {
                if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, commands))) {
                    News.error("{}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
                    News.error("{}号LED命令下发失败--->出库!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
                    continue;
                } else {
                    ledThread.setLedMk(false);
@@ -918,10 +924,14 @@
            for (Integer staNo : led.getStaArr()) {
                // 获取叉车站点
                StaProtocol staProtocol = devpThread.getStation().get(staNo);
                StaProtocol staProtocol1 = devpThread.getStation().get(122);
                if (staProtocol == null) {
                    continue;
                }
                if (staProtocol.getWorkNo() != 0 && staProtocol.isLoading()) {
                if (staProtocol1 == null) {
                    continue;
                }
                if ((staProtocol.getWorkNo() != 0 && staProtocol.isLoading()) || (staProtocol1.getWorkNo() != 0 || staProtocol1.isLoading())) {
                    reset = false;
                    break;
                }
@@ -932,7 +942,7 @@
            if (reset && !ledThread.isLedMk()) {
                ledThread.setLedMk(true);
                if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(4, new ArrayList<>()))) {
                    News.error("" + mark + " - 1" + " - {}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
                    News.error("" + mark + " - 1" + " - {}号LED命令下发失败--->复位!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
                } else {
                }
@@ -940,4 +950,144 @@
        }
        News.infoNoLog("" + mark + " - 0" + " - 执行完成:其他  ===>> LED显示器复位,显示默认信息");
    }
}
    public void ledExecuteIn(Integer mark) {
        for (LedSlave led : slaveProperties.getLed()) {
            // 命令集合
            List<LedCommand> commands = new ArrayList<>();
            List<Integer> workNoList = new ArrayList<>();
            // 入库工作档 - 这里可能需要添加更多查询条件,确保只获取该LED对应的工作档
            WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>()
                            .eq("wrk_sts", 3)
                            .in("io_type", 1, 53, 54, 57)
                    // 可能需要添加LED关联条件,例如站点编号等
            );
            if (wrkMast == null) {
                continue;  // 没有工作档,继续处理下一个LED
            }
            Integer wrkNo = wrkMast.getWrkNo();
            Integer ioType = wrkMast.getIoType();
            String sourceLocNo = wrkMast.getSourceLocNo();
            String locNo = wrkMast.getLocNo();
            Integer targetStaNo = wrkMast.getStaNo();
            String barcode = wrkMast.getBarcode();
            workNoList.add(wrkNo);
            // 组装命令
            LedCommand ledCommand = new LedCommand();
            ledCommand.setWorkNo(wrkNo);
            ledCommand.setIoType(ioType);
            // 入库模式 - 修复了case 54和57的描述
            switch (ioType) {
                case 1:
                    ledCommand.setTitle("全板入库");
                    break;
                case 53:
                    ledCommand.setTitle("拣料入库");
                    break;
                case 54:
                    ledCommand.setTitle("并板入库");  // 修正:应该是并板入库,不是盘点入库
                    break;
                case 57:
                    ledCommand.setTitle("盘点入库");  // 修正:应该是盘点入库,不是并板入库
                    break;
                default:
                    // 可选的错误处理
                    continue;  // 跳过不支持的ioType
            }
            ledCommand.setSourceLocNo(sourceLocNo);
            ledCommand.setLocNo(locNo);
            ledCommand.setStaNo(targetStaNo);
            ledCommand.setBarcode(barcode);
            List<WrkDetl> wrkDetls = wrkDetlService.findByWorkNo(wrkNo);
            // 即使wrkDetls为空,也应该处理LED命令(可能某些入库类型不需要物料明细)
            if (!wrkDetls.isEmpty()) {
                // 获取库存信息
                List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>()
                        .eq("loc_no", sourceLocNo));  // 使用sourceLocNo而不是wrkMast.getSourceLocNo()
                double totalAnfme = 0D;
                double totalWeight = 0D;
                for (LocDetl locDetl : locDetls) {
                    totalAnfme += locDetl.getAnfme();
                    totalWeight += locDetl.getWeight();  // 如果数据库有weight字段,应该加上
                }
                // 为每个WrkDetl创建独立的MatDto
                for (WrkDetl wrkDetl : wrkDetls) {
                    ledCommand.getMatDtos().add(new MatDto(
                            wrkDetl.getMatnr(),
                            wrkDetl.getMaktx(),
                            wrkDetl.getAnfme(),   // 使用单个物料的数量
                            wrkDetl.getWeight(),  // 使用单个物料的重量
                            totalAnfme,           // 库存总数
                            totalWeight,          // 库存总重量
                            wrkDetl.getSpecs(),
                            wrkDetl.getSku(),
                            wrkDetl.getZpallet(),
                            wrkDetl.getModel(),
                            wrkDetl.getSupp(),
                            wrkDetl.getKpCstmrName(),
                            wrkDetl.getOrderNo(),
                            wrkDetl.getBatch()
                    ));
                }
            }
            // 即使没有物料明细,也应该添加LED命令(某些入库类型可能不需要显示物料)
            commands.add(ledCommand);
            Set<Integer> workNos = new HashSet<>(workNoList);
            // 获取LED线程
            LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led.getId());
            if (ledThread == null) {
                News.error("未找到LED线程:[id:{}]", led.getId());
                continue;
            }
            // 相同工作号集合则过滤
            if (CollectionUtils.equals(ledThread.getWorkNos(), workNos)) {
                continue;
            }
            // 命令下发 -------------------------------------------------------------------------------
            if (!commands.isEmpty()) {
                if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, commands))) {
                    News.error("{}号LED命令下发失败--->入库!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
                    continue;
                } else {
                    ledThread.setLedMk(false);
                }
            }
            try {
                // 修改主档led标记
                // 注意:这里只需要更新当前工作档,不需要循环
                WrkMast wrkMastToUpdate = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", wrkNo));
                if (wrkMastToUpdate != null) {
                    wrkMastToUpdate.setOveMk("Y");
                    wrkMastToUpdate.setModiTime(new Date());
                    if (wrkMastMapper.updateById(wrkMastToUpdate) == 0) {
                        News.errorNoLog("" + mark + " - 4" + " - 更新工作档失败");
                        throw new CoolException("更新工作档失败");
                    }
                }
                // 更新线程当前工作号集合
                ledThread.setWorkNos(workNos);
            } catch (Exception e) {
                e.printStackTrace();
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            }
        }
    }
}
src/main/java/com/zy/common/model/MatDto.java
@@ -20,7 +20,7 @@
    private String specs;
    // 物料数量
    private Double count;
    private Double anfme;
    // 库位数量
    private Double total;
@@ -49,17 +49,20 @@
    //单号
    private String orderNo;
    private String cstateid;
    //批号
    private String batch;
//    private String cstateid;
    public MatDto() {
    }
    public MatDto(String matNo, String maktx, Double count, Double weight, Double total, Double totalWeight, String specs, String sku, String barcode, String model, String supp, String kpCstmrName, String orderNo, String cstateid) {
    public MatDto(String matNo, String maktx, Double anfme, Double weight, Double total, Double totalWeight, String specs, String sku, String barcode, String model, String supp, String kpCstmrName, String orderNo, String batch) {
        this.matnr = matNo;
        this.maktx = maktx;
        this.maknx = maktx;
        this.specs = specs;
        this.count = count;
        this.anfme = anfme;
        this.weight = weight;
        this.total = total;
        this.totalWeight = totalWeight;
@@ -69,6 +72,7 @@
        this.supp = supp;
        this.kpCstmrName = kpCstmrName;
        this.orderNo = orderNo;
        this.cstateid = cstateid;
        this.batch = batch;
//        this.cstateid = cstateid;
    }
}
src/main/java/com/zy/core/MainProcess.java
@@ -54,6 +54,8 @@
//                    mainService.recCrnErr(3);
                    // 出库  ===>> 工作档信息写入led显示器
                    mainService.ledExecute(4);
                    // 入库 ===>> 工作档信息写入led显示器
                    mainService.ledExecuteIn(6);
                    // 其他  ===>> LED显示器复位,显示默认信息
                    mainService.ledReset(5);
src/main/java/com/zy/core/thread/LedThread.java
@@ -122,7 +122,7 @@
            if (!command.isEmptyMk()) {
                for (MatDto matDto : command.getMatDtos()) {
                    //去掉小数点
                    String strQty = matDto.getCount().toString();
                    String strQty = matDto.getAnfme().toString();
                    int idx = strQty.lastIndexOf(".");
                    if(idx >= 0){
                        strQty.substring(0,idx);
@@ -214,7 +214,7 @@
            if (!command.isEmptyMk()) {
                for (MatDto matDto : command.getMatDtos()) {
                    sb.append("物料编码:").append(matDto.getMatnr()).append("\n");
                    sb.append("数量:").append(matDto.getCount()).append("\n");
                    sb.append("数量:").append(matDto.getAnfme()).append("\n");
                    sb.append("规格:").append(matDto.getSpecs()).append("\n");
                }
            }
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -53,7 +53,7 @@
        add(100);add(101);add(102);add(103);add(104);
        add(105);add(106);add(107);add(108);add(109);
        add(110);add(111);add(112);add(113);add(114);
        add(115);add(116);add(117);add(118);add(119);add(120);
        add(115);add(116);add(117);add(118);add(119);add(120);add(122);
    }};
    public static final ArrayList<Integer> barcode1 = new ArrayList<Integer>() {{
@@ -132,6 +132,8 @@
                        break;
                    case 3:
                        writeIoMode((Integer) task.getData());
                    case 4:
                        writeBack((Integer) task.getData());
                    default:
                        break;
                }
@@ -195,7 +197,7 @@
    private void read() throws InterruptedException {
        ArrayList<Integer> staNos = getStaNo();
        int staNoSize = staNos.size();
        OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (staNoSize * 13));
        OperateResultExOne<byte[]> result = siemensS7Net.Read("DB301.0", (short) (staNoSize * 14));
        if (result.IsSuccess) {
            for (int i = 0; i < staNoSize; i++) {
                Integer siteId = staNos.get(i); // 站点编号
@@ -206,18 +208,31 @@
                    station.put(siteId, staProtocol);
                }
                staProtocol.setSiteId(siteId);
                staProtocol.setWorkNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, (i * 13)));     // 工作号
                staProtocol.setStaNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, (i * 13) + 4));   // 目标站
                staProtocol.setLocHeight(siemensS7Net.getByteTransform().TransInt16(result.Content, (i * 13) + 8));//库位高度
                staProtocol.setError(siemensS7Net.getByteTransform().TransInt16(result.Content, (i * 13) + 10));   // 报警
                staProtocol.setWorkNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, (i * 14)));     // 工作号
                staProtocol.setStaNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, (i * 14) + 4));   // 目标站
                staProtocol.setLocHeight(siemensS7Net.getByteTransform().TransInt16(result.Content, (i * 14) + 8));//库位高度
                staProtocol.setError(siemensS7Net.getByteTransform().TransInt16(result.Content, (i * 14) + 10));   // 报警
                boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, (i * 13) + 12, 1);
                boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, (i * 14) + 12, 1);
                staProtocol.setAutoing(status[0]);  // 自动
                staProtocol.setLoading(status[1]);  // 有物
                staProtocol.setInEnable(status[2]); // 可入
                staProtocol.setOutEnable(status[3]);// 可出
                staProtocol.setEmptyMk(status[4]);  // 空板信号
                staProtocol.setFullPlt(status[5]);  // 满托盘
                //122 提升机单独读取
                if (siteId == 122){
                    staProtocol.setSiteId(siteId);
                    OperateResultExOne<byte[]> result3 = siemensS7Net.Read("DB301.308", (short) 10);
                    OperateResultExOne<byte[]> result4 = siemensS7Net.Read("DB301.306", (short) 1);
                    staProtocol.setWorkNo((short) siemensS7Net.getByteTransform().TransInt32(result3.Content, 6)); //工作号
                    staProtocol.setAutoing(siemensS7Net.getByteTransform().TransInt16(result3.Content, 0) == 1); //自动
                    boolean[] booleans = siemensS7Net.getByteTransform().TransBool(result4.Content, 0, 1);
                    staProtocol.setLoading(booleans[1]); //1 有物  0 无物
                }
                if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
                    staProtocol.setPakMk(true);
@@ -227,19 +242,19 @@
        //任务信息反馈
        Thread.sleep(200);
        OperateResultExOne<byte[]> result3 = siemensS7Net.Read("DB101.400", (short) 10);
        OperateResultExOne<byte[]> result3 = siemensS7Net.Read("DB301.308", (short) 10);
        if (result3.IsSuccess) {
            liftProtocol.setMode(siemensS7Net.getByteTransform().TransInt16(result3.Content, 0));     // 模式
            liftProtocol.setDeviceStatus(siemensS7Net.getByteTransform().TransInt16(result3.Content, 2));     // 设备状态
            liftProtocol.setTaskStatus(siemensS7Net.getByteTransform().TransInt16(result3.Content, 4));     // 完成信号
            liftProtocol.setWorkNo((short) siemensS7Net.getByteTransform().TransInt32(result3.Content, 6));     // 工作号
            liftProtocol.setIoMode(siemensS7Net.getByteTransform().TransInt16(result3.Content, 10));     // 出入库模式
            liftProtocol.setIoMode(siemensS7Net.getByteTransform().TransInt16(result3.Content, 8));     // 出入库模式
        }
        //温湿度信息反馈
        Thread.sleep(200);
        ArrayList<Integer> temperatureList = getTemperature();
        OperateResultExOne<byte[]> result4 = siemensS7Net.Read("DB101.300", (short) (temperatureList.size() * 4));
        OperateResultExOne<byte[]> result4 = siemensS7Net.Read("DB301.300", (short) (temperatureList.size() * 4));
        if (result4.IsSuccess) {
            for (int i = 0; i < temperatureList.size(); i++) {
                Integer deviceId = temperatureList.get(i); // 编号
@@ -258,7 +273,7 @@
        Thread.sleep(200);
        ArrayList<Integer> barcodeList = getBarcode();
        int barcodeSize = barcodeList.size();
        OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB103.0", (short) (barcodeSize * 8));
        OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB4.0", (short) (barcodeSize * 8));
        if (result2.IsSuccess) {
            for (int i = 0; i < barcodeSize; i++) {
                String barcode = siemensS7Net.getByteTransform().TransString(result2.Content, i * 8, 8, "UTF-8");
@@ -286,7 +301,7 @@
            deviceDataLogTime = System.currentTimeMillis();
        }
        if (result.IsSuccess && result2.IsSuccess) {
        if (result.IsSuccess && result2.IsSuccess && result3.IsSuccess && result4.IsSuccess) {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
        } else {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】读取输送线plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
@@ -305,7 +320,7 @@
        array[1] = liftCommand.getSourceStaNo();
        array[2] = liftCommand.getTargetStaNo();
        OperateResult write = siemensS7Net.Write("DB100.0", array);
        OperateResult write = siemensS7Net.Write("DB300.0", array);
        if (!write.IsSuccess) {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线站点数据失败。输送线plc编号={1},站点数据={2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(liftCommand)));
@@ -326,7 +341,7 @@
        short[] array = new short[1];
        array[0] = ioMode.shortValue();
        OperateResult write = siemensS7Net.Write("DB100.12", array);
        OperateResult write = siemensS7Net.Write("DB300.12", array);
        if (!write.IsSuccess) {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入出入库模式数据失败。输送线plc编号={1},站点数据={2}", DateUtils.convert(new Date()), slave.getId(), ioMode));
@@ -338,6 +353,27 @@
    }
    /**
     * 写入命令
     */
    private void writeBack(Integer back) {
        if (null == back) {
            return;
        }
        short[] array = new short[1];
        array[0] = back.shortValue();
        OperateResult write = siemensS7Net.Write("DB300.14", array);
        if (!write.IsSuccess) {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入托盘退回数据失败。输送线plc编号={1},站点数据={2}", DateUtils.convert(new Date()), slave.getId(), back));
            News.error("SiemensDevp"+" - 4"+" - 写入托盘退回数据失败。输送线plc编号={},站点数据={}", slave.getId(), back);
        } else {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 托盘退回命令下发 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), back));
            News.info("SiemensDevp"+" - 5"+" - 托盘退回命令下发 [id:{}] >>>>> 命令下发: {}",  slave.getId(), back);
        }
    }
    /**
     * 设置入库标记
     */
    @Override
src/main/resources/application.yml
@@ -8,7 +8,7 @@
    name: @pom.build.finalName@
  datasource:
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    url: jdbc:sqlserver://127.0.0.1:1433;databasename=shhtgcasrs
    url: jdbc:sqlserver://127.0.0.1:52840;databasename=shhtgcasrs
    username: sa
    password: sa@123
  mvc:
@@ -55,42 +55,42 @@
  # 输送线1
  devp[0]:
    id: 1
    ip: 172.17.60.100
    ip: 172.168.61.123
    port: 102
    rack: 0
    slot: 0
    # 入库口1
    inSta[0]:
      staNo: 1009
      staNo: 101
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 1008
      backSta: 100
      led: ${wcs-slave.led[0].id}
    # 空板入库口1
    emptyInSta[0]:
      staNo: 1076
      staNo: 101
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 1075
      backSta: 100
      led: ${wcs-slave.led[0].id}
    # 拣料入库口1
    pickSta[0]:
      staNo: 1059
      staNo: 101
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 1059
      backSta: 100
      led: ${wcs-slave.led[0].id}
    # 出库口1
    outSta[0]:
      staNo: 102
      staNo: 101
      led: ${wcs-slave.led[0].id}
  # 条码扫描仪1
  barcode[0]:
    id: 1
    ip: 10.10.10.121
    ip: 172.168.61.127
    port: 51236
  # LED1
  led[0]:
    id: 1
    ip: 127.0.0.1
    ip: 172.168.61.201
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 1009
    staArr: 101
    crnId: 1
src/main/resources/mapper/WrkMastMapper.xml
@@ -87,7 +87,7 @@
        select top 1 * from asr_wrk_mast where source_sta_no=#{sourceStaNo} and wrk_sts=2 and barcode=#{barcode} and (io_type=1 or io_type=10) order by io_pri desc,io_time,wrk_no ASC
    </select>
    <select id="selectPakInStepBarcode" resultMap="BaseResultMap">
        select top 1 * from dbo.asr_wrk_mast where  barcode = #{barcode}
        select top 1 * from dbo.asr_wrk_mast where barcode = #{barcode}
    </select>
    <select id="selectPakInStep11" resultMap="BaseResultMap">
src/main/webapp/static/js/console.map.js
@@ -1 +1,141 @@
mapInfo = {"mapName":"YTFLWCS","rackCount":16,"crnCount":4,"stbCount":16,"hpPosition":0,"minBayNo":2,"floors":1,"racks":[{"type":"rack","id":"rack23","top":558,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},{"type":"rack","id":"rack26","top":631,"left":642,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},{"type":"rack","id":"rack25","top":612,"left":642,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},{"type":"rack","id":"rack24","top":577,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},{"type":"rack","id":"rack19","top":469,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},{"type":"rack","id":"rack22","top":539,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},{"type":"rack","id":"rack21","top":519,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},{"type":"rack","id":"rack20","top":488,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},{"type":"rack","id":"rack4","top":122,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":61},{"type":"rack","id":"rack5","top":141,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":61},{"type":"rack","id":"rack111","top":49,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":61},{"type":"rack","id":"rack15","top":376,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},{"type":"rack","id":"rack18","top":449,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},{"type":"rack","id":"rack17","top":430,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},{"type":"rack","id":"rack16","top":396,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},{"type":"rack","id":"rack11","top":287,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},{"type":"rack","id":"rack14","top":357,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},{"type":"rack","id":"rack13","top":337,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},{"type":"rack","id":"rack12","top":307,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},{"type":"rack","id":"rack7","top":193,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},{"type":"rack","id":"rack10","top":268,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},{"type":"rack","id":"rack9","top":249,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},{"type":"rack","id":"rack8","top":212,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},{"type":"rack","id":"rack2","top":83,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":61},{"type":"rack","id":"rack3","top":103,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":61},{"type":"rack","id":"rack6","top":174,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31}],"crns":[{"type":"track","id":"lb_track8","text":"","top":76,"left":1327,"width":1,"height":93},{"type":"track","id":"lb_track7","text":"","top":75,"left":596,"width":733,"height":1},{"type":"track","id":"lb_track1","text":"","top":604,"left":593,"width":733,"height":1},{"type":"track","id":"lb_track2","text":"","top":513,"left":595,"width":733,"height":1},{"type":"crane","id":"crn-5","text":"5","top":507,"left":731,"width":67,"height":13},{"type":"crane","id":"crn-6","text":"6","top":597,"left":731,"width":67,"height":13},{"type":"crane","id":"crn-1","text":"1","top":162,"left":730,"width":67,"height":13},{"type":"track","id":"lb_track3","text":"","top":424,"left":593,"width":733,"height":1},{"type":"crane","id":"crn-2","text":"2","top":234,"left":741,"width":67,"height":13},{"type":"track","id":"lb_track4","text":"","top":333,"left":593,"width":733,"height":1},{"type":"crane","id":"crn-3","text":"3","top":325,"left":730,"width":67,"height":13},{"type":"track","id":"lb_track5","text":"","top":241,"left":595,"width":733,"height":1},{"type":"track","id":"lb_track6","text":"","top":168,"left":596,"width":733,"height":1},{"type":"crane","id":"crn-4","text":"4","top":417,"left":730,"width":67,"height":13}],"areas":[{"type":"Control_floor","id":"tabControl_floor1","text":"楼层","top":41,"left":80,"width":1269,"height":781,"floors":[{"type":"floor","id":"page_floor1","text":"1F","top":4,"left":22,"width":1243,"height":773,"stns":[{"type":"stn","id":"site-1064","text":"1064","top":720,"left":769,"width":59,"height":20},{"type":"stn","id":"site-2003","text":"2003","top":456,"left":309,"width":37,"height":20},{"type":"stn","id":"site-2002","text":"2002","top":455,"left":221,"width":37,"height":20},{"type":"stn","id":"site-1004","text":"1004","top":334,"left":296,"width":37,"height":20},{"type":"stn","id":"site-1002","text":"1002","top":291,"left":296,"width":37,"height":20},{"type":"stn","id":"site-1006","text":"1006","top":312,"left":296,"width":37,"height":20},{"type":"stn","id":"site-1007","text":"1007","top":312,"left":258,"width":37,"height":20},{"type":"stn","id":"site-1003","text":"1003","top":312,"left":220,"width":37,"height":20},{"type":"stn","id":"site-1075","text":"1075","top":723,"left":406,"width":71,"height":20},{"type":"stn","id":"site-1076","text":"1076","top":701,"left":406,"width":71,"height":20},{"type":"stn","id":"site-1077","text":"1077","top":679,"left":406,"width":71,"height":20},{"type":"stn","id":"site-1078","text":"1078","top":657,"left":406,"width":71,"height":20},{"type":"stn","id":"site-1079","text":"1079","top":598,"left":406,"width":71,"height":57},{"type":"stn","id":"site-1047","text":"1047","top":578,"left":405,"width":93,"height":17},{"type":"stn","id":"site-1081","text":"1081","top":417,"left":405,"width":71,"height":158},{"type":"stn","id":"site-1034","text":"1034","top":398,"left":405,"width":95,"height":17},{"type":"stn","id":"site-1083","text":"1083","top":320,"left":405,"width":71,"height":75},{"type":"stn","id":"site-1084","text":"1084","top":198,"left":405,"width":71,"height":121},{"type":"stn","id":"site-1059","text":"1059","top":700,"left":480,"width":161,"height":20},{"type":"stn","id":"site-1018","text":"1018","top":178,"left":405,"width":95,"height":17},{"type":"stn","id":"site-1086","text":"1086","top":146,"left":406,"width":71,"height":30},{"type":"stn","id":"site-1087","text":"1087","top":125,"left":406,"width":71,"height":19},{"type":"stn","id":"site-1088","text":"1088","top":105,"left":406,"width":71,"height":19},{"type":"stn","id":"site-1074","text":"1074","top":678,"left":1141,"width":59,"height":20},{"type":"stn","id":"site-1073","text":"1073","top":657,"left":1141,"width":59,"height":20},{"type":"stn","id":"site-1071","text":"1071","top":678,"left":1017,"width":59,"height":20},{"type":"stn","id":"site-1072","text":"1072","top":657,"left":1079,"width":59,"height":20},{"type":"stn","id":"site-1070","text":"1070","top":657,"left":1017,"width":59,"height":20},{"type":"stn","id":"site-1069","text":"1069","top":657,"left":955,"width":59,"height":20},{"type":"stn","id":"site-1068","text":"1068","top":678,"left":893,"width":59,"height":20},{"type":"stn","id":"site-1067","text":"1067","top":657,"left":893,"width":59,"height":20},{"type":"stn","id":"site-1066","text":"1066","top":657,"left":831,"width":59,"height":20},{"type":"stn","id":"site-1065","text":"1065","top":700,"left":707,"width":59,"height":20},{"type":"stn","id":"site-1063","text":"1063","top":700,"left":769,"width":59,"height":20},{"type":"stn","id":"site-1062","text":"1062","top":678,"left":769,"width":59,"height":20},{"type":"stn","id":"site-1061","text":"1061","top":657,"left":769,"width":59,"height":20},{"type":"stn","id":"site-1058","text":"1058","top":721,"left":645,"width":59,"height":20},{"type":"stn","id":"site-1057","text":"1057","top":700,"left":645,"width":59,"height":20},{"type":"stn","id":"site-1056","text":"1056","top":678,"left":645,"width":59,"height":20},{"type":"stn","id":"site-1060","text":"1060","top":657,"left":707,"width":59,"height":20},{"type":"stn","id":"site-1055","text":"1055","top":657,"left":645,"width":59,"height":20},{"type":"stn","id":"site-1054","text":"1054","top":657,"left":574,"width":67,"height":20},{"type":"stn","id":"site-1053","text":"1053","top":657,"left":479,"width":91,"height":20},{"type":"stn","id":"site-1052","text":"1052","top":614,"left":573,"width":67,"height":17},{"type":"stn","id":"site-1051","text":"1051","top":597,"left":502,"width":67,"height":58},{"type":"stn","id":"site-1049","text":"1049","top":577,"left":571,"width":67,"height":17},{"type":"stn","id":"site-1048","text":"1048","top":578,"left":501,"width":67,"height":17},{"type":"stn","id":"site-1045","text":"1045","top":523,"left":571,"width":67,"height":17},{"type":"stn","id":"site-1044","text":"1044","top":506,"left":501,"width":67,"height":69},{"type":"stn","id":"site-1042","text":"1042","top":488,"left":571,"width":67,"height":17},{"type":"stn","id":"site-1041","text":"1041","top":466,"left":501,"width":67,"height":39},{"type":"stn","id":"site-1039","text":"1039","top":433,"left":571,"width":67,"height":17},{"type":"stn","id":"site-1038","text":"1038","top":418,"left":501,"width":67,"height":45},{"type":"stn","id":"site-1036","text":"1036","top":397,"left":571,"width":67,"height":17},{"type":"stn","id":"site-1035","text":"1035","top":398,"left":501,"width":67,"height":17},{"type":"stn","id":"site-1032","text":"1032","top":342,"left":571,"width":67,"height":17},{"type":"stn","id":"site-1031","text":"1031","top":322,"left":501,"width":67,"height":73},{"type":"stn","id":"site-1029","text":"1029","top":308,"left":571,"width":67,"height":17},{"type":"stn","id":"site-1028","text":"1028","top":280,"left":501,"width":67,"height":40},{"type":"stn","id":"site-1026","text":"1026","top":250,"left":571,"width":67,"height":17},{"type":"stn","id":"site-1025","text":"1025","top":248,"left":501,"width":67,"height":29},{"type":"stn","id":"site-1023","text":"1023","top":212,"left":571,"width":67,"height":17},{"type":"stn","id":"site-1022","text":"1022","top":198,"left":501,"width":67,"height":48},{"type":"stn","id":"site-1020","text":"1020","top":177,"left":571,"width":67,"height":17},{"type":"stn","id":"site-1019","text":"1019","top":178,"left":502,"width":67,"height":17},{"type":"stn","id":"site-1016","text":"1016","top":142,"left":571,"width":67,"height":17},{"type":"stn","id":"site-1015","text":"1015","top":129,"left":502,"width":67,"height":46},{"type":"stn","id":"site-1012","text":"1012","top":105,"left":502,"width":67,"height":23},{"type":"stn","id":"site-1008","text":"1008","top":82,"left":337,"width":67,"height":21},{"type":"stn","id":"site-1009","text":"1009","top":82,"left":406,"width":95,"height":21},{"type":"stn","id":"site-1010","text":"1010","top":82,"left":502,"width":67,"height":21},{"type":"stn","id":"site-1013","text":"1013","top":105,"left":571,"width":67,"height":17}]}]}]}
mapInfo =
    {"mapName":"YTFLWCS","rackCount":16,"crnCount":4,"stbCount":16,"hpPosition":0,"minBayNo":2,"floors":1,
        "racks":[
            // {"type":"rack","id":"rack23","top":558,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},
            // {"type":"rack","id":"rack26","top":631,"left":642,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},
            // {"type":"rack","id":"rack25","top":612,"left":642,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},
            // {"type":"rack","id":"rack24","top":577,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},
            // {"type":"rack","id":"rack19","top":469,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},
            // {"type":"rack","id":"rack22","top":539,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},
            // {"type":"rack","id":"rack21","top":519,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},
            // {"type":"rack","id":"rack20","top":488,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},
            // {"type":"rack","id":"rack4","top":122,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":61},
            // {"type":"rack","id":"rack5","top":141,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":61},
            // {"type":"rack","id":"rack111","top":49,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":61},
            // {"type":"rack","id":"rack15","top":376,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},
            // {"type":"rack","id":"rack18","top":449,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},
            // {"type":"rack","id":"rack17","top":430,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},
            // {"type":"rack","id":"rack16","top":396,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},
            // {"type":"rack","id":"rack11","top":287,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},
            // {"type":"rack","id":"rack14","top":357,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},
            // {"type":"rack","id":"rack13","top":337,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},
            // {"type":"rack","id":"rack12","top":307,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},
            // {"type":"rack","id":"rack7","top":193,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},
            // {"type":"rack","id":"rack10","top":268,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},
            // {"type":"rack","id":"rack9","top":249,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},
            // {"type":"rack","id":"rack8","top":212,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31},
            // {"type":"rack","id":"rack2","top":83,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":61},
            // {"type":"rack","id":"rack3","top":103,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":61},
            // {"type":"rack","id":"rack6","top":174,"left":641,"width":667,"height":18,"minBayNo":2,"maxBayNo":31}
            ],
        "crns":[
            // {"type":"track","id":"lb_track8","text":"","top":76,"left":1327,"width":1,"height":93},
            // {"type":"track","id":"lb_track7","text":"","top":75,"left":596,"width":733,"height":1},
            // {"type":"track","id":"lb_track1","text":"","top":604,"left":593,"width":733,"height":1},
            // {"type":"track","id":"lb_track2","text":"","top":513,"left":595,"width":733,"height":1},
            // {"type":"crane","id":"crn-5","text":"5","top":507,"left":731,"width":67,"height":13},
            // {"type":"crane","id":"crn-6","text":"6","top":597,"left":731,"width":67,"height":13},
            // {"type":"crane","id":"crn-1","text":"1","top":162,"left":730,"width":67,"height":13},
            // {"type":"track","id":"lb_track3","text":"","top":424,"left":593,"width":733,"height":1},
            // {"type":"crane","id":"crn-2","text":"2","top":234,"left":741,"width":67,"height":13},
            // {"type":"track","id":"lb_track4","text":"","top":333,"left":593,"width":733,"height":1},
            // {"type":"crane","id":"crn-3","text":"3","top":325,"left":730,"width":67,"height":13},
            // {"type":"track","id":"lb_track5","text":"","top":241,"left":595,"width":733,"height":1},
            // {"type":"track","id":"lb_track6","text":"","top":168,"left":596,"width":733,"height":1},
            // {"type":"crane","id":"crn-4","text":"4","top":417,"left":730,"width":67,"height":13}
        ],
        "areas":[{"type":"Control_floor","id":"tabControl_floor1","text":"楼层","top":41,"left":80,"width":1269,"height":781,
            "floors":[{"type":"floor","id":"page_floor1","text":"1F","top":4,"left":22,"width":1243,"height":773,
                "stns":[
                    // {"type":"stn","id":"site-1064","text":"1064","top":720,"left":769,"width":59,"height":20},
                    // {"type":"stn","id":"site-2003","text":"2003","top":456,"left":309,"width":37,"height":20},
                    // {"type":"stn","id":"site-2002","text":"2002","top":455,"left":221,"width":37,"height":20},
                    // {"type":"stn","id":"site-1004","text":"1004","top":334,"left":296,"width":37,"height":20},
                    // {"type":"stn","id":"site-1002","text":"1002","top":291,"left":296,"width":37,"height":20},
                    // {"type":"stn","id":"site-1006","text":"1006","top":312,"left":296,"width":37,"height":20},
                    // {"type":"stn","id":"site-1007","text":"1007","top":312,"left":258,"width":37,"height":20},
                    // {"type":"stn","id":"site-1003","text":"1003","top":312,"left":220,"width":37,"height":20},
                    // {"type":"stn","id":"site-1075","text":"1075","top":723,"left":406,"width":71,"height":20},
                    // {"type":"stn","id":"site-1076","text":"1076","top":701,"left":406,"width":71,"height":20},
                    // {"type":"stn","id":"site-1077","text":"1077","top":679,"left":406,"width":71,"height":20},
                    // {"type":"stn","id":"site-1078","text":"1078","top":657,"left":406,"width":71,"height":20},
                    // {"type":"stn","id":"site-1079","text":"1079","top":598,"left":406,"width":71,"height":57},
                    // {"type":"stn","id":"site-1047","text":"1047","top":578,"left":405,"width":93,"height":17},
                    // {"type":"stn","id":"site-1081","text":"1081","top":417,"left":405,"width":71,"height":158},
                    // {"type":"stn","id":"site-1034","text":"1034","top":398,"left":405,"width":95,"height":17},
                    // {"type":"stn","id":"site-1083","text":"1083","top":320,"left":405,"width":71,"height":75},
                    // {"type":"stn","id":"site-1084","text":"1084","top":198,"left":405,"width":71,"height":121},
                    // {"type":"stn","id":"site-1059","text":"1059","top":700,"left":480,"width":161,"height":20},
                    // {"type":"stn","id":"site-1018","text":"1018","top":178,"left":405,"width":95,"height":17},
                    // {"type":"stn","id":"site-1086","text":"1086","top":146,"left":406,"width":71,"height":30},
                    // {"type":"stn","id":"site-1087","text":"1087","top":125,"left":406,"width":71,"height":19},
                    // {"type":"stn","id":"site-1088","text":"1088","top":105,"left":406,"width":71,"height":19},
                    // {"type":"stn","id":"site-1074","text":"1074","top":678,"left":1141,"width":59,"height":20},
                    // {"type":"stn","id":"site-1073","text":"1073","top":657,"left":1141,"width":59,"height":20},
                    // {"type":"stn","id":"site-1071","text":"1071","top":678,"left":1017,"width":59,"height":20},
                    // {"type":"stn","id":"site-1072","text":"1072","top":657,"left":1079,"width":59,"height":20},
                    // {"type":"stn","id":"site-1070","text":"1070","top":657,"left":1017,"width":59,"height":20},
                    {"type":"stn","id":"site-100","text":"100","top":657,"left":1017,"width":59,"height":20},
                    {"type":"stn","id":"site-101","text":"101","top":657,"left":955,"width":59,"height":20},
                    {"type":"stn","id":"site-103","text":"103","top":630,"left":955,"width":59,"height":20},
                    {"type":"stn","id":"site-105","text":"105","top":603,"left":955,"width":59,"height":20},
                    {"type":"stn","id":"site-107","text":"107","top":576,"left":955,"width":59,"height":20},
                    {"type":"stn","id":"site-109","text":"109","top":549,"left":955,"width":59,"height":20},
                    {"type":"stn","id":"site-111","text":"111","top":522,"left":955,"width":59,"height":20},
                    {"type":"stn","id":"site-113","text":"113","top":495,"left":955,"width":59,"height":20},
                    {"type":"stn","id":"site-115","text":"115","top":468,"left":955,"width":59,"height":20},
                    {"type":"stn","id":"site-117","text":"117","top":441,"left":955,"width":59,"height":20},
                    {"type":"stn","id":"site-119","text":"119","top":414,"left":955,"width":59,"height":20},
                    // {"type":"stn","id":"site-1068","text":"1068","top":678,"left":893,"width":59,"height":20},
                    {"type":"stn","id":"site-122","text":"122","top":657,"left":893,"width":59,"height":20},
                    {"type":"stn","id":"site-102","text":"102","top":657,"left":831,"width":59,"height":20},
                    {"type":"stn","id":"site-104","text":"104","top":630,"left":831,"width":59,"height":20},
                    {"type":"stn","id":"site-106","text":"106","top":603,"left":831,"width":59,"height":20},
                    {"type":"stn","id":"site-108","text":"108","top":576,"left":831,"width":59,"height":20},
                    {"type":"stn","id":"site-110","text":"110","top":549,"left":831,"width":59,"height":20},
                    {"type":"stn","id":"site-112","text":"112","top":522,"left":831,"width":59,"height":20},
                    {"type":"stn","id":"site-114","text":"114","top":495,"left":831,"width":59,"height":20},
                    {"type":"stn","id":"site-116","text":"116","top":468,"left":831,"width":59,"height":20},
                    {"type":"stn","id":"site-118","text":"118","top":441,"left":831,"width":59,"height":20},
                    {"type":"stn","id":"site-120","text":"120","top":414,"left":831,"width":59,"height":20},
                    // {"type":"stn","id":"site-1065","text":"1065","top":700,"left":707,"width":59,"height":20},
                    // {"type":"stn","id":"site-1063","text":"1063","top":700,"left":769,"width":59,"height":20},
                    // {"type":"stn","id":"site-1062","text":"1062","top":678,"left":769,"width":59,"height":20},
                    // {"type":"stn","id":"site-1061","text":"1061","top":657,"left":769,"width":59,"height":20},
                    // {"type":"stn","id":"site-1058","text":"1058","top":721,"left":645,"width":59,"height":20},
                    // {"type":"stn","id":"site-1057","text":"1057","top":700,"left":645,"width":59,"height":20},
                    // {"type":"stn","id":"site-1056","text":"1056","top":678,"left":645,"width":59,"height":20},
                    // {"type":"stn","id":"site-1060","text":"1060","top":657,"left":707,"width":59,"height":20},
                    // {"type":"stn","id":"site-1055","text":"1055","top":657,"left":645,"width":59,"height":20},
                    // {"type":"stn","id":"site-1054","text":"1054","top":657,"left":574,"width":67,"height":20},
                    // {"type":"stn","id":"site-1053","text":"1053","top":657,"left":479,"width":91,"height":20},
                    // {"type":"stn","id":"site-1052","text":"1052","top":614,"left":573,"width":67,"height":17},
                    // {"type":"stn","id":"site-1051","text":"1051","top":597,"left":502,"width":67,"height":58},
                    // {"type":"stn","id":"site-1049","text":"1049","top":577,"left":571,"width":67,"height":17},
                    // {"type":"stn","id":"site-1048","text":"1048","top":578,"left":501,"width":67,"height":17},
                    // {"type":"stn","id":"site-1045","text":"1045","top":523,"left":571,"width":67,"height":17},
                    // {"type":"stn","id":"site-1044","text":"1044","top":506,"left":501,"width":67,"height":69},
                    // {"type":"stn","id":"site-1042","text":"1042","top":488,"left":571,"width":67,"height":17},
                    // {"type":"stn","id":"site-1041","text":"1041","top":466,"left":501,"width":67,"height":39},
                    // {"type":"stn","id":"site-1039","text":"1039","top":433,"left":571,"width":67,"height":17},
                    // {"type":"stn","id":"site-1038","text":"1038","top":418,"left":501,"width":67,"height":45},
                    // {"type":"stn","id":"site-1036","text":"1036","top":397,"left":571,"width":67,"height":17},
                    // {"type":"stn","id":"site-1035","text":"1035","top":398,"left":501,"width":67,"height":17},
                    // {"type":"stn","id":"site-1032","text":"1032","top":342,"left":571,"width":67,"height":17},
                    // {"type":"stn","id":"site-1031","text":"1031","top":322,"left":501,"width":67,"height":73},
                    // {"type":"stn","id":"site-1029","text":"1029","top":308,"left":571,"width":67,"height":17},
                    // {"type":"stn","id":"site-1028","text":"1028","top":280,"left":501,"width":67,"height":40},
                    // {"type":"stn","id":"site-1026","text":"1026","top":250,"left":571,"width":67,"height":17},
                    // {"type":"stn","id":"site-1025","text":"1025","top":248,"left":501,"width":67,"height":29},
                    // {"type":"stn","id":"site-1023","text":"1023","top":212,"left":571,"width":67,"height":17},
                    // {"type":"stn","id":"site-1022","text":"1022","top":198,"left":501,"width":67,"height":48},
                    // {"type":"stn","id":"site-1020","text":"1020","top":177,"left":571,"width":67,"height":17},
                    // {"type":"stn","id":"site-1019","text":"1019","top":178,"left":502,"width":67,"height":17},
                    // {"type":"stn","id":"site-1016","text":"1016","top":142,"left":571,"width":67,"height":17},
                    // {"type":"stn","id":"site-1015","text":"1015","top":129,"left":502,"width":67,"height":46},
                    // {"type":"stn","id":"site-1012","text":"1012","top":105,"left":502,"width":67,"height":23},
                    // {"type":"stn","id":"site-1008","text":"1008","top":82,"left":337,"width":67,"height":21},
                    // {"type":"stn","id":"site-1009","text":"1009","top":82,"left":406,"width":95,"height":21},
                    // {"type":"stn","id":"site-1010","text":"1010","top":82,"left":502,"width":67,"height":21},
                    // {"type":"stn","id":"site-1013","text":"1013","top":105,"left":571,"width":67,"height":17}
                ]}]}]}