From 9388b1d64f4b5da813857f9939f32018e5e2681c Mon Sep 17 00:00:00 2001
From: zyx <zyx123456>
Date: 星期一, 09 十月 2023 10:40:44 +0800
Subject: [PATCH] Merge branch 'tzskasrs' of http://47.97.1.152:5880/r/zy-asrs into tzskasrs

---
 src/main/java/com/zy/system/controller/LicenseCreatorController.java |  120 ++
 src/main/webapp/static/css/fonts/element-icons.ttf                   |    0 
 .gitignore                                                           |    1 
 src/main/java/com/zy/asrs/mapper/LocDetlMapper.java                  |    2 
 src/main/java/com/zy/system/entity/license/CustomLicenseManager.java |  246 +++++
 src/main/resources/publicCerts.keystore                              |    0 
 src/main/resources/mapper/LocDetlMapper.xml                          |    5 
 src/main/java/com/zy/asrs/entity/WrkCharge.java                      |    6 
 src/main/webapp/static/js/wrkMast/wrkMast.js                         |   62 
 src/main/java/com/zy/system/entity/license/LicenseCheck.java         |   45 
 pom.xml                                                              |    5 
 src/main/java/com/zy/asrs/controller/WorkController.java             |    2 
 src/main/java/com/zy/common/CodeRes.java                             |    2 
 src/main/java/com/zy/system/entity/license/LicenseCreatorParam.java  |   96 ++
 src/main/webapp/static/js/wrkCharge/wrkCharge.js                     |    3 
 src/main/java/com/zy/common/web/AuthController.java                  |    7 
 src/main/webapp/views/command/shuttleCommand.html                    |   55 +
 src/main/java/com/zy/asrs/controller/BasShuttleController.java       |  136 ++
 src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java          |    8 
 src/main/webapp/views/index.html                                     |   24 
 src/main/java/com/zy/asrs/entity/param/StockOutParam.java            |    2 
 src/main/resources/mapper/WrkChargeMapper.xml                        |    1 
 src/main/java/com/zy/system/entity/license/LicenseVerifyParam.java   |   48 +
 src/main/java/com/zy/system/entity/license/LicenseCheckListener.java |   94 +
 src/main/java/com/zy/system/entity/license/LicenseManagerHolder.java |   22 
 src/main/webapp/views/wrkMast/wrkMast.html                           |   17 
 src/main/java/com/zy/asrs/service/LocDetlService.java                |    2 
 src/main/webapp/static/js/command/shuttleCommand.js                  |  474 +++++++++
 src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java          |   15 
 src/main/java/com/zy/system/entity/license/LicenseVerify.java        |  133 ++
 src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java       |    4 
 src/main/java/com/zy/system/entity/license/LicenseCreator.java       |   86 +
 src/main/webapp/views/home/easy_login.html                           |  182 +++
 src/main/java/com/zy/asrs/controller/BasLiftController.java          |  136 ++
 /dev/null                                                            |    1 
 src/main/java/com/zy/system/entity/license/CustomKeyStoreParam.java  |   57 +
 src/main/webapp/views/command/liftCommand.html                       |   55 +
 src/main/webapp/static/js/command/liftCommand.js                     |  465 +++++++++
 src/main/webapp/static/css/fonts/element-icons.woff                  |    0 
 src/main/java/com/zy/system/entity/license/WindowsServerInfos.java   |   85 +
 src/main/java/com/zy/system/entity/license/AbstractServerInfos.java  |  111 ++
 src/main/webapp/views/login.html                                     |   45 
 src/main/resources/application.yml                                   |    9 
 43 files changed, 2,808 insertions(+), 61 deletions(-)

diff --git a/.gitignore b/.gitignore
index 9224005..7b3962c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,7 @@
 !.mvn/wrapper/maven-wrapper.jar
 !**/src/main/**
 !**/src/test/**
+/src/main/resources/license.lic
 
 ### STS ###
 .apt_generated
diff --git a/pom.xml b/pom.xml
index 171c0f9..e020f8f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -103,6 +103,11 @@
             <artifactId>okhttp</artifactId>
             <version>3.10.0</version>
         </dependency>
+        <dependency>
+            <groupId>de.schlichtherle.truelicense</groupId>
+            <artifactId>truelicense-core</artifactId>
+            <version>1.33</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/src/main/java/com/zy/asrs/controller/BasLiftController.java b/src/main/java/com/zy/asrs/controller/BasLiftController.java
index 6153fa2..3559e29 100644
--- a/src/main/java/com/zy/asrs/controller/BasLiftController.java
+++ b/src/main/java/com/zy/asrs/controller/BasLiftController.java
@@ -1,5 +1,6 @@
 package com.zy.asrs.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
@@ -12,8 +13,10 @@
 import com.core.common.BaseRes;
 import com.core.common.Cools;
 import com.core.common.R;
+import com.zy.common.utils.HttpHandler;
 import com.zy.common.web.BaseController;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.*;
@@ -23,6 +26,9 @@
 
     @Autowired
     private BasLiftService basLiftService;
+
+    @Value("${wcs-slave.url}")
+    private String wcsUrl;
 
     @RequestMapping(value = "/basLift/{id}/auth")
     @ManagerAuth
@@ -122,4 +128,134 @@
         return R.ok();
     }
 
+    @RequestMapping(value = "/basLift/command/list/auth")
+    @ManagerAuth
+    public R liftCommandQuery(@RequestParam Integer wrkNo) {
+        HashMap<String, Object> hashMap = new HashMap<>();
+        hashMap.put("total", 0);
+        hashMap.put("records", null);
+        try {
+            HashMap<String, Object> map = new HashMap<>();
+            map.put("wrkNo", wrkNo);
+            String response = new HttpHandler.Builder()
+                    .setUri(wcsUrl)
+                    .setPath("/lift/command/query")
+                    .setParams(map)
+                    .build()
+                    .doPost();
+            JSONObject jsonObject = JSON.parseObject(response);
+            Integer code = jsonObject.getInteger("code");
+            if (code.equals(200)) {
+                JSONObject data = jsonObject.getJSONObject("data");
+                JSONObject assignCommand = data.getJSONObject("assignCommand");
+                JSONArray commands = assignCommand.getJSONArray("commands");
+                Integer commandStep = data.getInteger("commandStep");//褰撳墠姝ュ簭
+                for (int i = 0; i < commands.size(); i++) {
+                    JSONObject object = commands.getJSONObject(i);
+                    object.put("commandStep", commandStep);//褰撳墠姝ュ簭
+                    commands.set(i, object);
+                }
+                hashMap.put("total", commands.size());
+                hashMap.put("records", commands);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error();
+        }
+
+        return R.ok().add(hashMap);
+    }
+
+    //鍥為��鍛戒护
+    @RequestMapping(value = "/basLift/command/rollback/auth")
+    @ManagerAuth
+    public R liftCommandRollback(@RequestBody JSONObject param) {
+        try {
+            String response = new HttpHandler.Builder()
+                    .setUri(wcsUrl)
+                    .setPath("/lift/command/rollback")
+                    .setParams(param)
+                    .build()
+                    .doPost();
+            JSONObject jsonObject = JSON.parseObject(response);
+            Integer code = jsonObject.getInteger("code");
+            if (code.equals(200)) {
+                return R.ok();
+            }
+            return R.error();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error();
+        }
+    }
+
+    //鍛戒护瀹屾垚鐘舵�佸垏鎹�
+    @RequestMapping(value = "/basLift/command/completeSwitch/auth")
+    @ManagerAuth
+    public R liftCommandCompleteSwitch(@RequestBody JSONObject param) {
+        try {
+            String response = new HttpHandler.Builder()
+                    .setUri(wcsUrl)
+                    .setPath("/lift/command/completeSwitch")
+                    .setParams(param)
+                    .build()
+                    .doPost();
+            JSONObject jsonObject = JSON.parseObject(response);
+            Integer code = jsonObject.getInteger("code");
+            if (code.equals(200)) {
+                return R.ok();
+            }
+            return R.error();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error();
+        }
+    }
+
+    //閲嶅惎浠诲姟(鍛戒护)
+    @RequestMapping(value = "/basLift/command/restart/auth")
+    @ManagerAuth
+    public R liftCommandRestart(@RequestBody JSONObject param) {
+        try {
+            String response = new HttpHandler.Builder()
+                    .setUri(wcsUrl)
+                    .setPath("/lift/command/restart")
+                    .setParams(param)
+                    .build()
+                    .doPost();
+            JSONObject jsonObject = JSON.parseObject(response);
+            Integer code = jsonObject.getInteger("code");
+            if (code.equals(200)) {
+                return R.ok();
+            }
+            return R.error("閲嶅惎澶辫触");
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error();
+        }
+    }
+
+    //鍒犻櫎浠诲姟(鍛戒护)
+    @RequestMapping(value = "/basLift/command/del/auth")
+    @ManagerAuth
+    public R liftCommandDel(@RequestBody JSONObject param) {
+        try {
+            String response = new HttpHandler.Builder()
+                    .setUri(wcsUrl)
+                    .setPath("/lift/command/del")
+                    .setParams(param)
+                    .build()
+                    .doPost();
+            JSONObject jsonObject = JSON.parseObject(response);
+            Integer code = jsonObject.getInteger("code");
+            if (code.equals(200)) {
+                return R.ok();
+            }
+            return R.error("鍒犻櫎澶辫触");
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error();
+        }
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/controller/BasShuttleController.java b/src/main/java/com/zy/asrs/controller/BasShuttleController.java
index 5309bde..7ea785f 100644
--- a/src/main/java/com/zy/asrs/controller/BasShuttleController.java
+++ b/src/main/java/com/zy/asrs/controller/BasShuttleController.java
@@ -1,5 +1,6 @@
 package com.zy.asrs.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
@@ -12,8 +13,10 @@
 import com.core.common.BaseRes;
 import com.core.common.Cools;
 import com.core.common.R;
+import com.zy.common.utils.HttpHandler;
 import com.zy.common.web.BaseController;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.*;
@@ -23,6 +26,9 @@
 
     @Autowired
     private BasShuttleService basShuttleService;
+
+    @Value("${wcs-slave.url}")
+    private String wcsUrl;
 
     @RequestMapping(value = "/basShuttle/{id}/auth")
     @ManagerAuth
@@ -122,4 +128,134 @@
         return R.ok();
     }
 
+    @RequestMapping(value = "/basShuttle/command/list/auth")
+    @ManagerAuth
+    public R shuttleCommandQuery(@RequestParam Integer wrkNo) {
+        HashMap<String, Object> hashMap = new HashMap<>();
+        hashMap.put("total", 0);
+        hashMap.put("records", null);
+        try {
+            HashMap<String, Object> map = new HashMap<>();
+            map.put("wrkNo", wrkNo);
+            String response = new HttpHandler.Builder()
+                    .setUri(wcsUrl)
+                    .setPath("/shuttle/command/query")
+                    .setParams(map)
+                    .build()
+                    .doPost();
+            JSONObject jsonObject = JSON.parseObject(response);
+            Integer code = jsonObject.getInteger("code");
+            if (code.equals(200)) {
+                JSONObject data = jsonObject.getJSONObject("data");
+                JSONObject assignCommand = data.getJSONObject("assignCommand");
+                JSONArray commands = assignCommand.getJSONArray("commands");
+                Integer commandStep = data.getInteger("commandStep");//褰撳墠姝ュ簭
+                for (int i = 0; i < commands.size(); i++) {
+                    JSONObject object = commands.getJSONObject(i);
+                    object.put("commandStep", commandStep);//褰撳墠姝ュ簭
+                    commands.set(i, object);
+                }
+                hashMap.put("total", commands.size());
+                hashMap.put("records", commands);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error();
+        }
+
+        return R.ok().add(hashMap);
+    }
+
+    //鍥為��鍛戒护
+    @RequestMapping(value = "/basShuttle/command/rollback/auth")
+    @ManagerAuth
+    public R shuttleCommandRollback(@RequestBody JSONObject param) {
+        try {
+            String response = new HttpHandler.Builder()
+                    .setUri(wcsUrl)
+                    .setPath("/shuttle/command/rollback")
+                    .setParams(param)
+                    .build()
+                    .doPost();
+            JSONObject jsonObject = JSON.parseObject(response);
+            Integer code = jsonObject.getInteger("code");
+            if (code.equals(200)) {
+                return R.ok();
+            }
+            return R.error();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error();
+        }
+    }
+
+    //鍛戒护瀹屾垚鐘舵�佸垏鎹�
+    @RequestMapping(value = "/basShuttle/command/completeSwitch/auth")
+    @ManagerAuth
+    public R shuttleCommandCompleteSwitch(@RequestBody JSONObject param) {
+        try {
+            String response = new HttpHandler.Builder()
+                    .setUri(wcsUrl)
+                    .setPath("/shuttle/command/completeSwitch")
+                    .setParams(param)
+                    .build()
+                    .doPost();
+            JSONObject jsonObject = JSON.parseObject(response);
+            Integer code = jsonObject.getInteger("code");
+            if (code.equals(200)) {
+                return R.ok();
+            }
+            return R.error();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error();
+        }
+    }
+
+    //閲嶅惎浠诲姟(鍛戒护)
+    @RequestMapping(value = "/basShuttle/command/restart/auth")
+    @ManagerAuth
+    public R shuttleCommandRestart(@RequestBody JSONObject param) {
+        try {
+            String response = new HttpHandler.Builder()
+                    .setUri(wcsUrl)
+                    .setPath("/shuttle/command/restart")
+                    .setParams(param)
+                    .build()
+                    .doPost();
+            JSONObject jsonObject = JSON.parseObject(response);
+            Integer code = jsonObject.getInteger("code");
+            if (code.equals(200)) {
+                return R.ok();
+            }
+            return R.error("閲嶅惎澶辫触");
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error();
+        }
+    }
+
+    //鍒犻櫎浠诲姟(鍛戒护)
+    @RequestMapping(value = "/basShuttle/command/del/auth")
+    @ManagerAuth
+    public R shuttleCommandDel(@RequestBody JSONObject param) {
+        try {
+            String response = new HttpHandler.Builder()
+                    .setUri(wcsUrl)
+                    .setPath("/shuttle/command/del")
+                    .setParams(param)
+                    .build()
+                    .doPost();
+            JSONObject jsonObject = JSON.parseObject(response);
+            Integer code = jsonObject.getInteger("code");
+            if (code.equals(200)) {
+                return R.ok();
+            }
+            return R.error("鍒犻櫎澶辫触");
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error();
+        }
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/controller/WorkController.java b/src/main/java/com/zy/asrs/controller/WorkController.java
index 5eb4ebf..b0a457d 100644
--- a/src/main/java/com/zy/asrs/controller/WorkController.java
+++ b/src/main/java/com/zy/asrs/controller/WorkController.java
@@ -91,7 +91,7 @@
     @RequestMapping("/plate/out/start")
     @ManagerAuth(memo = "鍑哄簱浣滀笟")
     public R fullStoreTakeStart(@RequestBody StockOutParam param) {
-        workService.startupFullTakeStore(param, getUserId());
+        //workService.startupFullTakeStore(param, getUserId());
         return R.ok("鍑哄簱鍚姩鎴愬姛");
     }
 
diff --git a/src/main/java/com/zy/asrs/entity/WrkCharge.java b/src/main/java/com/zy/asrs/entity/WrkCharge.java
index 39dda13..7416e4f 100644
--- a/src/main/java/com/zy/asrs/entity/WrkCharge.java
+++ b/src/main/java/com/zy/asrs/entity/WrkCharge.java
@@ -186,6 +186,12 @@
     @ApiModelProperty(value= "鏉$爜")
     private String barcode;
 
+    /**
+     * 绌挎杞�
+     */
+    @ApiModelProperty(value= "绌挎杞�")
+    private Integer shuttleNo;
+
     public WrkCharge() {}
 
     public WrkCharge(Integer wrkNo,String mk,Long wrkSts,Integer ioType,Integer crnNo,Integer steNo,Integer outMost,Double ioPri,String locNo,Integer staNo,Integer sourceStaNo,String sourceLocNo,String emptyMk,Date ioTime,Date crnStrTime,Date crnEndTime,String modiUser,Date modiTime,String appeUser,Date appeTime,String memo,String barcode) {
diff --git a/src/main/java/com/zy/asrs/entity/param/StockOutParam.java b/src/main/java/com/zy/asrs/entity/param/StockOutParam.java
index 22cc462..337e0ad 100644
--- a/src/main/java/com/zy/asrs/entity/param/StockOutParam.java
+++ b/src/main/java/com/zy/asrs/entity/param/StockOutParam.java
@@ -35,7 +35,7 @@
         private Double count;
 
         //
-
+        private String containerCode;
     }
 
 }
diff --git a/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java b/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
index 004592e..9e097b6 100644
--- a/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
@@ -17,7 +17,7 @@
 @Repository
 public interface LocDetlMapper extends BaseMapper<LocDetl> {
 
-    LocDetl selectItem(@Param("locNo")String locNo, @Param("matnr")String matnr, @Param("batch")String batch);
+    LocDetl selectItem(@Param("locNo")String locNo, @Param("matnr")String matnr, @Param("batch")String batch,@Param("suppCode")String suppCode);
 
     int deleteItem(@Param("locNo")String locNo, @Param("matnr")String matnr, @Param("batch")String batch);
 
diff --git a/src/main/java/com/zy/asrs/service/LocDetlService.java b/src/main/java/com/zy/asrs/service/LocDetlService.java
index 803ac71..41f917f 100644
--- a/src/main/java/com/zy/asrs/service/LocDetlService.java
+++ b/src/main/java/com/zy/asrs/service/LocDetlService.java
@@ -11,7 +11,7 @@
 
 public interface LocDetlService extends IService<LocDetl> {
 
-    LocDetl selectItem(String locNo, String matnr, String batch);
+    LocDetl selectItem(String locNo, String matnr, String batch,String suppCode);
 
     Page<LocDetl> getStockOut(Page<LocDetl> page);
 
diff --git a/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
index 10265ee..94ca11d 100644
--- a/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
@@ -164,8 +164,8 @@
 
 
     @Override
-    public LocDetl selectItem(String locNo, String matnr, String batch) {
-        return this.baseMapper.selectItem(locNo, matnr, batch);
+    public LocDetl selectItem(String locNo, String matnr, String batch,String suppCode) {
+        return this.baseMapper.selectItem(locNo, matnr, batch,suppCode);
     }
 
     @Override
diff --git a/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
index f999701..b29f993 100644
--- a/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -217,8 +217,8 @@
         List<LocDetlDto> locDetlDtos = new ArrayList<>();
         for (StockOutParam.LocDetl paramLocDetl : param.getLocDetls()) {
             if (!Cools.isEmpty(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getCount())) {
-                LocDetl one = locDetlService.selectItem(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getBatch());
-                if (null != one) locDetlDtos.add(new LocDetlDto(one, paramLocDetl.getCount()));
+                //LocDetl one = locDetlService.selectItem(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getBatch());
+               // if (null != one) locDetlDtos.add(new LocDetlDto(one, paramLocDetl.getCount()));
             }
         }
         if (!locDetlDtos.isEmpty()) {
@@ -411,7 +411,7 @@
         // 鐢熸垚宸ヤ綔妗f槑缁�
         for (LocDto locDto : taskDto.getLocDtos()) {
             if (locDto.getAnfme()==null || locDto.getAnfme() <= 0.0D) { continue; }
-            LocDetl locDetl = locDetlService.selectItem(locDto.getLocNo(), locDto.getMatnr(), locDto.getBatch());
+            LocDetl locDetl = locDetlService.selectItem(locDto.getLocNo(), locDto.getMatnr(), locDto.getBatch(), locDto.getContainerCode());
             if (locDetl == null || locDetl.getAnfme() < locDto.getAnfme()) {
                 throw new CoolException(locDto.getLocNo() + "搴撲綅涓�" + locDto.getMatnr() + "鍟嗗搧搴撳瓨涓嶈冻锛�");
             }
@@ -654,7 +654,7 @@
         List<LocDetlDto> locDetlDtos = new ArrayList<>();
         for (StockOutParam.LocDetl paramLocDetl : param.getLocDetls()) {
             if (!Cools.isEmpty(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getCount())) {
-                LocDetl one = locDetlService.selectItem(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getBatch());
+                LocDetl one = locDetlService.selectItem(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getBatch(),paramLocDetl.getContainerCode());
                 if (null != one) locDetlDtos.add(new LocDetlDto(one, paramLocDetl.getCount()));
             }
         }
diff --git a/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java b/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
index 55150d3..7ee97c1 100644
--- a/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
+++ b/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -86,14 +86,7 @@
                     }
                     // 閬嶅巻宸ヤ綔鏄庣粏锛屾洿鏂板簱瀛樻槑缁嗗拰鍏ュ簱閫氱煡妗�
                     for (WrkDetl wrkDetl : wrkDetls) {
-
-                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
-                        if (null != locDetl) {
-                            if (!locDetlService.updateAnfme(wrkDetl.getAnfme(), wrkMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch())) {
-                                exceptionHandle("鍏ㄦ澘鍏ュ簱 ===>> 鏇存柊搴撳瓨鏄庣粏澶辫触锛沎workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
-                            }
-                        } else {
-                            locDetl = new LocDetl();
+                            LocDetl locDetl = new LocDetl();
                             locDetl.sync(wrkDetl);
                             locDetl.setLocNo(wrkMast.getLocNo()); // 搴撲綅鍙�
                             locDetl.setAnfme(wrkDetl.getAnfme()); // 鏁伴噺
@@ -103,7 +96,7 @@
                             if (!locDetlService.insert(locDetl)) {
                                 exceptionHandle("鍏ㄦ澘鍏ュ簱 ===>> 娣诲姞搴撳瓨鏄庣粏澶辫触锛沎workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                             }
-                        }
+
 
                         // 鏇存柊鍏ュ簱閫氱煡妗� ioStatus ===>> Y
                         try {
@@ -143,7 +136,7 @@
                     }
                     for (WrkDetl wrkDetl : wrkDetls53) {
 
-                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
+                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(),wrkDetl.getSuppCode());
                         if (null != locDetl) {
                             if (!locDetlService.updateAnfme(locDetl.getAnfme() - wrkDetl.getAnfme(), locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch())) {
                                 exceptionHandle("鎷f枡鍏ュ簱 ===>> 淇敼搴撳瓨鏄庣粏鏁伴噺澶辫触锛沎workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
@@ -171,7 +164,7 @@
                     // 淇敼搴撳瓨鏄庣粏鏁伴噺锛屽鏃犲簱瀛橈紝鏇炬柊澧�
                     for (WrkDetl wrkDetl:wrkDetls54) {
 
-                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
+                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(),wrkDetl.getSuppCode());
                         if (null != locDetl) {
                             if (!locDetlService.updateAnfme(wrkDetl.getAnfme(), locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch())) {
                                 exceptionHandle("骞舵澘鍏ュ簱 ===>> 淇敼搴撳瓨鏄庣粏鏁伴噺澶辫触锛沎workNo={0}],[matnr={1}]", wrkMast.getWrkNo(), wrkDetl.getMatnr());
diff --git a/src/main/java/com/zy/common/CodeRes.java b/src/main/java/com/zy/common/CodeRes.java
index a69fd59..9870e91 100644
--- a/src/main/java/com/zy/common/CodeRes.java
+++ b/src/main/java/com/zy/common/CodeRes.java
@@ -9,6 +9,8 @@
     String USER_10002 = "10002-璐﹀彿宸茶绂佺敤";
     String USER_10003 = "10003-瀵嗙爜閿欒";
 
+    String SYSTEM_20001 = "20001-璁稿彲璇佸凡澶辨晥";
+
     String PICK_600 = "600-鎷f枡浠诲姟";
     String NO_COMB_700 = "700-璇峰厛缁勬墭";
 
diff --git a/src/main/java/com/zy/common/web/AuthController.java b/src/main/java/com/zy/common/web/AuthController.java
index 067d5e5..c8bca4a 100644
--- a/src/main/java/com/zy/common/web/AuthController.java
+++ b/src/main/java/com/zy/common/web/AuthController.java
@@ -14,6 +14,7 @@
 import com.zy.common.properties.SystemProperties;
 import com.zy.common.utils.RandomValidateCodeUtil;
 import com.zy.system.entity.*;
+import com.zy.system.entity.license.LicenseVerify;
 import com.zy.system.service.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -49,6 +50,12 @@
     @RequestMapping("/login.action")
     @ManagerAuth(value = ManagerAuth.Auth.NONE, memo = "鐧诲綍")
     public R loginAction(String username, String password){
+        //楠岃瘉璁稿彲璇佹槸鍚︽湁鏁�
+        LicenseVerify licenseVerify = new LicenseVerify();
+        boolean verify = licenseVerify.verify();
+        if (!verify) {//璁稿彲璇佸凡澶辨晥
+            return R.parse(CodeRes.SYSTEM_20001);
+        }
         if (username.equals("super") && password.equals(Cools.md5(superPwd))) {
             Map<String, Object> res = new HashMap<>();
             res.put("username", username);
diff --git a/src/main/java/com/zy/system/controller/LicenseCreatorController.java b/src/main/java/com/zy/system/controller/LicenseCreatorController.java
new file mode 100644
index 0000000..b8862a7
--- /dev/null
+++ b/src/main/java/com/zy/system/controller/LicenseCreatorController.java
@@ -0,0 +1,120 @@
+package com.zy.system.controller;
+
+import com.core.annotations.ManagerAuth;
+import com.core.common.Cools;
+import com.core.common.R;
+import com.zy.system.entity.license.*;
+import de.schlichtherle.license.LicenseContent;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.MediaType;
+import org.springframework.util.ClassUtils;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.time.temporal.ChronoUnit;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.prefs.Preferences;
+
+/**
+ *
+ * 鐢ㄤ簬鐢熸垚璇佷功鏂囦欢锛屼笉鑳芥斁鍦ㄧ粰瀹㈡埛閮ㄧ讲鐨勪唬鐮侀噷
+ */
+@RestController
+@RequestMapping("/license")
+public class LicenseCreatorController {
+
+    @Value("${license.licensePath}")
+    private String licensePath;
+
+    @Autowired
+    private LicenseCheckListener licenseCheckListener;
+
+    /**
+     * 鑾峰彇鏈嶅姟鍣ㄧ‖浠朵俊鎭�
+     * @param osName 鎿嶄綔绯荤粺绫诲瀷锛屽鏋滀负绌哄垯鑷姩鍒ゆ柇
+     */
+    @RequestMapping(value = "/getServerInfos",produces = {MediaType.APPLICATION_JSON_UTF8_VALUE})
+    public LicenseCheck getServerInfos(@RequestParam(value = "osName",required = false) String osName) {
+        //鎿嶄綔绯荤粺绫诲瀷
+        if(Cools.isEmpty(osName)){
+            osName = System.getProperty("os.name");
+        }
+        osName = osName.toLowerCase();
+
+        AbstractServerInfos abstractServerInfos = null;
+
+        //鏍规嵁涓嶅悓鎿嶄綔绯荤粺绫诲瀷閫夋嫨涓嶅悓鐨勬暟鎹幏鍙栨柟娉�
+        if (osName.startsWith("windows")) {
+            abstractServerInfos = new WindowsServerInfos();
+        } else if (osName.startsWith("linux")) {
+//            abstractServerInfos = new LinuxServerInfos();
+        }else{//鍏朵粬鏈嶅姟鍣ㄧ被鍨�
+            abstractServerInfos = new WindowsServerInfos();
+        }
+
+        return abstractServerInfos.getServerInfos();
+    }
+
+    /**
+     * 鑾峰彇璁稿彲璇佹湁鏁堟湡澶╂暟
+     */
+    @RequestMapping(value = "/getLicenseDays")
+    public R getLicenseDays() {
+        LicenseVerify licenseVerify = new LicenseVerify();
+        LicenseContent verifyInfo = licenseVerify.getVerifyInfo();
+        if (verifyInfo == null) {
+            return R.error();
+        }
+
+        Date start = new Date();
+        Date end = verifyInfo.getNotAfter();
+        Long starTime = start.getTime();
+        Long endTime = end.getTime();
+        Long num = endTime - starTime;//鏃堕棿鎴崇浉宸殑姣鏁�
+        int day = (int) (num / 24 / 60 / 60 / 1000);
+        return R.ok().add(day);
+    }
+
+    @RequestMapping(value = "/updateLicense")
+    public R updateLicense(@RequestParam("file") MultipartFile[] files){
+        MultipartFile file = files[0];
+
+        String licensePathFileName = this.getClass().getClassLoader().getResource(licensePath).getPath();
+        File licensePathFile = new File(licensePathFileName);
+        //鏈嶅姟鍣ㄧ淇濆瓨鐨勬枃浠跺璞�
+        File serverFile = new File(licensePathFile.getPath());
+        if (serverFile.exists()) {
+            try {
+                serverFile.delete();//瀛樺湪鏂囦欢锛屽垹闄�
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+
+        try {
+            //鍒涘缓鏂囦欢
+            serverFile.createNewFile();
+            //灏嗕笂浼犵殑鏂囦欢鍐欏叆鍒版湇鍔″櫒绔枃浠跺唴
+            file.transferTo(serverFile);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        //閲嶆柊鍔犺浇璁稿彲璇�
+        boolean loadedLicense = licenseCheckListener.loadLicense();
+        if (loadedLicense) {
+            return R.ok();
+        }
+        return R.error("璁稿彲璇佹洿鏂板け璐�");
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/zy/system/entity/license/AbstractServerInfos.java b/src/main/java/com/zy/system/entity/license/AbstractServerInfos.java
new file mode 100644
index 0000000..f771d16
--- /dev/null
+++ b/src/main/java/com/zy/system/entity/license/AbstractServerInfos.java
@@ -0,0 +1,111 @@
+package com.zy.system.entity.license;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+
+/**
+ * 鐢ㄤ簬鑾峰彇瀹㈡埛鏈嶅姟鍣ㄧ殑鍩烘湰淇℃伅锛屽锛欼P銆丮ac鍦板潃銆丆PU搴忓垪鍙枫�佷富鏉垮簭鍒楀彿绛�
+ */
+public abstract class AbstractServerInfos {
+    private static Logger logger = LogManager.getLogger(AbstractServerInfos.class);
+
+    /**
+     * 缁勮闇�瑕侀澶栨牎楠岀殑License鍙傛暟
+     */
+    public LicenseCheck getServerInfos(){
+        LicenseCheck result = new LicenseCheck();
+
+        try {
+            result.setIpAddress(this.getIpAddress());
+            result.setMacAddress(this.getMacAddress());
+            result.setCpuSerial(this.getCPUSerial());
+            result.setMainBoardSerial(this.getMainBoardSerial());
+        }catch (Exception e){
+            logger.error("鑾峰彇鏈嶅姟鍣ㄧ‖浠朵俊鎭け璐�",e);
+        }
+
+        return result;
+    }
+
+    /**
+     * 鑾峰彇IP鍦板潃
+     */
+    protected abstract List<String> getIpAddress() throws Exception;
+
+    /**
+     * 鑾峰彇Mac鍦板潃
+     */
+    protected abstract List<String> getMacAddress() throws Exception;
+
+    /**
+     * 鑾峰彇CPU搴忓垪鍙�
+     */
+    protected abstract String getCPUSerial() throws Exception;
+
+    /**
+     * 鑾峰彇涓绘澘搴忓垪鍙�
+     */
+    protected abstract String getMainBoardSerial() throws Exception;
+
+    /**
+     * 鑾峰彇褰撳墠鏈嶅姟鍣ㄦ墍鏈夌鍚堟潯浠剁殑InetAddress
+     */
+    protected List<InetAddress> getLocalAllInetAddress() throws Exception {
+        List<InetAddress> result = new ArrayList<>(4);
+
+        // 閬嶅巻鎵�鏈夌殑缃戠粶鎺ュ彛
+        for (Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces(); networkInterfaces.hasMoreElements(); ) {
+            NetworkInterface iface = (NetworkInterface) networkInterfaces.nextElement();
+            // 鍦ㄦ墍鏈夌殑鎺ュ彛涓嬪啀閬嶅巻IP
+            for (Enumeration inetAddresses = iface.getInetAddresses(); inetAddresses.hasMoreElements(); ) {
+                InetAddress inetAddr = (InetAddress) inetAddresses.nextElement();
+
+                //鎺掗櫎LoopbackAddress銆丼iteLocalAddress銆丩inkLocalAddress銆丮ulticastAddress绫诲瀷鐨処P鍦板潃
+                if(!inetAddr.isLoopbackAddress() /*&& !inetAddr.isSiteLocalAddress()*/
+                        && !inetAddr.isLinkLocalAddress() && !inetAddr.isMulticastAddress()){
+                    result.add(inetAddr);
+                }
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 鑾峰彇鏌愪釜缃戠粶鎺ュ彛鐨凪ac鍦板潃
+     */
+    protected String getMacByInetAddress(InetAddress inetAddr){
+        try {
+            byte[] mac = NetworkInterface.getByInetAddress(inetAddr).getHardwareAddress();
+            StringBuffer stringBuffer = new StringBuffer();
+
+            for(int i=0;i<mac.length;i++){
+                if(i != 0) {
+                    stringBuffer.append("-");
+                }
+
+                //灏嗗崄鍏繘鍒禸yte杞寲涓哄瓧绗︿覆
+                String temp = Integer.toHexString(mac[i] & 0xff);
+                if(temp.length() == 1){
+                    stringBuffer.append("0" + temp);
+                }else{
+                    stringBuffer.append(temp);
+                }
+            }
+
+            return stringBuffer.toString().toUpperCase();
+        } catch (SocketException e) {
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/zy/system/entity/license/CustomKeyStoreParam.java b/src/main/java/com/zy/system/entity/license/CustomKeyStoreParam.java
new file mode 100644
index 0000000..3d4e4b9
--- /dev/null
+++ b/src/main/java/com/zy/system/entity/license/CustomKeyStoreParam.java
@@ -0,0 +1,57 @@
+package com.zy.system.entity.license;
+
+import de.schlichtherle.license.AbstractKeyStoreParam;
+
+import java.io.*;
+
+/**
+ * 鑷畾涔塊eyStoreParam锛岀敤浜庡皢鍏閽ュ瓨鍌ㄦ枃浠跺瓨鏀惧埌鍏朵粬纾佺洏浣嶇疆鑰屼笉鏄」鐩腑
+ */
+public class CustomKeyStoreParam extends AbstractKeyStoreParam {
+
+    /**
+     * 鍏挜/绉侀挜鍦ㄧ鐩樹笂鐨勫瓨鍌ㄨ矾寰�
+     */
+    private String storePath;
+    private String alias;
+    private String storePwd;
+    private String keyPwd;
+
+    public CustomKeyStoreParam(Class clazz, String resource, String alias, String storePwd, String keyPwd) {
+        super(clazz, resource);
+        this.storePath = resource;
+        this.alias = alias;
+        this.storePwd = storePwd;
+        this.keyPwd = keyPwd;
+    }
+
+
+    @Override
+    public String getAlias() {
+        return alias;
+    }
+
+    @Override
+    public String getStorePwd() {
+        return storePwd;
+    }
+
+    @Override
+    public String getKeyPwd() {
+        return keyPwd;
+    }
+
+    /**
+     * 澶嶅啓de.schlichtherle.license.AbstractKeyStoreParam鐨刧etStream()鏂规硶<br/>
+     * 鐢ㄤ簬灏嗗叕绉侀挜瀛樺偍鏂囦欢瀛樻斁鍒板叾浠栫鐩樹綅缃�屼笉鏄」鐩腑
+     */
+    @Override
+    public InputStream getStream() throws IOException {
+        final InputStream in = new FileInputStream(new File(storePath));
+        if (null == in) {
+            throw new FileNotFoundException(storePath);
+        }
+
+        return in;
+    }
+}
diff --git a/src/main/java/com/zy/system/entity/license/CustomLicenseManager.java b/src/main/java/com/zy/system/entity/license/CustomLicenseManager.java
new file mode 100644
index 0000000..4e85844
--- /dev/null
+++ b/src/main/java/com/zy/system/entity/license/CustomLicenseManager.java
@@ -0,0 +1,246 @@
+package com.zy.system.entity.license;
+
+import com.core.common.Cools;
+import de.schlichtherle.license.LicenseContent;
+import de.schlichtherle.license.LicenseContentException;
+import de.schlichtherle.license.LicenseManager;
+import de.schlichtherle.license.LicenseNotary;
+import de.schlichtherle.license.LicenseParam;
+import de.schlichtherle.license.NoLicenseInstalledException;
+import de.schlichtherle.xml.GenericCertificate;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.beans.XMLDecoder;
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鑷畾涔塋icenseManager锛岀敤浜庡鍔犻澶栫殑鏈嶅姟鍣ㄧ‖浠朵俊鎭牎楠�
+ */
+public class CustomLicenseManager extends LicenseManager{
+    private static Logger logger = LogManager.getLogger(CustomLicenseManager.class);
+
+    //XML缂栫爜
+    private static final String XML_CHARSET = "UTF-8";
+    //榛樿BUFSIZE
+    private static final int DEFAULT_BUFSIZE = 8 * 1024;
+
+    public CustomLicenseManager() {
+
+    }
+
+    public CustomLicenseManager(LicenseParam param) {
+        super(param);
+    }
+
+    /**
+     * 澶嶅啓create鏂规硶
+     */
+    @Override
+    protected synchronized byte[] create(
+            LicenseContent content,
+            LicenseNotary notary)
+            throws Exception {
+        initialize(content);
+        this.validateCreate(content);
+        final GenericCertificate certificate = notary.sign(content);
+        return getPrivacyGuard().cert2key(certificate);
+    }
+
+    /**
+     * 澶嶅啓install鏂规硶锛屽叾涓璿alidate鏂规硶璋冪敤鏈被涓殑validate鏂规硶锛屾牎楠孖P鍦板潃銆丮ac鍦板潃绛夊叾浠栦俊鎭�
+     */
+    @Override
+    protected synchronized LicenseContent install(
+            final byte[] key,
+            final LicenseNotary notary)
+            throws Exception {
+        final GenericCertificate certificate = getPrivacyGuard().key2cert(key);
+
+        notary.verify(certificate);
+        final LicenseContent content = (LicenseContent)this.load(certificate.getEncoded());
+        this.validate(content);
+        setLicenseKey(key);
+        setCertificate(certificate);
+
+        return content;
+    }
+
+    /**
+     * 澶嶅啓verify鏂规硶锛岃皟鐢ㄦ湰绫讳腑鐨剉alidate鏂规硶锛屾牎楠孖P鍦板潃銆丮ac鍦板潃绛夊叾浠栦俊鎭�
+     */
+    @Override
+    protected synchronized LicenseContent verify(final LicenseNotary notary)
+            throws Exception {
+        GenericCertificate certificate = getCertificate();
+
+        // Load license key from preferences,
+        final byte[] key = getLicenseKey();
+        if (null == key){
+            throw new NoLicenseInstalledException(getLicenseParam().getSubject());
+        }
+
+        certificate = getPrivacyGuard().key2cert(key);
+        notary.verify(certificate);
+        final LicenseContent content = (LicenseContent)this.load(certificate.getEncoded());
+        this.validate(content);
+        setCertificate(certificate);
+
+        return content;
+    }
+
+    /**
+     * 鏍¢獙鐢熸垚璇佷功鐨勫弬鏁颁俊鎭�
+     */
+    protected synchronized void validateCreate(final LicenseContent content)
+            throws LicenseContentException {
+        final LicenseParam param = getLicenseParam();
+
+        final Date now = new Date();
+        final Date notBefore = content.getNotBefore();
+        final Date notAfter = content.getNotAfter();
+        if (null != notAfter && now.after(notAfter)){
+            throw new LicenseContentException("璇佷功澶辨晥鏃堕棿涓嶈兘鏃╀簬褰撳墠鏃堕棿");
+        }
+        if (null != notBefore && null != notAfter && notAfter.before(notBefore)){
+            throw new LicenseContentException("璇佷功鐢熸晥鏃堕棿涓嶈兘鏅氫簬璇佷功澶辨晥鏃堕棿");
+        }
+        final String consumerType = content.getConsumerType();
+        if (null == consumerType){
+            throw new LicenseContentException("鐢ㄦ埛绫诲瀷涓嶈兘涓虹┖");
+        }
+    }
+
+
+    /**
+     * 澶嶅啓validate鏂规硶锛屽鍔營P鍦板潃銆丮ac鍦板潃绛夊叾浠栦俊鎭牎楠�
+     */
+    @Override
+    protected synchronized void validate(final LicenseContent content)
+            throws LicenseContentException {
+        //1. 棣栧厛璋冪敤鐖剁被鐨剉alidate鏂规硶
+        super.validate(content);
+
+        //2. 鐒跺悗鏍¢獙鑷畾涔夌殑License鍙傛暟
+        //License涓彲琚厑璁哥殑鍙傛暟淇℃伅
+        LicenseCheck expectedCheckModel = (LicenseCheck) content.getExtra();
+        //褰撳墠鏈嶅姟鍣ㄧ湡瀹炵殑鍙傛暟淇℃伅
+        LicenseCheck serverCheckModel = getServerInfos();
+
+        if(expectedCheckModel != null && serverCheckModel != null){
+            //鏍¢獙IP鍦板潃
+            if(!checkIpAddress(expectedCheckModel.getIpAddress(),serverCheckModel.getIpAddress())){
+                throw new LicenseContentException("褰撳墠鏈嶅姟鍣ㄧ殑IP娌″湪鎺堟潈鑼冨洿鍐�");
+            }
+
+            //鏍¢獙Mac鍦板潃
+            if(!checkIpAddress(expectedCheckModel.getMacAddress(),serverCheckModel.getMacAddress())){
+                throw new LicenseContentException("褰撳墠鏈嶅姟鍣ㄧ殑Mac鍦板潃娌″湪鎺堟潈鑼冨洿鍐�");
+            }
+
+            //鏍¢獙涓绘澘搴忓垪鍙�
+            if(!checkSerial(expectedCheckModel.getMainBoardSerial(),serverCheckModel.getMainBoardSerial())){
+                throw new LicenseContentException("褰撳墠鏈嶅姟鍣ㄧ殑涓绘澘搴忓垪鍙锋病鍦ㄦ巿鏉冭寖鍥村唴");
+            }
+
+            //鏍¢獙CPU搴忓垪鍙�
+            if(!checkSerial(expectedCheckModel.getCpuSerial(),serverCheckModel.getCpuSerial())){
+                throw new LicenseContentException("褰撳墠鏈嶅姟鍣ㄧ殑CPU搴忓垪鍙锋病鍦ㄦ巿鏉冭寖鍥村唴");
+            }
+        }else{
+            throw new LicenseContentException("涓嶈兘鑾峰彇鏈嶅姟鍣ㄧ‖浠朵俊鎭�");
+        }
+    }
+
+
+    /**
+     * 閲嶅啓XMLDecoder瑙f瀽XML
+     */
+    private Object load(String encoded){
+        BufferedInputStream inputStream = null;
+        XMLDecoder decoder = null;
+        try {
+            inputStream = new BufferedInputStream(new ByteArrayInputStream(encoded.getBytes(XML_CHARSET)));
+
+            decoder = new XMLDecoder(new BufferedInputStream(inputStream, DEFAULT_BUFSIZE),null,null);
+
+            return decoder.readObject();
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if(decoder != null){
+                    decoder.close();
+                }
+                if(inputStream != null){
+                    inputStream.close();
+                }
+            } catch (Exception e) {
+                logger.error("XMLDecoder瑙f瀽XML澶辫触",e);
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * 鑾峰彇褰撳墠鏈嶅姟鍣ㄩ渶瑕侀澶栨牎楠岀殑License鍙傛暟
+     */
+    private LicenseCheck getServerInfos(){
+        //鎿嶄綔绯荤粺绫诲瀷
+        String osName = System.getProperty("os.name").toLowerCase();
+        AbstractServerInfos abstractServerInfos = null;
+
+        //鏍规嵁涓嶅悓鎿嶄綔绯荤粺绫诲瀷閫夋嫨涓嶅悓鐨勬暟鎹幏鍙栨柟娉�
+        if (osName.startsWith("windows")) {
+            abstractServerInfos = new WindowsServerInfos();
+        } else if (osName.startsWith("linux")) {
+//            abstractServerInfos = new LinuxServerInfos();
+        }else{//鍏朵粬鏈嶅姟鍣ㄧ被鍨�
+            abstractServerInfos = new WindowsServerInfos();
+        }
+
+        return abstractServerInfos.getServerInfos();
+    }
+
+    /**
+     * 鏍¢獙褰撳墠鏈嶅姟鍣ㄧ殑IP/Mac鍦板潃鏄惁鍦ㄥ彲琚厑璁哥殑IP鑼冨洿鍐�<br/>
+     * 濡傛灉瀛樺湪IP鍦ㄥ彲琚厑璁哥殑IP/Mac鍦板潃鑼冨洿鍐咃紝鍒欒繑鍥瀟rue
+     */
+    private boolean checkIpAddress(List<String> expectedList,List<String> serverList){
+        if(expectedList != null && expectedList.size() > 0){
+            if(serverList != null && serverList.size() > 0){
+                for(String expected : expectedList){
+                    if(serverList.contains(expected.trim())){
+                        return true;
+                    }
+                }
+            }
+
+            return false;
+        }else {
+            return true;
+        }
+    }
+
+    /**
+     * 鏍¢獙褰撳墠鏈嶅姟鍣ㄧ‖浠讹紙涓绘澘銆丆PU绛夛級搴忓垪鍙锋槸鍚﹀湪鍙厑璁歌寖鍥村唴
+     */
+    private boolean checkSerial(String expectedSerial,String serverSerial){
+        if(!Cools.isEmpty(expectedSerial)){
+            if(!Cools.isEmpty(serverSerial)){
+                if(expectedSerial.equals(serverSerial)){
+                    return true;
+                }
+            }
+            return false;
+        }else{
+            return true;
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/zy/system/entity/license/LicenseCheck.java b/src/main/java/com/zy/system/entity/license/LicenseCheck.java
new file mode 100644
index 0000000..660f818
--- /dev/null
+++ b/src/main/java/com/zy/system/entity/license/LicenseCheck.java
@@ -0,0 +1,45 @@
+package com.zy.system.entity.license;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 鑷畾涔夐渶瑕佹牎楠岀殑License鍙傛暟
+ */
+@Data
+public class LicenseCheck implements Serializable {
+
+    private static final long serialVersionUID = 8600137500316662317L;
+    /**
+     * 鍙鍏佽鐨処P鍦板潃
+     */
+    private List<String> ipAddress;
+
+    /**
+     * 鍙鍏佽鐨凪AC鍦板潃
+     */
+    private List<String> macAddress;
+
+    /**
+     * 鍙鍏佽鐨凜PU搴忓垪鍙�
+     */
+    private String cpuSerial;
+
+    /**
+     * 鍙鍏佽鐨勪富鏉垮簭鍒楀彿
+     */
+    private String mainBoardSerial;
+
+    @Override
+    public String toString() {
+        return "LicenseCheckModel{" +
+                "ipAddress=" + ipAddress +
+                ", macAddress=" + macAddress +
+                ", cpuSerial='" + cpuSerial + '\'' +
+                ", mainBoardSerial='" + mainBoardSerial + '\'' +
+                '}';
+    }
+
+}
diff --git a/src/main/java/com/zy/system/entity/license/LicenseCheckListener.java b/src/main/java/com/zy/system/entity/license/LicenseCheckListener.java
new file mode 100644
index 0000000..1659df2
--- /dev/null
+++ b/src/main/java/com/zy/system/entity/license/LicenseCheckListener.java
@@ -0,0 +1,94 @@
+package com.zy.system.entity.license;
+
+import com.core.common.Cools;
+import de.schlichtherle.license.LicenseContent;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.event.ContextRefreshedEvent;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+
+/**
+ * 鍦ㄩ」鐩惎鍔ㄦ椂瀹夎璇佷功
+ */
+@Component
+public class LicenseCheckListener implements ApplicationListener<ContextRefreshedEvent> {
+    private static Logger logger = LogManager.getLogger(LicenseCheckListener.class);
+
+    /**
+     * 璇佷功subject
+     */
+    @Value("${license.subject}")
+    private String subject;
+
+    /**
+     * 鍏挜鍒О
+     */
+    @Value("${license.publicAlias}")
+    private String publicAlias;
+
+    /**
+     * 璁块棶鍏挜搴撶殑瀵嗙爜
+     */
+    @Value("${license.storePass}")
+    private String storePass;
+
+    /**
+     * 璇佷功鐢熸垚璺緞
+     */
+    @Value("${license.licensePath}")
+    private String licensePath;
+
+    /**
+     * 瀵嗛挜搴撳瓨鍌ㄨ矾寰�
+     */
+    @Value("${license.publicKeysStorePath}")
+    private String publicKeysStorePath;
+
+    @Override
+    public void onApplicationEvent(ContextRefreshedEvent event) {
+        //root application context 娌℃湁parent
+        ApplicationContext context = event.getApplicationContext().getParent();
+        if(context == null){
+            loadLicense();
+        }
+    }
+
+    //鍔犺浇璇佷功
+    public boolean loadLicense() {
+        if(!Cools.isEmpty(licensePath)){
+            logger.info("++++++++ 寮�濮嬪姞杞借鍙瘉 ++++++++");
+
+            try {
+                String publicKeysStoreFileName = this.getClass().getClassLoader().getResource(publicKeysStorePath).getPath();
+                File publicKeysStoreFile = new File(publicKeysStoreFileName);
+
+                String licensePathFileName = this.getClass().getClassLoader().getResource(licensePath).getPath();
+                File licensePathFile = new File(licensePathFileName);
+
+                LicenseVerifyParam param = new LicenseVerifyParam();
+                param.setSubject(subject);
+                param.setPublicAlias(publicAlias);
+                param.setStorePass(storePass);
+                param.setLicensePath(licensePathFile.getPath());
+                param.setPublicKeysStorePath(publicKeysStoreFile.getPath());
+
+                LicenseVerify licenseVerify = new LicenseVerify();
+                //瀹夎璇佷功
+                LicenseContent install = licenseVerify.install(param);
+
+                logger.info("++++++++ 璁稿彲璇佸姞杞界粨鏉� ++++++++");
+
+                return install != null;
+            } catch (Exception e) {
+                return false;
+            }
+        }
+
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/zy/system/entity/license/LicenseCreator.java b/src/main/java/com/zy/system/entity/license/LicenseCreator.java
new file mode 100644
index 0000000..01f2ad1
--- /dev/null
+++ b/src/main/java/com/zy/system/entity/license/LicenseCreator.java
@@ -0,0 +1,86 @@
+package com.zy.system.entity.license;
+
+import de.schlichtherle.license.*;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import javax.security.auth.x500.X500Principal;
+import java.io.File;
+import java.text.MessageFormat;
+import java.util.prefs.Preferences;
+
+/**
+ * License鐢熸垚绫�
+ */
+public class LicenseCreator {
+    private static Logger logger = LogManager.getLogger(LicenseCreator.class);
+    private final static X500Principal DEFAULT_HOLDER_AND_ISSUER = new X500Principal("CN=localhost, OU=localhost, O=localhost, L=SH, ST=SH, C=CN");
+    private LicenseCreatorParam param;
+
+    public LicenseCreator(LicenseCreatorParam param) {
+        this.param = param;
+    }
+
+    /**
+     * 鐢熸垚License璇佷功
+     */
+    public boolean generateLicense(){
+        try {
+            LicenseManager licenseManager = new CustomLicenseManager(initLicenseParam());
+            LicenseContent licenseContent = initLicenseContent();
+
+            licenseManager.store(licenseContent,new File(param.getLicensePath()));
+
+            return true;
+        }catch (Exception e){
+            logger.error(MessageFormat.format("璇佷功鐢熸垚澶辫触锛歿0}",param),e);
+            return false;
+        }
+    }
+
+    /**
+     * 鍒濆鍖栬瘉涔︾敓鎴愬弬鏁�
+     */
+    private LicenseParam initLicenseParam(){
+        Preferences preferences = Preferences.userNodeForPackage(LicenseCreator.class);
+
+        //璁剧疆瀵硅瘉涔﹀唴瀹瑰姞瀵嗙殑绉橀挜
+        CipherParam cipherParam = new DefaultCipherParam(param.getStorePass());
+
+        KeyStoreParam privateStoreParam = new CustomKeyStoreParam(LicenseCreator.class
+                ,param.getPrivateKeysStorePath()
+                ,param.getPrivateAlias()
+                ,param.getStorePass()
+                ,param.getKeyPass());
+
+        LicenseParam licenseParam = new DefaultLicenseParam(param.getSubject()
+                ,preferences
+                ,privateStoreParam
+                ,cipherParam);
+
+        return licenseParam;
+    }
+
+    /**
+     * 璁剧疆璇佷功鐢熸垚姝f枃淇℃伅
+     */
+    private LicenseContent initLicenseContent(){
+        LicenseContent licenseContent = new LicenseContent();
+        licenseContent.setHolder(DEFAULT_HOLDER_AND_ISSUER);
+        licenseContent.setIssuer(DEFAULT_HOLDER_AND_ISSUER);
+
+        licenseContent.setSubject(param.getSubject());
+        licenseContent.setIssued(param.getIssuedTime());
+        licenseContent.setNotBefore(param.getIssuedTime());
+        licenseContent.setNotAfter(param.getExpiryTime());
+        licenseContent.setConsumerType(param.getConsumerType());
+        licenseContent.setConsumerAmount(param.getConsumerAmount());
+        licenseContent.setInfo(param.getDescription());
+
+        //鎵╁睍鏍¢獙鏈嶅姟鍣ㄧ‖浠朵俊鎭�
+        licenseContent.setExtra(param.getLicenseCheck());
+
+        return licenseContent;
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/zy/system/entity/license/LicenseCreatorParam.java b/src/main/java/com/zy/system/entity/license/LicenseCreatorParam.java
new file mode 100644
index 0000000..5a3915d
--- /dev/null
+++ b/src/main/java/com/zy/system/entity/license/LicenseCreatorParam.java
@@ -0,0 +1,96 @@
+package com.zy.system.entity.license;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * License鐢熸垚绫婚渶瑕佺殑鍙傛暟
+ */
+@Data
+public class LicenseCreatorParam implements Serializable {
+
+    private static final long serialVersionUID = -7793154252684580872L;
+    /**
+     * 璇佷功subject
+     */
+    private String subject;
+
+    /**
+     * 瀵嗛挜鍒О
+     */
+    private String privateAlias;
+
+    /**
+     * 瀵嗛挜瀵嗙爜锛堥渶瑕佸Ε鍠勪繚绠★紝涓嶈兘璁╀娇鐢ㄨ�呯煡閬擄級
+     */
+    private String keyPass;
+
+    /**
+     * 璁块棶绉橀挜搴撶殑瀵嗙爜
+     */
+    private String storePass;
+
+    /**
+     * 璇佷功鐢熸垚璺緞
+     */
+    private String licensePath;
+
+    /**
+     * 瀵嗛挜搴撳瓨鍌ㄨ矾寰�
+     */
+    private String privateKeysStorePath;
+
+    /**
+     * 璇佷功鐢熸晥鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date issuedTime = new Date();
+
+    /**
+     * 璇佷功澶辨晥鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date expiryTime;
+
+    /**
+     * 鐢ㄦ埛绫诲瀷
+     */
+    private String consumerType = "user";
+
+    /**
+     * 鐢ㄦ埛鏁伴噺
+     */
+    private Integer consumerAmount = 1;
+
+    /**
+     * 鎻忚堪淇℃伅
+     */
+    private String description = "";
+
+    /**
+     * 棰濆鐨勬湇鍔″櫒纭欢鏍¢獙淇℃伅
+     */
+    private LicenseCheck licenseCheck;
+
+    @Override
+    public String toString() {
+        return "LicenseCreatorParam{" +
+                "subject='" + subject + '\'' +
+                ", privateAlias='" + privateAlias + '\'' +
+                ", keyPass='" + keyPass + '\'' +
+                ", storePass='" + storePass + '\'' +
+                ", licensePath='" + licensePath + '\'' +
+                ", privateKeysStorePath='" + privateKeysStorePath + '\'' +
+                ", issuedTime=" + issuedTime +
+                ", expiryTime=" + expiryTime +
+                ", consumerType='" + consumerType + '\'' +
+                ", consumerAmount=" + consumerAmount +
+                ", description='" + description + '\'' +
+                ", licenseCheck=" + licenseCheck +
+                '}';
+    }
+
+}
diff --git a/src/main/java/com/zy/system/entity/license/LicenseManagerHolder.java b/src/main/java/com/zy/system/entity/license/LicenseManagerHolder.java
new file mode 100644
index 0000000..64c6f39
--- /dev/null
+++ b/src/main/java/com/zy/system/entity/license/LicenseManagerHolder.java
@@ -0,0 +1,22 @@
+package com.zy.system.entity.license;
+
+import de.schlichtherle.license.LicenseManager;
+import de.schlichtherle.license.LicenseParam;
+
+public class LicenseManagerHolder {
+
+    private static volatile LicenseManager LICENSE_MANAGER;
+
+    public static LicenseManager getInstance(LicenseParam param) {
+        if (LICENSE_MANAGER == null) {
+            synchronized (LicenseManagerHolder.class) {
+                if (LICENSE_MANAGER == null) {
+                    LICENSE_MANAGER = new CustomLicenseManager(param);
+                }
+            }
+        }
+
+        return LICENSE_MANAGER;
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/zy/system/entity/license/LicenseVerify.java b/src/main/java/com/zy/system/entity/license/LicenseVerify.java
new file mode 100644
index 0000000..2175930
--- /dev/null
+++ b/src/main/java/com/zy/system/entity/license/LicenseVerify.java
@@ -0,0 +1,133 @@
+package com.zy.system.entity.license;
+
+import de.schlichtherle.license.*;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.io.File;
+import java.text.DateFormat;
+import java.text.MessageFormat;
+import java.text.SimpleDateFormat;
+import java.util.prefs.Preferences;
+
+/**
+ * License鏍¢獙绫�
+ */
+public class LicenseVerify {
+    private static Logger logger = LogManager.getLogger(LicenseVerify.class);
+
+    /**
+     * 瀹夎License璇佷功
+     */
+    public synchronized LicenseContent install(LicenseVerifyParam param){
+        LicenseContent result = null;
+        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+        //1. 瀹夎璇佷功
+        try{
+            LicenseManager licenseManager = LicenseManagerHolder.getInstance(initLicenseParam(param));
+            licenseManager.uninstall();
+
+            result = licenseManager.install(new File(param.getLicensePath()));
+            logger.info(MessageFormat.format("璁稿彲璇佸姞杞芥垚鍔燂紝璁稿彲璇佹湁鏁堟湡锛歿0} - {1}",format.format(result.getNotBefore()),format.format(result.getNotAfter())));
+        }catch (Exception e){
+            logger.error("璁稿彲璇佸姞杞藉け璐ワ紒",e);
+        }
+
+        return result;
+    }
+
+    /**
+     * 鏍¢獙License璇佷功
+     */
+    public boolean verify(){
+        try {
+            LicenseManager licenseManager = LicenseManagerHolder.getInstance(null);
+            DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+            if (!updateSystemTime()) {
+                //鏃堕棿鏇存柊澶辫触锛岀郴缁熸椂闂磋鏇存敼
+                return false;
+            }
+
+            LicenseContent licenseContent = licenseManager.verify();
+            logger.info(MessageFormat.format("璁稿彲璇佹牎楠岄�氳繃锛岃鍙瘉鏈夋晥鏈燂細{0} - {1}",format.format(licenseContent.getNotBefore()),format.format(licenseContent.getNotAfter())));
+            return true;
+        }catch (Exception e){
+            logger.error("璁稿彲璇佹牎楠屽け璐ワ紒",e);
+            return false;
+        }
+    }
+
+    /**
+     * 鏍¢獙License璇佷功骞惰幏鍙栬瘉涔︿俊鎭�
+     */
+    public LicenseContent getVerifyInfo(){
+        LicenseManager licenseManager = LicenseManagerHolder.getInstance(null);
+
+        if (!updateSystemTime()) {
+            //鏃堕棿鏇存柊澶辫触锛岀郴缁熸椂闂磋鏇存敼
+            return null;
+        }
+
+        //鏍¢獙璇佷功
+        try {
+            LicenseContent licenseContent = licenseManager.verify();
+            return licenseContent;
+        }catch (Exception e){
+            logger.error("璁稿彲璇佹牎楠屽け璐ワ紒",e);
+            return null;
+        }
+    }
+
+    /**
+     * 鍒濆鍖栬瘉涔︾敓鎴愬弬鏁�
+     * @param param License鏍¢獙绫婚渶瑕佺殑鍙傛暟
+     * @return de.schlichtherle.license.LicenseParam
+     */
+    private LicenseParam initLicenseParam(LicenseVerifyParam param){
+        Preferences preferences = Preferences.userNodeForPackage(LicenseVerify.class);
+
+        CipherParam cipherParam = new DefaultCipherParam(param.getStorePass());
+
+        KeyStoreParam publicStoreParam = new CustomKeyStoreParam(LicenseVerify.class
+                ,param.getPublicKeysStorePath()
+                ,param.getPublicAlias()
+                ,param.getStorePass()
+                ,null);
+
+        return new DefaultLicenseParam(param.getSubject()
+                ,preferences
+                ,publicStoreParam
+                ,cipherParam);
+    }
+
+    /**
+     * 鏇存柊鏃堕棿鍒版敞鍐岃〃涓�
+     */
+    private boolean updateSystemTime() {
+        // 鑾峰彇鐢ㄦ埛鏍硅妭鐐�
+        Preferences userRoot = Preferences.userRoot();
+        // 鑾峰彇鎸囧畾璺緞涓嬬殑鑺傜偣
+        Preferences node = userRoot.node("/zhongyang");
+        String key = "time";
+        // 璇诲彇娉ㄥ唽琛�
+        String value = node.get(key, null);
+        if (value != null) {
+            long originTime = Long.parseLong(value);
+            long now = System.currentTimeMillis();
+            long diff = now - originTime;//鐜板湪鏃堕棿 - 婧愭椂闂� = 鏃堕棿宸�
+            if (diff > 0) {
+                //鏃堕棿宸ぇ浜�0鎵嶅厑璁告洿鏂版敞鍐岃〃鏃堕棿
+                node.put(key, String.valueOf(System.currentTimeMillis()));
+                return true;
+            }
+        }else {
+            // 鍐欏叆娉ㄥ唽琛�
+            node.put(key, String.valueOf(System.currentTimeMillis()));
+            return true;
+        }
+        return false;
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/zy/system/entity/license/LicenseVerifyParam.java b/src/main/java/com/zy/system/entity/license/LicenseVerifyParam.java
new file mode 100644
index 0000000..33806e5
--- /dev/null
+++ b/src/main/java/com/zy/system/entity/license/LicenseVerifyParam.java
@@ -0,0 +1,48 @@
+package com.zy.system.entity.license;
+
+import lombok.Data;
+
+/**
+ * 鏍¢獙绛惧悕鏂囦欢
+ */
+@Data
+public class LicenseVerifyParam {
+
+    /**
+     * 璇佷功subject
+     */
+    private String subject;
+
+    /**
+     * 鍏挜鍒О
+     */
+    private String publicAlias;
+
+    /**
+     * 璁块棶鍏挜搴撶殑瀵嗙爜
+     */
+    private String storePass;
+
+    /**
+     * 璇佷功鐢熸垚璺緞
+     */
+    private String licensePath;
+
+    /**
+     * 瀵嗛挜搴撳瓨鍌ㄨ矾寰�
+     */
+    private String publicKeysStorePath;
+
+    public LicenseVerifyParam() {
+
+    }
+
+    public LicenseVerifyParam(String subject, String publicAlias, String storePass, String licensePath, String publicKeysStorePath) {
+        this.subject = subject;
+        this.publicAlias = publicAlias;
+        this.storePass = storePass;
+        this.licensePath = licensePath;
+        this.publicKeysStorePath = publicKeysStorePath;
+    }
+
+}
diff --git a/src/main/java/com/zy/system/entity/license/WindowsServerInfos.java b/src/main/java/com/zy/system/entity/license/WindowsServerInfos.java
new file mode 100644
index 0000000..c575e6d
--- /dev/null
+++ b/src/main/java/com/zy/system/entity/license/WindowsServerInfos.java
@@ -0,0 +1,85 @@
+package com.zy.system.entity.license;
+
+import java.net.InetAddress;
+import java.util.List;
+import java.util.Scanner;
+import java.util.stream.Collectors;
+
+/**
+ * 鐢ㄤ簬鑾峰彇瀹㈡埛Windows鏈嶅姟鍣ㄧ殑鍩烘湰淇℃伅
+ */
+public class WindowsServerInfos extends AbstractServerInfos {
+
+    @Override
+    protected List<String> getIpAddress() throws Exception {
+        List<String> result = null;
+
+        //鑾峰彇鎵�鏈夌綉缁滄帴鍙�
+        List<InetAddress> inetAddresses = getLocalAllInetAddress();
+
+        if(inetAddresses != null && inetAddresses.size() > 0){
+            result = inetAddresses.stream().map(InetAddress::getHostAddress).distinct().map(String::toLowerCase).collect(Collectors.toList());
+        }
+
+        return result;
+    }
+
+    @Override
+    protected List<String> getMacAddress() throws Exception {
+        List<String> result = null;
+
+        //1. 鑾峰彇鎵�鏈夌綉缁滄帴鍙�
+        List<InetAddress> inetAddresses = getLocalAllInetAddress();
+
+        if(inetAddresses != null && inetAddresses.size() > 0){
+            //2. 鑾峰彇鎵�鏈夌綉缁滄帴鍙g殑Mac鍦板潃
+            result = inetAddresses.stream().map(this::getMacByInetAddress).distinct().collect(Collectors.toList());
+        }
+
+        return result;
+    }
+
+    @Override
+    protected String getCPUSerial() throws Exception {
+        //搴忓垪鍙�
+        String serialNumber = "";
+
+        //浣跨敤WMIC鑾峰彇CPU搴忓垪鍙�
+        Process process = Runtime.getRuntime().exec("wmic cpu get processorid");
+        process.getOutputStream().close();
+        Scanner scanner = new Scanner(process.getInputStream());
+
+        if(scanner.hasNext()){
+            scanner.next();
+        }
+
+        if(scanner.hasNext()){
+            serialNumber = scanner.next().trim();
+        }
+
+        scanner.close();
+        return serialNumber;
+    }
+
+    @Override
+    protected String getMainBoardSerial() throws Exception {
+        //搴忓垪鍙�
+        String serialNumber = "";
+
+        //浣跨敤WMIC鑾峰彇涓绘澘搴忓垪鍙�
+        Process process = Runtime.getRuntime().exec("wmic baseboard get serialnumber");
+        process.getOutputStream().close();
+        Scanner scanner = new Scanner(process.getInputStream());
+
+        if(scanner.hasNext()){
+            scanner.next();
+        }
+
+        if(scanner.hasNext()){
+            serialNumber = scanner.next().trim();
+        }
+
+        scanner.close();
+        return serialNumber;
+    }
+}
\ No newline at end of file
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 8a01c7b..330352b 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -43,6 +43,14 @@
 swagger:
   enable: false
 
+#License鐩稿叧閰嶇疆
+license:
+  subject: tzskasrs
+  publicAlias: publicCert
+  storePass: public_zhongyang_123456789
+  licensePath: license.lic
+  publicKeysStorePath: publicCerts.keystore
+
 # 涓嬩綅鏈洪厤缃�
 wcs-slave:
   # 鍙屾繁
@@ -51,6 +59,7 @@
   doubleLocs: 32
   # 涓�涓爢鍨涙満璐熻矗鐨勮揣鏋舵帓鏁�
   groupCount: 2
+  url: http://127.0.0.1:9090/tzskwcs
 
 #鍏ュ簱鏆傚瓨鏁�
 store:
diff --git a/src/main/resources/map.json b/src/main/resources/map.json
deleted file mode 100644
index 51d9560..0000000
--- a/src/main/resources/map.json
+++ /dev/null
@@ -1 +0,0 @@
-[[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-23,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-22,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-21,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-20,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-19,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-18,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-17,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-16,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-15,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-14,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-13,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-12,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-11,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-10,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":4,"data":"100","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-9,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":4,"data":"104","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":4,"data":"101","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-8,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":4,"data":"103","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":4,"data":"102","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-7,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"109","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-6,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-5,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-4,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-3,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-2,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":0,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}],[{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500},{"value":-1,"data":"","top":1300,"bottom":1300,"left":1500,"right":1500}]]
\ No newline at end of file
diff --git a/src/main/resources/mapper/LocDetlMapper.xml b/src/main/resources/mapper/LocDetlMapper.xml
index 6b33153..082b5a6 100644
--- a/src/main/resources/mapper/LocDetlMapper.xml
+++ b/src/main/resources/mapper/LocDetlMapper.xml
@@ -64,6 +64,11 @@
         where 1=1
         and loc_no = #{locNo}
         and matnr = #{matnr}
+        <choose>
+            <when test="suppCode != null and suppCode != ''">
+                and supp_code = #{suppCode}
+            </when>
+        </choose>
         <include refid="batchSeq"></include>
     </select>
 
diff --git a/src/main/resources/mapper/WrkChargeMapper.xml b/src/main/resources/mapper/WrkChargeMapper.xml
index 5119bbf..96e4302 100644
--- a/src/main/resources/mapper/WrkChargeMapper.xml
+++ b/src/main/resources/mapper/WrkChargeMapper.xml
@@ -27,6 +27,7 @@
         <result column="appe_time" property="appeTime" />
         <result column="memo" property="memo" />
         <result column="barcode" property="barcode" />
+        <result column="shuttle_no" property="shuttleNo" />
 
     </resultMap>
 
diff --git a/src/main/resources/publicCerts.keystore b/src/main/resources/publicCerts.keystore
new file mode 100644
index 0000000..382a874
--- /dev/null
+++ b/src/main/resources/publicCerts.keystore
Binary files differ
diff --git a/src/main/webapp/static/css/fonts/element-icons.ttf b/src/main/webapp/static/css/fonts/element-icons.ttf
new file mode 100644
index 0000000..91b74de
--- /dev/null
+++ b/src/main/webapp/static/css/fonts/element-icons.ttf
Binary files differ
diff --git a/src/main/webapp/static/css/fonts/element-icons.woff b/src/main/webapp/static/css/fonts/element-icons.woff
new file mode 100644
index 0000000..02b9a25
--- /dev/null
+++ b/src/main/webapp/static/css/fonts/element-icons.woff
Binary files differ
diff --git a/src/main/webapp/static/js/command/liftCommand.js b/src/main/webapp/static/js/command/liftCommand.js
new file mode 100644
index 0000000..12c1bad
--- /dev/null
+++ b/src/main/webapp/static/js/command/liftCommand.js
@@ -0,0 +1,465 @@
+var pageCurr;
+layui.use(['table','laydate', 'form'], function(){
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+
+    $('#wrkNo').val(parent.wrkNo);
+    // 鏁版嵁娓叉煋
+    tableIns = table.render({
+        elem: '#liftCommand',
+        headers: {token: localStorage.getItem('token')},
+        url: baseUrl+'/basLift/command/list/auth',
+        where: {wrkNo: parent.wrkNo},
+        page: true,
+        limit: 16,
+        limits: [16, 30, 50, 100, 200, 500],
+        even: true,
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        cols: [[
+            {field: 'run', align: 'center',title: '鍛戒护瀛�',templet: function (row){
+                    var html = "";
+                    if (row.taskModel === 0) {
+                        html = "绌�";
+                    }else if (row.taskModel === 1) {
+                        html = "绉昏揣鐗�";
+                    }else if (row.taskModel === 2) {
+                        html = "绉诲皬杞�";
+                    }else {
+                        html = row.taskModel;
+                    }
+                    return html;
+            }}
+            ,{field: 'sourceSta', align: 'center',title: '婧愮珯'}
+            ,{field: 'targetSta', align: 'center',title: '鐩爣绔�'}
+            ,{field: 'taskNo', align: 'center',title: '宸ヤ綔鍙�'}
+            ,{field: 'liftNo', align: 'center',title: '鎻愬崌鏈�'}
+            ,{field: 'complete', align: 'center',title: '鏄惁瀹屾垚', templet: function (row){
+                    var html = "<input value='complete' type='checkbox' lay-skin='switch' lay-text='瀹屾垚|鏈畬鎴�' lay-filter='completeSwitch' table-index='"+row.LAY_TABLE_INDEX+"'";
+                    if(row.complete){html += " checked ";}
+                    html += ">";
+                    return html;
+            }}
+            ,{fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width:150}
+        ]],
+        request: {
+            pageName: 'curr',
+            pageSize: 'limit'
+        },
+        parseData: function (res) {
+            return {
+                'code': res.code,
+                'msg': res.msg,
+                'count': res.data.total,
+                'data': res.data.records
+            }
+        },
+        response: {
+            statusCode: 200
+        },
+        done: function(res, curr, count) {
+            var that = this.elem.next();
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            pageCurr=curr;
+
+            res.data.forEach((item,idx) => {
+                if (idx == item.commandStep) {
+                    that.find(".layui-table-box tr[data-index='" + idx + "']").css("background-color", "#1E9FFF");
+                }
+            })
+        }
+    });
+
+    // 鐩戝惉鎺掑簭浜嬩欢
+    table.on('sort(liftCommand)', function (obj) {
+        var searchData = {};
+        $.each($('#search-box [name]').serializeArray(), function() {
+            searchData[this.name] = this.value;
+        });
+        searchData['orderByField'] = obj.field;
+        searchData['orderByType'] = obj.type;
+        tableIns.reload({
+            where: searchData,
+            page: {
+                curr: 1
+            },
+            done: function (res, curr, count) {
+                if (res.code === 403) {
+                    top.location.href = baseUrl+"/";
+                }
+                pageCurr=curr;
+                limit();
+            }
+        });
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(liftCommand)', function (obj) {
+        var checkStatus = table.checkStatus(obj.config.id);
+        switch(obj.event) {
+            case 'addData':
+                layer.open({
+                    type: 2,
+                    title: '鏂板',
+                    maxmin: true,
+                    area: ['500px', top.detailHeight],
+                    shadeClose: false,
+                    content: 'liftCommand_detail.html',
+                    success: function(layero, index){
+                        layer.getChildFrame('#data-detail-submit-edit', index).hide();
+                        clearFormVal(layer.getChildFrame('#detail', index));
+                        layer.iframeAuto(index);layer.style(index, {top: (($(window).height()-layer.getChildFrame('#data-detail', index).height())/3)+"px"});
+                    }
+                });
+                break;
+            case 'refreshData':
+                tableIns.reload({
+                    page: {
+                        curr: pageCurr
+                    }
+                });
+                limit();
+                break;
+            case 'deleteData':
+                var data = checkStatus.data;
+                if (data.length === 0){
+                    layer.msg('璇烽�夋嫨鏁版嵁');
+                } else {
+                    layer.confirm('纭畾鍒犻櫎'+(data.length===1?'姝�':data.length)+'鏉℃暟鎹悧', function(){
+                        $.ajax({
+                            url: baseUrl+"/liftCommand/delete/auth",
+                            headers: {'token': localStorage.getItem('token')},
+                            data: {param: JSON.stringify(data)},
+                            method: 'POST',
+                            traditional:true,
+                            success: function (res) {
+                                if (res.code === 200){
+                                    layer.closeAll();
+                                    tableReload(false);
+                                } else if (res.code === 403){
+                                    top.location.href = baseUrl+"/";
+                                } else {
+                                    layer.msg(res.msg)
+                                }
+                            }
+                        })
+                    });
+                }
+                break;
+            case 'exportData':
+                layer.confirm('纭畾瀵煎嚭Excel鍚�', {shadeClose: true}, function(){
+                    var titles=[];
+                    var fields=[];
+                    obj.config.cols[0].map(function (col) {
+                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
+                            titles.push(col.title);
+                            fields.push(col.field);
+                        }
+                    });
+                    var exportData = {};
+                    $.each($('#search-box [name]').serializeArray(), function() {
+                        exportData[this.name] = this.value;
+                    });
+                    var param = {
+                        'liftCommand': exportData,
+                        'fields': fields
+                    };
+                    $.ajax({
+                        url: baseUrl+"/liftCommand/export/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: JSON.stringify(param),
+                        dataType:'json',
+                        contentType:'application/json;charset=UTF-8',
+                        method: 'POST',
+                        success: function (res) {
+                            layer.closeAll();
+                            if (res.code === 200) {
+                                table.exportFile(titles,res.data,'xls');
+                            } else if (res.code === 403) {
+                                top.location.href = baseUrl+"/";
+                            } else {
+                                layer.msg(res.msg)
+                            }
+                        }
+                    });
+                });
+                break;
+        }
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(liftCommand)', function(obj){
+        var data = obj.data;
+        //鑾峰彇褰撳墠琛岀殑绱㈠紩
+        var rowIndex = $(obj.tr).attr("data-index");
+        switch (obj.event) {
+            // 鍥為��鍛戒护
+            case 'rollback':
+                $.ajax({
+                    url: baseUrl+"/basLift/command/rollback/auth",
+                    headers: {'token': localStorage.getItem('token')},
+                    data: JSON.stringify({
+                        wrkNo: parent.wrkNo,
+                        commandStep: rowIndex
+                    }),
+                    dataType:'json',
+                    contentType:'application/json;charset=UTF-8',
+                    method: 'POST',
+                    success: function (res) {
+                        layer.closeAll();
+                        if (res.code === 200) {
+                            tableReload();
+                            layer.msg(res.msg)
+                        } else if (res.code === 403) {
+                            top.location.href = baseUrl+"/";
+                        } else {
+                            layer.msg(res.msg)
+                        }
+                    }
+                });
+                break;
+
+        }
+    });
+
+    // 淇敼鐘舵��
+    form.on('switch(completeSwitch)', function (obj) {
+        var index  = obj.othis.parents('tr').attr("data-index");
+        $.ajax({
+            url: baseUrl+"/basLift/command/completeSwitch/auth",
+            headers: {'token': localStorage.getItem('token')},
+            data: JSON.stringify({
+                wrkNo: parent.wrkNo,
+                commandStep: index,
+                complete: obj.elem.checked?1:0
+            }),
+            dataType:'json',
+            contentType:'application/json;charset=UTF-8',
+            method: 'POST',
+            success: function (res) {
+                layer.closeAll();
+                if (res.code === 200) {
+                    tableReload();
+                    layer.msg(res.msg)
+                } else if (res.code === 403) {
+                    top.location.href = baseUrl+"/";
+                } else {
+                    layer.msg(res.msg)
+                }
+            }
+        });
+    })
+
+    // 鏁版嵁淇濆瓨鍔ㄤ綔
+    form.on('submit(save)', function () {
+        if (banMsg != null){
+            layer.msg(banMsg);
+            return;
+        }
+        method("add");
+    });
+
+    // 鏁版嵁淇敼鍔ㄤ綔
+    form.on('submit(edit)', function () {
+        method("update")
+    });
+
+    function method(name){
+        var index = layer.load(1, {
+            shade: [0.5,'#000'] //0.1閫忔槑搴︾殑鑳屾櫙
+        });
+        var data = {
+//            id: $('#id').val(),
+            wrkSts: $('#wrkSts').val(),
+            wrkDesc: $('#wrkDesc').val(),
+            modiUser: $('#modiUser').val(),
+            modiTime: top.strToDate($('#modiTime\\$').val()),
+            appeUser: $('#appeUser').val(),
+            appeTime: top.strToDate($('#appeTime\\$').val()),
+
+        };
+        $.ajax({
+            url: baseUrl+"/liftCommand/"+name+"/auth",
+            headers: {'token': localStorage.getItem('token')},
+            data: top.reObject(data),
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200){
+                    parent.layer.closeAll();
+                    tableReload(true);
+                    $("#data-detail :input").each(function () {
+                        $(this).val("");
+                    });
+                } else if (res.code === 403){
+                    top.location.href = baseUrl+"/";
+                }else {
+                    layer.msg(res.msg)
+                }
+                layer.close(index);
+            }
+        })
+    }
+
+    // 鎼滅储鏍忔悳绱簨浠�
+    form.on('submit(search)', function (data) {
+        pageCurr = 1;
+        tableReload(false);
+    });
+
+    // 鎼滅储鏍忛噸缃簨浠�
+    form.on('submit(reset)', function (data) {
+        pageCurr = 1;
+        clearFormVal($('#search-box'));
+        tableReload(false);
+    });
+
+    // 鎼滅储鏍忛噸鍚换鍔�
+    form.on('submit(restartCommand)', function (data) {
+        $.ajax({
+            url: baseUrl+"/basLift/command/restart/auth",
+            headers: {'token': localStorage.getItem('token')},
+            data: JSON.stringify({
+                wrkNo: parent.wrkNo
+            }),
+            dataType:'json',
+            contentType:'application/json;charset=UTF-8',
+            method: 'POST',
+            success: function (res) {
+                layer.closeAll();
+                if (res.code === 200) {
+                    tableReload();
+                    layer.msg(res.msg)
+                } else if (res.code === 403) {
+                    top.location.href = baseUrl+"/";
+                } else {
+                    layer.msg(res.msg)
+                }
+            }
+        });
+    });
+
+    // 鎼滅储鏍忓垹闄や换鍔�
+    form.on('submit(delCommand)', function (data) {
+        $.ajax({
+            url: baseUrl+"/basLift/command/del/auth",
+            headers: {'token': localStorage.getItem('token')},
+            data: JSON.stringify({
+                wrkNo: parent.wrkNo
+            }),
+            dataType:'json',
+            contentType:'application/json;charset=UTF-8',
+            method: 'POST',
+            success: function (res) {
+                layer.closeAll();
+                if (res.code === 200) {
+                    tableReload();
+                    layer.msg(res.msg)
+                } else if (res.code === 403) {
+                    top.location.href = baseUrl+"/";
+                } else {
+                    layer.msg(res.msg)
+                }
+            }
+        });
+    });
+
+    // 鏃堕棿閫夋嫨鍣�
+    layDate.render({
+        elem: '#modiTime\\$',
+        type: 'datetime'
+    });
+    layDate.render({
+        elem: '#appeTime\\$',
+        type: 'datetime'
+    });
+
+
+});
+
+// 鍏抽棴鍔ㄤ綔
+$(document).on('click','#data-detail-close', function () {
+    parent.layer.closeAll();
+});
+
+function tableReload(child) {
+    var searchData = {};
+    $.each($('#search-box [name]').serializeArray(), function() {
+        searchData[this.name] = this.value;
+    });
+    (child ? parent.tableIns : tableIns).reload({
+        where: searchData,
+        page: {
+            curr: pageCurr
+        },
+        done: function (res, curr, count) {
+            var that = this.elem.next();
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            pageCurr=curr;
+            if (res.data.length === 0 && count !== 0) {
+                tableIns.reload({
+                    where: searchData,
+                    page: {
+                        curr: pageCurr-1
+                    }
+                });
+                pageCurr -= 1;
+            }
+            limit(child);
+
+            res.data.forEach((item,idx) => {
+                if (idx == item.commandStep) {
+                    that.find(".layui-table-box tr[data-index='" + idx + "']").css("background-color", "#1E9FFF");
+                }
+            })
+        }
+    });
+}
+
+function setFormVal(el, data, showImg) {
+    for (var val in data) {
+        var find = el.find(":input[id='" + val + "']");
+        find.val(data[val]);
+        if (showImg){
+            var next = find.next();
+            if (next.get(0)){
+                if (next.get(0).localName === "img") {
+                    find.hide();
+                    next.attr("src", data[val]);
+                    next.show();
+                }
+            }
+        }
+    }
+}
+
+function clearFormVal(el) {
+    $(':input', el)
+        .val('')
+        .removeAttr('checked')
+        .removeAttr('selected');
+}
+
+function detailScreen(index) {
+    var detail = layer.getChildFrame('#data-detail', index);
+    var height = detail.height()+60;
+    if (height > ($(window).height()*0.9)) {
+        height = ($(window).height()*0.9);
+    }
+    layer.style(index, {
+//        top: (($(window).height()-height)/3)+"px",
+        height: height+'px'
+    });
+}
+
+$('body').keydown(function () {
+    if (event.keyCode === 13) {
+        $("#search").click();
+    }
+});
diff --git a/src/main/webapp/static/js/command/shuttleCommand.js b/src/main/webapp/static/js/command/shuttleCommand.js
new file mode 100644
index 0000000..86df54d
--- /dev/null
+++ b/src/main/webapp/static/js/command/shuttleCommand.js
@@ -0,0 +1,474 @@
+var pageCurr;
+layui.use(['table','laydate', 'form'], function(){
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+
+    $('#wrkNo').val(parent.wrkNo);
+    // 鏁版嵁娓叉煋
+    tableIns = table.render({
+        elem: '#shuttleCommand',
+        headers: {token: localStorage.getItem('token')},
+        url: baseUrl+'/basShuttle/command/list/auth',
+        where: {wrkNo: parent.wrkNo},
+        page: true,
+        limit: 16,
+        limits: [16, 30, 50, 100, 200, 500],
+        even: true,
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        cols: [[
+            {field: 'commandWord', align: 'center',title: '鍛戒护绫诲瀷', templet: function (row) {
+                    var html = row.request.body.requestType;
+                    return html;
+            }}
+            ,{field: 'start', align: 'center',title: '璧风偣', templet: function (row) {
+                    var html = row.request.body.start;
+                    if (html === undefined) {
+                        html = ""
+                    }
+                    return JSON.stringify(html);
+            }}
+            ,{field: 'target', align: 'center',title: '缁堢偣', templet: function (row) {
+                    var html = row.request.body.target;
+                    if (html === undefined) {
+                        html = ""
+                    }
+                    return JSON.stringify(html);
+            }}
+            ,{field: 'taskId', align: 'center',title: 'taskId', templet: function (row) {
+                    var html = row.request.body.taskId;
+                    return html;
+            }}
+            ,{field: 'robotId', align: 'center',title: 'robotId', templet: function (row) {
+                    var html = row.robotId;
+                    return html;
+            }}
+            ,{field: 'complete', align: 'center',title: '鏄惁瀹屾垚', templet: function (row){
+                    var html = "<input value='complete' type='checkbox' lay-skin='switch' lay-text='瀹屾垚|鏈畬鎴�' lay-filter='completeSwitch' table-index='"+row.LAY_TABLE_INDEX+"'";
+                    if(row.complete){html += " checked ";}
+                    html += ">";
+                    return html;
+            }}
+            ,{fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width:150}
+        ]],
+        request: {
+            pageName: 'curr',
+            pageSize: 'limit'
+        },
+        parseData: function (res) {
+            return {
+                'code': res.code,
+                'msg': res.msg,
+                'count': res.data.total,
+                'data': res.data.records
+            }
+        },
+        response: {
+            statusCode: 200
+        },
+        done: function(res, curr, count) {
+            var that = this.elem.next();
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            pageCurr=curr;
+
+            res.data.forEach((item,idx) => {
+                if (idx == item.commandStep) {
+                    that.find(".layui-table-box tr[data-index='" + idx + "']").css("background-color", "#1E9FFF");
+                }
+            })
+        }
+    });
+
+    // 鐩戝惉鎺掑簭浜嬩欢
+    table.on('sort(shuttleCommand)', function (obj) {
+        var searchData = {};
+        $.each($('#search-box [name]').serializeArray(), function() {
+            searchData[this.name] = this.value;
+        });
+        searchData['orderByField'] = obj.field;
+        searchData['orderByType'] = obj.type;
+        tableIns.reload({
+            where: searchData,
+            page: {
+                curr: 1
+            },
+            done: function (res, curr, count) {
+                if (res.code === 403) {
+                    top.location.href = baseUrl+"/";
+                }
+                pageCurr=curr;
+                limit();
+            }
+        });
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(shuttleCommand)', function (obj) {
+        var checkStatus = table.checkStatus(obj.config.id);
+        switch(obj.event) {
+            case 'addData':
+                layer.open({
+                    type: 2,
+                    title: '鏂板',
+                    maxmin: true,
+                    area: ['500px', top.detailHeight],
+                    shadeClose: false,
+                    content: 'shuttleCommand_detail.html',
+                    success: function(layero, index){
+                        layer.getChildFrame('#data-detail-submit-edit', index).hide();
+                        clearFormVal(layer.getChildFrame('#detail', index));
+                        layer.iframeAuto(index);layer.style(index, {top: (($(window).height()-layer.getChildFrame('#data-detail', index).height())/3)+"px"});
+                    }
+                });
+                break;
+            case 'refreshData':
+                tableIns.reload({
+                    page: {
+                        curr: pageCurr
+                    }
+                });
+                limit();
+                break;
+            case 'deleteData':
+                var data = checkStatus.data;
+                if (data.length === 0){
+                    layer.msg('璇烽�夋嫨鏁版嵁');
+                } else {
+                    layer.confirm('纭畾鍒犻櫎'+(data.length===1?'姝�':data.length)+'鏉℃暟鎹悧', function(){
+                        $.ajax({
+                            url: baseUrl+"/shuttleCommand/delete/auth",
+                            headers: {'token': localStorage.getItem('token')},
+                            data: {param: JSON.stringify(data)},
+                            method: 'POST',
+                            traditional:true,
+                            success: function (res) {
+                                if (res.code === 200){
+                                    layer.closeAll();
+                                    tableReload(false);
+                                } else if (res.code === 403){
+                                    top.location.href = baseUrl+"/";
+                                } else {
+                                    layer.msg(res.msg)
+                                }
+                            }
+                        })
+                    });
+                }
+                break;
+            case 'exportData':
+                layer.confirm('纭畾瀵煎嚭Excel鍚�', {shadeClose: true}, function(){
+                    var titles=[];
+                    var fields=[];
+                    obj.config.cols[0].map(function (col) {
+                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
+                            titles.push(col.title);
+                            fields.push(col.field);
+                        }
+                    });
+                    var exportData = {};
+                    $.each($('#search-box [name]').serializeArray(), function() {
+                        exportData[this.name] = this.value;
+                    });
+                    var param = {
+                        'shuttleCommand': exportData,
+                        'fields': fields
+                    };
+                    $.ajax({
+                        url: baseUrl+"/shuttleCommand/export/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: JSON.stringify(param),
+                        dataType:'json',
+                        contentType:'application/json;charset=UTF-8',
+                        method: 'POST',
+                        success: function (res) {
+                            layer.closeAll();
+                            if (res.code === 200) {
+                                table.exportFile(titles,res.data,'xls');
+                            } else if (res.code === 403) {
+                                top.location.href = baseUrl+"/";
+                            } else {
+                                layer.msg(res.msg)
+                            }
+                        }
+                    });
+                });
+                break;
+        }
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(shuttleCommand)', function(obj){
+        var data = obj.data;
+        //鑾峰彇褰撳墠琛岀殑绱㈠紩
+        var rowIndex = $(obj.tr).attr("data-index");
+        switch (obj.event) {
+            // 鍥為��鍛戒护
+            case 'rollback':
+                $.ajax({
+                    url: baseUrl+"/basShuttle/command/rollback/auth",
+                    headers: {'token': localStorage.getItem('token')},
+                    data: JSON.stringify({
+                        wrkNo: parent.wrkNo,
+                        commandStep: rowIndex
+                    }),
+                    dataType:'json',
+                    contentType:'application/json;charset=UTF-8',
+                    method: 'POST',
+                    success: function (res) {
+                        layer.closeAll();
+                        if (res.code === 200) {
+                            tableReload();
+                            layer.msg(res.msg)
+                        } else if (res.code === 403) {
+                            top.location.href = baseUrl+"/";
+                        } else {
+                            layer.msg(res.msg)
+                        }
+                    }
+                });
+                break;
+
+        }
+    });
+
+    // 淇敼鐘舵��
+    form.on('switch(completeSwitch)', function (obj) {
+        var index  = obj.othis.parents('tr').attr("data-index");
+        $.ajax({
+            url: baseUrl+"/basShuttle/command/completeSwitch/auth",
+            headers: {'token': localStorage.getItem('token')},
+            data: JSON.stringify({
+                wrkNo: parent.wrkNo,
+                commandStep: index,
+                complete: obj.elem.checked?1:0
+            }),
+            dataType:'json',
+            contentType:'application/json;charset=UTF-8',
+            method: 'POST',
+            success: function (res) {
+                layer.closeAll();
+                if (res.code === 200) {
+                    tableReload();
+                    layer.msg(res.msg)
+                } else if (res.code === 403) {
+                    top.location.href = baseUrl+"/";
+                } else {
+                    layer.msg(res.msg)
+                }
+            }
+        });
+    })
+
+    // 鏁版嵁淇濆瓨鍔ㄤ綔
+    form.on('submit(save)', function () {
+        if (banMsg != null){
+            layer.msg(banMsg);
+            return;
+        }
+        method("add");
+    });
+
+    // 鏁版嵁淇敼鍔ㄤ綔
+    form.on('submit(edit)', function () {
+        method("update")
+    });
+
+    function method(name){
+        var index = layer.load(1, {
+            shade: [0.5,'#000'] //0.1閫忔槑搴︾殑鑳屾櫙
+        });
+        var data = {
+//            id: $('#id').val(),
+            wrkSts: $('#wrkSts').val(),
+            wrkDesc: $('#wrkDesc').val(),
+            modiUser: $('#modiUser').val(),
+            modiTime: top.strToDate($('#modiTime\\$').val()),
+            appeUser: $('#appeUser').val(),
+            appeTime: top.strToDate($('#appeTime\\$').val()),
+
+        };
+        $.ajax({
+            url: baseUrl+"/shuttleCommand/"+name+"/auth",
+            headers: {'token': localStorage.getItem('token')},
+            data: top.reObject(data),
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200){
+                    parent.layer.closeAll();
+                    tableReload(true);
+                    $("#data-detail :input").each(function () {
+                        $(this).val("");
+                    });
+                } else if (res.code === 403){
+                    top.location.href = baseUrl+"/";
+                }else {
+                    layer.msg(res.msg)
+                }
+                layer.close(index);
+            }
+        })
+    }
+
+    // 鎼滅储鏍忔悳绱簨浠�
+    form.on('submit(search)', function (data) {
+        pageCurr = 1;
+        tableReload(false);
+    });
+
+    // 鎼滅储鏍忛噸缃簨浠�
+    form.on('submit(reset)', function (data) {
+        pageCurr = 1;
+        clearFormVal($('#search-box'));
+        tableReload(false);
+    });
+
+    // 鎼滅储鏍忛噸鍚换鍔�
+    form.on('submit(restartCommand)', function (data) {
+        $.ajax({
+            url: baseUrl+"/basShuttle/command/restart/auth",
+            headers: {'token': localStorage.getItem('token')},
+            data: JSON.stringify({
+                wrkNo: parent.wrkNo
+            }),
+            dataType:'json',
+            contentType:'application/json;charset=UTF-8',
+            method: 'POST',
+            success: function (res) {
+                layer.closeAll();
+                if (res.code === 200) {
+                    tableReload();
+                    layer.msg(res.msg)
+                } else if (res.code === 403) {
+                    top.location.href = baseUrl+"/";
+                } else {
+                    layer.msg(res.msg)
+                }
+            }
+        });
+    });
+
+    // 鎼滅储鏍忓垹闄や换鍔�
+    form.on('submit(delCommand)', function (data) {
+        $.ajax({
+            url: baseUrl+"/basShuttle/command/del/auth",
+            headers: {'token': localStorage.getItem('token')},
+            data: JSON.stringify({
+                wrkNo: parent.wrkNo
+            }),
+            dataType:'json',
+            contentType:'application/json;charset=UTF-8',
+            method: 'POST',
+            success: function (res) {
+                layer.closeAll();
+                if (res.code === 200) {
+                    tableReload();
+                    layer.msg(res.msg)
+                } else if (res.code === 403) {
+                    top.location.href = baseUrl+"/";
+                } else {
+                    layer.msg(res.msg)
+                }
+            }
+        });
+    });
+
+    // 鏃堕棿閫夋嫨鍣�
+    layDate.render({
+        elem: '#modiTime\\$',
+        type: 'datetime'
+    });
+    layDate.render({
+        elem: '#appeTime\\$',
+        type: 'datetime'
+    });
+
+
+});
+
+// 鍏抽棴鍔ㄤ綔
+$(document).on('click','#data-detail-close', function () {
+    parent.layer.closeAll();
+});
+
+function tableReload(child) {
+    var searchData = {};
+    $.each($('#search-box [name]').serializeArray(), function() {
+        searchData[this.name] = this.value;
+    });
+    (child ? parent.tableIns : tableIns).reload({
+        where: searchData,
+        page: {
+            curr: pageCurr
+        },
+        done: function (res, curr, count) {
+            var that = this.elem.next();
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            pageCurr=curr;
+            if (res.data.length === 0 && count !== 0) {
+                tableIns.reload({
+                    where: searchData,
+                    page: {
+                        curr: pageCurr-1
+                    }
+                });
+                pageCurr -= 1;
+            }
+            limit(child);
+
+            res.data.forEach((item,idx) => {
+                if (idx == item.commandStep) {
+                    that.find(".layui-table-box tr[data-index='" + idx + "']").css("background-color", "#1E9FFF");
+                }
+            })
+        }
+    });
+}
+
+function setFormVal(el, data, showImg) {
+    for (var val in data) {
+        var find = el.find(":input[id='" + val + "']");
+        find.val(data[val]);
+        if (showImg){
+            var next = find.next();
+            if (next.get(0)){
+                if (next.get(0).localName === "img") {
+                    find.hide();
+                    next.attr("src", data[val]);
+                    next.show();
+                }
+            }
+        }
+    }
+}
+
+function clearFormVal(el) {
+    $(':input', el)
+        .val('')
+        .removeAttr('checked')
+        .removeAttr('selected');
+}
+
+function detailScreen(index) {
+    var detail = layer.getChildFrame('#data-detail', index);
+    var height = detail.height()+60;
+    if (height > ($(window).height()*0.9)) {
+        height = ($(window).height()*0.9);
+    }
+    layer.style(index, {
+//        top: (($(window).height()-height)/3)+"px",
+        height: height+'px'
+    });
+}
+
+$('body').keydown(function () {
+    if (event.keyCode === 13) {
+        $("#search").click();
+    }
+});
diff --git a/src/main/webapp/static/js/wrkCharge/wrkCharge.js b/src/main/webapp/static/js/wrkCharge/wrkCharge.js
index 846bfed..a0538f1 100644
--- a/src/main/webapp/static/js/wrkCharge/wrkCharge.js
+++ b/src/main/webapp/static/js/wrkCharge/wrkCharge.js
@@ -27,8 +27,7 @@
             // ,{field: 'mk', align: 'center',title: '鏍囪'}
             ,{field: 'wrkSts$', align: 'center',title: '宸ヤ綔鐘舵��'}
             // ,{field: 'ioType$', align: 'center',title: '鍏ュ嚭搴撶被鍨�'}
-            ,{field: 'crnNo$', align: 'center',title: '鍫嗗灈鏈�'}
-            ,{field: 'steNo$', align: 'center',title: '绌挎杞�'}
+            ,{field: 'shuttleNo', align: 'center',title: '绌挎杞�'}
             ,{field: 'charge', align: 'center',title: '鍏呯數妗�'}
             // ,{field: 'outMost', align: 'center',title: '宸烽亾鍙�'}
             // ,{field: 'ioPri', align: 'center',title: '浼樺厛绾�'}
diff --git a/src/main/webapp/static/js/wrkMast/wrkMast.js b/src/main/webapp/static/js/wrkMast/wrkMast.js
index e196bca..e79cbdb 100644
--- a/src/main/webapp/static/js/wrkMast/wrkMast.js
+++ b/src/main/webapp/static/js/wrkMast/wrkMast.js
@@ -1,6 +1,10 @@
 var pageCurr;
 var wrkNo;
-layui.use(['table','laydate', 'form'], function(){
+layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"
+}).extend({
+    dropdown: 'dropdown/dropdown',
+}).use(['table', 'laydate', 'form', 'dropdown'], function () {
     var table = layui.table;
     var $ = layui.jquery;
     var layer = layui.layer;
@@ -89,6 +93,7 @@
             if (res.code === 403) {
                 top.location.href = baseUrl+"/";
             }
+            $(".layui-table-body, .layui-table-box, .layui-table-cell").css('overflow', 'visible');//瑙e喅layui鏁版嵁琛ㄦ牸涓祵濂椾笅鎷夋鏄剧ず闂
             pageCurr=curr;
             limit();
             form.on('checkbox(tableCheckbox)', function (data) {
@@ -334,31 +339,6 @@
                     layer.closeAll();
                 });
                 break;
-            //  鍏堝叆鍝�
-            case 'preHave':
-                layer.confirm('浠诲姟鍙戠敓鍏堝叆鍝佸紓甯搞�傚闇�閲嶆柊鍏ュ簱锛岃纭繚璐х墿宸叉斁鑷冲爢鍨涙満鍑哄簱绔欙紒', {title: '宸ヤ綔鍙凤細'+data.wrkNo, shadeClose: true}, function(){
-                    http.post(baseUrl+"/deal/preHave/start", {wrkNo: data.wrkNo}, function (res) {
-                        $(".layui-laypage-btn")[0].click();
-                        layer.msg(data.wrkNo + res.msg, {icon: 1});
-                    })
-                    layer.closeAll();
-                });
-                break;
-            //  绌烘搷浣�
-            case 'takeNone':
-                layer.confirm('浠诲姟鍙戦�佺┖鎿嶄綔寮傚父锛佹槸鍚︺�傘�傘�傘�傘�傘�傘�傘�傦紵', {title: '宸ヤ綔鍙凤細'+data.wrkNo, shadeClose: true}, function(){
-                });
-                break;
-            //  寮冭溅
-            case 'removeSte':
-                layer.confirm('娓呴櫎灏忚溅銆�' + data.steNo + '銆�', {title: '宸ヤ綔鍙凤細'+data.wrkNo, shadeClose: true}, function(){
-                    http.post(baseUrl+"/deal/steNo/empty", {wrkNo: data.wrkNo}, function (res) {
-                        $(".layui-laypage-btn")[0].click();
-                        layer.msg(data.wrkNo + res.msg, {icon: 1});
-                    })
-                    layer.closeAll();
-                });
-                break;
             case 'priWrkMast':
                 layer.open({
                     type: 2,
@@ -377,6 +357,36 @@
                     }
                 });
                 break;
+            //绌挎杞︽寚浠�
+            case 'shuttleCommand':
+                wrkNo = data.wrkNo;
+                layer.open({
+                    type: 2,
+                    title: '绌挎杞︽寚浠�',
+                    maxmin: true,
+                    area: [top.detailWidth, top.detailHeight],
+                    shadeClose: true,
+                    content: '../command/shuttleCommand.html',
+                    success: function (layero, index) {
+
+                    }
+                });
+                break;
+            //鎻愬崌鏈烘寚浠�
+            case 'liftCommand':
+                wrkNo = data.wrkNo;
+                layer.open({
+                    type: 2,
+                    title: '鎻愬崌鏈烘寚浠�',
+                    maxmin: true,
+                    area: [top.detailWidth, top.detailHeight],
+                    shadeClose: true,
+                    content: '../command/liftCommand.html',
+                    success: function (layero, index) {
+
+                    }
+                });
+                break;
         }
     });
 
diff --git a/src/main/webapp/views/command/liftCommand.html b/src/main/webapp/views/command/liftCommand.html
new file mode 100644
index 0000000..e551266
--- /dev/null
+++ b/src/main/webapp/views/command/liftCommand.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+</head>
+<body>
+
+<!-- 鎼滅储鏍� -->
+<div id="search-box" class="layui-form layui-card-header">
+    <div class="layui-inline">
+        <div class="layui-input-inline">
+            <input class="layui-input" type="text" name="wrkNo" id="wrkNo" placeholder="浠e彿" autocomplete="off" disabled>
+        </div>
+    </div>
+
+    <!-- 寰呮坊鍔� -->
+    <div id="data-search-btn" class="layui-btn-container layui-form-item" style="display: inline-block">
+        <button id="search" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="search">鎼滅储</button>
+        <button id="restartCommand" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="restartCommand">閲嶅惎浠诲姟</button>
+        <button id="delCommand" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="delCommand">鍒犻櫎浠诲姟</button>
+    </div>
+</div>
+
+<!-- 琛ㄦ牸 -->
+<table class="layui-hide" id="liftCommand" lay-filter="liftCommand"></table>
+<script type="text/html" id="toolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">鏂板</button>
+        <button class="layui-btn layui-btn-sm" id="btn-delete" lay-event="deleteData">鍒犻櫎</button>
+        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData">瀵煎嚭</button>
+    </div>
+</script>
+
+<script type="text/html" id="operate">
+    <a class="layui-btn layui-btn-xs" lay-event="rollback">鍥為��鍛戒护</a>
+</script>
+
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/command/liftCommand.js" charset="utf-8"></script>
+
+<iframe id="detail-iframe" scrolling="auto" style="display:none;"></iframe>
+
+</body>
+</html>
+
diff --git a/src/main/webapp/views/command/shuttleCommand.html b/src/main/webapp/views/command/shuttleCommand.html
new file mode 100644
index 0000000..8be1458
--- /dev/null
+++ b/src/main/webapp/views/command/shuttleCommand.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+</head>
+<body>
+
+<!-- 鎼滅储鏍� -->
+<div id="search-box" class="layui-form layui-card-header">
+    <div class="layui-inline">
+        <div class="layui-input-inline">
+            <input class="layui-input" type="text" name="wrkNo" id="wrkNo" placeholder="浠e彿" autocomplete="off" disabled>
+        </div>
+    </div>
+
+    <!-- 寰呮坊鍔� -->
+    <div id="data-search-btn" class="layui-btn-container layui-form-item" style="display: inline-block">
+        <button id="search" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="search">鎼滅储</button>
+        <button id="restartCommand" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="restartCommand">閲嶅惎浠诲姟</button>
+        <button id="delCommand" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="delCommand">鍒犻櫎浠诲姟</button>
+    </div>
+</div>
+
+<!-- 琛ㄦ牸 -->
+<table class="layui-hide" id="shuttleCommand" lay-filter="shuttleCommand"></table>
+<script type="text/html" id="toolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">鏂板</button>
+        <button class="layui-btn layui-btn-sm" id="btn-delete" lay-event="deleteData">鍒犻櫎</button>
+        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData">瀵煎嚭</button>
+    </div>
+</script>
+
+<script type="text/html" id="operate">
+    <a class="layui-btn layui-btn-xs" lay-event="rollback">鍥為��鍛戒护</a>
+</script>
+
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/command/shuttleCommand.js" charset="utf-8"></script>
+
+<iframe id="detail-iframe" scrolling="auto" style="display:none;"></iframe>
+
+</body>
+</html>
+
diff --git a/src/main/webapp/views/home/easy_login.html b/src/main/webapp/views/home/easy_login.html
new file mode 100644
index 0000000..2b79fdc
--- /dev/null
+++ b/src/main/webapp/views/home/easy_login.html
@@ -0,0 +1,182 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <title>娴欐睙涓壃 鈹� login of zoneyung wms</title>
+    <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1">
+    <meta name="description" content="study of Instancing with three.js">
+    <meta name="keywords" content="undefined, Yoichi Kobayashi, WebGL, three.js">
+    <meta name="theme-color" content="#111111">
+    <meta name="msapplication-TileImage" content="/sketch-threejs/img/common/ms_tileimage.png">
+    <meta name="msapplication-TileColor" content="#111111">
+    <link rel="stylesheet" href="../static/css/font/font-awesome-4.7.0/css/font-awesome.css">
+    <link rel="stylesheet" href="../static/css/main.min.css">
+    <link rel="stylesheet" href="../static/css/login.css">
+    <style>
+      #sidebar{
+        /*瀹氫綅*/
+        position: absolute;
+        top: 50%;
+        right: 1%;
+        transform: translateY(-50%);
+        width: 20%;
+        height: 95%;
+        /*鐗规晥*/
+        background: rgba(255,255,255,0.6);
+        border-radius: 5px;
+        color: #ffffff;
+        z-index: 99;
+        box-shadow: 3px 3px 6px 3px rgba(0, 0, 0, .3);
+      }
+
+      .login-contain {
+        position: relative;
+        width: 100%;
+        height: 100%;
+      }
+      .login-box {
+        position: absolute;
+        top: 50%;
+        left: 50%;
+        transform: translate(-50%, -50%);
+        width: 100%;
+        text-align: center;
+      }
+
+    </style>
+  </head>
+  <body>
+    <!-- 渚ц竟鏍� -->
+    <div id="sidebar">
+      <div class="login-contain">
+        <div class="login-box">
+          <img src="../static/image/logo.png" alt="" style="width: 80%">
+<!--          <span class="login100-form-title p-t-20 p-b-45">涓壃绔嬪簱</span>-->
+<!--          <span class="login100-form-title p-t-20 p-b-45" style="margin: 15px 0;color: #868686;font-size: 24px">WMS</span>-->
+          <div class="wrap-input100 validate-input m-b-10" data-validate="璇疯緭鍏ョ敤鎴峰悕">
+            <input id="username" class="input100" type="text" name="username" placeholder="username" autocomplete="off">
+            <span class="focus-input100"></span>
+            <span class="symbol-input100">
+              <i class="fa fa-user"></i>
+            </span>
+          </div>
+          <div class="wrap-input100 validate-input m-b-10" data-validate="璇疯緭鍏ュ瘑鐮�">
+            <input id="password" class="input100" type="password" name="pass" placeholder="password">
+            <span class="focus-input100"></span>
+            <span class="symbol-input100">
+              <i class="fa fa-lock"></i>
+            </span>
+          </div>
+          <div class="container-login100-form-btn p-t-10">
+            <button class="login100-form-btn login-btn">Login</button>
+          </div>
+          <div class="container-login100-form-btn p-t-10" style="display: none;margin-top: 50px;" id="updateLicense">
+            <form enctype="multipart/form-data" style="display: none;">
+              <input id="license" type="file" name="file" >
+            </form>
+            <button class="login100-form-btn" id="submitLicense">鏇存柊璁稿彲璇�</button>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <script type="text/javascript" src="../../static/js/tools/main.min.js"></script>
+    <script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+    <script type="text/javascript" src="../../static/js/tools/md5.js"></script>
+    <script type="text/javascript" src="../../static/layer/layer.js"></script>
+    <script type="text/javascript" src="../../static/js/common.js"></script>
+    <script>
+      // remember pwd
+      $(function () {
+        var oldUserName = localStorage.getItem('oldUserName');
+        var oldPass = localStorage.getItem('oldPass');
+        if(oldUserName){
+          $('#username').val(oldUserName);
+        }
+        if(oldPass){
+          $('#password').val(oldPass);
+        }
+      })
+
+      window.onload = function(){document.getElementById("username").focus();}
+
+      $(document).on('click','.login-btn', function () {
+        let username = $("#username").val();
+        if (username === "") {
+          layer.tips('璇疯緭鍏ョ櫥褰曡处鍙�', '#username', {tips: [4, '#ff0000']});
+          return;
+        }
+        let password = $("#password").val();
+        if (password === "") {
+          layer.tips('璇疯緭鍏ュ瘑鐮�', '#password', {tips: [4, '#ff0000']});
+          return;
+        }
+        $.ajax({
+          url: baseUrl+"/login.action",
+          data: {
+            username: username,
+            password: hex_md5(password)
+          },
+          method: 'POST',
+          success: function (res) {
+            if (res.code === 200){
+              localStorage.setItem("token", res.data.token);
+              localStorage.setItem("username", res.data.username);
+              window.location.href = "../index.html";
+            } else if (res.code === 10001) {
+              layer.tips(res.msg, '#username', {tips: [4, '#ff0000']});
+            } else if (res.code === 10002) {
+              layer.tips(res.msg, '#username', {tips: [4, '#ff0000']});
+            } else if (res.code === 10003) {
+              layer.tips(res.msg, '#password', {tips: [4, '#ff0000']});
+            } else if (res.code == 20001) {
+              layer.tips(res.msg, '.login-btn', {tips: [3, '#ff0000']});
+              $("#updateLicense").show()
+            } else {
+              layer.tips(res.msg, '.login-btn', {tips: [3, '#ff0000']});
+            }
+          }
+        });
+      });
+
+      $('body').keydown(function () {
+        if (event.keyCode === 13) {
+          $(".login-btn").click();
+        }
+      });
+
+      //鏇存柊璁稿彲璇�
+      $("#submitLicense").on("click",() => {
+        $("#license").click()
+      })
+
+      //涓婁紶骞舵洿鏂拌鍙瘉
+      $("#license").on("change",(evt) => {
+        var files = evt.target.files;
+        let formData = new FormData();
+        formData.append("file", files[0])
+        $.ajax({
+          url: baseUrl+"/license/updateLicense",
+          headers: {'token': localStorage.getItem('token')},
+          data: formData,
+          method: 'POST',
+          cache: false,
+          processData: false,
+          contentType: false,
+          success: function (res) {
+            if (res.code == 200) {
+              layer.msg('鏇存柊鎴愬姛', {time: 1000}, () => {
+                parent.location.reload()
+              });
+            }else{
+              layer.msg(res.msg,{time:2000},() => {
+                parent.location.reload()
+              })
+            }
+          }
+        })
+      })
+    </script>
+  </body>
+</html>
diff --git a/src/main/webapp/views/index.html b/src/main/webapp/views/index.html
index 6d576f4..872d1aa 100644
--- a/src/main/webapp/views/index.html
+++ b/src/main/webapp/views/index.html
@@ -40,8 +40,11 @@
       </li>
     </ul>
     <ul class="layui-nav layui-layout-right">
-      <li class="layui-nav-item" lay-unselect>
-        <a ew-event="note" title="渚跨"><i class="layui-icon layui-icon-note"></i></a>
+<!--      <li class="layui-nav-item" lay-unselect>-->
+<!--        <a ew-event="note" title="渚跨"><i class="layui-icon layui-icon-note"></i></a>-->
+<!--      </li>-->
+      <li class="layui-nav-item" lay-unselect id="licenseShow" style="display: none;user-select: none;">
+        <div style="color: red;">璁稿彲璇佹湁鏁堟湡锛�<span id="licenseDays">29</span>澶�</div>
       </li>
       <li class="layui-nav-item layui-hide-xs" lay-unselect>
         <a ew-event="fullScreen" title="鍏ㄥ睆"><i class="layui-icon layui-icon-screen-full"></i></a>
@@ -139,6 +142,23 @@
       }
     });
 
+    $.ajax({
+      url: baseUrl + "/license/getLicenseDays",
+      headers: {'token': localStorage.getItem('token')},
+      method: 'POST',
+      success: function (res) {
+        if (res.code == 200) {
+          let days = res.data
+          if (days <= 30) {
+            $("#licenseShow").show()
+            $("#licenseDays").html(days)
+          }
+        }else {
+          top.location.href = baseUrl + "/login";
+        }
+      }
+    });
+
     // 榛樿鍔犺浇涓婚〉
     index.loadHome({
       menuPath: baseUrl+'/views/home/navigation.html',
diff --git a/src/main/webapp/views/login.html b/src/main/webapp/views/login.html
index 2a45e5c..a0652d4 100644
--- a/src/main/webapp/views/login.html
+++ b/src/main/webapp/views/login.html
@@ -67,8 +67,8 @@
       <div class="login-contain">
         <div class="login-box">
           <img src="../static/image/logo.png" alt="" style="width: 80%">
-          <span class="login100-form-title p-t-20 p-b-45">涓壃绔嬪簱</span>
-          <span class="login100-form-title p-t-20 p-b-45" style="margin: 15px 0;color: #868686;font-size: 24px">WMS</span>
+<!--          <span class="login100-form-title p-t-20 p-b-45">涓壃绔嬪簱</span>-->
+<!--          <span class="login100-form-title p-t-20 p-b-45" style="margin: 15px 0;color: #868686;font-size: 24px">WMS</span>-->
           <div class="wrap-input100 validate-input m-b-10" data-validate="璇疯緭鍏ョ敤鎴峰悕">
             <input id="username" class="input100" type="text" name="username" placeholder="username" autocomplete="off">
             <span class="focus-input100"></span>
@@ -85,6 +85,12 @@
           </div>
           <div class="container-login100-form-btn p-t-10">
             <button class="login100-form-btn login-btn">Login</button>
+          </div>
+          <div class="container-login100-form-btn p-t-10" style="display: none;margin-top: 50px;" id="updateLicense">
+            <form enctype="multipart/form-data" style="display: none;">
+              <input id="license" type="file" name="file" >
+            </form>
+            <button class="login100-form-btn" id="submitLicense">鏇存柊璁稿彲璇�</button>
           </div>
         </div>
       </div>
@@ -139,6 +145,9 @@
               layer.tips(res.msg, '#username', {tips: [4, '#ff0000']});
             } else if (res.code === 10003) {
               layer.tips(res.msg, '#password', {tips: [4, '#ff0000']});
+            } else if (res.code == 20001) {
+              layer.tips(res.msg, '.login-btn', {tips: [3, '#ff0000']});
+              $("#updateLicense").show()
             } else {
               layer.tips(res.msg, '.login-btn', {tips: [3, '#ff0000']});
             }
@@ -151,6 +160,38 @@
           $(".login-btn").click();
         }
       });
+
+      //鏇存柊璁稿彲璇�
+      $("#submitLicense").on("click",() => {
+        $("#license").click()
+      })
+
+      //涓婁紶骞舵洿鏂拌鍙瘉
+      $("#license").on("change",(evt) => {
+        var files = evt.target.files;
+        let formData = new FormData();
+        formData.append("file", files[0])
+        $.ajax({
+          url: baseUrl+"/license/updateLicense",
+          headers: {'token': localStorage.getItem('token')},
+          data: formData,
+          method: 'POST',
+          cache: false,
+          processData: false,
+          contentType: false,
+          success: function (res) {
+            if (res.code == 200) {
+              layer.msg('鏇存柊鎴愬姛', {time: 1000}, () => {
+                parent.location.reload()
+              });
+            }else{
+              layer.msg(res.msg,{time:2000},() => {
+                parent.location.reload()
+              })
+            }
+          }
+        })
+      })
     </script>
   </body>
 </html>
diff --git a/src/main/webapp/views/wrkMast/wrkMast.html b/src/main/webapp/views/wrkMast/wrkMast.html
index 979b575..aed8900 100644
--- a/src/main/webapp/views/wrkMast/wrkMast.html
+++ b/src/main/webapp/views/wrkMast/wrkMast.html
@@ -113,13 +113,16 @@
 </div>
 
 <script type="text/html" id="operate">
-    <a class="layui-btn layui-btn-xs btn-detlShow" lay-event="detlShow">鏄庣粏</a>
-    <a class="layui-btn layui-btn-danger layui-btn-xs btn-complete" lay-event="complete">瀹屾垚</a>
-    <a class="layui-btn layui-btn-primary layui-btn-xs btn-cancel" lay-event="cancel">鍙栨秷</a>
-    <a class="layui-btn layui-btn-warm layui-btn-xs btn-pick" lay-event="priWrkMast">缁存姢鐘舵��</a>
-    {{#if (d.steNo) { }}
-    <a class="layui-btn layui-btn-warm layui-btn-xs btn-pick" lay-event="removeSte">寮冭溅</a>
-    {{# } }}
+    <div class="dropdown-menu">
+        <button class="layui-btn layui-btn-primary layui-border-black icon-btn layui-btn-sm"><i class="layui-icon layui-icon-shrink-right"></i></button>
+        <ul class="dropdown-menu-nav" style="margin-left: -35px">
+            <li><a lay-event="detlShow">鏄庣粏</a></li>
+            <li><a lay-event="complete">瀹屾垚</a></li>
+            <li><a lay-event="cancel">鍙栨秷</a></li>
+            <li><a lay-event="shuttleCommand">绌挎杞︽寚浠�</a></li>
+            <li><a lay-event="liftCommand">鎻愬崌鏈烘寚浠�</a></li>
+        </ul>
+    </div>
 </script>
 
 <script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>

--
Gitblit v1.9.1