From badc6b0a84fd57360341eca49839d074b355c588 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期日, 15 十月 2023 13:47:13 +0800
Subject: [PATCH] #plc2

---
 src/main/java/com/zy/asrs/controller/ConsoleController.java |   48 ++
 src/main/webapp/views/index.html                            |    1 
 src/main/java/com/zy/core/thread/SiemensDevpThread2.java    |  318 +++++++++++++++++
 src/main/webapp/views/plc2.html                             |  661 ++++++++++++++++++++++++++++++++++++
 src/main/resources/plc2.json                                |    1 
 src/main/resources/application.yml                          |    7 
 src/main/java/com/zy/core/ServerBootstrap.java              |   12 
 7 files changed, 1,045 insertions(+), 3 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/ConsoleController.java b/src/main/java/com/zy/asrs/controller/ConsoleController.java
index 1983b70..a88397f 100644
--- a/src/main/java/com/zy/asrs/controller/ConsoleController.java
+++ b/src/main/java/com/zy/asrs/controller/ConsoleController.java
@@ -41,6 +41,10 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
 import java.util.*;
 
 /**
@@ -322,6 +326,50 @@
     }
 
     /**
+     * 鑾峰彇PLC2鏁版嵁
+     */
+    @GetMapping("/plc2/auth")
+    @ManagerAuth
+    public R getMapFromPlc2() {
+        try {
+            String mapFilename = "plc2.json";
+            String fileName = this.getClass().getClassLoader().getResource(mapFilename).getPath();//鑾峰彇鏂囦欢璺緞
+            File file = new File(fileName);
+            StringBuffer stringBuffer = new StringBuffer();
+            if (file.isFile() && file.exists()) {
+                InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "GBK");
+                BufferedReader br = new BufferedReader(isr);
+                String lineTxt = null;
+                while ((lineTxt = br.readLine()) != null) {
+                    stringBuffer.append(lineTxt);
+                }
+                br.close();
+            }
+
+            NavigateMapData navigateMapData = new NavigateMapData();
+
+            //瑙f瀽json鍦板浘鏁版嵁
+            ArrayList arrayList = JSON.parseObject(stringBuffer.toString(), ArrayList.class);
+            List<List<MapNode>> lists = new ArrayList<>();
+            //閲嶅缓鏁版嵁鏍煎紡
+            for (int i = 0; i < arrayList.size(); i++) {
+                Object obj = arrayList.get(i);
+                List<MapNode> list = JSON.parseArray(obj.toString(), MapNode.class);
+                for (int j = 0; j < list.size(); j++) {
+                    MapNode mapNode = list.get(j);
+                    list.set(j, mapNode);
+                }
+                lists.add(list);
+            }
+            return R.ok().add(lists);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return R.error();
+    }
+
+    /**
      * 閲嶇疆redis涓殑鍦板浘锛屽皢鍗犵敤鐨勫簱浣嶅叏閮ㄨВ闄�
      */
     @GetMapping("/map/resetMap/auth")
diff --git a/src/main/java/com/zy/core/ServerBootstrap.java b/src/main/java/com/zy/core/ServerBootstrap.java
index 781ce85..e8e5600 100644
--- a/src/main/java/com/zy/core/ServerBootstrap.java
+++ b/src/main/java/com/zy/core/ServerBootstrap.java
@@ -79,9 +79,15 @@
         // 鍒濆鍖栬緭閫佺嚎绾跨▼
         News.info("鍒濆鍖栬緭閫佺嚎绾跨▼...................................................");
         for (DevpSlave devp : slaveProperties.getDevp()) {
-            DevpThread devpThread = new SiemensDevpThread(devp);
-            new Thread((Runnable) devpThread).start();
-            SlaveConnection.put(SlaveType.Devp, devp.getId(), devpThread);
+            if (devp.getId() == 1) {
+                DevpThread devpThread = new SiemensDevpThread(devp);
+                new Thread((Runnable) devpThread).start();
+                SlaveConnection.put(SlaveType.Devp, devp.getId(), devpThread);
+            }else {
+                DevpThread devpThread = new SiemensDevpThread2(devp);
+                new Thread((Runnable) devpThread).start();
+                SlaveConnection.put(SlaveType.Devp, devp.getId(), devpThread);
+            }
         }
         // 鍒濆鍖栨彁鍗囨満
         News.info("鍒濆鍖栨彁鍗囨満........................................................");
diff --git a/src/main/java/com/zy/core/thread/SiemensDevpThread2.java b/src/main/java/com/zy/core/thread/SiemensDevpThread2.java
new file mode 100644
index 0000000..d967224
--- /dev/null
+++ b/src/main/java/com/zy/core/thread/SiemensDevpThread2.java
@@ -0,0 +1,318 @@
+package com.zy.core.thread;
+
+import HslCommunication.Core.Types.OperateResult;
+import HslCommunication.Core.Types.OperateResultExOne;
+import HslCommunication.Profinet.Siemens.SiemensPLCS;
+import HslCommunication.Profinet.Siemens.SiemensS7Net;
+import com.alibaba.fastjson.JSON;
+import com.core.common.Cools;
+import com.core.common.DateUtils;
+import com.core.common.SpringUtils;
+import com.zy.asrs.entity.BasDevp;
+import com.zy.asrs.service.BasDevpService;
+import com.zy.core.DevpThread;
+import com.zy.core.News;
+import com.zy.core.cache.MessageQueue;
+import com.zy.core.cache.OutputQueue;
+import com.zy.core.cache.SlaveConnection;
+import com.zy.core.enums.SlaveType;
+import com.zy.core.model.DevpSlave;
+import com.zy.core.model.Task;
+import com.zy.core.model.protocol.StaProtocol;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 杈撻�佺嚎绾跨▼
+ * Created by vincent on 2020/8/4
+ */
+@Data
+@Slf4j
+public class SiemensDevpThread2 implements Runnable, DevpThread {
+
+    private DevpSlave slave;
+    private SiemensS7Net siemensS7Net;
+    private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>();
+    private short heartBeatVal = 1;
+    private int barcodeSize = 1;
+    public static final ArrayList<Integer> staNos = new ArrayList<Integer>() {{
+        add(106);add(107);
+        add(108);add(209);
+        add(210);add(347);
+        add(348);add(349);
+    }};
+
+    public SiemensDevpThread2(DevpSlave slave) {
+        this.slave = slave;
+    }
+
+    @Override
+    @SuppressWarnings("InfiniteLoopStatement")
+    public void run() {
+        connect();
+        while (true) {
+            try {
+                int step = 1;
+                Task task = MessageQueue.poll(SlaveType.Devp, slave.getId());
+                if (task != null) {
+                    step = task.getStep();
+                }
+                switch (step) {
+                    // 璇绘暟鎹�
+                    case 1:
+                        read();
+                        break;
+                    // 鍐欐暟鎹� ID+鐩爣绔�
+                    case 2:
+                        write((StaProtocol) task.getData());
+                        read();
+                        break;
+                    default:
+                        break;
+                }
+                // 蹇冭烦
+//                heartbeat();
+                Thread.sleep(400);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+        }
+    }
+
+    @Override
+    public boolean connect() {
+        boolean result = false;
+        siemensS7Net = new SiemensS7Net(SiemensPLCS.S1200, slave.getIp());
+        siemensS7Net.setRack(slave.getRack().byteValue());
+        siemensS7Net.setSlot(slave.getSlot().byteValue());
+        OperateResult connect = siemensS7Net.ConnectServer();
+        if(connect.IsSuccess){
+            result = true;
+            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()));
+            News.info("杈撻�佺嚎plc杩炴帴鎴愬姛 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+        } 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()));
+            News.error("杈撻�佺嚎plc杩炴帴澶辫触锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+        }
+        siemensS7Net.ConnectClose();
+        return result;
+    }
+
+    /**
+     * 璇诲彇鐘舵�� ====> 鏁村潡plc
+     */
+    private void read() throws InterruptedException {
+        OperateResultExOne<byte[]> result = siemensS7Net.Read("DB1000.0", (short) (staNos.size()*4));
+        if (result.IsSuccess) {
+            for (int i = 0; i < staNos.size(); i++) {
+                Integer siteId = staNos.get(i); // 绔欑偣缂栧彿
+                StaProtocol staProtocol = station.get(siteId);
+                if (null == staProtocol) {
+                    staProtocol = new StaProtocol();
+                    staProtocol.setSiteId(siteId);
+                    station.put(siteId, staProtocol);
+                }
+                staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*4));     // 宸ヤ綔鍙�
+                staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*4+2));   // 鐩爣绔�
+            }
+        }
+        Thread.sleep(200);
+        OperateResultExOne<byte[]> result1 = siemensS7Net.Read("DB1001.0", (short) (staNos.size()*2));
+        if (result1.IsSuccess) {
+            for (int i = 0; i < staNos.size(); i++) {
+                Integer siteId = staNos.get(i); // 绔欑偣缂栧彿
+                boolean[] status = siemensS7Net.getByteTransform().TransBool(result1.Content, i*2, 1);
+                StaProtocol staProtocol = station.get(siteId);
+                staProtocol.setAutoing(status[0]);  // 鑷姩
+                staProtocol.setLoading(status[1]);  // 鏈夌墿
+                staProtocol.setInEnable(status[2]); // 鍙叆
+                staProtocol.setOutEnable(status[3]);// 鍙嚭
+                staProtocol.setEmptyMk(status[4]);  // 绌烘澘淇″彿
+                staProtocol.setFullPlt(status[5]);  // 婊℃墭鐩�
+                staProtocol.setLiftArrival(status[6]);     // 鎻愬崌鏈哄埌浣嶄俊鍙�
+                staProtocol.setShuttleTakeEnable(status[7]);      // 鎻愬崌鏈哄彲鍙栦俊鍙�
+
+                if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
+                    staProtocol.setPakMk(true);
+                }
+            }
+        }
+
+        if (result.IsSuccess && result1.IsSuccess) {
+            OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), slave.getId()));
+
+            // 鏍规嵁瀹炴椂淇℃伅鏇存柊鏁版嵁搴�
+            try {
+                List<BasDevp> basDevps = new ArrayList<>();
+                for (Integer siteId : staNos) {
+                    StaProtocol staProtocol = station.get(siteId);
+                    basDevps.add(staProtocol.toSqlModel());
+                }
+                BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class);
+                if (!basDevpService.updateBatchById(basDevps)) {
+                    throw new Exception("鏇存柊鏁版嵁搴撴暟鎹け璐�");
+                }
+            } catch (Exception e) {
+                OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戞洿鏂版暟鎹簱鏁版嵁澶辫触 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
+                News.error("鏇存柊鏁版嵁搴撴暟鎹け璐� ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
+            }
+
+        } 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()));
+//            News.error("璇诲彇杈撻�佺嚎plc鐘舵�佷俊鎭け璐� ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
+        }
+    }
+
+    /**
+     * 鍐欏叆 ID+鐩爣绔� =====> 鍗曠珯鐐瑰啓鍏�
+     */
+    private void write(StaProtocol staProtocol) throws InterruptedException {
+        if (null == staProtocol) {
+            return;
+        }
+        int index = staNos.indexOf(staProtocol.getSiteId());
+        short[] array = new short[2];
+        array[0] = staProtocol.getWorkNo();
+        array[1] = staProtocol.getStaNo();
+//        OperateResult write = siemensS7Net.Write("DB100." + index*4, staProtocol.getWorkNo());    // 宸ヤ綔鍙�
+//        Thread.sleep(500);
+//        OperateResult write1 = siemensS7Net.Write("DB100." + (index*4+2), staProtocol.getStaNo());    // 鐩爣绔�
+
+        OperateResult writeResult;
+        //浠诲姟涓嬪彂娆℃暟
+        int writeCount = 0;
+        //浠诲姟涓嬪彂鎴愬姛鏍囪瘑
+        boolean writeFlag = false;
+        while(writeCount < 5){
+            writeResult = siemensS7Net.Write("DB1000." + index*4, array);    // 宸ヤ綔鍙枫�佺洰鏍囩珯
+            if(writeResult.IsSuccess){
+                Thread.sleep(200);
+                OperateResultExOne<byte[]> readResult = siemensS7Net.Read("DB1000." + index*4, (short)4);
+                if(readResult.IsSuccess){
+                    short workNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 0);
+                    short staNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 2);
+                    if(staProtocol.getWorkNo().equals(workNo) && staProtocol.getStaNo().equals(staNo)){
+                        //浠诲姟鍛戒护鍐欏叆鎴愬姛
+                        writeFlag = true;
+                        log.info("鍐欏叆杈撻�佺嚎鍛戒护鍚庤繑鍥炴垚鍔燂紝骞朵笖鍥炶鎴愬姛銆傝緭閫佺嚎plc缂栧彿={}锛寋}锛屽啓鍏ユ鏁�={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
+                        break;
+                    } else {//杩斿洖缁撴灉鏄垚鍔熶簡锛屼絾鏄湡瀹炲�间笉鐩稿悓
+                        writeCount++;
+                        OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戝啓鍏ヨ緭閫佺嚎鍛戒护鍚庤繑鍥炴垚鍔燂紝浣嗘槸璇诲彇浠诲姟鍊间笉涓�鑷淬�傝緭閫佺嚎plc缂栧彿={1}锛岀珯鐐规暟鎹�={2},鍐欏叆娆℃暟={3}",
+                                slave.getId(), JSON.toJSON(staProtocol),writeCount));
+                        log.error("鍐欏叆杈撻�佺嚎鍛戒护鍚庤繑鍥炴垚鍔燂紝浣嗘槸璇诲彇浠诲姟鍊间笉涓�鑷淬�傝緭閫佺嚎plc缂栧彿={}锛寋}锛屽啓鍏ユ鏁�={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
+                    }
+                } else {
+                    writeCount++;
+                    OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戝啓鍏ヨ緭閫佺嚎鍛戒护鍚庤鍙栧け璐ャ�傝緭閫佺嚎plc缂栧彿={1}锛岀珯鐐规暟鎹�={2},鍐欏叆娆℃暟={3}",
+                            slave.getId(), JSON.toJSON(staProtocol), writeCount));
+                    log.error("鍐欏叆杈撻�佺嚎鍛戒护鍚庤鍙栧け璐ャ�傝緭閫佺嚎plc缂栧彿={}锛岀珯鐐规暟鎹�={},鍐欏叆娆℃暟={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
+                }
+            } else {
+                writeCount++;
+                OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戝啓鍏ヨ緭閫佺嚎鍛戒护澶辫触銆傝緭閫佺嚎plc缂栧彿={1}锛岀珯鐐规暟鎹�={2},鍐欏叆娆℃暟={3}",
+                        slave.getId(), JSON.toJSON(staProtocol),writeCount));
+                log.error("鍐欏叆杈撻�佺嚎鍛戒护澶辫触銆傝緭閫佺嚎plc缂栧彿={}锛岀珯鐐规暟鎹�={},鍐欏叆娆℃暟={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
+            }
+            Thread.sleep(200);
+        }
+
+        //鍐欏懡浠ゅ皾璇曚簡5娆¤繕鏄け璐ヤ簡
+        if(!writeFlag){
+            staProtocol = station.get(staProtocol.getSiteId());
+            if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) {
+                staProtocol.setPakMk(true);
+            }
+            OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戝啓鍏ヨ緭閫佺嚎鍛戒护灏濊瘯5娆″け璐ャ�傝緭閫佺嚎plc缂栧彿={1}锛岀珯鐐规暟鎹�={2}", slave.getId(), JSON.toJSON(staProtocol)));
+            log.error("鍐欏叆杈撻�佺嚎鍛戒护灏濊瘯5娆″け璐ャ�傝緭閫佺嚎plc缂栧彿={}锛岀珯鐐规暟鎹�={}", slave.getId(), JSON.toJSON(staProtocol));
+
+            //閲嶆柊娣诲姞鏁版嵁鍒颁换鍔¢槦鍒�
+            boolean result = MessageQueue.offer(SlaveType.Devp, slave.getId(), new Task(2, staProtocol));
+            read();//璇诲彇1娆¤澶囩姸鎬�
+            return;
+        } else {
+            OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆� 杈撻�佺嚎鍛戒护涓嬪彂鎴愬姛 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(staProtocol)));
+            log.info("杈撻�佺嚎鍛戒护涓嬪彂 [id:{}] >>>>> 鍛戒护涓嬪彂鎴愬姛锛� {}",  slave.getId(), JSON.toJSON(staProtocol));
+
+            Integer siteId = staProtocol.getSiteId();
+            staProtocol = station.get(siteId);
+            if ((siteId == 101 || siteId == 201)&&(staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0)) {
+                staProtocol.setPakMk(true);
+            }
+        }
+    }
+
+    /**
+     * 蹇冭烦
+     */
+    private void heartbeat(){
+        if (heartBeatVal == 1) {
+            heartBeatVal = 2;
+        } else {
+            heartBeatVal = 1;
+        }
+        OperateResult write = siemensS7Net.Write("DB100.50", heartBeatVal);
+        if (!write.IsSuccess) {
+            News.error("杈撻�佺嚎plc缂栧彿={} 蹇冭烦澶辫触", slave.getId());
+        }
+    }
+
+    /**
+     * 璁剧疆鍏ュ簱鏍囪
+     */
+    @Override
+    public void setPakMk(Integer siteId, boolean pakMk) {
+        StaProtocol staProtocol = station.get(siteId);
+        if (null != staProtocol) {
+            staProtocol.setPakMk(pakMk);
+        }
+    }
+
+    @Override
+    public void close() {
+        siemensS7Net.ConnectClose();
+    }
+
+    public static void main(String[] args) {
+//        System.out.println(staNos.indexOf(129));
+        System.out.println(staNos.size());
+        for (int i = 0; i<staNos.size(); i++) {
+//            System.out.println(i*2);
+//            System.out.println(i*2 + 200);
+//            System.out.println(i);
+        }
+//        int index = staNos.indexOf(128);
+//        System.out.println(index*2);
+//        System.out.println(index*2 + 200);
+    }
+
+//    public static void main(String[] args) throws Exception {
+//        DevpSlave slave = new DevpSlave();
+//        slave.setIp("192.168.2.125");
+//        SiemensDevpThread devpThread = new SiemensDevpThread(slave);
+//        devpThread.connect();
+//        devpThread.read();
+//        // 鍐�
+//        StaProtocol staProtocol = devpThread.getStation().get(1);
+//        staProtocol.setWorkNo((short) 232);
+//        staProtocol.setStaNo((short) 6);
+//        staProtocol.setAutoing(true);
+//        staProtocol.setEmptyMk(true);
+//        staProtocol.setInEnable(true);
+//        devpThread.write(staProtocol);
+//        System.out.println("----------------------------------------");
+//        // 璇�
+//        devpThread.read();
+//        System.out.println(JSON.toJSONString(devpThread.station));
+//
+//    }
+
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index b9f5cba..80560d9 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -293,6 +293,13 @@
 #      row: 4
 #      bay: 6
 #      lev: 6
+  # 杈撻�佺嚎2
+  devp[1]:
+    id: 2
+    ip: 10.10.10.58
+    port: 102
+    rack: 0
+    slot: 0
 
   # 鏉$爜鎵弿浠�
   barcode[0]:
diff --git a/src/main/resources/plc2.json b/src/main/resources/plc2.json
new file mode 100644
index 0000000..cc2ae1d
--- /dev/null
+++ b/src/main/resources/plc2.json
@@ -0,0 +1 @@
+[ [ { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 } ], [ { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": 4, "data": "106", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": 4, "data": "107", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": 4, "data": "108", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": 4, "data": "210", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": 4, "data": "209", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": 4, "data": "349", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": 4, "data": "348", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 } ], [ { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 }, { "value": -1, "data": "", "top": 1000, "bottom": 1000, "left": 1000, "right": 1000 } ] ]
\ No newline at end of file
diff --git a/src/main/webapp/views/index.html b/src/main/webapp/views/index.html
index e9c8b09..4dba389 100644
--- a/src/main/webapp/views/index.html
+++ b/src/main/webapp/views/index.html
@@ -23,6 +23,7 @@
             <li><a id="lift" onclick="nav(this.id)" class="nav-unselect" href="#">鎻愬崌鏈�</a></li>
 <!--            <li><a id="ste" onclick="nav(this.id)" class="nav-unselect" href="#">绌挎杞�</a></li>-->
             <li><a id="shuttle" onclick="nav(this.id)" class="nav-unselect" href="#">鍥涘悜绌挎杞�</a></li>
+            <li><a id="plc2" onclick="nav(this.id)" class="nav-unselect" href="#">PLC2</a></li>
         </ul>
     </div>
 </div>
diff --git a/src/main/webapp/views/plc2.html b/src/main/webapp/views/plc2.html
new file mode 100644
index 0000000..f20589d
--- /dev/null
+++ b/src/main/webapp/views/plc2.html
@@ -0,0 +1,661 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="UTF-8">
+	<title>WCS鎺у埗涓績</title>
+	<link rel="stylesheet" href="../static/css/animate.min.css">
+	<link rel="stylesheet" href="../static/vue/element/element.css">
+	<link rel="stylesheet" href="../static/css/console_vue.css">
+	<link rel="stylesheet" href="../static/css/toggle-switch.css">
+	<script type="text/javascript" src="../static/js/jquery/jquery-3.3.1.min.js"></script>
+	<script type="text/javascript" src="../static/layui/layui.js"></script>
+	<script type="text/javascript" src="../static/js/handlebars/handlebars-v4.5.3.js"></script>
+	<script type="text/javascript" src="../static/js/common.js"></script>
+	<script type="text/javascript" src="../static/vue/js/vue.min.js"></script>
+	<script type="text/javascript" src="../static/vue/element/element.js"></script>
+</head>
+<body>
+<div id="app">
+	<div style="display: flex;justify-content: center;align-items: center;width: 100%;margin-top: 150px;">
+		<div id="mapDataId" style="zoom: 0.7;position: relative;">
+			<div class="pointContainer" v-for="(row,index) in map" :key="index">
+				<div v-for="(col,idx) in row" :key="idx">
+					<div v-if="col.value == 0">
+						<!-- 瀛愯建閬� 璺緞涓虹┛姊溅棰勮璺緞鍒欐樉绀虹┛姊溅棰滆壊鍜岀┛姊溅鍙� -->
+						<div :style="{background: checkAdvancePath(index,idx).length == 0 ? '':shuttleColorList[checkAdvancePath(index,idx)[0]]}" class="item" v-if="col.data.length > 0">{{col.data}}</div>
+						<div :style="{background: checkAdvancePath(index,idx).length == 0 ? '':shuttleColorList[checkAdvancePath(index,idx)[0]]}" class="item" v-else>{{checkAdvancePath(index,idx).length == 0 ? idx:checkAdvancePath(index,idx)}}</div>
+					</div>
+					<div v-else-if="col.value == 3">
+						<!-- 姣嶈建閬� 璺緞涓虹┛姊溅棰勮璺緞鍒欐樉绀虹┛姊溅棰滆壊鍜岀┛姊溅鍙� -->
+						<div :style="{background: checkAdvancePath(index,idx).length == 0 ? '#5af':shuttleColorList[checkAdvancePath(index,idx)[0]]}" class="item">{{checkAdvancePath(index,idx).length == 0 ? '&#x21c5;&#x21c4;':checkAdvancePath(index,idx)}}</div>
+					</div>
+					<div v-else-if="col.value == 4">
+						<!-- 绔欑偣 -->
+						<div class="site" :id="'site-' + col.data" @click="openSite(col.data)">{{col.data}}</div>
+					</div>
+					<div v-else-if="col.value == 5">
+						<!-- 鍏呯數妗� -->
+						<div class="item" style="font-size: 24px">&#9889;</div>
+					</div>
+					<div v-else-if="col.value == -999">
+						<!-- 璺緞鍗犵敤鍖哄煙 -->
+						<div class="item" style="background:#f83333;color: #fff;">{{idx}}</div>
+					</div>
+					<div v-else-if="col.value < 0">
+						<!-- 绂佹鏄剧ず鍖哄煙 -->
+						<div class="item" style="visibility: hidden">{{idx}}</div>
+					</div>
+					<div v-else>
+						<div class="item" v-if="col.data.length > 0">{{col.data}}</div>
+						<div class="item" v-else>{{idx}}-{{col.value}}</div>
+					</div>
+				</div>
+			</div>
+
+		</div>
+	</div>
+
+	<div class="footer">
+		<!-- 鎬诲紑鍏� -->
+		<div class="line-status">
+			<div class="body-head">鎬诲紑鍏�</div>
+			<div class="switch" @click="systemSwitch">
+				<label id="system-toggle" class="toggle-switch" style="margin-left: 20px;">
+					<input id="system-toggle-checked" disabled type="checkbox">
+					<div class="button">
+						<div class="light"></div>
+						<div class="dots"></div>
+						<div class="characters"></div>
+						<div class="shine"></div>
+						<div class="shadow"></div>
+					</div>
+				</label>
+
+				<div class="switch_r">
+					<p>绯荤粺鐘舵��</p>
+					<p id="system-run-desc">绯荤粺杩愯涓�</p>
+				</div>
+			</div>
+		</div>
+		<!-- 鍥涘悜绌挎杞︾姸鎬� -->
+		<div class="line-status">
+			<div class="body-head">绌挎杞︾姸鎬�</div>
+			<div class="shuttle-status-box">
+				<div v-for="(item,idx) in shuttleList" class="state">
+					<span :style="{color: shuttleColorList[item.shuttleNo]}">鍥涘悜绌挎杞� {{item.shuttleNo}}</span>
+					<span v-if="item.protocolStatus == 1"
+						  class="state-ss shuttle-idle">{{item.protocolStatus$}}</span>
+					<span v-else-if="item.protocolStatus == 2"
+						  class="state-ss shuttle-working">{{item.protocolStatus$}}</span>
+					<span v-else-if="item.protocolStatus == 3"
+						  class="state-ss shuttle-waiting">{{item.protocolStatus$}}</span>
+					<span v-else-if="item.protocolStatus == 4"
+						  class="state-ss shuttle-charging">{{item.protocolStatus$}}</span>
+					<span v-else-if="item.protocolStatus == 5"
+						  class="state-ss shuttle-charging-waiting">{{item.protocolStatus$}}</span>
+					<span v-else-if="item.protocolStatus == 6"
+						  class="state-ss shuttle-fixing">{{item.protocolStatus$}}</span>
+					<span v-else-if="item.protocolStatus == 7"
+						  class="state-ss shuttle-offline">{{item.protocolStatus$}}</span>
+					<span v-else class="state-ss shuttle-offline">{{item.protocolStatus$}}</span>
+				</div>
+			</div>
+			<div class="allStatus"><span>鎵�鏈夌姸鎬�</span></div>
+			<div class="allStatus item-group">
+				<span class="shuttle-idle">绌洪棽</span>
+				<span class="shuttle-working">浣滀笟涓�</span>
+				<span class="shuttle-waiting">绛夊緟纭</span>
+				<span class="shuttle-charging">鍏呯數涓�</span>
+				<span class="shuttle-charging-waiting">鍏呯數浠诲姟绛夊緟纭</span>
+				<span class="shuttle-fixing">鏁呴殰淇涓�</span>
+				<span class="shuttle-offline">绂荤嚎</span>
+			</div>
+		</div>
+		<!-- 鎻愬崌鏈虹姸鎬� -->
+		<div class="line-status">
+			<div class="body-head">鎻愬崌鏈虹姸鎬�</div>
+			<div class="lift-status-box">
+				<div v-for="(item,idx) in liftList" class="state states">
+					<span>鎻愬崌鏈� {{item.liftNo}}</span>
+					<span v-if="item.protocolStatus == 1"
+						  class="state-ss lift-idle">{{item.protocolStatus$}}</span>
+					<span v-else-if="item.protocolStatus == 2"
+						  class="state-ss lift-working">{{item.protocolStatus$}}</span>
+					<span v-else-if="item.protocolStatus == 3"
+						  class="state-ss lift-waiting">{{item.protocolStatus$}}</span>
+					<span v-else-if="item.protocolStatus == 4"
+						  class="state-ss lift-offline">{{item.protocolStatus$}}</span>
+					<span v-else class="state-ss lift-offline">{{item.protocolStatus$}}</span>
+				</div>
+			</div>
+			<div class="allStatus"><span>鎵�鏈夌姸鎬�</span></div>
+			<div class="allStatus item-group">
+				<span class="lift-idle">绌洪棽</span>
+				<span class="lift-working">浣滀笟涓�</span>
+				<span class="lift-waiting">绛夊緟纭</span>
+				<span class="lift-offline">绂荤嚎</span>
+			</div>
+		</div>
+		<!-- 杈撻�佺嚎鐘舵�� -->
+		<div class="line-status">
+			<div class="body-head">杈撻�佺嚎鐘舵��</div>
+			<div class="state states">
+				<span>杩愯緭绾挎�绘暟</span>
+				<span class="line-ss">9</span>
+			</div>
+			<div class="allStatus"><span>鎵�鏈夌姸鎬�</span></div>
+			<div class="allStatus item-group">
+				<span class="site-auto-run-id">鑷姩+鏈夌墿+ID</span>
+				<span class="site-auto-run">鑷姩+鏈夌墿</span>
+				<span class="site-auto-id">鑷姩+ID</span>
+				<span class="site-auto">鑷姩</span>
+				<span class="site-unauto">闈炶嚜鍔�/鎵嬪姩</span>
+			</div>
+		</div>
+		<!-- 鏉$爜琛ㄦ牸 -->
+		<div class="bar-code">
+			<div class="body-head" id="code">鏉$爜鎵弿鍣�</div>
+			<div class="tablebox">
+				<div class="table-head">
+					<li><span>鏉$爜鍚嶇О</span><span class="right">鎵爜鏃堕棿</span></li>
+				</div>
+				<div id="barcode1" class="table-body">
+					<li v-for="(item,index) in codeList1" :key="index"><span>{{item.barcode}}</span><span class="right">{{item.time}}</span></li>
+				</div>
+			</div>
+			<div class="tablebox">
+				<div class="table-head">
+					<li><span>鏉$爜鍚嶇О</span><span class="right">鎵爜鏃堕棿</span></li>
+				</div>
+				<div id="barcode2" class="table-body">
+					<li v-for="(item,index) in codeList2" :key="index"><span>{{item.barcode}}</span><span class="right">{{item.time}}</span></li>
+				</div>
+			</div>
+		</div>
+	</div>
+
+	<!-- 杈撻�佽澶囧脊绐� -->
+	<div id="siteWindow" :style="{display:siteWindow?'block':'none'}" class="animate__animated animate__fadeIn">
+		<!-- 琛ㄥご -->
+		<div id="siteWindow-head">
+			<div class="detailed"></div>
+			<button @click="siteWindow = false"></button>
+		</div>
+		<!-- 琛ㄥ唴瀹� -->
+		<div class="siteWindow-body">
+			<form>
+				<!-- 璁惧鍙� -->
+				<div class="form-item">
+					<div class="form-item-label">
+						<span>璁惧鍙凤細</span>
+					</div>
+					<div class="form-item-input">
+						<input type="text" name="siteId" value="">
+					</div>
+				</div>
+				<!-- 宸ヤ綔鍙� -->
+				<div class="form-item">
+					<div class="form-item-label">
+						<span>宸ヤ綔鍙凤細</span>
+					</div>
+					<div class="form-item-input">
+						<input type="text" name="workNo" value="">
+					</div>
+				</div>
+				<!-- 宸ヤ綔鐘舵�� -->
+				<div class="form-item">
+					<div class="form-item-label">
+						<span>宸ヤ綔鐘舵�侊細</span>
+					</div>
+					<div class="form-item-input">
+						<input type="text" name="wrkSts" value="">
+					</div>
+				</div>
+				<div class="form-item">
+					<!-- 鑷姩 -->
+					<div class="form-item-checkbox">
+						<div class="form-item-label-checkbox">
+							<span>鑷姩</span>
+						</div>
+						<div class="form-item-input-checkbox">
+							<input type="checkbox" name="autoing">
+						</div>
+					</div>
+					<!-- 鏈夌墿 -->
+					<div class="form-item-checkbox">
+						<div class="form-item-label-checkbox">
+							<span>鏈夌墿</span>
+						</div>
+						<div class="form-item-input-checkbox">
+							<input type="checkbox" name="loading">
+						</div>
+					</div>
+					<!-- 鑳藉叆 -->
+					<div class="form-item-checkbox">
+						<div class="form-item-label-checkbox">
+							<span>鑳藉叆</span>
+						</div>
+						<div class="form-item-input-checkbox">
+							<input type="checkbox" name="canining">
+						</div>
+					</div>
+					<!-- 鑳藉嚭 -->
+					<div class="form-item-checkbox">
+						<div class="form-item-label-checkbox">
+							<span>鑳藉嚭</span>
+						</div>
+						<div class="form-item-input-checkbox">
+							<input type="checkbox" name="canouting">
+						</div>
+					</div>
+				</div>
+				<!-- 鍑哄叆绫诲瀷 -->
+				<div class="form-item">
+					<div class="form-item-label">
+						<span>鍑哄叆绫诲瀷锛�</span>
+					</div>
+					<div class="form-item-input">
+						<input type="text" name="ioType" value="">
+					</div>
+				</div>
+				<!-- 婧愮珯 -->
+				<div class="form-item">
+					<div class="form-item-label">
+						<span>婧愮珯锛�</span>
+					</div>
+					<div class="form-item-input">
+						<input type="text" name="sourceStaNo" value="">
+					</div>
+				</div>
+				<!-- 鐩爣绔� -->
+				<div class="form-item">
+					<div class="form-item-label">
+						<span>鐩爣绔欙細</span>
+					</div>
+					<div class="form-item-input">
+						<input type="text" name="staNo" value="">
+					</div>
+				</div>
+				<!-- 婧愬簱浣� -->
+				<div class="form-item">
+					<div class="form-item-label">
+						<span>婧愬簱浣嶏細</span>
+					</div>
+					<div class="form-item-input">
+						<input type="text" name="sourceLocNo" value="">
+					</div>
+				</div>
+				<!-- 鐩爣搴撲綅 -->
+				<div class="form-item">
+					<div class="form-item-label">
+						<span>鐩爣搴撲綅锛�</span>
+					</div>
+					<div class="form-item-input">
+						<input type="text" name="locNo" value="">
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+
+</div>
+<script>
+	var app = new Vue({
+		el: '#app',
+		data: {
+			map: [],//鍦板浘鏁版嵁
+			currentLev: 1,//鍦板浘褰撳墠妤煎眰
+			siteWindow: false, //绔欑偣寮圭獥鏄剧ず榛樿涓嶆樉绀�
+			floorList: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], //褰撳墠椤圭洰妤煎眰
+			shuttleList: [], //鍥涘悜绌挎杞﹂泦鍚�
+			currentLevShuttleList: [],//褰撳墠妤煎眰鍥涘悜绌挎杞﹂泦鍚�
+			shuttleColorList: [],//鍥涘悜绌挎杞﹂鑹查泦鍚�
+			liftList: [], //鎻愬崌鏈洪泦鍚�
+			systemStatus: true,//绯荤粺杩愯鐘舵��
+			consoleInterval: null,//瀹氭椂鍣ㄥ瓨鍌ㄥ彉閲�
+			codeList1: [],//鏉$爜List
+			codeList2: [],//鏉$爜List
+		},
+		created() {
+			this.init()
+		},
+		watch: {
+
+		},
+		methods: {
+			init() {
+				this.getMap(this.currentLev)
+				this.getSystemRunningStatus() //鑾峰彇绯荤粺杩愯鐘舵��
+
+				this.consoleInterval = setInterval(() => {
+					this.getShuttleStateInfo() //鑾峰彇鍥涘悜绌挎杞︿俊鎭�
+					this.getLiftStateInfo() //鑾峰彇鎻愬崌鏈轰俊鎭�
+					this.getSiteInfo() //鑾峰彇杈撻�佺珯鐐规暟鎹�
+					this.getMap(this.currentLev) //鑾峰彇瀹炴椂鍦板浘鏁版嵁
+					this.getCodeData()//鑾峰彇鏉$爜
+				}, 1000)
+			},
+			//鑾峰彇鍦板浘鏁版嵁
+			getMap(lev) {
+				$.ajax({
+					type: "get",
+					url: baseUrl + "/console/plc2/auth",
+					headers: {
+						'token': localStorage.getItem('token')
+					},
+					success: (res) => {
+						let data = res.data
+						let tmp = []
+						for (let i = 1; i < data.length - 1; i++) {
+							tmp.push(data[i])
+						}
+						// console.log(tmp)
+						this.map = tmp
+					}
+				})
+			},
+			openSite(id) {
+				this.siteWindow = true; //鎵撳紑绔欑偣淇℃伅寮圭獥
+				$(".detailed").empty();
+				$('.detailed').append(id + '绔欑偣璇︾粏淇℃伅');
+				$.ajax({
+					url: baseUrl + "/console/site/detail",
+					headers: {
+						'token': localStorage.getItem('token')
+					},
+					data: {
+						siteId: id
+					},
+					method: 'post',
+					success: function(res) {
+						for (var val in res.data) {
+							var find = $("#siteWindow").find(":input[name='" + val + "']");
+							if (find[0].type === 'text') {
+								find.val(res.data[val]);
+							} else if (find[0].type === 'checkbox') {
+								find.attr("checked", res.data[val] === 'Y');
+							}
+						}
+					}
+
+				})
+			},
+			getSiteInfo() {
+				//鑾峰彇杈撻�佺珯鐐规暟鎹�
+				$.ajax({
+					url: baseUrl+ "/console/latest/data/site",
+					headers: {'token': localStorage.getItem('token')},
+					method: 'POST',
+					success: function (res) {
+						if (res.code === 200){
+							var sites = res.data;
+							for (var i = 0; i < sites.length; i++){
+								var siteEl = $("#site-"+sites[i].siteId);
+								siteEl.attr("class", "site " + sites[i].siteStatus);
+								if (sites[i].workNo != null && sites[i].workNo>0) {
+									siteEl.html(sites[i].siteId + "[" + sites[i].workNo + "]");
+								} else {
+									siteEl.html(sites[i].siteId);
+								}
+							}
+						} else if (res.code === 403){
+							parent.location.href = baseUrl+"/login";
+						}  else {
+							console.log(res.msg);
+						}
+					}
+				});
+			},
+			changFloor(lev) {
+				this.currentLev = lev
+				this.currentLevShuttleList = []
+				this.getMap(lev)
+			},
+			getShuttleStateInfo() {
+				// 鍥涘悜绌挎杞︿俊鎭〃鑾峰彇
+				let that = this
+				$.ajax({
+					url: baseUrl + "/shuttle/table/shuttle/state",
+					headers: {
+						'token': localStorage.getItem('token')
+					},
+					method: 'POST',
+					success: function(res) {
+						if (res.code == 200) {
+							let currentLevShuttle = []//褰撳墠妤煎眰灏忚溅闆嗗悎
+							res.data.forEach((item,idx) => {
+								if (item != null && item.point != undefined && item.point != null) {
+									if (item.point.z == that.currentLev) {
+										currentLevShuttle.push(item);
+									}
+								}
+							})
+							that.currentLevShuttleList = currentLevShuttle
+							that.shuttleList = res.data
+
+							if (that.shuttleColorList.length == 0) {
+								let colorList = []//闅忔満灏忚溅棰滆壊
+								res.data.forEach((item,idx) => {
+									colorList[item.shuttleNo] = that.colorRGB()
+								})
+								that.shuttleColorList = colorList
+							}
+						}
+					}
+				});
+			},
+			getLiftStateInfo() {
+				// 鎻愬崌鏈轰俊鎭〃鑾峰彇
+				let that = this
+				$.ajax({
+					url: baseUrl + "/lift/table/lift/state",
+					headers: {
+						'token': localStorage.getItem('token')
+					},
+					method: 'POST',
+					success: function(res) {
+						if (res.code == 200) {
+							that.liftList = res.data
+						}
+					}
+				});
+			},
+			systemSwitch() {
+				// 绯荤粺寮�鍏�
+				let that = this
+				if (this.systemStatus) {
+					this.$prompt('璇疯緭鍏ュ彛浠わ紝骞跺仠姝CS绯荤粺', '鎻愮ず', {
+						confirmButtonText: '纭畾',
+						cancelButtonText: '鍙栨秷',
+					}).then(({
+								 value
+							 }) => {
+						that.doSwitch(0, value)
+					}).catch(() => {
+
+					});
+				} else {
+					this.doSwitch(1)
+				}
+			},
+			doSwitch(operatorType, password) {
+				let that = this
+				$.ajax({
+					url: baseUrl + "/console/system/switch",
+					headers: {
+						'token': localStorage.getItem('token')
+					},
+					data: {
+						operatorType: operatorType,
+						password: password
+					},
+					method: 'POST',
+					success: function(res) {
+						if (res.code === 200) {
+							if (res.data.status) {
+								$('#system-toggle-checked').attr("checked", true);
+								$('#system-run-desc').html("绯荤粺杩愯涓�...");
+								that.systemStatus = true;
+								parent.systemRunning = true;
+							} else {
+								$('#system-toggle-checked').attr("checked", false);
+								$('#system-run-desc').html("绯荤粺宸插仠姝�!");
+								that.systemStatus = false;
+								parent.systemRunning = false;
+							}
+						} else if (res.code === 403) {
+							parent.location.href = baseUrl + "/login";
+						} else {
+							that.$message({
+								message: res.msg,
+								type: 'error'
+							});
+						}
+					}
+				});
+			},
+			getSystemRunningStatus() {
+				// 鑾峰彇wcs绯荤粺杩愯鐘舵��
+				let that = this
+				$.ajax({
+					url: baseUrl + "/console/system/running/status",
+					headers: {
+						'token': localStorage.getItem('token')
+					},
+					method: 'POST',
+					success: function(res) {
+						if (res.code === 200) {
+							if (res.data.status) {
+								$('#system-toggle-checked').attr("checked", true);
+								$('#system-run-desc').html("绯荤粺杩愯涓�...");
+								that.systemStatus = true;
+								parent.systemRunning = true;
+							} else {
+								$('#system-toggle-checked').attr("checked", false);
+								$('#system-run-desc').html("绯荤粺宸插仠姝�!");
+								that.systemStatus = false;
+								parent.systemRunning = false;
+							}
+						} else if (res.code === 403) {
+							parent.location.href = baseUrl + "/login";
+						} else {
+							that.$message({
+								message: res.msg,
+								type: 'error'
+							});
+						}
+					}
+				});
+			},
+			getCarPosition(x,y) {
+				//璁$畻鍥涘悜绌挎杞﹀浘鏍囦綅缃�
+				let top = (x * 35 - 35) + "px" //闇�瑕佸噺鍘诲皬杞﹁嚜宸辨墍鍗犻珮搴�
+				let left = (y * 35) + "px" //闇�瑕佸噺鍘诲皬杞﹁嚜宸辨墍鍗犲搴�
+				return [top,left];
+			},
+			testMove() {
+				let that = this
+				clearInterval(this.consoleInterval)//娓呯悊瀹氭椂鍣�
+
+				let shuttleList = this.currentLevShuttleList
+				$.ajax({
+					url: baseUrl + "/static/testMoveData.json",
+					headers: {
+						'token': localStorage.getItem('token')
+					},
+					method: 'GET',
+					success: function(res) {
+						shuttleList[0].moveAdvancePath = res
+						that.currentLevShuttleList = shuttleList
+
+						let index = 0
+						let tmp = null
+						tmp = setInterval(() => {
+							if (index < res.length) {
+								that.currentLevShuttleList[0].wcsPoint.y = res[index].y
+								that.currentLevShuttleList[0].wcsPoint.x = res[index].x
+								index++
+							}else {
+								clearInterval(tmp)
+								that.init()
+							}
+						},1000)
+					}
+				});
+			},
+			colorRGB(){
+				//闅忔満棰滆壊
+				const r = Math.floor(Math.random()*256);
+				const g = Math.floor(Math.random()*256);
+				const b = Math.floor(Math.random()*256);
+				return `rgb(${r},${g},${b})`;
+			},
+			checkAdvancePath(x,y) {
+				//妫�娴嬭矾寰勬槸鍚︿负绌挎杞﹂璁¤矾寰勶紝濡倄鍜寉璺緞鏄┛姊溅棰勮璺緞锛屽垯杩斿洖灏忚溅鍙�
+				this.currentLevShuttleList.forEach((item,idx) => {
+					if (item.moveAdvancePath != null) {
+						item.moveAdvancePath.forEach((path,index) => {
+							if (path.x === x && path.y === y) {
+								return item.shuttleNo;
+							}
+						})
+					}
+				})
+				let data = []
+				let shuttleList = this.currentLevShuttleList;
+				for (var i = 0; i < shuttleList.length; i++) {
+					let shuttle = shuttleList[i]
+					let moveAdvancePath = shuttle.moveAdvancePath
+					if (moveAdvancePath != null) {
+						for (var j = 0; j < moveAdvancePath.length; j++) {
+							let path = moveAdvancePath[j]
+							if (path.x-1 === x && path.y === y) {//璺緞绗﹀悎
+								data.push(shuttle.shuttleNo)
+								continue;
+							}
+						}
+					}
+				}
+				return data;//杩斿洖灏忚溅鍙烽泦鍚�
+			},
+			resetMap() {
+				//閲嶇疆鍦板浘
+				let that = this
+				$.ajax({
+					url:baseUrl+"/console/map/resetMap/auth",
+					headers:{
+						'token': localStorage.getItem('token')
+					},
+					data:{},
+					method:'get',
+					success:function (res) {
+						that.$message({
+							message: '閲嶇疆瀹屾垚',
+							type: 'success'
+						});
+					}
+				})
+			},
+			getCodeData(){
+				let that = this
+				$.ajax({
+					url:baseUrl +'/console/barcode/output/site',
+					method:'GET',
+					success:function (res) {
+						if(res.code === 200){
+							let data = JSON.parse(res.data)
+							if(data.length<=5){
+								that.codeList1 = data
+							} else {
+								tData1 = data.slice(0,5)
+								tData2 = data.splice(5,10)
+							}
+						}
+					}
+				})
+			}
+		}
+	})
+</script>
+</body>
+</html>

--
Gitblit v1.9.1