From 1b007b8d43f82cf86e3cf5f2a316f30bae51deb2 Mon Sep 17 00:00:00 2001
From: Junjie <xjj@123>
Date: 星期五, 23 五月 2025 12:53:40 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/shuttle_rcs' into shuttle_rcs

---
 /dev/null                                                      |    0 
 src/main/java/com/zy/core/dispatcher/ShuttleDispatchUtils.java |    6 
 src/main/java/com/zy/common/model/MapNode.java                 |    4 
 src/main/java/com/zy/core/thread/impl/NyShuttleThread.java     |   21 
 src/main/webapp/views/admin/locMap/locMap.html                 | 1031 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java    |   12 
 src/main/java/com/zy/common/utils/NavigateUtils.java           |   11 
 src/main/java/com/zy/common/utils/NavigateMapData.java         |    3 
 src/main/resources/sql/20250513125153.nb3                      |    0 
 src/main/resources/sql/库位地图sql                                 |    2 
 10 files changed, 1,080 insertions(+), 10 deletions(-)

diff --git a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
index ed1fcb3..c21959d 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -309,6 +309,12 @@
                 return false;
             }
 
+            boolean checkLocPathIsAvailable = navigateUtils.checkLocPathIsAvailable(wrkMast.getSourceLocNo(), liftSta.getLocNo());
+            if(!checkLocPathIsAvailable) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾湭璁$畻鍒板彲鎵ц璺緞锛岀瓑寰呬腑", wrkMast.getWrkNo());
+                return false;
+            }
+
             if (wrkMast.getShuttleNo() == null) {//娌℃湁缁戝畾灏忚溅锛岃繘琛岃皟搴�
                 //寮哄埗棰勭暀涓�鍙板皬杞︾粰鍏ュ簱浠诲姟
                 int lev = Utils.getLev(wrkMast.getSourceLocNo());
@@ -531,6 +537,12 @@
 
         //灏忚溅绉诲姩鑷崇珯鐐�  501.鐢熸垚绉诲簱浠诲姟 ==> 502.灏忚溅鎼繍涓�
         if (wrkMast.getWrkSts() == WrkStsType.NEW_LOC_MOVE.sts) {
+            boolean checkLocPathIsAvailable = navigateUtils.checkLocPathIsAvailable(wrkMast.getSourceLocNo(), wrkMast.getLocNo());
+            if(!checkLocPathIsAvailable) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾湭璁$畻鍒板彲鎵ц璺緞锛岀瓑寰呬腑", wrkMast.getWrkNo());
+                return false;
+            }
+
             if (wrkMast.getShuttleNo() == null) {//娌℃湁缁戝畾灏忚溅锛岃繘琛岃皟搴�
                 boolean result = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo());//璋冨害灏忚溅鍒拌揣鐗╃偣杩涜鍙栬揣
                 News.info("{}浠诲姟锛岃皟搴﹀皬杞}绯荤粺绛夊緟涓�", wrkMast.getWrkNo(), result ? "鎴愬姛" : "澶辫触");
diff --git a/src/main/java/com/zy/common/model/MapNode.java b/src/main/java/com/zy/common/model/MapNode.java
index 32da26a..a6a8ae6 100644
--- a/src/main/java/com/zy/common/model/MapNode.java
+++ b/src/main/java/com/zy/common/model/MapNode.java
@@ -37,6 +37,10 @@
 
     private Integer bay;
 
+    private String locSts;
+
+    private String locNo;
+
     //鑺傜偣琚攣瀹氭椂鎵�灞炶澶囧彿
     private Integer lockDeviceNo;
 
diff --git a/src/main/java/com/zy/common/utils/NavigateMapData.java b/src/main/java/com/zy/common/utils/NavigateMapData.java
index cf5a6c0..0d92ea3 100644
--- a/src/main/java/com/zy/common/utils/NavigateMapData.java
+++ b/src/main/java/com/zy/common/utils/NavigateMapData.java
@@ -225,6 +225,9 @@
                     }
                 }
 
+                mapNode.setLocSts(locMast.getLocSts());
+                mapNode.setLocNo(locMast.getLocNo());
+
                 //鏇存柊list
                 list.set(bay, mapNode);
                 lists.set(row, list);
diff --git a/src/main/java/com/zy/common/utils/NavigateUtils.java b/src/main/java/com/zy/common/utils/NavigateUtils.java
index cb21ea1..bf19aa9 100644
--- a/src/main/java/com/zy/common/utils/NavigateUtils.java
+++ b/src/main/java/com/zy/common/utils/NavigateUtils.java
@@ -426,6 +426,17 @@
         return 0D;
     }
 
+    //妫�娴嬪簱浣嶈矾寰勬槸鍚﹀彲鐢�(鐢ㄤ簬搴撲綅鏄惁鍙Щ鍔ㄦ娴�)
+    public boolean checkLocPathIsAvailable(String startLocNo, String endLocNo) {
+        List<int[]> shuttlePoints = Utils.getShuttlePoints(0, Utils.getLev(startLocNo));
+        //璁$畻搴撲綅鍒版彁鍗囨満搴撲綅锛岃矾寰勬槸鍚﹀彲鐢�
+        List<NavigateNode> nodeList = this.calc(startLocNo, endLocNo, NavigationMapType.DFX.id, shuttlePoints, null);
+        if (nodeList == null) {
+            return false;
+        }
+        return true;
+    }
+
     public static void main(String[] args) {
 //        //璁$畻璺緞
 //        List<NavigateNode> calc = calc("1000901", "1800201", NavigationMapType.NONE.id, null);
diff --git a/src/main/java/com/zy/core/dispatcher/ShuttleDispatchUtils.java b/src/main/java/com/zy/core/dispatcher/ShuttleDispatchUtils.java
index 0fe2dd8..2600041 100644
--- a/src/main/java/com/zy/core/dispatcher/ShuttleDispatchUtils.java
+++ b/src/main/java/com/zy/core/dispatcher/ShuttleDispatchUtils.java
@@ -57,14 +57,14 @@
     /**
      * 璋冨害杞﹁締-璋冨害鎸囧畾绌挎杞�
      */
-    public boolean dispatchShuttle(Integer wrkNo, String locNo, Integer shuttleNo) {
+    public synchronized boolean dispatchShuttle(Integer wrkNo, String locNo, Integer shuttleNo) {
         return shuttleMoveGenerate(wrkNo, locNo, shuttleNo);
     }
 
     /**
      * 璋冨害杞﹁締
      */
-    public boolean dispatchShuttle(Integer wrkNo, String locNo) {
+    public synchronized boolean dispatchShuttle(Integer wrkNo, String locNo) {
         ArrayList<ShuttleThread> sameLev = new ArrayList<>();//鐩稿悓妤煎眰鐨勭┛姊溅
         ArrayList<ShuttleThread> diffLev = new ArrayList<>();//涓嶅悓妤煎眰鐨勭┛姊溅
 
@@ -202,7 +202,7 @@
      * 灏忚溅杩佺Щ浠诲姟鐢熸垚
      */
     @Transactional
-    public boolean shuttleMoveGenerate(Integer wrkNo, String locNo, Integer shuttleNo) {
+    public synchronized boolean shuttleMoveGenerate(Integer wrkNo, String locNo, Integer shuttleNo) {
         Date now = new Date();
         //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
         ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo);
diff --git a/src/main/java/com/zy/core/thread/impl/NyShuttleThread.java b/src/main/java/com/zy/core/thread/impl/NyShuttleThread.java
index 126281a..33142bc 100644
--- a/src/main/java/com/zy/core/thread/impl/NyShuttleThread.java
+++ b/src/main/java/com/zy/core/thread/impl/NyShuttleThread.java
@@ -42,6 +42,7 @@
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.OutputStreamWriter;
+import java.net.InetAddress;
 import java.net.Socket;
 import java.text.MessageFormat;
 import java.util.*;
@@ -1067,12 +1068,15 @@
     @Override
     public boolean connect() {
         try {
-            Socket socket = new Socket(slave.getIp(), slave.getPort());
-            socket.setSoTimeout(10000);
-            socket.setKeepAlive(true);
-            this.socket = socket;
-            log.info(MessageFormat.format("銆恵0}銆戝洓鍚戠┛姊溅Socket閾炬帴鎴愬姛 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
-        } catch (IOException e) {
+            InetAddress address = InetAddress.getByName(slave.getIp());
+            if (address.isReachable(10000)) {
+                Socket socket = new Socket(slave.getIp(), slave.getPort());
+                socket.setSoTimeout(10000);
+                socket.setKeepAlive(true);
+                this.socket = socket;
+                log.info(MessageFormat.format("銆恵0}銆戝洓鍚戠┛姊溅Socket閾炬帴鎴愬姛 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
+            }
+        } catch (Exception e) {
             OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆戝洓鍚戠┛姊溅Socket閾炬帴澶辫触 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
             return false;
         }
@@ -1194,7 +1198,10 @@
            writer.flush();
 //            System.out.println("Sent message to server: " + JSON.toJSONString(httpCommand));
        }catch (Exception e) {
-           e.printStackTrace();
+//           e.printStackTrace();
+//           System.out.println("socket write error");
+           this.socket.close();
+           this.socket = null;
        }
     }
 
diff --git a/src/main/resources/sql/20250208165620.nb3 b/src/main/resources/sql/20250208165620.nb3
deleted file mode 100644
index 25c7c6c..0000000
--- a/src/main/resources/sql/20250208165620.nb3
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/sql/20250210133035.nb3 b/src/main/resources/sql/20250210133035.nb3
deleted file mode 100644
index b289c3a..0000000
--- a/src/main/resources/sql/20250210133035.nb3
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/sql/20250213165543.nb3 b/src/main/resources/sql/20250213165543.nb3
deleted file mode 100644
index aeb73c2..0000000
--- a/src/main/resources/sql/20250213165543.nb3
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/sql/20250313155617.nb3 b/src/main/resources/sql/20250313155617.nb3
deleted file mode 100644
index b31edc4..0000000
--- a/src/main/resources/sql/20250313155617.nb3
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/sql/20250331102933.nb3 b/src/main/resources/sql/20250331102933.nb3
deleted file mode 100644
index be73caa..0000000
--- a/src/main/resources/sql/20250331102933.nb3
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/sql/20250423154227.nb3 b/src/main/resources/sql/20250513125153.nb3
similarity index 86%
rename from src/main/resources/sql/20250423154227.nb3
rename to src/main/resources/sql/20250513125153.nb3
index 12de8e4..1c4f477 100644
--- a/src/main/resources/sql/20250423154227.nb3
+++ b/src/main/resources/sql/20250513125153.nb3
Binary files differ
diff --git "a/src/main/resources/sql/\345\272\223\344\275\215\345\234\260\345\233\276sql" "b/src/main/resources/sql/\345\272\223\344\275\215\345\234\260\345\233\276sql"
new file mode 100644
index 0000000..b56b4d1
--- /dev/null
+++ "b/src/main/resources/sql/\345\272\223\344\275\215\345\234\260\345\233\276sql"
@@ -0,0 +1,2 @@
+INSERT INTO `shuttle_rcs`.`sys_resource` (`code`, `name`, `resource_id`, `level`, `sort`, `status`) VALUES ('locMap/locMap.html', '搴撲綅鍦板浘', 40541, 2, 8, 1);
+INSERT INTO `shuttle_rcs`.`sys_resource` (`code`, `name`, `resource_id`, `level`, `sort`, `status`) VALUES ('locMap#query', '鏌ヨ', '', 3, 0, 1);
\ No newline at end of file
diff --git a/src/main/webapp/views/admin/locMap/locMap.html b/src/main/webapp/views/admin/locMap/locMap.html
new file mode 100644
index 0000000..4b25c9a
--- /dev/null
+++ b/src/main/webapp/views/admin/locMap/locMap.html
@@ -0,0 +1,1031 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <title>搴撲綅鍦板浘</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>
+  <script src="../../../static/js/gsap.min.js"></script>
+  <script src="../../../static/js/pixi-legacy.min.js"></script>
+  <style>
+    *{
+      margin: 0;
+      padding: 0;
+    }
+  </style>
+</head>
+<body>
+<div id="app">
+  <div id="pixiView">
+
+  </div>
+
+  <!--杈撳嚭鎿嶄綔鍜孎PS-->
+  <div style="position: absolute;top: 20px;right: 50px;">
+    <div>FPS:{{mapFps}}</div>
+    <el-button @click="drawer = true">鎿嶄綔</el-button>
+  </div>
+
+  <el-drawer
+          title="鎿嶄綔鍖哄煙"
+          :visible.sync="drawer"
+          :with-header="true"
+          :modal="false"
+  >
+    <div class="floorBtnBox" v-for="(lev,idx) in floorList">
+      <el-button :style="{background:currentLev === lev ? '#7DCDFF':''}" @click="changeFloor(lev)">{{lev}}F</el-button>
+    </div>
+<!--    <div>-->
+<!--      <el-button @click="testMove()">娴嬭瘯绉诲姩杞�</el-button>-->
+<!--    </div>-->
+<!--    <div style="margin-top: 10px;">-->
+<!--      <el-button @click="resetMap()">閲嶇疆鍦板浘</el-button>-->
+<!--    </div>-->
+  </el-drawer>
+
+  <el-drawer
+          title="搴撲綅璇︽儏"
+          :visible.sync="drawerLocNo"
+          :with-header="true"
+          :modal="false"
+  >
+    <div v-if="drawerLocNoData!=null">
+      <div style="margin: 10px;">
+        <div style="margin-top: 5px;">X锛歿{drawerLocNoData.x}}</div>
+        <div style="margin-top: 5px;">Y锛歿{drawerLocNoData.y}}</div>
+        <div style="margin-top: 5px;">Z锛歿{drawerLocNoData.z}}</div>
+        <div style="margin-top: 5px;">搴撲綅鍙凤細{{drawerLocNoData.locNo}}</div>
+        <div style="margin-top: 5px;">搴撲綅鐘舵�侊細{{drawerLocNoData.locSts}}</div>
+      </div>
+    </div>
+  </el-drawer>
+
+  <el-drawer
+          title="灏忚溅淇℃伅"
+          :visible.sync="drawerShuttle"
+          :with-header="true"
+          :modal="false"
+  >
+    <div v-if="drawerShuttleData!=null">
+      <div style="margin: 10px;">
+        <div style="margin-top: 5px;">灏忚溅锛歿{drawerShuttleData.shuttleNo}}</div>
+        <div style="margin-top: 5px;">宸ヤ綔鍙凤細{{drawerShuttleData.wrkNo}}</div>
+        <div style="margin-top: 5px;">鐘舵�侊細{{drawerShuttleData}}</div>
+      </div>
+    </div>
+  </el-drawer>
+
+  <el-drawer
+          title="绔欑偣淇℃伅"
+          :visible.sync="drawerSta"
+          :with-header="true"
+          :modal="false"
+  >
+    <div v-if="drawerStaData!=null">
+      <div style="margin: 10px;">
+        <div style="margin-top: 5px;">绔欑偣锛歿{drawerStaData.siteId}}</div>
+        <div style="margin-top: 5px;">宸ヤ綔鍙凤細{{drawerStaData.workNo}}</div>
+        <div style="margin-top: 5px;">宸ヤ綔鐘舵�侊細{{drawerStaData.wrkSts}}</div>
+        <div style="margin-top: 5px;">宸ヤ綔绫诲瀷锛歿{drawerStaData.ioType}}</div>
+        <div style="margin-top: 5px;">婧愮珯锛歿{drawerStaData.sourceStaNo}}</div>
+        <div style="margin-top: 5px;">鐩爣绔欙細{{drawerStaData.staNo}}</div>
+        <div style="margin-top: 5px;">婧愬簱浣嶏細{{drawerStaData.sourceLocNo}}</div>
+        <div style="margin-top: 5px;">鐩爣搴撲綅锛歿{drawerStaData.locNo}}</div>
+        <div style="margin-top: 5px;">鑷姩锛歿{drawerStaData.autoing}}</div>
+        <div style="margin-top: 5px;">鏈夌墿锛歿{drawerStaData.loading}}</div>
+        <div style="margin-top: 5px;">鑳藉叆锛歿{drawerStaData.canining}}</div>
+        <div style="margin-top: 5px;">鑳藉嚭锛歿{drawerStaData.canouting}}</div>
+        <div style="margin-top: 5px;">鑳藉嚭锛歿{drawerStaData.canouting}}</div>
+      </div>
+    </div>
+  </el-drawer>
+
+  <el-drawer
+          title="鎻愬崌鏈轰俊鎭�"
+          :visible.sync="drawerLift"
+          :with-header="true"
+          :modal="false"
+  >
+    <div v-if="drawerLiftData!=null">
+      <div style="margin: 10px;">
+        <div style="margin-top: 5px;">鎻愬崌鏈猴細{{liftList[drawerLiftData-1].liftNo}}</div>
+        <div style="margin-top: 5px;">宸ヤ綔鍙凤細{{liftList[drawerLiftData-1].taskNo}}</div>
+        <div style="margin-top: 5px;">鐘舵�侊細{{liftList[drawerLiftData-1]}}</div>
+      </div>
+    </div>
+  </el-drawer>
+
+</div>
+<script>
+  let width = 25;
+  let height = 25;
+  let pixiApp;
+  let pixiStageList = [];
+  let pixiShuttleMap = new Map();
+  let pixiShuttleMoveAdvancePathMap = new Map();
+  let pixiShuttleMoveAdvancePathList = [];
+  let pixiShuttleLockPathMap = new Map();
+  let pixiStaMap = new Map();
+  let objectsContainer;
+  let objectsContainer2;
+  let objectsContainer3;
+  let graphics0;
+  let graphics3;
+  let graphics4;
+  let graphics5;
+  let graphics9;
+  let graphics67;
+  let graphicsLock;
+  let ws;
+
+  var app = new Vue({
+    el: '#app',
+    data: {
+      map: [],
+      currentLev: 1,
+      floorList: [], //褰撳墠椤圭洰妤煎眰
+      currentLevShuttleList: [],//褰撳墠妤煎眰鍥涘悜绌挎杞﹂泦鍚�
+      shuttleColorList: [],//鍥涘悜绌挎杞﹂鑹查泦鍚�
+      drawer: false,
+      drawerLocNo: false,
+      drawerLocNoData: null,
+      drawerLocDetls: [],
+      reloadMap: true,
+      mapFps: 0,
+      drawerShuttle: false,
+      drawerShuttleData: null,
+      currentLevStaList: [],//褰撳墠妤煎眰绔欑偣list
+      reloadSta: true,
+      drawerSta: false,
+      drawerStaData: null,
+      drawerLift: false,
+      drawerLiftData: null,
+      liftList: [],
+    },
+    mounted() {
+      this.init()
+      this.createMap()
+    },
+    watch: {
+      map: {
+        deep: true,
+        handler(val) {
+
+        }
+      },
+      drawerLocNo: {
+        deep: true,
+        handler(val) {
+          if (!val) {
+            var sprite = pixiStageList[this.drawerLocNoData.x][this.drawerLocNoData.y];
+            updateColor(sprite, 0xFFFFFF);//鎭㈠棰滆壊
+          }
+        }
+      }
+    },
+    methods: {
+      init(){
+        let that = this
+        ws = new WebSocket("ws://" + window.location.host + baseUrl + "/console/websocket");
+        ws.onopen = this.webSocketOnOpen
+        ws.onerror = this.webSocketOnError
+        ws.onmessage = this.webSocketOnMessage
+        ws.onclose = this.webSocketClose
+
+
+        this.initLev()//鍒濆鍖栨ゼ灞備俊鎭�
+        setTimeout(() => {
+          that.getMap(this.currentLev)
+        }, 1000);
+
+        // this.consoleInterval = setInterval(() => {
+        //   this.getMap(this.currentLev) //鑾峰彇瀹炴椂鍦板浘鏁版嵁
+        //   this.getShuttleStateInfo() //鑾峰彇鍥涘悜绌挎杞︿俊鎭�
+        //   this.getLiftStateInfo() //鑾峰彇鎻愬崌鏈轰俊鎭�
+        //   this.getSiteInfo() //鑾峰彇杈撻�佺珯鐐规暟鎹�
+        //   // this.getCodeData()//鑾峰彇鏉$爜
+        // }, 1000)
+
+      },
+      initLev(){
+        let that = this
+        $.ajax({
+          url: baseUrl + "/console/map/lev/list",
+          headers: {
+            'token': localStorage.getItem('token')
+          },
+          data: {},
+          method: 'get',
+          success: function(res) {
+            if (res.code === 200) {
+              that.floorList = res.data;
+            } else if (res.code === 403) {
+              parent.location.href = baseUrl + "/login";
+            } else {
+              that.$message({
+                message: res.msg,
+                type: 'error'
+              });
+            }
+          }
+        });
+      },
+      getShuttleStateInfo() {
+        this.sendWs(JSON.stringify({
+          "url": "/shuttle/table/shuttle/state",
+          "data": {}
+        }))
+      },
+      setShuttleStateInfo(res) {
+        // 鍥涘悜绌挎杞︿俊鎭〃鑾峰彇
+        let that = this
+        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.shuttleList = res.data
+          if (that.shuttleColorList.length == 0) {
+            let colorList = []//闅忔満灏忚溅棰滆壊
+            res.data.forEach((item,idx) => {
+              colorList[item.shuttleNo] = that.colorRGB()
+            })
+            that.shuttleColorList = colorList
+          }
+
+          const result = this.findShuttleDiffList(this.currentLevShuttleList, currentLevShuttle);
+          if (!result) {
+            //灏忚溅瀛樺湪鍙樺姩锛岄噸鏂版覆鏌撳叏閮ㄥ皬杞�
+            pixiShuttleMap.forEach((shuttle,index) => {
+              pixiApp.stage.removeChild(shuttle)
+              pixiShuttleMap.delete(index)
+            })
+
+            currentLevShuttle.forEach((item,index) => {
+              pixiApp.loader.load((loader, resources) => {
+                // 绾圭悊鍒涘缓灏忚溅
+                const shuttle = new PIXI.Sprite(resources.shuttle.texture);
+                shuttle.width = width
+                shuttle.height = height
+                shuttle.x = (item.wcsPoint.y - 0) * width;//鏇存柊鍧愭爣x
+                shuttle.y = (item.wcsPoint.x - 1) * height;//鏇存柊鍧愭爣y
+                shuttle.updateMoveStatus = true;//鍔ㄧ敾鎵ц瀹屾垚
+                shuttle.interactive = true; // 蹇呴』瑕佽缃墠鑳芥帴鏀朵簨浠�
+                shuttle.buttonMode = true; // 璁╁厜鏍囧湪hover鏃跺彉涓烘墜鍨嬫寚閽�
+                shuttle.on('pointerdown', (e) => {
+                  this.drawerShuttle = true;
+                  this.drawerShuttleData = item;
+                })
+                pixiApp.stage.addChild(shuttle);
+                pixiShuttleMap.set(item.shuttleNo, shuttle);
+              })
+
+              if (item.moveAdvancePath != null && item.moveAdvancePath.length > 0) {//瀛樺湪棰勮璺緞锛岃繘琛屾覆鏌�
+                this.addMoveAdvancePath(item.moveAdvancePath, item.shuttleNo);//娣诲姞棰勮璺緞
+              }
+
+            })
+          }else {
+            //灏忚溅涓嶅瓨鍦ㄥ彉鍔紝娓叉煋灏忚溅浣嶇疆
+            currentLevShuttle.forEach((item,index) => {
+              this.updateShuttleXY(item)
+            })
+
+            const resultPath = this.findShuttlePathDiffList(JSON.parse(JSON.stringify(this.currentLevShuttleList)), JSON.parse(JSON.stringify(currentLevShuttle)));
+            if (!resultPath) {
+              //棰勮璺緞瀛樺湪鍙樺姩锛屾覆鏌撹矾寰�
+              currentLevShuttle.forEach((item,index) => {
+                //鍒犻櫎棰勮璺緞
+                this.removeMoveAdvancePath(item.shuttleNo);
+                if (item.moveAdvancePath != null && item.moveAdvancePath.length > 0) {//瀛樺湪棰勮璺緞锛岃繘琛屾覆鏌�
+                  this.addMoveAdvancePath(item.moveAdvancePath, item.shuttleNo);//娣诲姞棰勮璺緞
+                }
+              })
+            }
+          }
+          that.currentLevShuttleList = currentLevShuttle;
+        }
+      },
+      //鑾峰彇鍦板浘鏁版嵁
+      getMap(lev) {
+        this.sendWs(JSON.stringify({
+          "url": "/console/map/auth",
+          "data": lev
+        }))
+      },
+      setMap(res) {
+        //鑾峰彇鍦板浘鏁版嵁
+        let data = res.data
+        let tmp = []
+        for (let i = 1; i < data.length - 1; i++) {
+          tmp.push(data[i])
+        }
+        this.createMapData(tmp)
+      },
+      changeFloor(lev) {
+        this.currentLev = lev
+        this.currentLevShuttleList = []
+        this.reloadMap = true
+        this.reloadSta = true
+        this.getMap(lev)
+
+        //娓呯┖鍗犵敤璺緞
+        objectsContainer3.removeChildren();
+        pixiShuttleLockPathMap = new Map();
+
+        //娓呯┖棰勮璺緞
+        objectsContainer2.removeChildren();
+        pixiShuttleMoveAdvancePathMap = new Map();
+        pixiShuttleMoveAdvancePathList = []
+      },
+      createMap(){
+        //Create a Pixi Application
+        pixiApp = new PIXI.Application({
+          // width: 1500,
+          // height: 800,
+          backgroundColor: 0xF5F7F9FF,
+          resizeTo: window
+        });
+        //Add the canvas that Pixi automatically created for you to the HTML document
+        $("#pixiView").append(pixiApp.view)
+
+        //鍔犺浇灏忚溅璧勬簮
+        pixiApp.loader.add('shuttle', '../static/images/sxcar.png');
+
+        // 浠嶨raphics瀵硅薄鍒涘缓涓�涓汗鐞�
+		graphicsF = pixiApp.renderer.generateTexture(getContainer(1000));
+        graphics0 = pixiApp.renderer.generateTexture(getContainer(0));
+        graphics3 = pixiApp.renderer.generateTexture(getContainer(3));
+        graphics4 = pixiApp.renderer.generateTexture(getContainer(4));
+        graphics5 = pixiApp.renderer.generateTexture(getContainer(5));
+        graphics9 = pixiApp.renderer.generateTexture(getContainer(9));
+        graphics67 = pixiApp.renderer.generateTexture(getContainer(67));
+        graphicsLock = pixiApp.renderer.generateTexture(getContainer(-999));
+
+        // 鍒涘缓涓�涓鍣ㄦ潵绠$悊澶ф壒閲忕殑鏄剧ず瀵硅薄
+        objectsContainer = new PIXI.Container();
+        pixiApp.stage.addChild(objectsContainer);
+
+        // 鍒涘缓涓�涓鍣ㄦ潵绠$悊澶ф壒閲忕殑鏄剧ず瀵硅薄
+        objectsContainer2 = new PIXI.Container();
+        pixiApp.stage.addChild(objectsContainer2);
+
+        // 鍒涘缓涓�涓鍣ㄦ潵绠$悊澶ф壒閲忕殑鏄剧ず瀵硅薄
+        objectsContainer3 = new PIXI.Container();
+        pixiApp.stage.addChild(objectsContainer3);
+
+        //*******************鎷栧姩鐢诲竷*******************
+        let stageOriginalPos;
+        let mouseDownPoint;
+        let touchBlank = false;
+        pixiApp.renderer.plugins.interaction.on(
+                'pointerdown',
+                (event) => {
+                  const globalPos = event.data.global;
+                  // 璁板綍涓媠tage鍘熸潵鐨勪綅缃�
+                  stageOriginalPos = [pixiApp.stage.position._x, pixiApp.stage.position._y];
+                  // 璁板綍涓媘ouse down鐨勪綅缃�
+                  mouseDownPoint = [globalPos.x, globalPos.y];
+                  if (!event.target) {
+                    // 鐐瑰埌浜嗙敾甯冪殑绌虹櫧浣嶇疆
+                    touchBlank = true;
+                  }
+                }
+        );
+
+        pixiApp.renderer.plugins.interaction.on(
+                'pointermove',
+                (event) => {
+                  const globalPos = event.data.global;
+
+                  if (touchBlank) {
+                    // 鎷栨嫿鐢诲竷
+                    const dx = globalPos.x - mouseDownPoint[0];
+                    const dy = globalPos.y - mouseDownPoint[1];
+                    pixiApp.stage.position.set(
+                            stageOriginalPos[0] + dx,
+                            stageOriginalPos[1] + dy
+                    );
+                  }
+                }
+        );
+
+        pixiApp.renderer.plugins.interaction.on(
+                'pointerup',
+                (event) => {
+                  touchBlank = false;
+                }
+        );
+        //*******************鎷栧姩鐢诲竷*******************
+
+        //*******************缂╂斁鐢诲竷*******************
+        pixiApp.view.addEventListener('wheel', (event) => {
+          event.stopPropagation();
+          event.preventDefault();
+          // 鍥犱负鐢诲竷鏄厖婊¤绐楃殑锛屾墍浠lientX绛変簬mouse point鍦╮enderer涓婄殑x鍧愭爣
+          const globalPos = [event.clientX, event.clientY];
+          const delta = event.deltaY;
+          const oldZoom = pixiApp.stage.scale.x;
+          let newZoom = oldZoom * 0.999 ** delta;
+
+          // const oldStageMatrix = app.stage.localTransform.clone();
+          // const oldStagePos = oldStageMatrix.applyInverse(pointerGlobalPos);
+          const oldStagePos = globalPos;
+          const dx = oldStagePos[0] * oldZoom - oldStagePos[0] * newZoom;
+          const dy = oldStagePos[1] * oldZoom - oldStagePos[1] * newZoom;
+
+          pixiApp.stage.setTransform(
+                  pixiApp.stage.position.x + dx,
+                  pixiApp.stage.position.y + dy,
+                  newZoom,
+                  newZoom,
+                  0,
+                  0,
+                  0,
+                  0,
+                  0
+          );
+
+        });
+        //*******************缂╂斁鐢诲竷*******************
+
+        //*******************FPS*******************
+        var g_Time=0;
+        pixiApp.ticker.add((delta) => {
+          var timeNow = (new Date()).getTime();
+          var timeDiff = timeNow - g_Time;
+          g_Time = timeNow;
+          var fps = 1000 / timeDiff;
+          this.mapFps = parseInt(fps)
+        });
+        //*******************FPS*******************
+
+      },
+      createMapData(map) {
+        if (this.reloadMap) {
+          this.reloadMap = false
+          pixiStageList = [map.length]//鍒濆鍖栧垪琛�
+          pixiStaMap = new Map();//閲嶇疆
+
+          objectsContainer.removeChildren()
+          map.forEach((item,index) => {
+            pixiStageList[index] = [item.length]
+            for (let idx = 0; idx < item.length; idx++) {
+              let val = item[idx]
+              if (val.value < 0 && (val.value != -999)) {
+                continue;
+              }
+
+              let sprite = getSprite(val.value, idx * width, index * height, val, (e) => {
+                if (val.value == 4) {
+                  //绔欑偣
+                  this.openDrawerSta(val)
+                } else if (val.value == 67) {
+                  //鎻愬崌鏈�
+                  this.openDrawerLift(val)
+                } else {
+                  //搴撲綅
+                  this.rightEvent(index, idx, e);
+                  updateColor(sprite, 0x9900ff);
+                }
+              });
+
+              if (val.value == 4) {
+                // 鍒涘缓鏂囨湰瀵硅薄
+                const style = new PIXI.TextStyle({
+                  fontFamily: 'Arial',
+                  fontSize: 10,
+                  fill: '#000000',
+                });
+                const text = new PIXI.Text(val.data, style);
+                text.anchor.set(0.5); // 璁剧疆鏂囨湰閿氱偣涓轰腑蹇冪偣
+                text.position.set(sprite.width / 2, sprite.height / 2); // 灏嗘枃鏈綅缃缃负Graphics瀵硅薄鐨勪腑蹇冪偣
+                // 灏嗘枃鏈璞℃坊鍔犲埌Graphics瀵硅薄涓�
+                sprite.addChild(text);
+                sprite.textObj = text;
+                pixiStaMap.set(parseInt(val.data), sprite);//绔欑偣鏁版嵁娣诲姞鍒癿ap涓�
+              }else if (val.value == 67) {
+                // 鍒涘缓鎻愬崌鏈烘枃鏈璞�
+                const style = new PIXI.TextStyle({
+                  fontFamily: 'Arial',
+                  fontSize: 10,
+                  fill: '#000000',
+                });
+                const text = new PIXI.Text(val.data, style);
+                text.anchor.set(0.5); // 璁剧疆鏂囨湰閿氱偣涓轰腑蹇冪偣
+                text.position.set(sprite.width / 2, sprite.height / 2); // 灏嗘枃鏈綅缃缃负Graphics瀵硅薄鐨勪腑蹇冪偣
+                // 灏嗘枃鏈璞℃坊鍔犲埌Graphics瀵硅薄涓�
+                sprite.addChild(text);
+                sprite.textObj = text;
+                pixiStaMap.set(parseInt(val.data), sprite);//绔欑偣鏁版嵁娣诲姞鍒癿ap涓�
+              }
+
+              if (val.value == -999) {
+                pixiShuttleLockPathMap.set(val.locNo, sprite);
+                objectsContainer3.addChild(sprite);
+              }else {
+                objectsContainer.addChild(sprite);
+              }
+              pixiStageList[index][idx] = sprite
+            }
+          });
+
+          //瑙嗚灞呬腑
+          let containerWidth = (pixiApp.view.width - objectsContainer.width) / 2;
+          let containerHeight = (pixiApp.view.height - objectsContainer.height) / 2;
+          pixiApp.stage.position.set(containerWidth, containerHeight);
+        }else {
+          let diff = this.findDiffList(this.map, map);
+          diff.forEach((item, index) => {
+            //鑾峰彇old鍏冪礌
+            let oldSprite = pixiStageList[item.x][item.y]
+            if (item.originData == -999) {
+              //绉婚櫎old璺緞鍏冪礌
+              objectsContainer3.removeChild(oldSprite);
+            }else {
+              //绉婚櫎old鍏冪礌
+              objectsContainer.removeChild(oldSprite);
+            }
+
+            let sprite = getSprite(item.data, item.y * width, item.x * height, item, (e) => {
+              this.rightEvent(item.x, item.y, e);
+              updateColor(sprite, 0x9900ff);
+            });
+
+            if (item.data == -999) {
+              //娣诲姞璺緞鍏冪礌
+              objectsContainer3.addChild(sprite);
+            }else {
+              //娣诲姞鍏冪礌
+              objectsContainer.addChild(sprite);
+            }
+
+            //淇濆瓨鏂板厓绱�
+            pixiStageList[item.x][item.y] = sprite
+          });
+        }
+
+        this.map = map;
+      },
+      rightEvent(x, y, e) {
+        this.drawerLocNo = true
+        this.drawerLocNoData =  {x:x, y: y, z: this.currentLev, locNo: this.map[x][y].locNo, locSts: this.map[x][y].locSts};
+      },
+      findDiffList(arr1, arr2) {
+        let diff = []
+        arr1.forEach((item,index) => {
+          item.forEach((val,idx) => {
+            if(val.value != arr2[index][idx].value){
+              diff.push({
+                x: index,
+                y: idx,
+                data: arr2[index][idx].value,
+                originData: val.value,
+                locSts: val.locSts
+              })
+            }
+          })
+        })
+
+        return diff;
+      },
+      findShuttleDiffList(list1, list2) {
+        //妫�娴嬮泦鍚�1閲岄潰鐨勫皬杞︽槸鍚﹀湪闆嗗悎2涓湁鍙樺姩
+        if (list1.length == 0) {
+          return false;//闆嗗悎涓虹┖
+        }
+        if (list1.length != list2.length) {
+          return false;//涓や釜闆嗗悎闀垮害涓嶄竴鑷�
+        }
+
+        let flag = false;
+        list1.forEach((item,index) => {
+          for (var i = 0; i < list2.length; i++) {
+            if (item.shuttleNo == list2[i].shuttleNo) {
+              flag = true;
+              break;
+            }
+          }
+        });
+
+        return flag;
+      },
+      findShuttlePathDiffList(list1, list2) {
+        //妫�娴嬮泦鍚�1閲岄潰鐨勫皬杞﹂璁¤矾寰勬槸鍚﹀湪闆嗗悎2涓湁鍙樺姩
+        if (list1.length == 0) {
+          return false;//闆嗗悎涓虹┖
+        }
+        if (list1.length != list2.length) {
+          return false;//涓や釜闆嗗悎闀垮害涓嶄竴鑷�
+        }
+
+        for (var index = 0; index < list1.length; index++) {
+          let item = list1[index];
+          for (var i = 0; i < list2.length; i++) {
+            if (item.shuttleNo != list2[i].shuttleNo) {
+              continue;//鎵句笉鍒板皬杞﹀彿
+            }
+
+            if (item.moveAdvancePath == null) {
+              item.moveAdvancePath = [];
+            }
+
+            if (list2[i].moveAdvancePath == null) {
+              list2[i].moveAdvancePath = [];
+            }
+
+            if (!(item.moveAdvancePath.length == list2[i].moveAdvancePath.length)) {
+              return false;//灏忚溅棰勮璺緞闀垮害涓嶄竴鑷�
+            }
+          }
+        }
+        return true;
+      },
+      checkStaInListDiff(sta, list) {
+        //妫�娴嬬珯鐐规槸鍚﹀湪闆嗗悎涓湁鍙樺姩
+        if (list.length == 0) {
+          return false;//闆嗗悎涓虹┖
+        }
+
+        let tmp = null;
+        for (var i = 0; i < list.length; i++) {
+          if (sta.siteId == list[i].siteId) {
+            tmp = list[i];//鎵惧埌鐩稿悓绔欑偣
+            break
+          }
+        }
+
+        if (tmp == null) {
+          return false;//娌℃湁鎵惧埌鐩稿悓绔欑偣
+        }
+
+        if (sta.siteStatus != tmp.siteStatus) {
+          return false;//绔欑偣鐘舵�佷笉鐩稿悓
+        }
+
+        if (sta.workNo != tmp.workNo) {
+          return false;//绔欑偣宸ヤ綔鍙蜂笉鐩稿悓
+        }
+
+        return true;//鏃犲彉鍖�
+      },
+      webSocketOnOpen(e) {
+        console.log("open");
+      },
+      webSocketOnError(e) {
+        console.log(e);
+      },
+      webSocketOnMessage(e) {
+        const result = JSON.parse(e.data);
+        if (result.url == "/shuttle/table/shuttle/state") {
+          this.setShuttleStateInfo(JSON.parse(result.data))
+        }else if (result.url == "/lift/table/lift/state") {
+          this.setLiftStateInfo(JSON.parse(result.data))
+        }else if (result.url == "/console/latest/data/site") {
+          this.setSiteInfo(JSON.parse(result.data))
+        }else if (result.url == "/console/map/auth") {
+          this.setMap(JSON.parse(result.data))
+        }else if (result.url == "/console/barcode/output/site") {
+          this.setCodeData(JSON.parse(result.data))
+        }
+      },
+      webSocketClose(e) {
+        console.log("close");
+      },
+      sendWs(message) {
+        if (ws.readyState == WebSocket.OPEN) {
+          ws.send(message)
+        }
+      },
+      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})`;
+      },
+      updateShuttleXY(item) {
+        const shuttle = pixiShuttleMap.get(item.shuttleNo);
+        if (shuttle.updateMoveStatus) {//鍔ㄧ敾鎵ц瀹屾垚鎵嶅彲缁х画鎵ц鍔ㄧ敾
+          shuttle.updateMoveStatus = false;//鍔ㄧ敾鎵ц涓�
+          // 璁$畻涓ょ偣涔嬮棿鐨勮窛绂�1
+          const distance = Math.sqrt(Math.pow((item.wcsPoint.x * width) - shuttle.x, 2) + Math.pow((item.wcsPoint.y * height) - shuttle.y, 2));
+          gsap.killTweensOf(shuttle); // 鏉�姝绘墍鏈夐拡瀵�".class"鐨勫姩鐢�
+          gsap.to(shuttle, {
+            x: (item.wcsPoint.y - 0) * width, // 鐩爣浣嶇疆
+            y: (item.wcsPoint.x - 1) * height, // 鐩爣浣嶇疆
+            duration: 0.2, // 鍔ㄧ敾鎸佺画鏃堕棿锛堢锛�
+            ease: "power1.inOut", // 缂撳姩绫诲瀷
+            onComplete: () => {
+              shuttle.updateMoveStatus = true;//鍔ㄧ敾鎵ц瀹屾垚
+            }
+          });
+        }
+      },
+      getSiteInfo() {
+        //鑾峰彇杈撻�佺珯鐐规暟鎹�
+        this.sendWs(JSON.stringify({
+          "url": "/console/latest/data/site",
+          "data": {}
+        }))
+      },
+      setSiteInfo(res) {
+        // var test = "{\"msg\":\"鎿嶄綔鎴愬姛\",\"code\":200,\"data\":[{\"siteId\":\"300\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"301\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"302\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"303\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"304\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"305\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"306\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"307\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"308\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"309\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"310\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"311\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"312\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"313\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"314\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"315\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"316\",\"siteStatus\":\"site-auto-run\",\"workNo\":0},{\"siteId\":\"317\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"318\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"319\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"320\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"321\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"322\",\"siteStatus\":\"site-auto-run\",\"workNo\":0},{\"siteId\":\"323\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"324\",\"siteStatus\":\"site-auto-run\",\"workNo\":0},{\"siteId\":\"325\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"326\",\"siteStatus\":\"site-auto-id\",\"workNo\":5451},{\"siteId\":\"327\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"200\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"328\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"201\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"329\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"202\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"330\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"203\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"331\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"204\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"332\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"205\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"333\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"334\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"335\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"336\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"337\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"338\",\"siteStatus\":\"site-auto-run\",\"workNo\":0},{\"siteId\":\"339\",\"siteStatus\":\"site-auto-run-id\",\"workNo\":5447},{\"siteId\":\"340\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"341\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"342\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"343\",\"siteStatus\":\"site-auto-run\",\"workNo\":0},{\"siteId\":\"344\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"345\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"346\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"100\",\"siteStatus\":\"site-auto-run-id\",\"workNo\":8851},{\"siteId\":\"101\",\"siteStatus\":\"site-auto-run-id\",\"workNo\":8855},{\"siteId\":\"102\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"103\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"104\",\"siteStatus\":\"site-auto-run\",\"workNo\":0},{\"siteId\":\"105\",\"siteStatus\":\"site-auto\",\"workNo\":0}]}";
+        // res = JSON.parse(test)
+        //鑾峰彇杈撻�佺珯鐐规暟鎹�
+        if (res.code === 200){
+          var sites = res.data;
+          if (this.reloadSta && pixiStaMap.size > 0) {
+            //閲嶆柊娓叉煋鎵�鏈夎緭閫佺珯鐐�
+            this.currentLevStaList = sites;
+            this.reloadSta = false;
+            sites.forEach((item, index) => {
+              let sta = pixiStaMap.get(parseInt(item.siteId));
+              if (sta != undefined) {
+                if (item.workNo > 0) {
+                  sta.textObj.text = item.siteId + "(" + item.workNo + ")";
+                }
+
+                //鍒涘缓閬僵灞�
+                if (item.siteStatus == "site-auto") {
+                  //鑷姩鐘舵�侊紝绉婚櫎閬僵灞�
+                  if (sta.statusObj != null) {
+                    objectsContainer.removeChild(sta.statusObj)
+                    sta.statusObj = null;
+                  }
+                }else if (item.siteStatus == "site-auto-run" || item.siteStatus == "site-auto-run-id") {
+                  //鑷姩鏈夌墿
+                  let graphics = getGraphics(0xfa51f6, width, height, sta.x, sta.y);
+                  graphics.addChild(sta.textObj);//缁ф壙鏂囧瓧淇℃伅
+                  sta.statusObj = graphics;
+                  objectsContainer.addChild(graphics);
+                }else if (item.siteStatus == "site-unauto") {
+                  //闈炶嚜鍔�
+                  let graphics = getGraphics(0xb8b8b8, width, height, sta.x, sta.y);
+                  graphics.addChild(sta.textObj);//缁ф壙鏂囧瓧淇℃伅
+                  sta.statusObj = graphics;
+                  objectsContainer.addChild(graphics);
+                }
+              }
+            });
+          } else {
+            //妫�娴嬩笉鐩稿悓绔欑偣杩涜灞�閮ㄦ洿鏂�
+            this.currentLevStaList.forEach((item, index) => {
+              let result = this.checkStaInListDiff(item, sites);
+              if (!result) {
+                //闇�瑕佹洿鏂�
+                let sta = pixiStaMap.get(parseInt(item.siteId));
+                if (item.workNo > 0) {
+                  sta.textObj.text = item.siteId + "(" + item.workNo + ")";
+                }else {
+                  sta.textObj.text = item.siteId;
+                }
+
+                //鍒涘缓閬僵灞�
+                if (item.siteStatus == "site-auto") {
+                  //鑷姩鐘舵�侊紝绉婚櫎閬僵灞�
+                  if (sta.statusObj != null) {
+                    objectsContainer.removeChild(sta.statusObj)
+                    sta.statusObj = null;
+                  }
+                }else if (item.siteStatus == "site-auto-run") {
+                  //鑷姩鏈夌墿
+                  let graphics = getGraphics(0xfa51f6, width, height, sta.x, sta.y);
+                  graphics.addChild(sta.textObj);//缁ф壙鏂囧瓧淇℃伅
+                  sta.statusObj = graphics;
+                  objectsContainer.addChild(graphics);
+                }else if (item.siteStatus == "site-unauto") {
+                  //闈炶嚜鍔�
+                  let graphics = getGraphics(0xb8b8b8, width, height, sta.x, sta.y);
+                  graphics.addChild(sta.textObj);//缁ф壙鏂囧瓧淇℃伅
+                  sta.statusObj = graphics;
+                  objectsContainer.addChild(graphics);
+                }
+              }
+            });
+          }
+        } else if (res.code === 403){
+          parent.location.href = baseUrl+"/login";
+        }  else {
+          console.log(res.msg);
+        }
+      },
+      openDrawerSta(data) {
+        let that = this
+        this.drawerSta = true;
+        $.ajax({
+          url: baseUrl + "/console/site/detail",
+          headers: {
+            'token': localStorage.getItem('token')
+          },
+          data: {
+            siteId: data.data
+          },
+          method: 'post',
+          success: function(res) {
+            //瑙f瀽鏁版嵁
+            let siteInfo = res.data;
+            if (res.code == 200) {
+              that.drawerStaData = siteInfo;
+            }
+          }
+        })
+      },
+      openDrawerLift(data) {
+        this.drawerLift = true;
+        this.drawerLiftData = parseInt(data.data)
+      },
+      getLiftStateInfo() {
+        // 鎻愬崌鏈轰俊鎭〃鑾峰彇
+        this.sendWs(JSON.stringify({
+          "url": "/lift/table/lift/state",
+          "data": {}
+        }))
+      },
+      setLiftStateInfo(res) {
+        // 鎻愬崌鏈轰俊鎭〃鑾峰彇
+        if (res.code == 200) {
+          this.liftList = res.data
+        }
+      },
+      addMoveAdvancePath(moveAdvancePath, shuttleNo) {//娣诲姞棰勮璺緞
+        let that = this;
+        moveAdvancePath.forEach((path, idx) => {
+          let locNo = this.map[path.x, path.y];
+          if (!pixiShuttleMoveAdvancePathMap.has(locNo)) {
+            let graphics = getGraphics(0x9966ff, width, height, path.y * width, (path.x - 1) * height);
+            let shuttleNos = [shuttleNo];
+            // 鍒涘缓鏂囨湰瀵硅薄
+            const style = new PIXI.TextStyle({
+              fontFamily: 'Arial',
+              fontSize: 10,
+              fill: '#000000',
+            });
+            const text = new PIXI.Text(JSON.stringify(shuttleNos), style);
+            text.anchor.set(0.5); // 璁剧疆鏂囨湰閿氱偣涓轰腑蹇冪偣
+            text.position.set(graphics.width / 2, graphics.height / 2); // 灏嗘枃鏈綅缃缃负Graphics瀵硅薄鐨勪腑蹇冪偣
+            // 灏嗘枃鏈璞℃坊鍔犲埌Graphics瀵硅薄涓�
+            graphics.addChild(text);
+            graphics.textObj = text;
+            objectsContainer2.addChild(graphics)
+            pixiShuttleMoveAdvancePathMap.set(locNo, {
+              path: path,
+              sprite: graphics,
+              textObj: text,
+              shuttleNos: shuttleNos
+            })
+
+            if (pixiShuttleMoveAdvancePathList[shuttleNo] == null) {
+              let locNos = new Set()
+              locNos.add(locNo);
+              pixiShuttleMoveAdvancePathList[shuttleNo] = locNos;
+            }else {
+              pixiShuttleMoveAdvancePathList[shuttleNo].add(locNo);
+            }
+          }else {
+            let pathMap = pixiShuttleMoveAdvancePathMap.get(locNo)
+            let shuttleNos = pathMap.shuttleNos;
+            shuttleNos.push(shuttleNo);
+            pathMap.textObj.text = JSON.stringify(shuttleNos);
+            pixiShuttleMoveAdvancePathMap.set(locNo, pathMap);
+            if (pixiShuttleMoveAdvancePathList[shuttleNo] == null) {
+              let locNos = new Set()
+              locNos.add(locNo);
+              pixiShuttleMoveAdvancePathList[shuttleNo] = locNos;
+            }else {
+              pixiShuttleMoveAdvancePathList[shuttleNo].add(locNo);
+            }
+          }
+        });
+      },
+      removeMoveAdvancePath(shuttleNo) {//鍒犻櫎棰勮璺緞
+        let locNos = pixiShuttleMoveAdvancePathList[shuttleNo];
+        if (locNos != null) {
+          locNos.forEach((locNo,index) => {
+            let pathMap = pixiShuttleMoveAdvancePathMap.get(locNo);
+            if (pathMap != null) {
+              let shuttleNos = pathMap.shuttleNos;
+              let shuttleNosNew = [];
+              shuttleNos.forEach((shuttle, idx) => {
+                if (shuttle != shuttleNo) {
+                  shuttleNosNew.push(shuttle);
+                }
+              });
+
+              if (shuttleNosNew.length === 0) {
+                //棰勮璺緞娌℃湁灏忚溅锛岀洿鎺ュ垹闄よ矾寰�
+                objectsContainer2.removeChild(pathMap.sprite);
+                pixiShuttleMoveAdvancePathMap.delete(locNo)
+              }else {
+                //棰勮璺緞瀛樺湪鍏朵粬灏忚溅锛屾洿鏂版枃瀛椾俊鎭�
+                pathMap.textObj.text = JSON.stringify(shuttleNosNew);
+                pathMap.shuttleNos = shuttleNosNew;
+                pixiShuttleMoveAdvancePathMap.set(locNo, pathMap);
+              }
+            }
+          })
+        }
+      },
+    }
+  })
+
+  function getContainer(value) {
+    let graphics = new PIXI.Graphics();
+    if (value === 0) {
+      graphics.beginFill(0x55aaff);
+    } else if (value === 3) {//姣嶈建閬�
+      graphics.beginFill(0x00ff7f);
+      graphics.visible = true;
+    } else if (value === 4) {//绔欑偣
+      graphics.beginFill(0xffff00);
+      graphics.visible = true;
+    } else if (value === 5) {//鍏呯數妗�
+      graphics.beginFill(0xffaa7f);
+      graphics.visible = true;
+    } else if (value === 9) {//杞ㄨ抗
+      graphics.beginFill(0xff0000);
+    }else if (value === 67) {//鎻愬崌鏈�
+      graphics.beginFill(0xaaffff);
+    }else if (value === -999) {//璺緞閿佸畾
+      graphics.beginFill(0xf83333);
+    }else if (value === 1000) {//婊″簱浣�
+	  graphics.beginFill(0xf83333);
+	}
+    graphics.lineStyle(1, 0xffffff, 1);
+    graphics.drawRect(0, 0, width, height);
+    graphics.endFill();
+
+    return graphics;
+  }
+
+  function getGraphics(color, width, height, x, y) {
+    let graphics = new PIXI.Graphics();
+    graphics.beginFill(color);
+    graphics.lineStyle(1, 0xffffff, 1);
+    graphics.drawRect(0, 0, width, height);
+    graphics.position.set(x, y);
+    graphics.endFill();
+    return graphics;
+  }
+
+  function getSprite(value, x, y, item, pointerDownEvent) {
+    let sprite;
+    if (value == 0) {
+      if(item.locSts == 'O') {
+        sprite = new PIXI.Sprite(graphics0);
+      }else if(item.locSts == 'F') {
+        sprite = new PIXI.Sprite(graphicsF);
+      }else {
+        sprite = new PIXI.Sprite(graphics0);
+      }
+    } else if (value == 3) {
+      sprite = new PIXI.Sprite(graphics3);
+    } else if (value == 4) {
+      sprite = new PIXI.Sprite(graphics4);
+    } else if (value == 5) {
+      sprite = new PIXI.Sprite(graphics5);
+    } else if (value == 9) {
+      sprite = new PIXI.Sprite(graphics9);
+    } else if (value == 67) {
+      sprite = new PIXI.Sprite(graphics67);
+    } else if (value == -999) {
+      sprite = new PIXI.Sprite(graphicsLock);
+    } else {
+      sprite = new PIXI.Sprite(graphics0);
+    }
+    sprite.position.set(x, y);
+    sprite.interactive = true; // 蹇呴』瑕佽缃墠鑳芥帴鏀朵簨浠�
+    sprite.buttonMode = true; // 璁╁厜鏍囧湪hover鏃跺彉涓烘墜鍨嬫寚閽�
+
+    sprite.on('pointerdown', (e) => {
+      pointerDownEvent(e)
+    })
+
+    return sprite;
+  }
+
+  /**
+   * 鏇存柊棰滆壊
+   */
+  function updateColor(sprite, color) {
+    // graphics.clear()
+    // graphics.beginFill(color);
+    // graphics.drawRect(0, 0, width, height);
+    sprite.tint = color;
+  }
+
+</script>
+</body>
+</html>
\ No newline at end of file

--
Gitblit v1.9.1