From 7243e0b4bd9a267a633d2e481e17646509b6868d Mon Sep 17 00:00:00 2001
From: YYC <1833023622@qq.com>
Date: 星期四, 07 九月 2023 19:36:37 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/util/CRC8.java                                 |  186 +
 igds-web/src/main/resources/static/img/aerial-5317_001.png                                                |    0 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/builder/ReMessageBuilder.java         |  130 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/message/Message.java                   |   52 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/mq/ReceiverServer.java                         |   90 
 igds-protocol-modbus/.rules                                                                               | 1178 ++++++
 igds-web/src/main/resources/lib/modbus4j-3.1.0.jar                                                        |    0 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/mq/PublisherControl.java                       |   42 
 igds-protocol-modbus/src/main/java/com/ld/igds/modbus/GasModbus.view.xml                                  |  378 ++
 igds-protocol-block/src/main/java/com/ld/igds/protocol/quantity/shuhan/server/ShuhanServerEngine.java     |    2 
 igds-web/src/main/resources/application-pro5325.yml                                                       |   12 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1123.java        |   65 
 igds-protocol-modbus/src/main/java/com/ld/igds/models/GasModbus.java                                      |   60 
 igds-web/src/main/resources/templates/admin/n2/n2-hand-5013.html                                          |   10 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/task/CommandReSendService.java                 |  145 
 igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/inout/BHZNWeightServiceImpl.java               |    2 
 igds-core/src/main/java/com/ld/igds/models/MQuality.java                                                  |    4 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1126.java        |  100 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/task/ReSendCommonTask.java                     |   95 
 igds-web/src/main/resources/static/img/gas/5303/001.png                                                   |    0 
 igds-web/src/main/resources/gas-conf.properties                                                           |   78 
 igds-core/src/main/java/com/ld/igds/view/Device.view.xml                                                  |   47 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/server/MsgConsumer.java                        |   46 
 igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteGasServiceImpl.java          |  185 +
 igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/data/ModbusTcp.java                        |   85 
 igds-web/src/main/resources/application-pro5327.yml                                                       |    2 
 igds-n2/src/main/java/com/ld/igds/n2/controller/N2Controller.java                                         |    4 
 igds-core/src/main/java/com/ld/igds/common/impl/CoreDeviceServiceImpl.java                                |   26 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/RemoteCommonImpl.java                  |  426 ++
 pom.xml                                                                                                   |    4 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/RemoteGrainServiceImpl.java            |  129 
 igds-web/src/main/resources/static/img/gas/5303/002.png                                                   |    0 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/util/CRC16.java                                |  135 
 igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/data/ModbusGasResult.java                  |   31 
 igds-web/src/main/resources/static/img/gas/5328/5328_001_4.png                                            |    0 
 igds-core/src/main/resources/mapper/DeviceMapper.xml                                                      |    1 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder8829.java        |   73 
 igds-web/src/main/resources/templates/admin/verb/verb-hand1.html                                          |   10 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/message/MessageBody.java               |   13 
 igds-core/src/main/java/com/ld/igds/common/CoreDeviceService.java                                         |    9 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1116_0.java      |   83 
 igds-web/src/main/resources/application-pro5303.yml                                                       |   81 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/AnalysisConf.java                     |  381 ++
 igds-web/src/main/resources/static/img/aerial-5328_001.png                                                |    0 
 igds-core/src/main/resources/mapper/CommonMapper.xml                                                      |    2 
 igds-basic/src/main/java/com/ld/igds/gas/manager/GasManager.java                                          |   18 
 igds-protocol-fzzy3/src/main/java/com/ld/igds/protocol/fzzy/analysis/AnalysisGas.java                     |    2 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/server/HeartbeatProviderImpl.java              |   45 
 igds-core/src/main/java/com/ld/igds/view/DepotPR.java                                                     |   16 
 igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/AnalysisService.java               |  177 +
 igds-web/src/main/resources/static/img/logo-5325.png                                                      |    0 
 igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/ServerRunner.java                              |   13 
 igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/grainv1/RemoteGrainV1ServiceImpl.java          |   24 
 igds-core/src/main/java/com/ld/igds/data/ConfigGasImg.java                                                |   11 
 igds-web/src/main/resources/application-pro5322.yml                                                       |   80 
 igds-core/src/main/java/models/igds.model.xml                                                             |   61 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/AnalysisService.java                  |  211 +
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/package-info.java                              |    6 
 igds-verb/src/main/java/com/ld/igds/verb/manager/VerbManager.java                                         |   17 
 igds-web/src/main/resources/static/img/gas/5328/5328_001_7.png                                            |    0 
 igds-core/src/main/java/com/ld/igds/io/constant/ProtocolEnum.java                                         |    2 
 igds-web/src/main/resources/static/img/aerial-5317_001_1.png                                              |    0 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder8817.java        |   54 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/task/ReSendGrainTask.java                      |   99 
 igds-protocol-modbus/src/main/java/com/ld/igds/modbus/DeviceModbusPR.java                                 |   91 
 igds-web/src/main/resources/static/img/gas/5328/5328_001_10.png                                           |    0 
 igds-web/src/main/resources/static/img/n2/5325/pfc2_a.png                                                 |    0 
 igds-core/src/main/java/com/ld/igds/models/DepotConf.java                                                 |   19 
 igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil2.java                           |  203 +
 igds-web/src/main/resources/application.yml                                                               |    2 
 igds-core/src/main/java/com/ld/igds/grain/GrainUtil.java                                                  |   53 
 igds-recir/src/main/java/com/ld/igds/temp/manager/TempControlManager.java                                 |   12 
 igds-protocol-zldz/pom.xml                                                                                |   49 
 igds-core/src/main/java/com/ld/igds/constant/Constant.java                                                |    7 
 igds-web/src/main/resources/n2-conf.properties                                                            |    4 
 igds-core/src/main/java/com/ld/igds/view/DepotConf.view.xml                                               |   74 
 igds-web/src/main/resources/static/img/aerial-5325_001.png                                                |    0 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/message/Metadata.java                 |   18 
 igds-web/src/main/resources/static/img/gas/5328/5328_001_5.png                                            |    0 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/message/ReMessageBody.java            |   18 
 igds-web/src/main/resources/static/admin/n2/n2-hand-5013.js                                               |    2 
 igds-protocol-modbus/src/main/java/com/ld/igds/modbus/GasModbusPR.java                                    |   83 
 igds-web/src/main/resources/application-pro1000.yml                                                       |   80 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1115.java        |   79 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/AnalysisGrain.java                    |  763 ++++
 igds-es/src/main/java/com/ld/igds/es/manager/EsManager.java                                               |    8 
 igds-protocol-modbus/src/main/java/com/ld/igds/modbus/DeviceModbus.view.xml                               |  313 +
 igds-web/src/main/resources/verb-conf.properties                                                          |   22 
 igds-inout/src/main/java/com/ld/igds/inout/manager/InoutReportManager.java                                |   13 
 igds-protocol-modbus/src/main/java/com/ld/igds/modbus/ModbusConstant.java                                 |   36 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1116_1.java      |   97 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/BaseRemoteImpl.java                    |   46 
 igds-core/src/main/java/com/ld/igds/models/Device.java                                                    |   12 
 igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusTest.java                            |  234 +
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/AnalysisTH.java                       |  120 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/task/CommandTask.java                          |   31 
 igds-protocol-modbus/src/main/java/com/ld/igds/models/DeviceModbus.java                                   |  101 
 igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteEsServiceImpl.java           |   65 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/message/ReMessage.java                |   74 
 igds-web/src/main/resources/static/img/gas/5303/003.png                                                   |    0 
 igds-core/src/main/java/com/ld/igds/view/service/DeviceService.java                                       |  470 +-
 igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/grainv1/msg/AnalysisService.java               |   82 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder8815.java        |   41 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/OnLineCommandBuilder.java      |   40 
 igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/grainv1/server/BhznGrainV1SessionListener.java |    7 
 igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java      |  333 +
 igds-web/src/main/resources/application-dev.yml                                                           |    2 
 igds-protocol-modbus/src/main/java/com/ld/igds/modbus/service/HModbusService.java                         |  240 +
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1128.java        |   74 
 igds-protocol-modbus/pom.xml                                                                              |   43 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1122.java        |   46 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1125.java        |   73 
 igds-core/src/main/java/com/ld/igds/data/SimpleDepot.java                                                 |    3 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/server/SessionListener.java                    |   40 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/util/ServerUtils.java                          |   68 
 /dev/null                                                                                                 |  208 -
 igds-verb/src/main/java/com/ld/igds/models/MAreationData.java                                             |   32 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/ServerRunner.java                              |   53 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/mq/RedisSubConfig.java                         |   75 
 igds-web/src/main/resources/static/img/gas/5325/5325_001.png                                              |    0 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder.java            |  144 
 igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/server/ZldzServerEngine.java                   |  113 
 igds-web/pom.xml                                                                                          |  140 
 igds-web/src/main/resources/static/img/n2/5325/pfc2_b.png                                                 |    0 
 igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ServerUtil.java                            |   52 
 125 files changed, 9,456 insertions(+), 890 deletions(-)

diff --git a/igds-basic/src/main/java/com/ld/igds/gas/manager/GasManager.java b/igds-basic/src/main/java/com/ld/igds/gas/manager/GasManager.java
index 02446e1..00e7ace 100644
--- a/igds-basic/src/main/java/com/ld/igds/gas/manager/GasManager.java
+++ b/igds-basic/src/main/java/com/ld/igds/gas/manager/GasManager.java
@@ -204,9 +204,12 @@
         DepotConf depotConf = coreCommonService.getCacheDepotConf(
                 param.getCompanyId(), param.getDepotId());
 
-        // 鑾峰彇鍒嗘満淇℃伅
-        DeviceSer deviceSer = coreSerService.getCacheSer(param.getCompanyId(),
-                depotConf.getGasSer());
+        // 榛樿鑾峰彇绮儏鍒嗘満淇℃伅
+        DeviceSer deviceSer = coreSerService.getCacheSer(param.getCompanyId(), depotConf.getGrainSer());
+        // 鑻ユ皵浣撳垎鏈洪厤缃笉涓虹┖锛屽垯鑾峰彇姘斾綋鐨勫垎鏈�
+        if(StringUtils.isNotEmpty(depotConf.getGasSer())){
+            deviceSer = coreSerService.getCacheSer(param.getCompanyId(), depotConf.getGasSer());
+        }
 
         CheckGasRequest request = new CheckGasRequest();
         request.setDepotId(param.getDepotId());
@@ -259,9 +262,12 @@
         DepotConf depotConf = coreCommonService.getCacheDepotConf(
                 param.getCompanyId(), param.getDepotId());
 
-        // 鑾峰彇鍒嗘満淇℃伅
-        DeviceSer deviceSer = coreSerService.getCacheSer(param.getCompanyId(),
-                depotConf.getGrainSer());
+        // 榛樿鑾峰彇绮儏鍒嗘満淇℃伅
+        DeviceSer deviceSer = coreSerService.getCacheSer(param.getCompanyId(), depotConf.getGrainSer());
+        // 鑻ユ皵浣撳垎鏈洪厤缃笉涓虹┖锛屽垯鑾峰彇姘斾綋鐨勫垎鏈�
+        if(StringUtils.isNotEmpty(depotConf.getGasSer())){
+            deviceSer = coreSerService.getCacheSer(param.getCompanyId(), depotConf.getGasSer());
+        }
 
         CheckGasRequest request = new CheckGasRequest();
         request.setDepotId(param.getDepotId());
diff --git a/igds-core/src/main/java/com/ld/igds/common/CoreDeviceService.java b/igds-core/src/main/java/com/ld/igds/common/CoreDeviceService.java
index 216fd35..df04f89 100644
--- a/igds-core/src/main/java/com/ld/igds/common/CoreDeviceService.java
+++ b/igds-core/src/main/java/com/ld/igds/common/CoreDeviceService.java
@@ -2,6 +2,7 @@
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import com.ld.igds.models.Device;
 import com.ld.igds.temp.dto.TempParam;
@@ -39,6 +40,14 @@
      */
     List<Device> getCacheDeviceBySerId(String companyId, String serId);
 
+    /**
+     * 鏍规嵁浠撳簱缂栫爜鑾峰彇璁惧淇℃伅
+     * @param companyId
+     * @param depotId
+     * @return
+     */
+    Set<String> getCacheDeviceSerByDepotId(String companyId, String depotId);
+
 
     /**
      * 鏍规嵁鍒嗘満淇℃伅鑾峰彇璁惧
diff --git a/igds-core/src/main/java/com/ld/igds/common/impl/CoreDeviceServiceImpl.java b/igds-core/src/main/java/com/ld/igds/common/impl/CoreDeviceServiceImpl.java
index ac4ab1b..11d32fb 100644
--- a/igds-core/src/main/java/com/ld/igds/common/impl/CoreDeviceServiceImpl.java
+++ b/igds-core/src/main/java/com/ld/igds/common/impl/CoreDeviceServiceImpl.java
@@ -9,6 +9,8 @@
 import com.ld.igds.constant.DeviceStatus;
 import com.ld.igds.constant.DeviceType;
 
+import com.ld.igds.io.request.ExeDevice;
+import com.ld.igds.models.Depot;
 import lombok.extern.slf4j.Slf4j;
 
 import org.apache.commons.lang3.StringUtils;
@@ -112,6 +114,30 @@
         return list;
     }
 
+    @SuppressWarnings("unchecked")
+    @Override
+    public Set<String> getCacheDeviceSerByDepotId(String companyId, String depotId) {
+        String patten = RedisConst.buildKey(companyId, RedisConst.KEY_DEVICE_LIST);
+
+        Set<String> keys = redisUtil.keys(patten);
+        if (null == keys) return null;
+
+        List<Device> list = new ArrayList<>();
+        for (String key : keys) {
+            list.addAll((List<Device>) redisUtil.get(key));
+        }
+        if (list.isEmpty()) {
+            return null;
+        }
+        Set<String> result = new HashSet<>();
+        for (Device device : list) {
+            if(depotId.equals(device.getDepotId())){
+                result.add(device.getSerId());
+            }
+        }
+        return result;
+    }
+
     @Override
     public Device getCacheDeviceById(String companyId, String id) {
         String key = RedisConst.buildDeviceKey(companyId, RedisConst.KEY_DEVICE, id);
diff --git a/igds-core/src/main/java/com/ld/igds/constant/Constant.java b/igds-core/src/main/java/com/ld/igds/constant/Constant.java
index f2cf62c..f82d4a6 100644
--- a/igds-core/src/main/java/com/ld/igds/constant/Constant.java
+++ b/igds-core/src/main/java/com/ld/igds/constant/Constant.java
@@ -196,6 +196,13 @@
     public static final String GRAIN_START_POINT_TOP = "top";    //椤堕儴
     public static final String GRAIN_START_POINT_BELOW = "below";  //搴曢儴
 
+    /**
+     * 琛屽眰杞崲(榛樿涓嶈浆鎹�)
+     */
+    public static final String GRAIN_CONVERT_DEFAULT = "default";    //榛樿
+    public static final String GRAIN_CONVERT_CLOCKWISE = "clockwise";    //椤烘椂閽�
+    public static final String GRAIN_CONVERT_ANTICLOCKWISE = "anticlockwise";  //閫嗘椂閽�
+
 
     //绛掍粨閿ュ舰-鏃犻獙璇�
     public static final String CABLE_CONE_0 = "0";
diff --git a/igds-core/src/main/java/com/ld/igds/data/ConfigGasImg.java b/igds-core/src/main/java/com/ld/igds/data/ConfigGasImg.java
index e21e671..91b3d21 100644
--- a/igds-core/src/main/java/com/ld/igds/data/ConfigGasImg.java
+++ b/igds-core/src/main/java/com/ld/igds/data/ConfigGasImg.java
@@ -22,8 +22,9 @@
 public class ConfigGasImg {
 
     /**
-     * 鍥剧墖鐨勫皝瑁呰鍒欙細浠撳簱缂栫爜.img.png --鐓х墖
-     * 鍥剧墖鐨勫皝瑁呰鍒欙細鍒嗗簱缂栫爜.img.png --榛樿鐓х墖
+     * gas.mapImg.5318_001.img=5318_001.png
+     * 鍥剧墖鐨勫皝瑁呰鍒欙細gas.mapImg.companyId_浠撳簱缂栫爜.img.png --鐓х墖
+     * 鍥剧墖鐨勫皝瑁呰鍒欙細gas.mapImg.companyId_鍒嗗簱缂栫爜.img.png --榛樿鐓х墖
      */
     private Map<String, GasImg> mapImg;
 
@@ -39,12 +40,16 @@
         Map<String, GasImg> result = new HashMap<>();
         Map<String, GasImg> all = this.getMapImg();
         if (null == depotList || null == all) return result;
+        String companyId = depotList.get(0).getCompanyId();
         GasImg temp;
         for (Depot d : depotList) {
-            temp = all.get(d.getId());
+            //鍏堜粠閰嶇疆涓幏鍙�
+            temp = all.get(companyId + "_" + d.getId());
+
             if (null == temp) {
                 temp = all.get(deptId);
             }
+
             result.put(d.getId(), temp);
         }
         return result;
diff --git a/igds-core/src/main/java/com/ld/igds/data/SimpleDepot.java b/igds-core/src/main/java/com/ld/igds/data/SimpleDepot.java
index 6602824..d8b4885 100644
--- a/igds-core/src/main/java/com/ld/igds/data/SimpleDepot.java
+++ b/igds-core/src/main/java/com/ld/igds/data/SimpleDepot.java
@@ -4,9 +4,6 @@
 import com.ld.igds.models.Depot;
 import lombok.Data;
 
-import javax.persistence.Column;
-import javax.persistence.Id;
-
 /**
  * @Desc: 鐢ㄤ簬浣滀负涓嬫媺妗嗙殑鏁版嵁灏佽锛屽彧鍖呭惈鍩虹淇℃伅
  * @author: andy.jia
diff --git a/igds-core/src/main/java/com/ld/igds/grain/GrainUtil.java b/igds-core/src/main/java/com/ld/igds/grain/GrainUtil.java
index 762ce32..04e47b0 100644
--- a/igds-core/src/main/java/com/ld/igds/grain/GrainUtil.java
+++ b/igds-core/src/main/java/com/ld/igds/grain/GrainUtil.java
@@ -293,4 +293,57 @@
         return list;
     }
 
+    /**
+     * 灞傝杞崲--椤烘椂閽�
+     *
+     * @param temps
+     * @param cable
+     * @return
+     */
+    public List<Double> convertRight(List<Double> temps, String cable) {
+        String[] attCable = cable.split("-");
+        int cableZ = Integer.valueOf(attCable[0]);
+        int cableY = Integer.valueOf(attCable[1]);
+        int cableX = Integer.valueOf(attCable[2]);
+        List<Double> list = new ArrayList<>();
+
+        int index;
+        for (int x = 1; x <= cableX; x++) {
+            for(int z = cableZ; z >= 1; z--){
+                for (int y = 1; y <= cableY; y++) {
+                    index = z*y*x -1;
+                    list.add(temps.get(index));
+                }
+            }
+        }
+
+        return list;
+    }
+
+    /**
+     * 灞傝杞崲--閫嗘椂閽�
+     *
+     * @param temps
+     * @param cable
+     * @return
+     */
+    public List<Double> convertLeft(List<Double> temps, String cable) {
+        String[] attCable = cable.split("-");
+        int cableZ = Integer.valueOf(attCable[0]);
+        int cableY = Integer.valueOf(attCable[1]);
+        int cableX = Integer.valueOf(attCable[2]);
+        List<Double> list = new ArrayList<>();
+
+        int index;
+        for (int x = 1; x <= cableX; x++) {
+            for (int z = 1; z <= cableZ; z++) {
+                for (int y = cableY; y >= cableY; y--) {
+                    index = z*y*x -1;
+                    list.add(temps.get(index));
+                }
+            }
+        }
+
+        return list;
+    }
 }
\ No newline at end of file
diff --git a/igds-core/src/main/java/com/ld/igds/io/constant/ProtocolEnum.java b/igds-core/src/main/java/com/ld/igds/io/constant/ProtocolEnum.java
index d951865..d22bf75 100644
--- a/igds-core/src/main/java/com/ld/igds/io/constant/ProtocolEnum.java
+++ b/igds-core/src/main/java/com/ld/igds/io/constant/ProtocolEnum.java
@@ -33,7 +33,7 @@
     TCP_BHZH_INOUT_V1("TCP_BHZH_INOUT_V1", "閭︽捣鏅鸿兘鍑哄叆搴撴帶鍒跺櫒鍗忚"),
     TCP_BEIBO_GRAIN_V1("TCP_BEIBO_GRAIN_V1", "璐濆崥绮儏鍒嗘満鏈嶅姟绔崗璁�"),
     FZZY_OPENAPI_HTTP("FZZY_OPENAPI_HTTP", "椋庢鑷磋繙API-HTTP鍗忚"),
-    MODBUS_TCP("MODBUS_TCP", "Modbus-TCP鍗忚");
+    TCP_MODBUS("TCP_MODBUS", "Modbus-TCP鍗忚");
 
 
     private String code;
diff --git a/igds-core/src/main/java/com/ld/igds/models/DepotConf.java b/igds-core/src/main/java/com/ld/igds/models/DepotConf.java
index ef59d56..4839449 100644
--- a/igds-core/src/main/java/com/ld/igds/models/DepotConf.java
+++ b/igds-core/src/main/java/com/ld/igds/models/DepotConf.java
@@ -47,6 +47,14 @@
     @PropertyDef(label = "姘斾綋鍒嗘満")
     private String gasSer;
 
+    @Column(name = "PEST_SER_", length = 40)
+    @PropertyDef(label = "铏鍒嗘満")
+    private String pestSer;
+
+    @Column(name = "VERB_SER_", length = 40)
+    @PropertyDef(label = "閫氶鍒嗘満")
+    private String verbSer;
+
     @Column(name = "GRAIN_FREQ_", length = 4)
     @PropertyDef(label = "绮儏淇濆瓨棰戠巼", description = "榛樿涓�澶╁娆�")
     private String grainFreq = GrainFrequence.FREQ_01.getCode();
@@ -76,16 +84,20 @@
     private int cableEnd;
 
     @Column(name = "START_ORIENTATION_", length = 20)
-    @PropertyDef(label = "鐢电紗寮�濮嬫柟浣�", description = "榛樿鍙宠竟(鍙宠竟銆佸彸涓娿�佸乏杈广�佸乏涓�)")
+    @PropertyDef(label = "鐢电紗璧峰鏂逛綅", description = "榛樿鍙宠竟(鍙宠竟銆佸彸涓娿�佸乏杈广�佸乏涓�)")
     private String startOrientation = Constant.GRAIN_START_ORIENTATION_RIGHT;
 
     @Column(name = "START_DIRECTION_", length = 20)
-    @PropertyDef(label = "鐢电紗寮�濮嬫柟鍚�", description = "榛樿绾靛悜(绾靛悜銆佹í鍚�)")
+    @PropertyDef(label = "鐢电紗璧峰鏂瑰悜", description = "榛樿绾靛悜(绾靛悜銆佹í鍚�)")
     private String startDirection = Constant.GRAIN_START_DIRECTION_PORTRAIT;
 
     @Column(name = "START_POINT_", length = 20)
-    @PropertyDef(label = "鐢电紗寮�濮嬬偣浣�", description = "榛樿椤堕儴(椤堕儴銆佸簳閮�)")
+    @PropertyDef(label = "鐢电紗璧峰鐐逛綅", description = "榛樿椤堕儴(椤堕儴銆佸簳閮�)")
     private String startPoint = Constant.GRAIN_START_POINT_TOP;
+
+    @Column(name = "START_CONVERT_", length = 20)
+    @PropertyDef(label = "灞傝杞崲", description = "榛樿涓嶈浆鎹�(榛樿銆侀『鏃堕拡銆侀�嗘椂閽�)")
+    private String startConvert = Constant.GRAIN_CONVERT_DEFAULT;
 
     @Column(name = "TEMP_MAX_")
     @PropertyDef(label = "娓╁害涓婇檺")
@@ -126,7 +138,6 @@
     @Column(name = "PEST_MAX_")
     @PropertyDef(label = "铏涓婇檺")
     private Double pestMax;
-
 
     // 浠撳簱鍚嶇О
     @Transient
diff --git a/igds-core/src/main/java/com/ld/igds/models/Device.java b/igds-core/src/main/java/com/ld/igds/models/Device.java
index eebb08e..be25a08 100644
--- a/igds-core/src/main/java/com/ld/igds/models/Device.java
+++ b/igds-core/src/main/java/com/ld/igds/models/Device.java
@@ -66,9 +66,9 @@
     @PropertyDef(label = "璁惧鍔熺巼", description = "璁惧鍔熺巼锛屾病鏈夊彲涓嶅~鍐�:KW/H")
     private Double power;
 
-    @Column(name = "MODBUS_",length = 100)
-    @PropertyDef(label = "Modbus閰嶇疆")
-    private String modbus;
+//    @Column(name = "MODBUS_",length = 100)
+//    @PropertyDef(label = "Modbus閰嶇疆")
+//    private String modbus;
 
     @Column(name = "REMARK_", length = 250)
     @PropertyDef(label = "澶囨敞", description = "澶囨敞淇℃伅")
@@ -78,9 +78,9 @@
     @PropertyDef(label = "鍏宠仈璁惧閫氶亾", description = "閽堝鍙岄�氶亾閰嶇疆璁惧锛屽娣锋祦椋庡彛鐨勯鏈恒�佽酱娴侀鍙g殑椋庢満")
     private String link;
 
-    @Column(name = "LINK_MODBUS_",length = 100)
-    @PropertyDef(label = "鍏宠仈璁惧Modbus")
-    private String linkModbus;
+//    @Column(name = "LINK_MODBUS_",length = 100)
+//    @PropertyDef(label = "鍏宠仈璁惧Modbus")
+//    private String linkModbus;
 
     @Column(name = "EXT1_", length = 20)
     @PropertyDef(label = "鎵╁睍瀛楁1", description = "鏍规嵁涓氬姟闇�瑕佽嚜瀹氫箟瀛樺偍鍊�")
diff --git a/igds-core/src/main/java/com/ld/igds/models/MQuality.java b/igds-core/src/main/java/com/ld/igds/models/MQuality.java
index a8000d3..6ee6f21 100644
--- a/igds-core/src/main/java/com/ld/igds/models/MQuality.java
+++ b/igds-core/src/main/java/com/ld/igds/models/MQuality.java
@@ -120,11 +120,11 @@
 
     @PropertyDef(label = "鏍峰搧鏁伴噺", required = true)
     @Column(name = "ypsl", precision = 20, scale = 6)
-    private double ypsl;
+    private Double ypsl;
 
     @PropertyDef(label = "浠h〃鏁伴噺")
     @Column(name = "dbsl", precision = 20, scale = 6)
-    private double dbsl;
+    private Double dbsl;
 
     @PropertyDef(label = "鏍峰搧绛夌骇")
     @Column(name = "ypdj", length = 2)
diff --git a/igds-core/src/main/java/com/ld/igds/view/DepotConf.view.xml b/igds-core/src/main/java/com/ld/igds/view/DepotConf.view.xml
index 0f9aaac..fae18e5 100644
--- a/igds-core/src/main/java/com/ld/igds/view/DepotConf.view.xml
+++ b/igds-core/src/main/java/com/ld/igds/view/DepotConf.view.xml
@@ -155,7 +155,7 @@
           </Children>
         </FieldSet>
         <FieldSet>
-          <Property name="caption">绮儏妫�娴嬮厤缃�</Property>
+          <Property name="caption">绮俯妫�娴嬮厤缃�</Property>
           <Buttons/>
           <Children>
             <AutoForm layoutConstraint="padding:5">
@@ -205,39 +205,32 @@
               <AutoFormElement>
                 <Property name="name">tempMax</Property>
                 <Property name="property">tempMax</Property>
-                <Editor/>
-              </AutoFormElement>
-              <AutoFormElement>
-                <Property name="name">thSer</Property>
-                <Property name="property">thSer</Property>
-                <Property name="trigger">autoMappingDropDown2</Property>
-                <Editor/>
-              </AutoFormElement>
-              <AutoFormElement>
-                <Property name="name">thConf</Property>
-                <Property name="property">thConf</Property>
+                <Property name="label">绮俯涓婇檺</Property>
                 <Editor/>
               </AutoFormElement>
               <AutoFormElement>
                 <Property name="property">startOrientation</Property>
                 <Property name="name">startOrientation</Property>
                 <Property name="editable">false</Property>
-                <Property name="trigger">autoMappingDropDown1</Property>
                 <Editor/>
               </AutoFormElement>
               <AutoFormElement>
                 <Property name="property">startDirection</Property>
                 <Property name="name">startDirection</Property>
                 <Property name="editable">false</Property>
-                <Property name="trigger">autoMappingDropDown1</Property>
                 <Editor/>
               </AutoFormElement>
               <AutoFormElement>
                 <Property name="property">startPoint</Property>
                 <Property name="name">startPoint</Property>
                 <Property name="editable">false</Property>
-                <Property name="trigger">autoMappingDropDown1</Property>
                 <Editor/>
+              </AutoFormElement>
+              <AutoFormElement>
+                  <Property name="property">startConvert</Property>
+                  <Property name="name">startConvert</Property>
+                  <Property name="editable">false</Property>
+                  <Editor/>
               </AutoFormElement>
               <AutoFormElement>
                 <Property name="property">cableCone</Property>
@@ -249,6 +242,17 @@
               <AutoFormElement>
                 <Property name="name">grainFreq</Property>
                 <Property name="property">grainFreq</Property>
+                <Editor/>
+              </AutoFormElement>
+              <AutoFormElement>
+                <Property name="name">thSer</Property>
+                <Property name="property">thSer</Property>
+                <Property name="trigger">autoMappingDropDown2</Property>
+                <Editor/>
+              </AutoFormElement>
+              <AutoFormElement>
+                <Property name="name">thConf</Property>
+                <Property name="property">thConf</Property>
                 <Editor/>
               </AutoFormElement>
               <Button>
@@ -313,6 +317,15 @@
                 <Property name="property">ph3Max</Property>
                 <Editor/>
               </AutoFormElement>
+              <Button>
+                <ClientEvent name="onClick">var depotId = view.get(&quot;#dsMain.data:#&quot;).get(&quot;depotId&quot;);&#xD;
+var path = &quot;com.ld.igds.modbus.GasModbus.d?depotId=&quot;+depotId;&#xD;
+view.get(&quot;#iframModbus&quot;).set(&quot;path&quot;,path);&#xD;
+view.get(&quot;#dialogModbus&quot;).show();</ClientEvent>
+                <Property name="caption">Modbus閰嶇疆</Property>
+                <Property name="tip">閽堝Modbus鍗忚鐨勯厤缃�</Property>
+                <Property name="iconClass">fa fa-refresh</Property>
+              </Button>
             </AutoForm>
           </Children>
         </FieldSet>
@@ -325,6 +338,11 @@
               <Property name="cols">*,*,*</Property>
               <Property name="labelSeparator">锛�</Property>
               <Property name="labelWidth">100</Property>
+              <AutoFormElement>
+                <Property name="name">pestSer</Property>
+                <Property name="property">pestSer</Property>
+                <Editor/>
+              </AutoFormElement>
               <AutoFormElement>
                 <Property name="name">pestStart</Property>
                 <Property name="property">pestStart</Property>
@@ -340,6 +358,15 @@
                 <Property name="property">pestMax</Property>
                 <Editor/>
               </AutoFormElement>
+              <Button>
+                <ClientEvent name="onClick">var depotId = view.get(&quot;#dsMain.data:#&quot;).get(&quot;depotId&quot;);&#xD;
+var path = &quot;com.ld.igds.modbus.PestModbus.d?depotId=&quot;+depotId;&#xD;
+view.get(&quot;#iframModbus&quot;).set(&quot;path&quot;,path);&#xD;
+view.get(&quot;#dialogModbus&quot;).show();</ClientEvent>
+                <Property name="caption">Modbus閰嶇疆</Property>
+                <Property name="tip">閽堝Modbus鍗忚鐨勯厤缃�</Property>
+                <Property name="iconClass">fa fa-refresh</Property>
+              </Button>
             </AutoForm>
           </Children>
         </FieldSet>
@@ -352,6 +379,11 @@
               <Property name="cols">*,*,*</Property>
               <Property name="labelSeparator">锛�</Property>
               <Property name="labelWidth">100</Property>
+              <AutoFormElement>
+                <Property name="name">verbSer</Property>
+                <Property name="property">verbSer</Property>
+                <Editor/>
+              </AutoFormElement>
               <AutoFormElement>
                 <Property name="name">esSer</Property>
                 <Property name="property">esSer</Property>
@@ -377,5 +409,17 @@
       <Property name="service">depotPR#ajaxGetAllCache</Property>
       <Property name="executingMessage">鍒濆鍖栨暟鎹�︹��</Property>
     </AjaxAction>
+    <Dialog id="dialogModbus">
+      <Property name="width">80%</Property>
+      <Property name="height">95%</Property>
+      <Property name="caption">Modbus-TCP閰嶇疆</Property>
+      <Buttons/>
+      <Children>
+        <IFrame id="iframModbus">
+          <Property name="path">com.ld.igds.modbus.GasModbus.d</Property>
+        </IFrame>
+      </Children>
+      <Tools/>
+    </Dialog>
   </View>
 </ViewConfig>
diff --git a/igds-core/src/main/java/com/ld/igds/view/DepotPR.java b/igds-core/src/main/java/com/ld/igds/view/DepotPR.java
index 05a67d6..177ac2f 100644
--- a/igds-core/src/main/java/com/ld/igds/view/DepotPR.java
+++ b/igds-core/src/main/java/com/ld/igds/view/DepotPR.java
@@ -187,6 +187,22 @@
     }
 
     /**
+     * 灞傝杞崲
+     * ${dorado.getDataProvider("depotPR#triggerStartConvert").getResult()}
+     *
+     * @return
+     */
+    @DataProvider
+    public List<DicTrigger> triggerStartConvert() {
+        List<DicTrigger> list = new ArrayList<DicTrigger>();
+        list.add(new DicTrigger(Constant.GRAIN_CONVERT_DEFAULT, "榛樿"));
+        list.add(new DicTrigger(Constant.GRAIN_CONVERT_CLOCKWISE, "椤烘椂閽�"));
+        list.add(new DicTrigger(Constant.GRAIN_CONVERT_ANTICLOCKWISE, "閫嗘椂閽�"));
+
+        return list;
+    }
+
+    /**
      * 绛掍粨閿ュ舰
      * ${dorado.getDataProvider("depotPR#triggerCableCone").getResult()}
      *
diff --git a/igds-core/src/main/java/com/ld/igds/view/Device.view.xml b/igds-core/src/main/java/com/ld/igds/view/Device.view.xml
index 4e847df..5b7bcfb 100644
--- a/igds-core/src/main/java/com/ld/igds/view/Device.view.xml
+++ b/igds-core/src/main/java/com/ld/igds/view/Device.view.xml
@@ -34,7 +34,11 @@
     </DataType>
   </Model>
   <View layout="padding:5;regionPadding:5">
-    <ClientEvent name="onReady">view.get(&quot;#dataSetC&quot;).insert();</ClientEvent>
+    <ClientEvent name="onReady">view.get(&quot;#dataSetC&quot;).insert();&#xD;
+&#xD;
+openModbusDevice = function(){&#xD;
+	view.get(&quot;#dialogModbus&quot;).show();&#xD;
+}</ClientEvent>
     <Property name="packages">font-awesome,css-common</Property>
     <DataSet id="dsDevice">
       <Property name="dataProvider">devicePR#loadDeviceByContion</Property>
@@ -130,7 +134,7 @@
       </DataColumn>
       <DataColumn name="link">
         <Property name="property">link</Property>
-        <Property name="caption">鍏宠仈璁惧</Property>
+        <Property name="caption">椋庢満缂栫爜</Property>
         <Property name="align">center</Property>
       </DataColumn>
       <DataColumn name="serId">
@@ -140,6 +144,15 @@
       <DataColumn name="remark">
         <Property name="property">remark</Property>
         <Property name="align">center</Property>
+      </DataColumn>
+      <DataColumn>
+        <ClientEvent name="onRenderCell">arg.dom.innerHTML =&quot;&lt;a href='javascripe:;' onclick='openModbusDevice()'>Modbus閰嶇疆&lt;/a>&quot;;&#xD;
+arg.progressDefault = false;</ClientEvent>
+        <Property name="name">id</Property>
+        <Property name="property">id</Property>
+        <Property name="width">100</Property>
+        <Property name="caption">鎿嶄綔</Property>
+        <Editor/>
       </DataColumn>
     </DataGrid>
     <ToolBar layoutConstraint="bottom">
@@ -226,24 +239,6 @@
             <Property name="property">power</Property>
             <Editor/>
           </AutoFormElement>
-          <AutoFormElement layoutConstraint="colSpan:2">
-            <Property name="name">modbus</Property>
-            <Property name="property">modbus</Property>
-            <Editor/>
-          </AutoFormElement>
-          <AutoFormElement layoutConstraint="colSpan:2">
-            <Property name="name">linkModbus</Property>
-            <Property name="property">linkModbus</Property>
-            <Property name="label">椋庢満Modbus</Property>
-            <Editor/>
-          </AutoFormElement>
-          <Label layoutConstraint="colSpan:2">
-            <Property name="text">modbus瑙勫垯锛氬紑鍦板潃-鍏冲湴鍧�-鍋滃湴鍧�-寮�鍒颁綅-鍏冲埌浣�-寮�鏁呴殰-鍏虫晠闅滐紝鏃犲湴鍧�鐢∟浠f浛</Property>
-            <Property name="style">
-              <Property name="padding-left">100px</Property>
-              <Property name="color">blue</Property>
-            </Property>
-          </Label>
           <AutoFormElement layoutConstraint="colSpan:2">
             <Property name="name">remark</Property>
             <Property name="property">remark</Property>
@@ -332,5 +327,17 @@
       <Property name="successMessage">鍒锋柊鎴愬姛锛�</Property>
       <Property name="confirmMessage">纭畾瑕佸埛鏂扮紦瀛樹箞锛�</Property>
     </AjaxAction>
+    <Dialog id="dialogModbus">
+      <Property name="width">100%</Property>
+      <Property name="height">95%</Property>
+      <Property name="caption">璁惧MOBUS-TCP鐩稿叧閰嶇疆</Property>
+      <Buttons/>
+      <Children>
+        <IFrame id="iframeModbusDevice">
+          <Property name="path">com.ld.igds.modbus.DeviceModbus.d</Property>
+        </IFrame>
+      </Children>
+      <Tools/>
+    </Dialog>
   </View>
 </ViewConfig>
diff --git a/igds-core/src/main/java/com/ld/igds/view/service/DeviceService.java b/igds-core/src/main/java/com/ld/igds/view/service/DeviceService.java
index 9635b30..8bb0320 100644
--- a/igds-core/src/main/java/com/ld/igds/view/service/DeviceService.java
+++ b/igds-core/src/main/java/com/ld/igds/view/service/DeviceService.java
@@ -1,279 +1,275 @@
 package com.ld.igds.view.service;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.lang.StringUtils;
-import org.hibernate.Session;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
 import com.bstek.bdf2.core.orm.hibernate.HibernateDao;
 import com.bstek.dorado.data.provider.Page;
 import com.ld.igds.common.CoreDeviceService;
 import com.ld.igds.models.Device;
 import com.ld.igds.util.ContextUtil;
+import org.apache.commons.lang.StringUtils;
+import org.hibernate.Session;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
- * 
  * @author Andy
- *
  */
 @Component
 public class DeviceService extends HibernateDao {
-	
-	
-	@Autowired
-	private CoreDeviceService coreDeviceService;
 
-	/**
-	 * 鍔犺浇鎵�鏈夎澶囨暟鎹�
-	 * <p>
-	 * Title: loadDevice
-	 * </p>
-	 * <p>
-	 * Description:
-	 * </p>
-	 *
-	 */
-	public List<Device> loadDevice(Map<String, Object> parameter) {
-		if (parameter == null || parameter.size() <= 0)
-			return null;
 
-		Map<String, Object> p = new HashMap<String, Object>();
-		String hql = " from " + Device.class.getName()
-				+ " where companyId = :companyId ";
-		
-		String companyId = (String) parameter.get("companyId");
-		if(null == companyId){
-			companyId = ContextUtil.getCompanyId();
-		}
-		p.put("companyId", companyId);
+    @Resource
+    private CoreDeviceService coreDeviceService;
 
-		String depotId = (String) parameter.get("depotId");
-		if (StringUtils.isNotEmpty(depotId)) {
-			hql += " and depotId =:depotId";
-			p.put("depotId", depotId);
-		}
+    /**
+     * 鍔犺浇鎵�鏈夎澶囨暟鎹�
+     * <p>
+     * Title: loadDevice
+     * </p>
+     * <p>
+     * Description:
+     * </p>
+     */
+    public List<Device> loadDevice(Map<String, Object> parameter) {
+        if (parameter == null || parameter.size() <= 0)
+            return null;
 
-		String type = (String) parameter.get("type");
-		if (StringUtils.isNotEmpty(type)) {
-			hql += " and type =:type";
-			p.put("type", type);
-		}
+        Map<String, Object> p = new HashMap<String, Object>();
+        String hql = " from " + Device.class.getName()
+                + " where companyId = :companyId ";
 
-		String serId = (String) parameter.get("serId");
-		if (StringUtils.isNotEmpty(serId)) {
-			hql += " and serId =:serId";
-			p.put("serId", serId);
-		}
+        String companyId = (String) parameter.get("companyId");
+        if (null == companyId) {
+            companyId = ContextUtil.getCompanyId();
+        }
+        p.put("companyId", companyId);
 
-		hql += " order by type,id";
-		return this.query(hql, p);
-	}
+        String depotId = (String) parameter.get("depotId");
+        if (StringUtils.isNotEmpty(depotId)) {
+            hql += " and depotId =:depotId";
+            p.put("depotId", depotId);
+        }
 
-	public void loadDeviceByContion(Page<Device> page,
-			Map<String, Object> parameter) throws Exception {
-		Map<String, Object> p = new HashMap<String, Object>();
-		String hql = " from " + Device.class.getName()
-				+ " where companyId = :companyId ";
-		p.put("companyId", ContextUtil.getCompanyId());
-		
-		if(null == parameter)parameter = new HashMap<String, Object>();
+        String type = (String) parameter.get("type");
+        if (StringUtils.isNotEmpty(type)) {
+            hql += " and type =:type";
+            p.put("type", type);
+        }
 
-		String depotId = (String) parameter.get("depotId");
-		if (StringUtils.isNotEmpty(depotId)) {
-			hql += " and depotId =:depotId";
-			p.put("depotId", depotId);
-		}
+        String serId = (String) parameter.get("serId");
+        if (StringUtils.isNotEmpty(serId)) {
+            hql += " and serId =:serId";
+            p.put("serId", serId);
+        }
 
-		String type = (String) parameter.get("type");
-		if (StringUtils.isNotEmpty(type)) {
-			hql += " and type =:type";
-			p.put("type", type);
-		}
+        hql += " order by type,id";
+        return this.query(hql, p);
+    }
 
-		String serId = (String) parameter.get("serId");
-		if (StringUtils.isNotEmpty(serId)) {
-			hql += " and serId =:serId";
-			p.put("serId", serId);
-		}
+    public void loadDeviceByContion(Page<Device> page,
+                                    Map<String, Object> parameter) throws Exception {
+        Map<String, Object> p = new HashMap<String, Object>();
+        String hql = " from " + Device.class.getName()
+                + " where companyId = :companyId ";
+        p.put("companyId", ContextUtil.getCompanyId());
 
-		String countSql = "select count(*) " + hql;
-		hql += " order by serId,id asc";
-		this.pagingQuery(page, hql, countSql, p);
-	}
+        if (null == parameter) parameter = new HashMap<String, Object>();
 
-	/**
-	 * 淇敼璁惧淇℃伅
-	 * <p>
-	 * Title: upDepotDevice
-	 * </p>
-	 * <p>
-	 * Description:
-	 * </p>
-	 * 
-	 * @param depotDevice
-	 */
+        String depotId = (String) parameter.get("depotId");
+        if (StringUtils.isNotEmpty(depotId)) {
+            hql += " and depotId =:depotId";
+            p.put("depotId", depotId);
+        }
 
-	public void upDepotDevice(Device depotDevice) {
-		Session session = null;
-		try {
-			session = this.getSessionFactory().openSession();
-			session.update(depotDevice);
-		} catch (Exception e) {
-			e.printStackTrace();
-		} finally {
-			session.flush();
-			session.close();
-		}
+        String type = (String) parameter.get("type");
+        if (StringUtils.isNotEmpty(type)) {
+            hql += " and type =:type";
+            p.put("type", type);
+        }
 
-	}
+        String serId = (String) parameter.get("serId");
+        if (StringUtils.isNotEmpty(serId)) {
+            hql += " and serId =:serId";
+            p.put("serId", serId);
+        }
 
-	/**
-	 * 鍒犻櫎璁惧
-	 * <p>
-	 * Title: delDepotDevice
-	 * </p>
-	 * <p>
-	 * Description:
-	 * </p>
-	 */
-	public void delDepotDevice(Device depotDevice) {
-		Session session = null;
-		try {
-			session = this.getSessionFactory().openSession();
-			session.delete(depotDevice);
-		} catch (Exception e) {
-			e.printStackTrace();
-		} finally {
-			session.flush();
-			session.close();
-		}
-	}
+        String countSql = "select count(*) " + hql;
+        hql += " order by serId,id asc";
+        this.pagingQuery(page, hql, countSql, p);
+    }
 
-	public void delDepotDevice(String id) {
-		Session session = null;
-		try {
-			session = this.getSessionFactory().openSession();
-			String hql = " delete from " + Device.class.getName()
-					+ " where id=:id";
-			session.createQuery(hql).setString("id", id).executeUpdate();
-		} catch (Exception e) {
-			e.printStackTrace();
-		} finally {
-			session.flush();
-			session.close();
-		}
-	}
+    /**
+     * 淇敼璁惧淇℃伅
+     * <p>
+     * Title: upDepotDevice
+     * </p>
+     * <p>
+     * Description:
+     * </p>
+     *
+     * @param depotDevice
+     */
 
-	public String saveOrUpdate(Device device, String id) {
-		if (null != id) {
-			this.delDepotDevice(id);
-			return null;
-		}
-		Session session = null;
-		try {
-			session = this.getSessionFactory().openSession();
-			if (null != device.getId()) {
-				session.update(device);
-			} else {
-				device.setCompanyId(ContextUtil.getCompanyId());
-				device.setId(ContextUtil.buildDeviceId(device.getCompanyId(),
-						device.getDepotId(), device.getPassCode()));
-				session.save(device);
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		} finally {
-			session.flush();
-			session.close();
-		}
-		return null;
-	}
+    public void upDepotDevice(Device depotDevice) {
+        Session session = null;
+        try {
+            session = this.getSessionFactory().openSession();
+            session.update(depotDevice);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            session.flush();
+            session.close();
+        }
 
-	public void addDepotDevice(Device depotDevice) {
-		Session session = null;
-		try {
-			session = this.getSessionFactory().openSession();
-			depotDevice.setCompanyId(ContextUtil.getCompanyId());
-			depotDevice.setId(ContextUtil.buildDeviceId(
-					depotDevice.getCompanyId(), depotDevice.getDepotId(),
-					depotDevice.getPassCode()));
-			session.save(depotDevice);
-		} catch (Exception e) {
-			e.printStackTrace();
-		} finally {
-			session.flush();
-			session.close();
-		}
-	}
+    }
 
-	public void refreshCache(String companyId) {
-		coreDeviceService.refreshCache(companyId);
-	}
+    /**
+     * 鍒犻櫎璁惧
+     * <p>
+     * Title: delDepotDevice
+     * </p>
+     * <p>
+     * Description:
+     * </p>
+     */
+    public void delDepotDevice(Device depotDevice) {
+        Session session = null;
+        try {
+            session = this.getSessionFactory().openSession();
+            session.delete(depotDevice);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            session.flush();
+            session.close();
+        }
+    }
 
-	public Device getDeviceById(String id){
-		Map<String, Object> p = new HashMap<String, Object>();
-		String hql = " from " + Device.class.getName()
-				+ " where companyId = :companyId and id=:id";
+    public void delDepotDevice(String id) {
+        Session session = null;
+        try {
+            session = this.getSessionFactory().openSession();
+            String hql = " delete from " + Device.class.getName()
+                    + " where id=:id";
+            session.createQuery(hql).setString("id", id).executeUpdate();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            session.flush();
+            session.close();
+        }
+    }
 
-		String	companyId = ContextUtil.getCompanyId();
-		p.put("companyId", companyId);
-		p.put("id", id);
-		List<Device> list = this.query(hql,p);
-		if(list != null && list.size() > 0){
-			return list.get(0);
-		}
-		return null;
-	}
+    public String saveOrUpdate(Device device, String id) {
+        if (null != id) {
+            this.delDepotDevice(id);
+            return null;
+        }
+        Session session = null;
+        try {
+            session = this.getSessionFactory().openSession();
+            if (null != device.getId()) {
+                session.update(device);
+            } else {
+                device.setCompanyId(ContextUtil.getCompanyId());
+                device.setId(ContextUtil.buildDeviceId(device.getCompanyId(),
+                        device.getDepotId(), device.getPassCode()));
+                session.save(device);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            session.flush();
+            session.close();
+        }
+        return null;
+    }
 
-	public List<Device> loadDeviceByType(Map<String, Object> parameter) {
-		if (parameter == null || parameter.size() <= 0)
-			return null;
+    public void addDepotDevice(Device depotDevice) {
+        Session session = null;
+        try {
+            session = this.getSessionFactory().openSession();
+            depotDevice.setCompanyId(ContextUtil.getCompanyId());
+            depotDevice.setId(ContextUtil.buildDeviceId(
+                    depotDevice.getCompanyId(), depotDevice.getDepotId(),
+                    depotDevice.getPassCode()));
+            session.save(depotDevice);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            session.flush();
+            session.close();
+        }
+    }
 
-		Map<String, Object> p = new HashMap<String, Object>();
-		String hql = " from " + Device.class.getName()
-				+ " where companyId = :companyId ";
+    public void refreshCache(String companyId) {
+        coreDeviceService.refreshCache(companyId);
+    }
 
-		String companyId = (String) parameter.get("companyId");
-		if(null == companyId){
-			companyId = ContextUtil.getCompanyId();
-		}
-		p.put("companyId", companyId);
+    public Device getDeviceById(String id) {
+        Map<String, Object> p = new HashMap<String, Object>();
+        String hql = " from " + Device.class.getName()
+                + " where companyId = :companyId and id=:id";
 
-		String depotId = (String) parameter.get("depotId");
-		if (StringUtils.isNotEmpty(depotId)) {
-			hql += " and depotId =:depotId";
-			p.put("depotId", depotId);
-		}
+        String companyId = ContextUtil.getCompanyId();
+        p.put("companyId", companyId);
+        p.put("id", id);
+        List<Device> list = this.query(hql, p);
+        if (list != null && list.size() > 0) {
+            return list.get(0);
+        }
+        return null;
+    }
 
-		String type = (String) parameter.get("type");
-		if (StringUtils.isNotEmpty(type)) {
-			hql += " and type =:type";
-			p.put("type", type);
-		}
+    public List<Device> loadDeviceByType(Map<String, Object> parameter) {
+        if (parameter == null || parameter.size() <= 0)
+            return null;
 
-		String serId = (String) parameter.get("serId");
-		if (StringUtils.isNotEmpty(serId)) {
-			hql += " and serId =:serId";
-			p.put("serId", serId);
-		}
-		String tag = (String) parameter.get("tag");
-		// tag = 1 鏌ヨ椋庢満绫诲瀷鐨勮澶囷紝tag = 2 鏌ヨ鐓ф槑璁惧锛屽惁鍒欐槸鍏朵綑鐨勫叾瀹冭澶�
-		if (StringUtils.isNotEmpty(tag) && "1".equals(tag)) {
-			hql += " and type  in (:types)";
-			p.put("types", new String[] {"02","03","04","0C","0D"});
-		}else if (StringUtils.isNotEmpty(tag) && "2".equals(tag)) {
-			hql += " and type =:type";
-			p.put("type", "06");
-		}else{
-			hql += " and type  not in (:types)";
-			p.put("types", new String[] {"02","03","04","0C","0D"});
-		}
-		hql += " order by type,id";
-		return this.query(hql, p);
-	}
+        Map<String, Object> p = new HashMap<String, Object>();
+        String hql = " from " + Device.class.getName()
+                + " where companyId = :companyId ";
+
+        String companyId = (String) parameter.get("companyId");
+        if (null == companyId) {
+            companyId = ContextUtil.getCompanyId();
+        }
+        p.put("companyId", companyId);
+
+        String depotId = (String) parameter.get("depotId");
+        if (StringUtils.isNotEmpty(depotId)) {
+            hql += " and depotId =:depotId";
+            p.put("depotId", depotId);
+        }
+
+        String type = (String) parameter.get("type");
+        if (StringUtils.isNotEmpty(type)) {
+            hql += " and type =:type";
+            p.put("type", type);
+        }
+
+        String serId = (String) parameter.get("serId");
+        if (StringUtils.isNotEmpty(serId)) {
+            hql += " and serId =:serId";
+            p.put("serId", serId);
+        }
+        String tag = (String) parameter.get("tag");
+        // tag = 1 鏌ヨ椋庢満绫诲瀷鐨勮澶囷紝tag = 2 鏌ヨ鐓ф槑璁惧锛屽惁鍒欐槸鍏朵綑鐨勫叾瀹冭澶�
+        if (StringUtils.isNotEmpty(tag) && "1".equals(tag)) {
+            hql += " and type  in (:types)";
+            p.put("types", new String[]{"02", "03", "04", "0C", "0D"});
+        } else if (StringUtils.isNotEmpty(tag) && "2".equals(tag)) {
+            hql += " and type =:type";
+            p.put("type", "06");
+        } else {
+            hql += " and type  not in (:types)";
+            p.put("types", new String[]{"02", "03", "04", "0C", "0D"});
+        }
+        hql += " order by type,id";
+        return this.query(hql, p);
+    }
 
 }
diff --git a/igds-core/src/main/java/models/igds.model.xml b/igds-core/src/main/java/models/igds.model.xml
index 791ffe0..8cc3fe8 100644
--- a/igds-core/src/main/java/models/igds.model.xml
+++ b/igds-core/src/main/java/models/igds.model.xml
@@ -518,14 +518,17 @@
         <Property name="keyProperty">id</Property>
         <Property name="valueProperty">name</Property>
       </Property>
+      <Property name="required">true</Property>
     </PropertyDef>
     <PropertyDef name="name">
       <Property></Property>
       <Property name="label">鍚嶇О</Property>
+      <Property name="required">true</Property>
     </PropertyDef>
     <PropertyDef name="passCode">
       <Property name="dataType">int</Property>
       <Property name="label">璁惧缂栧彿</Property>
+      <Property name="required">true</Property>
     </PropertyDef>
     <PropertyDef name="link">
       <Property></Property>
@@ -548,6 +551,7 @@
         <Property name="keyProperty">id</Property>
         <Property name="valueProperty">name</Property>
       </Property>
+      <Property name="required">true</Property>
     </PropertyDef>
     <PropertyDef name="type">
       <Property></Property>
@@ -602,14 +606,6 @@
     <PropertyDef name="locationName">
       <Property></Property>
       <Property name="label">浣嶇疆</Property>
-    </PropertyDef>
-    <PropertyDef name="modbus">
-      <Property></Property>
-      <Property name="label">Modbus閰嶇疆</Property>
-    </PropertyDef>
-    <PropertyDef name="linkModbus">
-      <Property/>
-      <Property name="label">鍏宠仈璁惧Modbus</Property>
     </PropertyDef>
     <PropertyDef name="ext1">
       <Property></Property>
@@ -875,24 +871,6 @@
       <Property name="dataType">Double</Property>
       <Property name="label">铏涓婇檺</Property>
     </PropertyDef>
-    <PropertyDef name="videoIn">
-      <Property></Property>
-      <Property name="label">鍐呴儴瑙嗛</Property>
-      <Property name="mapping">
-        <Property name="mapValues">${dorado.getDataProvider(&quot;securityPR#listCamera&quot;).getResult()}</Property>
-        <Property name="keyProperty">id</Property>
-        <Property name="valueProperty">name</Property>
-      </Property>
-    </PropertyDef>
-    <PropertyDef name="quantitySer">
-      <Property></Property>
-      <Property name="label">鏁伴噺妫�娴嬪垎鏈�</Property>
-      <Property name="mapping">
-        <Property name="mapValues">${dorado.getDataProvider(&quot;deviceSerPR2#getSerCacheByType&quot;).getResult(&quot;99&quot;)}</Property>
-        <Property name="keyProperty">id</Property>
-        <Property name="valueProperty">name</Property>
-      </Property>
-    </PropertyDef>
     <PropertyDef name="thSer">
       <Property></Property>
       <Property name="label">娓╂箍搴﹀垎鏈�</Property>
@@ -944,6 +922,14 @@
         <Property name="mapValues">${dorado.getDataProvider(&quot;depotPR#triggerStartPoint&quot;).getResult()}</Property>
       </Property>
     </PropertyDef>
+    <PropertyDef name="startConvert">
+      <Property name="label">灞傝杞崲</Property>
+      <Property name="mapping">
+        <Property name="keyProperty">code</Property>
+        <Property name="valueProperty">name</Property>
+        <Property name="mapValues">${dorado.getDataProvider(&quot;depotPR#triggerStartConvert&quot;).getResult()}</Property>
+      </Property>
+    </PropertyDef>
     <PropertyDef name="depotName">
       <Property></Property>
     </PropertyDef>
@@ -961,6 +947,29 @@
     <PropertyDef name="gasSer">
       <Property></Property>
       <Property name="label">姘斾綋鍒嗘満</Property>
+      <Property name="mapping">
+        <Property name="mapValues">${dorado.getDataProvider(&quot;deviceSerPR#getAllSerCache&quot;).getResult()}</Property>
+        <Property name="keyProperty">id</Property>
+        <Property name="valueProperty">name</Property>
+      </Property>
+    </PropertyDef>
+    <PropertyDef name="pestSer">
+      <Property/>
+      <Property name="label">姘斾綋鍒嗘満</Property>
+      <Property name="mapping">
+        <Property name="mapValues">${dorado.getDataProvider(&quot;deviceSerPR#getAllSerCache&quot;).getResult()}</Property>
+        <Property name="keyProperty">id</Property>
+        <Property name="valueProperty">name</Property>
+      </Property>
+    </PropertyDef>
+    <PropertyDef name="verbSer">
+      <Property/>
+      <Property name="label">閫氶鍒嗘満</Property>
+      <Property name="mapping">
+        <Property name="mapValues">${dorado.getDataProvider(&quot;deviceSerPR#getAllSerCache&quot;).getResult()}</Property>
+        <Property name="keyProperty">id</Property>
+        <Property name="valueProperty">name</Property>
+      </Property>
     </PropertyDef>
   </DataType>
   <DataType name="dtDicSlogan">
diff --git a/igds-core/src/main/resources/mapper/CommonMapper.xml b/igds-core/src/main/resources/mapper/CommonMapper.xml
index 11d7a80..a31668c 100644
--- a/igds-core/src/main/resources/mapper/CommonMapper.xml
+++ b/igds-core/src/main/resources/mapper/CommonMapper.xml
@@ -212,6 +212,8 @@
             <if test="data.gasEnd != null ">GAS_END_ = #{data.gasEnd},</if>
             <if test="data.pestStart != null ">PEST_START_ = #{data.pestStart},</if>
             <if test="data.pestEnd != null ">PEST_END_ = #{data.pestEnd},</if>
+			<if test="data.pestSer != null ">PEST_SER_ = #{pestSer},</if>
+			<if test="data.verbSer != null ">VERB_SER_ = #{verbSer},</if>
         </set>
         where COMPANY_ID_ = #{data.companyId} AND DEPOT_ID_ = #{data.depotId}
     </update>
diff --git a/igds-core/src/main/resources/mapper/DeviceMapper.xml b/igds-core/src/main/resources/mapper/DeviceMapper.xml
index 056e15d..8b1a57a 100644
--- a/igds-core/src/main/resources/mapper/DeviceMapper.xml
+++ b/igds-core/src/main/resources/mapper/DeviceMapper.xml
@@ -17,7 +17,6 @@
 		g.LOCATION_ AS location,
 		g.STATUS_ AS status,
 		g.POWER_ AS power,
-		g.MODBUS_ AS modbus,
 		g.LINK_ AS link,
 		g.EXT1_ AS ext1,
 		g.EXT2_ AS ext2,
diff --git a/igds-es/src/main/java/com/ld/igds/es/manager/EsManager.java b/igds-es/src/main/java/com/ld/igds/es/manager/EsManager.java
index 142fab3..332a9cb 100644
--- a/igds-es/src/main/java/com/ld/igds/es/manager/EsManager.java
+++ b/igds-es/src/main/java/com/ld/igds/es/manager/EsManager.java
@@ -205,10 +205,10 @@
                     "鎵ц澶辫触锛氭病鏈夐厤缃�氳鍗忚銆�");
         }
 
-        if (Constant.YN_N.equals(deviceSer.getStatus())) {
-            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
-                    "鎵ц澶辫触锛氳兘鑰楀垎鏈轰笉鍦ㄧ嚎銆�");
-        }
+//        if (Constant.YN_N.equals(deviceSer.getStatus())) {
+//            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+//                    "鎵ц澶辫触锛氳兘鑰楀垎鏈轰笉鍦ㄧ嚎銆�");
+//        }
 
         RemoteEsService remoteEsService = remoteManager.getRemoteEsService(deviceSer.getProtocol());
 
diff --git a/igds-inout/src/main/java/com/ld/igds/inout/manager/InoutReportManager.java b/igds-inout/src/main/java/com/ld/igds/inout/manager/InoutReportManager.java
index d04efe0..757202e 100644
--- a/igds-inout/src/main/java/com/ld/igds/inout/manager/InoutReportManager.java
+++ b/igds-inout/src/main/java/com/ld/igds/inout/manager/InoutReportManager.java
@@ -144,6 +144,11 @@
         htmlStr = htmlStr.replace("remark", bill.getRemark());
         htmlStr = htmlStr.replace("moneyName", bill.getMoneyName());
 
+        htmlStr = htmlStr.replace("unitName", bill.getUnitName());
+        htmlStr = htmlStr.replace("time", bill.getRegisterTime());
+        htmlStr = htmlStr.replace("handleStart", "");
+        htmlStr = htmlStr.replace("handleEnd", "");
+
         htmlStr = htmlStr.replaceAll("weightUser",
                 bill.getWeightUser() == null ? "" : bill.getWeightUser());
         htmlStr = htmlStr.replaceAll("handleUser",
@@ -243,6 +248,11 @@
         htmlStr = htmlStr.replace("settleMoney", bill.getSettleMoney() + "");
         htmlStr = htmlStr.replace("wet", bill.getWet() + "");
         htmlStr = htmlStr.replace("impurity", bill.getImpurity() + "");
+
+        htmlStr = htmlStr.replace("unitName", bill.getUnitName());
+        htmlStr = htmlStr.replace("time", bill.getRegisterTime());
+        htmlStr = htmlStr.replace("handleStart", "");
+        htmlStr = htmlStr.replace("handleEnd", "");
 
         htmlStr = htmlStr.replaceAll("weightUser",
                 bill.getWeightUser() == null ? "" : bill.getWeightUser());
@@ -347,7 +357,7 @@
         }
         bill.setSettleMoney(data.getSettleMoney() == null ? "" : data.getSettleMoney() + "");
         bill.setRemark(data.getRemarks() == null ? "" : data.getRemarks());
-
+        bill.setDeSum(data.getDeCheck() + data.getDeOther() + data.getDeHandle() + data.getDePackage());
 
         if(InoutConstant.TYPE_IN.equals(data.getType())){
             bill.setWeightUser(data.getFullWeightUser());
@@ -839,6 +849,5 @@
         List<String> strings3 = result.subList(6, 8);
         System.out.println(strings3);
     }
-
 
 }
\ No newline at end of file
diff --git a/igds-n2/src/main/java/com/ld/igds/n2/controller/N2Controller.java b/igds-n2/src/main/java/com/ld/igds/n2/controller/N2Controller.java
index 506e3f4..bc10d82 100644
--- a/igds-n2/src/main/java/com/ld/igds/n2/controller/N2Controller.java
+++ b/igds-n2/src/main/java/com/ld/igds/n2/controller/N2Controller.java
@@ -80,7 +80,7 @@
         if (DepotType.TYPE_02.getCode().equals(depotType) || DepotType.TYPE_04.getCode().equals(depotType)) {
             view.setViewName("admin/n2/n2-hand2");
         } else {
-            if ("5013".equals(user.getCompanyId()) || "5016".equals(user.getCompanyId())) {
+            if ("5013".equals(user.getCompanyId()) || "5016".equals(user.getCompanyId()) || "5325".equals(user.getCompanyId())) {
                 view.setViewName("admin/n2/n2-hand-5013");
             } else {
                 view.setViewName("admin/n2/n2-hand1");
@@ -128,7 +128,7 @@
         view.addObject("n2ImgMap", n2ImgMap);
 
         view.setViewName("admin/n2/n2-hand1");
-        if ("5013".equals(user.getCompanyId()) || "5016".equals(user.getCompanyId())) {
+        if ("5013".equals(user.getCompanyId()) || "5016".equals(user.getCompanyId()) || "5325".equals(user.getCompanyId())) {
             view.setViewName("admin/n2/n2-hand-5013");
         }
         return view;
diff --git a/igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/ServerRunner.java b/igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/ServerRunner.java
index bb0cf5a..4e73906 100644
--- a/igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/ServerRunner.java
+++ b/igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/ServerRunner.java
@@ -1,6 +1,7 @@
 package com.ld.igds.protocol.bhzn;
 
 import com.ld.igds.data.ConfigData;
+import com.ld.igds.protocol.bhzn.grainv1.server.BhznGrainV1ServerEngine;
 import com.ld.igds.protocol.bhzn.grainv2.server.BhznGrainV2ServerEngine;
 import com.ld.igds.protocol.bhzn.verb.server.BhznVerbServerEngine;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -20,19 +21,21 @@
     @Autowired
     private ConfigData configData;
     @Autowired
-    private BhznGrainV2ServerEngine bhznGrainServerEngine;
+    private BhznGrainV2ServerEngine bhznGrainServerEngine2;
+    @Autowired
+    private BhznGrainV1ServerEngine bhznGrainServerEngine1;
     @Autowired
     private BhznVerbServerEngine bhznVerbServerEngine;
     @Override
     public void run(String... strings) throws Exception {
 
         if (configData.getActive().indexOf("pro") >= 0) {
-            bhznGrainServerEngine.start(BhznGrainV2ServerEngine.PORT);
-            bhznVerbServerEngine.start(BhznVerbServerEngine.PORT);
+            bhznGrainServerEngine1.start(BhznGrainV1ServerEngine.PORT);
+           // bhznVerbServerEngine.start(BhznVerbServerEngine.PORT);
         }
         if (configData.getActive().indexOf("dev") >= 0) {
-            bhznGrainServerEngine.start(BhznGrainV2ServerEngine.PORT);
-            bhznVerbServerEngine.start(BhznVerbServerEngine.PORT);
+            bhznGrainServerEngine1.start(BhznGrainV1ServerEngine.PORT);
+            //bhznVerbServerEngine.start(BhznVerbServerEngine.PORT);
         }
     }
 }
diff --git a/igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/grainv1/RemoteGrainV1ServiceImpl.java b/igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/grainv1/RemoteGrainV1ServiceImpl.java
index 16be4b2..1000c64 100644
--- a/igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/grainv1/RemoteGrainV1ServiceImpl.java
+++ b/igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/grainv1/RemoteGrainV1ServiceImpl.java
@@ -37,8 +37,28 @@
     public GrainResponse checkGrain(CheckGrainRequest request) {
         try {
             // 鐢熸垚绮儏淇℃伅
-            String hexStr = CommandBuild.getInstance().getMsgCheck(request.getSerId(), request.getDepotId());
-
+            String hexStr = "";
+            if("5323".equals(request.getCompanyId())){
+                if("0P01".equals(request.getDepotId())){
+                    hexStr = CommandBuild.getInstance().getMsgCheck(request.getSerId(), "1");
+                }else if("0P02".equals(request.getDepotId())){
+                    hexStr = CommandBuild.getInstance().getMsgCheck(request.getSerId(),  "1");
+                }else if("0P03".equals(request.getDepotId())){
+                    hexStr = CommandBuild.getInstance().getMsgCheck(request.getSerId(),  "2");
+                }else if("0P04".equals(request.getDepotId())){
+                    hexStr = CommandBuild.getInstance().getMsgCheck(request.getSerId(), "2");
+                }else if("0P05".equals(request.getDepotId())){
+                    hexStr = CommandBuild.getInstance().getMsgCheck(request.getSerId(), "3");
+                }else if("0P06".equals(request.getDepotId())){
+                    hexStr = CommandBuild.getInstance().getMsgCheck(request.getSerId(), "4");
+                }else if("0P07".equals(request.getDepotId())){
+                    hexStr = CommandBuild.getInstance().getMsgCheck(request.getSerId(), "4");
+                }else if("0P08".equals(request.getDepotId())){
+                    hexStr = CommandBuild.getInstance().getMsgCheck(request.getSerId(), "4");
+                }
+            }else{
+                hexStr = CommandBuild.getInstance().getMsgCheck(request.getSerId(), request.getDepotId());
+            }
 
 //            //閫氳浣跨敤鐨勬槸涓绘満閫氳
 //            DeviceSer mainSer = coreSerService.getCacheSer(ContextUtil.getDefaultCompanyId(), BhznGrainV1ServerUtils.DEFAULT_MAC_ID);
diff --git a/igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/grainv1/msg/AnalysisService.java b/igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/grainv1/msg/AnalysisService.java
index 41a7547..7772715 100644
--- a/igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/grainv1/msg/AnalysisService.java
+++ b/igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/grainv1/msg/AnalysisService.java
@@ -5,13 +5,11 @@
 import com.ld.igds.common.dto.THDto;
 import com.ld.igds.constant.BizType;
 import com.ld.igds.constant.Constant;
+import com.ld.igds.constant.DepotType;
 import com.ld.igds.grain.GrainUtil;
 import com.ld.igds.grain.dto.GrainItemInfo;
 import com.ld.igds.io.notify.NotifyGrainInvoker;
-import com.ld.igds.models.DepotConf;
-import com.ld.igds.models.DeviceSer;
-import com.ld.igds.models.DicSysConf;
-import com.ld.igds.models.Grain;
+import com.ld.igds.models.*;
 import com.ld.igds.order.ExeOrderService;
 import com.ld.igds.order.data.ExeRequest;
 import com.ld.igds.protocol.bhzn.grainv1.msg.builder.CommandBuild;
@@ -75,7 +73,7 @@
             //DO NOTHING
 
             log.info("涓绘満------->>骞冲彴锛氭敞鍐屼俊鎭姤鏂�={}", message);
-            DeviceSer ser = coreSerService.getCacheSerBySn(ContextUtil.getDefaultCompanyId(),message.getAddr());
+            DeviceSer ser = coreSerService.getCacheSerBySn("5323",message.getAddr());
             if(ser!= null ){
                 ser.setIp(message.getIp());
                 ser.setPort(message.getPort());
@@ -113,7 +111,7 @@
 
             //鏍规嵁鍒嗘満鍦板潃鑾峰彇鍒嗘満淇℃伅
 
-            DeviceSer ser = coreSerService.getCacheSer(ContextUtil.getDefaultCompanyId(), message.getAddr());
+            DeviceSer ser = coreSerService.getCacheSer("5323", message.getAddr());
             if (ser == null) {
                 replayGrain(message);
                 log.error("涓绘満-------->>骞冲彴锛岃В鏋愮伯鎯呭け璐ワ紝鏈幏鍙栧埌绯荤粺绮儏涓绘満閰嶇疆锛�" + message.getAddr());
@@ -145,15 +143,30 @@
                 log.error("鍒嗘満------>>>骞冲彴锛�" + info);
                 return;
             }
-
+            Depot depot = commonService.getDepotById(depotConf.getCompanyId(),depotConf.getDepotId());
+            if (null == depot) {
+                String info = "绮儏瑙f瀽澶辫触:鍒嗘満=" + ser.getName() + "娌℃湁鑾峰彇鍒扮伯鎯呭弬鏁伴厤缃粨搴撱��";
+                log.error("鍒嗘満------>>>骞冲彴锛�" + info);
+                return;
+            }
             // 绮儏鐨勬壒娆″彿閲嶆柊鏍规嵁棰戠巼璋冩暣
             String batchId = ContextUtil.getBatchIdByFireq(depotConf.getGrainFreq());
 
             // 鍒ゆ柇鏁版嵁鏈夋病鏈夋敹鍙栧畬鏁�
             String[] attCable = depotConf.getCableRule().split("-");
-            int cableZ = Integer.valueOf(attCable[0]);
-            int cableY = Integer.valueOf(attCable[1]);
-            int cableX = Integer.valueOf(attCable[2]);
+            int cableZ = 1;
+            int cableY = 1;
+            int cableX = 1;
+
+            if(DepotType.TYPE_01.equals(depot.getDepotType())){
+                cableZ = Integer.valueOf(attCable[0]);
+                cableY = Integer.valueOf(attCable[1]);
+                cableX = Integer.valueOf(attCable[2]);
+            }else{
+                cableZ = Integer.valueOf(depotConf.getCableCir());
+                cableY = Integer.valueOf(attCable[0]);
+                cableX = 1;
+            }
             int sumPoint = cableZ * cableY * cableX;
 
             //鑾峰彇褰撳墠绮儏娓╁害鎶ユ枃
@@ -215,10 +228,26 @@
 
     private void analysisGrain2(DeviceSer ser, IoMessage message, ExeRequest exeRequest, DepotConf depotConf, DicSysConf sysConf, String batchId, String grainStr) {
         // 鑾峰彇瀹屾暣鐨勭伯鎯呭寘淇℃伅
+        Depot depot = commonService.getDepotById(depotConf.getCompanyId(),depotConf.getDepotId());
+        if (null == depot) {
+            String info = "绮儏瑙f瀽澶辫触:鍒嗘満=" + ser.getName() + "娌℃湁鑾峰彇鍒扮伯鎯呭弬鏁伴厤缃粨搴撱��";
+            log.error("鍒嗘満------>>>骞冲彴锛�" + info);
+            return;
+        }
         String[] attCable = depotConf.getCableRule().split("-");
-        int cableZ = Integer.valueOf(attCable[0]);
-        int cableY = Integer.valueOf(attCable[1]);
-        int cableX = Integer.valueOf(attCable[2]);
+        int cableZ = 1;
+        int cableY = 1;
+        int cableX = 1;
+
+        if(DepotType.TYPE_01.equals(depot.getDepotType())){
+            cableZ = Integer.valueOf(attCable[0]);
+            cableY = Integer.valueOf(attCable[1]);
+            cableX = Integer.valueOf(attCable[2]);
+        }else{
+            cableZ = Integer.valueOf(depotConf.getCableCir());
+            cableY = Integer.valueOf(attCable[0]);
+            cableX = 1;
+        }
 
         // 鏍规嵁灞傝鍒楄幏鍙栨寚瀹氶暱搴�
         int start = 4 * (depotConf.getCableStart() - ser.getCableStart())
@@ -275,7 +304,12 @@
     private void addPoint1(List<Double> temps,
                            DepotConf depotConf, DeviceSer ser, ExeRequest exeRequest,
                            THDto thDto, DicSysConf sysConf, String batchId) {
-
+        Depot depot = commonService.getDepotById(depotConf.getCompanyId(),depotConf.getDepotId());
+        if (null == depot) {
+            String info = "绮儏瑙f瀽澶辫触:鍒嗘満=" + ser.getName() + "娌℃湁鑾峰彇鍒扮伯鎯呭弬鏁伴厤缃粨搴撱��";
+            log.error("鍒嗘満------>>>骞冲彴锛�" + info);
+            return;
+        }
         //鏍规嵁鐢电紗璧峰鏂逛綅鍜屽竷绾挎柟鍚戯紝瀵圭伯鎯呮暟鎹繘琛岃皟鏁�
         if (null != depotConf.getStartOrientation()) {
             temps = reversalGrainPoint(temps, depotConf);
@@ -288,14 +322,26 @@
         }
 
         String[] attCable = depotConf.getCableRule().split("-");
-        int cableZ = Integer.valueOf(attCable[0]);
-        int cableY = Integer.valueOf(attCable[1]);
-        int cableX = Integer.valueOf(attCable[2]);
+        int cableZ = 1;
+        int cableY = 1;
+        int cableX = 1;
+
+        if(DepotType.TYPE_01.equals(depot.getDepotType())){
+            cableZ = Integer.valueOf(attCable[0]);
+            cableY = Integer.valueOf(attCable[1]);
+            cableX = Integer.valueOf(attCable[2]);
+        }else{
+            cableZ = Integer.valueOf(depotConf.getCableCir());
+            cableY = Integer.valueOf(attCable[0]);
+            cableX = 1;
+        }
+
 
         Grain grain = new Grain();
         grain.setDepotId(depotConf.getDepotId());
         grain.setCompanyId(depotConf.getCompanyId());
         grain.setCable(depotConf.getCableRule());
+        grain.setCableCir(depotConf.getCableCir());
         grain.setBatchId(batchId);
         grain.setTempIn(Constant.ERROR_TEMP);
         grain.setHumidityIn(Constant.ERROR_TEMP);
@@ -430,7 +476,7 @@
     private void analysisTh(IoMessage message) {
         try {
             THDto th = new THDto();
-            th.setCompanyId(ContextUtil.getDefaultCompanyId());
+            th.setCompanyId("5323");
             String data = message.getContent();
             String houseNo = data.substring(0, 2);
             String t = data.substring(4, 8);
diff --git a/igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/grainv1/server/BhznGrainV1SessionListener.java b/igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/grainv1/server/BhznGrainV1SessionListener.java
index dfba6d2..452fc16 100644
--- a/igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/grainv1/server/BhznGrainV1SessionListener.java
+++ b/igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/grainv1/server/BhznGrainV1SessionListener.java
@@ -1,9 +1,11 @@
 package com.ld.igds.protocol.bhzn.grainv1.server;
 
+import com.ld.igds.common.CoreCommonService;
 import com.ld.igds.common.CoreSerService;
 import com.ld.igds.constant.Constant;
 import com.ld.igds.models.DeviceSer;
 import com.ld.igds.util.ContextUtil;
+import com.ld.igds.view.service.DeviceSerService;
 import com.ld.io.api.IoSession;
 import com.ld.io.api.IoSessionListener;
 import lombok.extern.slf4j.Slf4j;
@@ -19,7 +21,6 @@
 
     @Autowired
     private CoreSerService coreSerService;
-
     /**
      * 璁惧鍒涘缓鍦ㄧ嚎锛岄渶瑕佹敞鎰忓綋鍓嶄娇鐢ㄤ富鏈烘ā寮忥紝涓绘満涓婄嚎榛樿鎵�鏈夌浉鍚孲N閰嶇疆鐨勫垎鏈哄叏閮ㄤ笂绾�
      *
@@ -37,10 +38,8 @@
         session.setBusinessKey(BhznGrainV1ServerUtils.getServerKey(session.getAddress(), session.getPort()));
 
         //椤圭洰閲囩敤鏃犵嚎涓绘満妯″紡锛岀洿鎺ヨ幏鍙栭粯璁よ澶�
-        DeviceSer deviceSer = coreSerService.getCacheSer(ContextUtil.getDefaultCompanyId(), BhznGrainV1ServerUtils.DEFAULT_MAC_ID);
-
+        DeviceSer deviceSer = coreSerService.getCacheSerBySn("5323", BhznGrainV1ServerUtils.DEFAULT_MAC_ID);
         if (null == deviceSer) return;
-
         coreSerService.onlineBySn(session.getAddress(), session.getPort(), deviceSer.getSn(), Constant.YN_Y);
         //鏇存柊缂撳瓨
         coreSerService.refreshCache(deviceSer.getCompanyId());
diff --git a/igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/inout/BHZNWeightServiceImpl.java b/igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/inout/BHZNWeightServiceImpl.java
index a8d4b86..bc8108e 100644
--- a/igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/inout/BHZNWeightServiceImpl.java
+++ b/igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/inout/BHZNWeightServiceImpl.java
@@ -131,7 +131,7 @@
         try{
             log.info("BHZN鎺у埗LED寮�濮�");
             BHZNClientEngine test = new BHZNClientEngine(
-                    "12.10.0.187", 58258);
+                    "192.168.0.210", 58258);
             test.start();
             Thread.sleep(3000L);
 
diff --git a/igds-protocol-block/src/main/java/com/ld/igds/protocol/quantity/shuhan/server/ShuhanServerEngine.java b/igds-protocol-block/src/main/java/com/ld/igds/protocol/quantity/shuhan/server/ShuhanServerEngine.java
index fe073c9..3891502 100644
--- a/igds-protocol-block/src/main/java/com/ld/igds/protocol/quantity/shuhan/server/ShuhanServerEngine.java
+++ b/igds-protocol-block/src/main/java/com/ld/igds/protocol/quantity/shuhan/server/ShuhanServerEngine.java
@@ -50,7 +50,7 @@
 
 		log.info("* ========================");
 		log.info("* ");
-		log.info("* 鏁伴噺鐩戞祴鏈嶅姟鍚姩锛岀鍙e彿={}", port);
+		log.info("* 铚�姹夋暟閲忕洃娴嬫湇鍔″惎鍔紝绔彛鍙�={}", port);
 		log.info("* ");
 		log.info("* ========================");
 
diff --git a/igds-protocol-fzzy3/src/main/java/com/ld/igds/protocol/fzzy/analysis/AnalysisGas.java b/igds-protocol-fzzy3/src/main/java/com/ld/igds/protocol/fzzy/analysis/AnalysisGas.java
index b62e2ba..a3274b1 100644
--- a/igds-protocol-fzzy3/src/main/java/com/ld/igds/protocol/fzzy/analysis/AnalysisGas.java
+++ b/igds-protocol-fzzy3/src/main/java/com/ld/igds/protocol/fzzy/analysis/AnalysisGas.java
@@ -48,8 +48,6 @@
     private CoreGasService gasService;
     @Autowired
     private CoreCommonService commonService;
-    @Autowired
-    private ExeOrderService exeOrderService;
 
     @Autowired
     private NotifyWebInvoker notifyInvoker;
diff --git a/igds-protocol-modbus/.rules b/igds-protocol-modbus/.rules
new file mode 100644
index 0000000..4f44b30
--- /dev/null
+++ b/igds-protocol-modbus/.rules
@@ -0,0 +1,1178 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<RuleSet version="1.1"><PackageInfos>
+<PackageInfo name="dorado-core" version="7.6.0.2.190128.1750"/>
+<PackageInfo name="bdf2-orm" version="2.1.0"/>
+<PackageInfo name="bdf2-core" version="2.0.9"/>
+<PackageInfo name="dorado-uploader" version="1.0.20-SNAPSHOT"/>
+<PackageInfo name="bdf2-job" version="2.0.5-SNAPSHOT"/>
+<PackageInfo name="dorado-intro" version="0.2.1.140715.2255"/>
+<PackageInfo name="bdf2-swfviewer" version="2.0.6-SNAPSHOT"/>
+<PackageInfo name="bdf2-export" version="2.0.8"/>
+<PackageInfo name="dorado-vidor"/></PackageInfos><Rule name="Auxiliary"><Children><Child rule="Import" name="Import"></Child><Child rule="GroupStart" name="GroupStart"></Child><Child rule="GroupEnd" name="GroupEnd"></Child><Child rule="PlaceHolder" name="PlaceHolder"></Child><Child rule="PlaceHolderStart" name="PlaceHolderStart"></Child><Child rule="PlaceHolderEnd" name="PlaceHolderEnd"></Child></Children></Rule><Rule name="Import" scope="public" sortFactor="9001" category="Auxiliary" icon="/com/bstek/dorado/idesupport/icons/Import.png"><PrimitiveProps>
+<Prop name="id"/>
+<Prop name="src"/></PrimitiveProps></Rule><Rule name="GroupStart" scope="public" sortFactor="9002" category="Auxiliary" icon="/com/bstek/dorado/idesupport/icons/GroupStart.png"><PrimitiveProps>
+<Prop name="id"/></PrimitiveProps></Rule><Rule name="GroupEnd" scope="public" sortFactor="9003" category="Auxiliary" icon="/com/bstek/dorado/idesupport/icons/GroupEnd.png"></Rule><Rule name="PlaceHolder" scope="public" sortFactor="9004" category="Auxiliary" icon="/com/bstek/dorado/idesupport/icons/PlaceHolder.png"><PrimitiveProps>
+<Prop name="id"/></PrimitiveProps></Rule><Rule name="PlaceHolderStart" parents="PlaceHolder" scope="public" sortFactor="9005" category="Auxiliary" icon="/com/bstek/dorado/idesupport/icons/PlaceHolderStart.png"></Rule><Rule name="PlaceHolderEnd" scope="public" sortFactor="9006" category="Auxiliary" icon="/com/bstek/dorado/idesupport/icons/PlaceHolderEnd.png"></Rule><Rule name="Model" icon="/com/bstek/dorado/view/manager/Model.png"><Children><Child rule="AbstractDataType" name="DataType" aggregated="true"></Child><Child rule="AbstractDataProvider" name="DataProvider" aggregated="true"></Child><Child rule="AbstractDataResolver" name="DataResolver" aggregated="true"></Child></Children></Rule><Rule name="AbstractDataType" abstract="true" nodeName="DataType" type="com.bstek.dorado.data.type.AbstractDataType"><PrimitiveProps>
+<Prop name="name"/></PrimitiveProps><Props>
+<Prop name="creationType" type="java.lang.Class"/>
+<Prop name="matchType" type="java.lang.Class"/><Prop name="metaData" type="java.util.Map" compositeType="Open"></Prop>
+<Prop name="tags"/></Props></Rule><Rule name="AbstractDataProvider" abstract="true" nodeName="DataProvider" type="com.bstek.dorado.data.provider.AbstractDataProvider"><PrimitiveProps>
+<Prop name="impl"/>
+<Prop name="parent"/>
+<Prop name="scope" enumValues="instant,thread,singleton,session,request"/>
+<Prop name="listener"/>
+<Prop name="overwrite" type="boolean"/>
+<Prop name="name"/></PrimitiveProps><Props>
+<Prop name="interceptor"/><Prop name="metaData" type="java.util.Map" compositeType="Open"></Prop>
+<Prop name="parameter" editor="pojo" type="java.lang.Object"/></Props></Rule><Rule name="AbstractDataResolver" abstract="true" nodeName="DataResolver" type="com.bstek.dorado.data.resolver.AbstractDataResolver"><PrimitiveProps>
+<Prop name="impl"/>
+<Prop name="parent"/>
+<Prop name="scope" enumValues="instant,thread,singleton,session,request"/>
+<Prop name="listener"/>
+<Prop name="overwrite" type="boolean"/>
+<Prop name="name"/></PrimitiveProps><Props>
+<Prop name="interceptor"/><Prop name="metaData" type="java.util.Map" compositeType="Open"></Prop>
+<Prop name="parameter" type="java.lang.Object"/></Props></Rule><Rule name="ViewConfig" label="ViewConfig" type="com.bstek.dorado.view.manager.ViewConfig" icon="/com/bstek/dorado/view/manager/ViewConfig.png"><PrimitiveProps>
+<Prop name="listener"/>
+<Prop name="template"/></PrimitiveProps><Props><Prop name="metaData" type="java.util.Map" compositeType="Open"></Prop>
+<Prop name="scope" defaultValue="thread" enumValues="instant,thread,singleton,session,request"/></Props><Children><Child name="Arguments"><Rule name="Arguments" nodeName="Arguments" icon="/com/bstek/dorado/view/manager/Arguments.png"><Children><Child name="Argument" aggregated="true"><Rule name="Argument" nodeName="Argument" icon="/com/bstek/dorado/view/manager/Argument.png"><PrimitiveProps>
+<Prop name="name"/></PrimitiveProps><Props>
+<Prop name="value" type="java.lang.Object"/></Props></Rule></Child></Children></Rule></Child><Child name="Context"><Rule name="Context" nodeName="Context" icon="/com/bstek/dorado/view/manager/ViewContext.png"><Children><Child name="Attribute" aggregated="true"><Rule name="Attribute" nodeName="Attribute" icon="/com/bstek/dorado/view/manager/Attribute.png"><PrimitiveProps>
+<Prop name="name"/></PrimitiveProps><Props>
+<Prop name="value" type="java.lang.Object"/></Props></Rule></Child></Children></Rule></Child><Child rule="Model" name="Model"></Child><Child rule="View" name="View"></Child></Children></Rule><Rule name="LayoutHolder"><Children><Child rule="AnchorLayout" name="anchor"></Child><Child rule="DockLayout" name="dock"></Child><Child rule="HboxLayout" name="hbox"></Child><Child rule="VboxLayout" name="vbox"></Child><Child rule="FormLayout" name="form"></Child><Child rule="NativeLayout" name="native"></Child></Children></Rule><Rule name="View" parents="Container" abstract="true" type="com.bstek.dorado.view.View" scope="private" clientTypes="desktop"><PrimitiveProps>
+<Prop name="listener"/></PrimitiveProps><Props><Prop name="cache" type="com.bstek.dorado.view.ViewCache" compositeType="Fixed">
+<Prop name="maxAge" type="long"/>
+<Prop name="mode" enumValues="none,clientSide"/></Prop>
+<Prop name="javaScriptFile"/>
+<Prop name="packages"/>
+<Prop name="pageTemplate"/>
+<Prop name="pageUri"/>
+<Prop name="renderMode" defaultValue="onCreate" enumValues="onCreate,onDataLoaded,manual"/>
+<Prop name="skin"/>
+<Prop name="styleSheetFile"/>
+<Prop name="title" highlight="1"/></Props><ClientEvents>
+<ClientEvent name="onLoadData" parameters="self,arg"/>
+<ClientEvent name="onComponentRegistered" parameters="self,arg"/>
+<ClientEvent name="onComponentUnregistered" parameters="self,arg"/></ClientEvents><Children><Child rule="Component" name="Children" aggregated="true"></Child></Children></Rule><Rule name="DataType" parents="EntityDataTypeSupport" label="DataType" type="com.bstek.dorado.data.type.DefaultEntityDataType" scope="public" sortFactor="1" robots="datatype-reflection|鑷姩鍒涘缓PropertyDefs" icon="/com/bstek/dorado/data/type/DefaultEntityDataType.png" reserve="default"><Children><Child rule="BasePropertyDef" name="PropertyDef" aggregated="true"></Child><Child rule="Reference" name="Reference" aggregated="true"></Child></Children></Rule><Rule name="NonAggregationDataType" parents="AbstractDataType" abstract="true" type="com.bstek.dorado.data.type.NonAggregationDataType"></Rule><Rule name="EntityDataTypeSupport" parents="NonAggregationDataType" abstract="true" nodeName="DataType" type="com.bstek.dorado.data.type.EntityDataTypeSupport"><PrimitiveProps>
+<Prop name="impl"/>
+<Prop name="parent"/>
+<Prop name="listener"/>
+<Prop name="overwrite" type="boolean"/></PrimitiveProps><Props>
+<Prop name="cachable" type="java.lang.Boolean"/>
+<Prop name="acceptUnknownProperty" type="boolean"/>
+<Prop name="acceptValidationState" defaultValue="ok" enumValues="info,ok,warn,error"/>
+<Prop name="autoCreatePropertyDefs" type="boolean"/>
+<Prop name="defaultDisplayProperty"/>
+<Prop name="userData" editor="any" type="java.lang.Object"/></Props><ClientEvents>
+<ClientEvent name="onEntityToText" parameters="self,arg"/>
+<ClientEvent name="onAttributeChange" parameters="self,arg"/>
+<ClientEvent name="beforeInsert" parameters="self,arg"/>
+<ClientEvent name="beforeDataChange" parameters="self,arg"/>
+<ClientEvent name="onDataChange" parameters="self,arg"/>
+<ClientEvent name="beforeCurrentChange" parameters="self,arg"/>
+<ClientEvent name="onCurrentChange" parameters="self,arg"/>
+<ClientEvent name="beforeStateChange" parameters="self,arg"/>
+<ClientEvent name="beforeRemove" parameters="self,arg"/>
+<ClientEvent name="onMessageChange" parameters="self,arg"/>
+<ClientEvent name="onStateChange" parameters="self,arg"/>
+<ClientEvent name="onRemove" parameters="self,arg"/>
+<ClientEvent name="onEntityLoad" parameters="self,arg"/>
+<ClientEvent name="onInsert" parameters="self,arg"/></ClientEvents></Rule><Rule name="BasePropertyDef" parents="com.bstek.dorado.data.type.property.PropertyDefSupport" label="PropertyDef" nodeName="PropertyDef" type="com.bstek.dorado.data.type.property.BasePropertyDef" scope="protected" icon="/com/bstek/dorado/data/type/property/BasePropertyDef.png"><Props>
+<Prop name="propertyPath"/></Props></Rule><Rule name="PropertyDef" abstract="true" type="com.bstek.dorado.data.type.property.PropertyDef"><PrimitiveProps>
+<Prop name="name"/></PrimitiveProps><Props>
+<Prop name="acceptUnknownMapKey" type="boolean"/>
+<Prop name="dataType" highlight="1" type="com.bstek.dorado.data.type.DataType"/>
+<Prop name="defaultValue" type="java.lang.Object"/>
+<Prop name="displayFormat"/>
+<Prop name="ignored" type="boolean"/>
+<Prop name="label" highlight="1"/><Prop name="mapping" type="com.bstek.dorado.data.type.property.Mapping" compositeType="Fixed">
+<Prop name="keyProperty"/>
+<Prop name="mapValues" editor="collection[pojo]" type="java.lang.Object"/>
+<Prop name="valueProperty"/></Prop><Prop name="metaData" type="java.util.Map" compositeType="Open"></Prop>
+<Prop name="readOnly" type="boolean"/>
+<Prop name="required" type="boolean"/>
+<Prop name="submittable" defaultValue="true" type="boolean"/>
+<Prop name="tags"/>
+<Prop name="userData" editor="any" type="java.lang.Object"/>
+<Prop name="visible" defaultValue="true" type="boolean"/></Props><ClientEvents>
+<ClientEvent name="onGet" parameters="self,arg"/>
+<ClientEvent name="onSet" parameters="self,arg"/>
+<ClientEvent name="onValidate" parameters="self,arg"/>
+<ClientEvent name="onGetText" parameters="self,arg"/></ClientEvents><Children><Child rule="Validator" name="Validators" aggregated="true"></Child></Children></Rule><Rule name="Validator" abstract="true" nodeName="Validator" type="com.bstek.dorado.data.type.validator.Validator" icon="/com/bstek/dorado/view/type/property/validator/Validator.png"><PrimitiveProps>
+<Prop name="name"/></PrimitiveProps></Rule><Rule name="Reference" parents="LazyPropertyDef" label="Reference" type="com.bstek.dorado.data.type.property.Reference" icon="/com/bstek/dorado/data/type/property/Reference.png"><Props>
+<Prop name="activeOnNewEntity" type="boolean"/>
+<Prop name="dataProvider" highlight="1" type="com.bstek.dorado.data.provider.DataProvider"/>
+<Prop name="pageSize" type="int"/>
+<Prop name="parameter" highlight="1" editor="pojo" type="java.lang.Object"/></Props><ClientEvents>
+<ClientEvent name="beforeLoadData" parameters="self,arg"/>
+<ClientEvent name="onLoadData" parameters="self,arg"/></ClientEvents></Rule><Rule name="PropertyDefSupport" parents="PropertyDef" abstract="true" type="com.bstek.dorado.data.type.property.PropertyDefSupport"></Rule><Rule name="LazyPropertyDef" parents="PropertyDefSupport" abstract="true" type="com.bstek.dorado.data.type.property.LazyPropertyDef"><Props>
+<Prop name="activeAtClient" defaultValue="true" type="boolean"/>
+<Prop name="cacheMode" enumValues="noCache,serverSide,clientSide,bothSides"/></Props></Rule><Rule name="com.bstek.dorado.data.type.property.PropertyDefSupport" parents="PropertyDef" abstract="true" type="com.bstek.dorado.data.type.property.PropertyDefSupport"></Rule><Rule name="DirectDataProvider" parents="AbstractDataProvider" label="DirectDataProvider" type="com.bstek.dorado.data.provider.DirectDataProvider" scope="public" sortFactor="2" icon="/com/bstek/dorado/data/provider/DirectDataProvider.png" reserve="direct"><PrimitiveProps>
+<Prop name="type" defaultValue="direct" fixed="true" visible="false"/></PrimitiveProps><Props>
+<Prop name="result" editor="pojo" type="java.lang.Object"/></Props></Rule><Rule name="DirectDataResolver" parents="AbstractDataResolver" label="DirectDataResolver" type="com.bstek.dorado.data.resolver.DirectDataResolver" scope="public" sortFactor="3" icon="/com/bstek/dorado/data/resolver/DirectDataResolver.png" reserve="direct"><PrimitiveProps>
+<Prop name="type" defaultValue="direct" fixed="true" visible="false"/></PrimitiveProps></Rule><Rule name="AbstractValidator" parents="Validator" abstract="true" nodeName="Validator" type="com.bstek.dorado.view.type.property.validator.AbstractValidator" icon="/com/bstek/dorado/view/type/property/validator/Validator.png"><Props>
+<Prop name="name"/>
+<Prop name="defaultResultState" defaultValue="error" enumValues="info,ok,warn,error"/>
+<Prop name="revalidateOldValue" defaultValue="true" type="boolean"/>
+<Prop name="runAt" enumValues="server,client,both"/></Props></Rule><Rule name="RequiredValidator" parents="BaseValidator" label="RequiredValidator" type="com.bstek.dorado.view.type.property.validator.RequiredValidator" scope="public" sortFactor="4" reserve="required"><PrimitiveProps>
+<Prop name="type" defaultValue="required" fixed="true" visible="false"/></PrimitiveProps><Props>
+<Prop name="acceptZeroOrFalse" type="boolean"/>
+<Prop name="trimBeforeValid" defaultValue="true" type="boolean"/></Props></Rule><Rule name="BaseValidator" parents="AbstractValidator" abstract="true" type="com.bstek.dorado.view.type.property.validator.BaseValidator"><Props>
+<Prop name="resultMessage"/></Props></Rule><Rule name="LengthValidator" parents="BaseValidator" label="LengthValidator" type="com.bstek.dorado.view.type.property.validator.LengthValidator" scope="public" sortFactor="5" reserve="length"><PrimitiveProps>
+<Prop name="type" defaultValue="length" fixed="true" visible="false"/></PrimitiveProps><Props>
+<Prop name="maxLength" defaultValue="-1" type="int"/>
+<Prop name="minLength" defaultValue="-1" type="int"/></Props></Rule><Rule name="CharLengthValidator" parents="BaseValidator" label="CharLengthValidator" type="com.bstek.dorado.view.type.property.validator.CharLengthValidator" scope="public" sortFactor="6" reserve="charLength"><PrimitiveProps>
+<Prop name="type" defaultValue="charLength" fixed="true" visible="false"/></PrimitiveProps><Props>
+<Prop name="maxLength" type="int"/>
+<Prop name="minLength" type="int"/></Props></Rule><Rule name="RangeValidator" parents="BaseValidator" label="RangeValidator" type="com.bstek.dorado.view.type.property.validator.RangeValidator" scope="public" sortFactor="7" reserve="range"><PrimitiveProps>
+<Prop name="type" defaultValue="range" fixed="true" visible="false"/></PrimitiveProps><Props>
+<Prop name="maxValue" defaultValue="-1" type="double"/>
+<Prop name="maxValueValidateMode" defaultValue="ignore" enumValues="allowEquals,notAllowEquals,ignore"/>
+<Prop name="minValue" defaultValue="-1" type="double"/>
+<Prop name="minValueValidateMode" defaultValue="ignore" enumValues="allowEquals,notAllowEquals,ignore"/></Props></Rule><Rule name="EnumValidator" parents="BaseValidator" label="EnumValidator" type="com.bstek.dorado.view.type.property.validator.EnumValidator" scope="public" sortFactor="8" reserve="enum"><PrimitiveProps>
+<Prop name="type" defaultValue="enum" fixed="true" visible="false"/></PrimitiveProps><Props>
+<Prop name="enumValues" highlight="1" editor="collection[value]" type="java.util.List"/></Props></Rule><Rule name="RegExpValidator" parents="BaseValidator" label="RegExpValidator" type="com.bstek.dorado.view.type.property.validator.RegExpValidator" scope="public" sortFactor="9" reserve="regExp"><PrimitiveProps>
+<Prop name="type" defaultValue="regExp" fixed="true" visible="false"/></PrimitiveProps><Props>
+<Prop name="blackRegExp"/>
+<Prop name="validateMode" enumValues="whiteBlack,blackWhite"/>
+<Prop name="whiteRegExp"/></Props></Rule><Rule name="AjaxValidator" parents="AbstractAjaxValidator" label="AjaxValidator" type="com.bstek.dorado.view.type.property.validator.AjaxValidator" scope="public" sortFactor="10" reserve="ajax"><PrimitiveProps>
+<Prop name="type" defaultValue="ajax" fixed="true" visible="false"/></PrimitiveProps><Props>
+<Prop name="ajaxAction" reference="AjaxAction:id"/>
+<Prop name="service" highlight="1"/></Props><ClientEvents>
+<ClientEvent name="beforeExecute" parameters="self,arg"/></ClientEvents></Rule><Rule name="AbstractAjaxValidator" parents="AbstractValidator" abstract="true" type="com.bstek.dorado.view.type.property.validator.AbstractAjaxValidator"><Props>
+<Prop name="async" defaultValue="true" type="boolean"/>
+<Prop name="executingMessage"/></Props></Rule><Rule name="CustomValidator" parents="AbstractValidator" label="CustomValidator" type="com.bstek.dorado.view.type.property.validator.CustomValidator" scope="public" sortFactor="11" reserve="custom"><PrimitiveProps>
+<Prop name="type" defaultValue="custom" fixed="true" visible="false"/></PrimitiveProps><ClientEvents>
+<ClientEvent name="onValidate" parameters="self,arg"/></ClientEvents></Rule><Rule name="AnchorLayout" parents="Layout" label="AnchorLayout" nodeName="anchor" type="com.bstek.dorado.view.widget.layout.AnchorLayout" sortFactor="1001"></Rule><Rule name="Layout" abstract="true" type="com.bstek.dorado.view.widget.layout.Layout"><Props>
+<Prop name="className"/>
+<Prop name="padding" type="int"/></Props></Rule><Rule name="AnchorLayoutConstraint" parents="LayoutConstraintSupport" label="AnchorLayoutConstraint" type="com.bstek.dorado.view.widget.layout.AnchorLayoutConstraint"><Props>
+<Prop name="anchorBottom" enumValues="auto,none,container,previous"/>
+<Prop name="anchorLeft" enumValues="auto,none,container,previous"/>
+<Prop name="anchorRight" enumValues="auto,none,container,previous"/>
+<Prop name="anchorTop" enumValues="auto,none,container,previous"/>
+<Prop name="bottom"/>
+<Prop name="heightOffset" type="int"/>
+<Prop name="left"/>
+<Prop name="leftOffset" type="int"/>
+<Prop name="right"/>
+<Prop name="top"/>
+<Prop name="topOffset" type="int"/>
+<Prop name="widthOffset" type="int"/></Props></Rule><Rule name="LayoutConstraintSupport" abstract="true" type="com.bstek.dorado.view.widget.layout.LayoutConstraintSupport"><Props>
+<Prop name="padding" type="int"/></Props></Rule><Rule name="DockLayout" parents="Layout" label="DockLayout" nodeName="dock" type="com.bstek.dorado.view.widget.layout.DockLayout" sortFactor="1002"><Props>
+<Prop name="regionPadding" type="int"/></Props></Rule><Rule name="DockLayoutConstraint" parents="LayoutConstraintSupport" label="DockLayoutConstraint" type="com.bstek.dorado.view.widget.layout.DockLayoutConstraint"><Props>
+<Prop name="type" highlight="1" enumValues="left,top,right,bottom,center"/></Props></Rule><Rule name="HboxLayout" parents="AbstractBoxLayout" label="HBoxLayout" nodeName="hbox" type="com.bstek.dorado.view.widget.layout.HBoxLayout" sortFactor="1003"><Props>
+<Prop name="align" defaultValue="center" enumValues="top,center,bottom"/></Props></Rule><Rule name="AbstractBoxLayout" parents="Layout" abstract="true" type="com.bstek.dorado.view.widget.layout.AbstractBoxLayout"><Props>
+<Prop name="pack" defaultValue="start" enumValues="start,center,end"/>
+<Prop name="padding" defaultValue="2" type="int"/>
+<Prop name="regionPadding" defaultValue="2" type="int"/>
+<Prop name="stretch" defaultValue="true" type="boolean"/></Props></Rule><Rule name="HboxLayoutConstraint" parents="LayoutConstraintSupport" label="HBoxLayoutConstraintSupport" type="com.bstek.dorado.view.widget.layout.HBoxLayoutConstraintSupport"><Props>
+<Prop name="align" defaultValue="center" enumValues="top,center,bottom"/></Props></Rule><Rule name="VboxLayout" parents="AbstractBoxLayout" label="VBoxLayout" nodeName="vbox" type="com.bstek.dorado.view.widget.layout.VBoxLayout" sortFactor="1004"><Props>
+<Prop name="align" defaultValue="left" enumValues="left,center,right"/>
+<Prop name="lazyRenderChild" type="boolean"/></Props></Rule><Rule name="VboxLayoutConstraint" parents="LayoutConstraintSupport" label="VBoxLayoutConstraintSupport" type="com.bstek.dorado.view.widget.layout.VBoxLayoutConstraintSupport"><Props>
+<Prop name="align" defaultValue="left" enumValues="left,center,right"/></Props></Rule><Rule name="FormLayout" parents="Layout" label="FormLayout" nodeName="form" type="com.bstek.dorado.view.widget.layout.FormLayout" sortFactor="1005"><Props>
+<Prop name="colPadding" defaultValue="6" type="int"/>
+<Prop name="cols" highlight="1"/>
+<Prop name="padding" defaultValue="8" type="int"/>
+<Prop name="rowHeight" type="int"/>
+<Prop name="rowPadding" defaultValue="6" type="int"/>
+<Prop name="stretchWidth" type="boolean"/></Props></Rule><Rule name="FormLayoutConstraint" parents="LayoutConstraintSupport" label="FormLayoutConstraint" type="com.bstek.dorado.view.widget.layout.FormLayoutConstraint"><Props>
+<Prop name="align" defaultValue="left" enumValues="left,center,right"/>
+<Prop name="colSpan" type="int"/>
+<Prop name="rowSpan" type="int"/>
+<Prop name="vAlign" defaultValue="top" enumValues="top,center,bottom"/></Props></Rule><Rule name="NativeLayout" parents="Layout" label="NativeLayout" nodeName="native" type="com.bstek.dorado.view.widget.layout.NativeLayout" sortFactor="1006"><Props>
+<Prop name="lazyRenderChild" type="boolean"/>
+<Prop name="style"/></Props></Rule><Rule name="NativeLayoutConstraint" parents="HashMap" label="CommonLayoutConstraint" type="com.bstek.dorado.view.widget.layout.CommonLayoutConstraint"></Rule><Rule name="AbstractMap" abstract="true" type="java.util.AbstractMap"></Rule><Rule name="HashMap" parents="AbstractMap" label="HashMap" type="java.util.HashMap"></Rule><Rule name="DataSet" parents="Component" label="DataSet" nodeName="DataSet" type="com.bstek.dorado.view.widget.data.DataSet" sortFactor="2001" category="General" icon="/com/bstek/dorado/view/widget/data/DataSet.png" autoGenerateId="true" clientTypes="desktop,touch"><PrimitiveProps>
+<Prop name="listener"/></PrimitiveProps><Props>
+<Prop name="cacheable" type="boolean"/>
+<Prop name="dataProvider" highlight="1" type="com.bstek.dorado.data.provider.DataProvider"/>
+<Prop name="dataType" highlight="1" type="com.bstek.dorado.data.type.DataType"/>
+<Prop name="loadMode" defaultValue="lazy" enumValues="preload,onCreate,onReady,lazy,manual"/>
+<Prop name="pageSize" type="int"/>
+<Prop name="parameter" highlight="1" editor="any" type="java.lang.Object"/>
+<Prop name="readOnly" type="boolean"/></Props><ClientEvents>
+<ClientEvent name="onLoadData" parameters="self,arg"/>
+<ClientEvent name="beforeLoadData" parameters="self,arg"/>
+<ClientEvent name="onDataLoad" parameters="self,arg" deprecated="true"/></ClientEvents></Rule><Rule name="Control" parents="com.bstek.dorado.view.widget.Control" label="Control" nodeName="Control" type="com.bstek.dorado.view.widget.DefaultControl" sortFactor="2002" category="General" clientTypes="desktop,touch"></Rule><Rule name="Container" parents="com.bstek.dorado.view.widget.Control" label="Container" type="com.bstek.dorado.view.widget.Container" sortFactor="2003" category="General" icon="/com/bstek/dorado/view/widget/Container.png" clientTypes="desktop,touch"><PrimitiveProps>
+<Prop name="listener"/></PrimitiveProps><Props>
+<Prop name="containerUi" defaultValue="default" enumValues="default,optional1"/>
+<Prop name="contentOverflow" enumValues="visible,hidden,scroll,auto"/>
+<Prop name="contentOverflowX" enumValues="visible,hidden,scroll,auto"/>
+<Prop name="contentOverflowY" enumValues="visible,hidden,scroll,auto"/>
+<Prop name="layout" visible="false" type="com.bstek.dorado.view.widget.layout.Layout"/></Props><Children><Child rule="Component" name="Children" aggregated="true"></Child></Children></Rule><Rule name="HtmlContainer" parents="Container" label="HtmlContainer" type="com.bstek.dorado.view.widget.HtmlContainer" sortFactor="2004" category="General" icon="/com/bstek/dorado/view/widget/HtmlContainer.png" clientTypes="desktop,touch"><Props>
+<Prop name="containerExpression"/>
+<Prop name="content" editor="multiLines"/>
+<Prop name="contentFile"/></Props></Rule><Rule name="SubViewHolder" parents="com.bstek.dorado.view.widget.Control" label="SubViewHolder" type="com.bstek.dorado.view.widget.SubViewHolder" sortFactor="2005" category="General" icon="/com/bstek/dorado/view/widget/SubViewHolder.png" clientTypes="desktop,touch"><Props><Prop name="context" type="java.util.Map" compositeType="Open"></Prop>
+<Prop name="loadMode" enumValues="preload,lazy,manual"/>
+<Prop name="subView"/></Props><ClientEvents>
+<ClientEvent name="beforeLoad" parameters="self,arg"/>
+<ClientEvent name="onLoad" parameters="self,arg"/>
+<ClientEvent name="onLoadFailure" parameters="self,arg"/></ClientEvents></Rule><Rule name="Action" parents="Component" label="Action" type="com.bstek.dorado.view.widget.action.Action" sortFactor="2006" category="Action" icon="/com/bstek/dorado/view/widget/action/Action.png" autoGenerateId="true" clientTypes="desktop,touch"><Props>
+<Prop name="caption"/>
+<Prop name="confirmMessage"/>
+<Prop name="disabled" type="boolean"/>
+<Prop name="hotkey" enumValues="f1,f2,ctrl+s,alt+s,shift+s,ctrl+alt+shift+s,return,space,backspace,left,right,up,down"/>
+<Prop name="icon"/>
+<Prop name="iconClass"/>
+<Prop name="parameter" editor="any" type="java.lang.Object"/>
+<Prop name="successMessage"/>
+<Prop name="tip"/></Props><ClientEvents>
+<ClientEvent name="onExecute" parameters="self,arg"/>
+<ClientEvent name="beforeExecute" parameters="self,arg"/>
+<ClientEvent name="onFailure" parameters="self,arg"/>
+<ClientEvent name="onSuccess" parameters="self,arg"/></ClientEvents></Rule><Rule name="AjaxAction" parents="AsyncAction" label="AjaxAction" type="com.bstek.dorado.view.widget.action.AjaxAction" sortFactor="2007" category="Action" icon="/com/bstek/dorado/view/widget/action/AjaxAction.png" autoGenerateId="true" clientTypes="desktop,touch"><Props>
+<Prop name="batchable" defaultValue="true" type="boolean"/>
+<Prop name="service" highlight="1"/>
+<Prop name="supportsEntity" defaultValue="true" type="boolean"/>
+<Prop name="timeout" type="long"/></Props></Rule><Rule name="UpdateAction" parents="AsyncAction" label="UpdateAction" type="com.bstek.dorado.view.widget.action.UpdateAction" sortFactor="2008" category="Action" icon="/com/bstek/dorado/view/widget/action/UpdateAction.png" autoGenerateId="true" clientTypes="desktop,touch"><Props>
+<Prop name="alwaysExecute" type="boolean"/>
+<Prop name="dataResolver" highlight="1" type="com.bstek.dorado.data.resolver.DataResolver"/>
+<Prop name="executingMessage"/></Props><ClientEvents>
+<ClientEvent name="onGetUpdateData" parameters="self,arg"/></ClientEvents><Children><Child rule="UpdateItem" name="UpdateItems" aggregated="true"></Child></Children></Rule><Rule name="FormSubmitAction" parents="Action" label="FormSubmitAction" type="com.bstek.dorado.view.widget.action.FormSubmitAction" sortFactor="2009" category="Action" icon="/com/bstek/dorado/view/widget/action/FormSubmitAction.png" autoGenerateId="true" clientTypes="desktop,touch"><Props>
+<Prop name="action"/>
+<Prop name="method" defaultValue="post" enumValues="post,get"/>
+<Prop name="target"/></Props></Rule><Rule name="LongTask" parents="Action" label="LongTask" type="com.bstek.dorado.view.widget.action.LongTask" sortFactor="2010" category="Action" autoGenerateId="true" clientTypes="desktop,touch"><Props>
+<Prop name="appearence" defaultValue="daemonTask" enumValues="none,daemonTask,mainTask"/>
+<Prop name="disableOnActive" defaultValue="true" type="boolean"/>
+<Prop name="taskName" highlight="1"/></Props><ClientEvents>
+<ClientEvent name="onTaskScheduled" parameters="self,arg"/>
+<ClientEvent name="onTaskEnd" parameters="self,arg"/>
+<ClientEvent name="onLog" parameters="self,arg"/>
+<ClientEvent name="onStateChange" parameters="self,arg"/></ClientEvents></Rule><Rule name="Button" parents="AbstractButton" label="Button" type="com.bstek.dorado.view.widget.base.Button" sortFactor="2011" category="General" icon="/com/bstek/dorado/view/widget/base/Button.png" clientTypes="desktop"><Props>
+<Prop name="caption" highlight="1"/>
+<Prop name="height" visible="false"/>
+<Prop name="icon"/>
+<Prop name="iconClass"/>
+<Prop name="showTrigger" type="boolean"/>
+<Prop name="splitButton" type="boolean"/>
+<Prop name="triggerToggled" type="boolean"/></Props><ClientEvents>
+<ClientEvent name="onTriggerClick" parameters="self,arg"/></ClientEvents></Rule><Rule name="SimpleButton" parents="AbstractButton" label="SimpleButton" type="com.bstek.dorado.view.widget.base.SimpleButton" sortFactor="2012" category="General" icon="/com/bstek/dorado/view/widget/base/SimpleButton.png" clientTypes="desktop,touch"><Props>
+<Prop name="disabledClassName"/>
+<Prop name="hoverClassName"/>
+<Prop name="mouseDownClassName"/>
+<Prop name="toggledClassName"/></Props></Rule><Rule name="SimpleIconButton" parents="SimpleButton" label="SimpleIconButton" type="com.bstek.dorado.view.widget.base.SimpleIconButton" sortFactor="2013" category="General" icon="/com/bstek/dorado/view/widget/base/SimpleIconButton.png" clientTypes="desktop,touch"><Props>
+<Prop name="icon" highlight="1"/>
+<Prop name="iconClass"/>
+<Prop name="showTrigger" type="boolean"/></Props></Rule><Rule name="Panel" parents="AbstractPanel" label="Panel" type="com.bstek.dorado.view.widget.base.Panel" sortFactor="2014" category="General" icon="/com/bstek/dorado/view/widget/base/Panel.png" clientTypes="desktop"><Props>
+<Prop name="background"/>
+<Prop name="border" defaultValue="normal" enumValues="none,normal,curve" deprecated="true"/>
+<Prop name="closeAction" defaultValue="hide" enumValues="hide,close"/>
+<Prop name="closeable" type="boolean"/>
+<Prop name="collapseable" defaultValue="false" type="boolean"/>
+<Prop name="icon"/>
+<Prop name="iconClass"/>
+<Prop name="maximizeable" type="boolean"/>
+<Prop name="maximized" type="boolean"/>
+<Prop name="showCaptionBar" type="java.lang.Boolean"/></Props><ClientEvents>
+<ClientEvent name="onMaximize" parameters="self,arg"/>
+<ClientEvent name="beforeMaximize" parameters="self,arg"/></ClientEvents><Children><Child name="Tools" fixed="true"><Rule name="Wrapper.Tools" label="Tools" nodeName="Tools" icon="/com/bstek/dorado/view/widget/base/Tools.png"><Children><Child rule="SimpleIconButton" name="Tools" aggregated="true"></Child></Children></Rule></Child></Children></Rule><Rule name="GroupBox" parents="AbstractPanel" label="GroupBox" type="com.bstek.dorado.view.widget.base.GroupBox" sortFactor="2015" category="General" icon="/com/bstek/dorado/view/widget/base/GroupBox.png" clientTypes="desktop"></Rule><Rule name="FieldSet" parents="AbstractPanel" label="FieldSet" type="com.bstek.dorado.view.widget.base.FieldSet" sortFactor="2016" category="General" icon="/com/bstek/dorado/view/widget/base/FieldSet.png" clientTypes="desktop"></Rule><Rule name="IFrame" parents="com.bstek.dorado.view.widget.Control" label="IFrame" type="com.bstek.dorado.view.widget.base.IFrame" sortFactor="2017" category="General" icon="/com/bstek/dorado/view/widget/base/IFrame.png" clientTypes="desktop,touch"><Props>
+<Prop name="name"/>
+<Prop name="path"/></Props><ClientEvents>
+<ClientEvent name="onLoad" parameters="self,arg"/></ClientEvents></Rule><Rule name="CardBook" parents="com.bstek.dorado.view.widget.Control" label="CardBook" type="com.bstek.dorado.view.widget.base.CardBook" sortFactor="2018" category="General" icon="/com/bstek/dorado/view/widget/base/CardBook.png" clientTypes="desktop,touch"><Props>
+<Prop name="currentControl" deprecated="true" visible="false" type="int"/>
+<Prop name="currentIndex" type="int"/>
+<Prop name="dynaHeight" defaultValue="false" type="boolean"/></Props><ClientEvents>
+<ClientEvent name="beforeCurrentChange" parameters="self,arg"/>
+<ClientEvent name="onCurrentChange" parameters="self,arg"/></ClientEvents><Children><Child rule="com.bstek.dorado.view.widget.Control" name="Controls" aggregated="true"></Child></Children></Rule><Rule name="TabControl" parents="TabBar" label="TabControl" type="com.bstek.dorado.view.widget.base.tab.TabControl" sortFactor="2019" category="General" icon="/com/bstek/dorado/view/widget/base/tab/TabControl.png" clientTypes="desktop"><Props>
+<Prop name="dynaHeight" defaultValue="false" type="boolean"/></Props><Children><Child rule="ControlTab" name="ControlTab" aggregated="true"></Child><Child rule="IFrameTab" name="IFrameTab" aggregated="true"></Child></Children></Rule><Rule name="VerticalTabControl" parents="TabColumn" label="VerticalTabControl" type="com.bstek.dorado.view.widget.base.tab.VerticalTabControl" sortFactor="2020" category="General" icon="/com/bstek/dorado/view/widget/base/tab/VerticalTabControl.png" clientTypes="desktop"><Props>
+<Prop name="tabColumnWidth" defaultValue="200" type="int"/></Props><Children><Child rule="ControlTab" name="ControlTab" aggregated="true"></Child><Child rule="IFrameTab" name="IFrameTab" aggregated="true"></Child></Children></Rule><Rule name="TabBar" parents="AbstractTabControl" label="TabBar" type="com.bstek.dorado.view.widget.base.tab.TabBar" sortFactor="2021" category="General" icon="/com/bstek/dorado/view/widget/base/tab/TabBar.png" clientTypes="desktop"><Props>
+<Prop name="showMenuButton" type="boolean"/>
+<Prop name="tabMinWidth" type="int"/>
+<Prop name="tabPlacement" defaultValue="top" enumValues="top,bottom"/></Props><Children><Child rule="Tab" name="Tab" aggregated="true" public="false"></Child></Children></Rule><Rule name="TabColumn" parents="AbstractTabControl" label="TabColumn" type="com.bstek.dorado.view.widget.base.tab.TabColumn" sortFactor="2022" category="General" icon="/com/bstek/dorado/view/widget/base/tab/TabColumn.png" clientTypes="desktop"><Props>
+<Prop name="tabPlacement" defaultValue="left" enumValues="left,right"/>
+<Prop name="verticalText" type="boolean"/></Props><Children><Child rule="Tab" name="Tab" aggregated="true" public="false"></Child></Children></Rule><Rule name="ToolBar" parents="com.bstek.dorado.view.widget.Control" label="ToolBar" type="com.bstek.dorado.view.widget.base.toolbar.ToolBar" sortFactor="2023" category="General" icon="/com/bstek/dorado/view/widget/base/toolbar/ToolBar.png" clientTypes="desktop"><Props>
+<Prop name="fixRight" type="boolean"/>
+<Prop name="height" visible="false"/>
+<Prop name="showMenuOnHover" defaultValue="false" type="boolean"/></Props><Children><Child rule="com.bstek.dorado.view.widget.base.toolbar.Label" name="ToolBarLabel" aggregated="true"></Child><Child rule="MenuButton" name="MenuButton" aggregated="true"></Child><Child rule="Fill" name="Fill" aggregated="true"></Child><Child rule="com.bstek.dorado.view.widget.base.toolbar.Button" name="ToolBarButton" aggregated="true"></Child><Child rule="com.bstek.dorado.view.widget.base.toolbar.Separator" name="Separator" aggregated="true"></Child><Child rule="com.bstek.dorado.view.widget.Control" name="Items" aggregated="true"></Child></Children></Rule><Rule name="SplitPanel" parents="com.bstek.dorado.view.widget.Control" label="SplitPanel" type="com.bstek.dorado.view.widget.base.SplitPanel" sortFactor="2024" category="General" icon="/com/bstek/dorado/view/widget/base/SplitPanel.png" clientTypes="desktop"><Props>
+<Prop name="animate" type="java.lang.Boolean"/>
+<Prop name="collapseBothSide" defaultValue="false" type="boolean"/>
+<Prop name="collapseable" defaultValue="true" type="boolean"/>
+<Prop name="collapsed" type="boolean"/>
+<Prop name="direction" defaultValue="left" highlight="1" enumValues="left,top,right,bottom"/>
+<Prop name="maxPosition" type="int"/>
+<Prop name="minPosition" type="int"/>
+<Prop name="openPreviewOnHover" defaultValue="false" type="boolean"/>
+<Prop name="position" defaultValue="100" highlight="1"/>
+<Prop name="previewable" type="boolean"/>
+<Prop name="resizeable" defaultValue="true" type="boolean"/></Props><ClientEvents>
+<ClientEvent name="onCollapsedChange" parameters="self,arg"/>
+<ClientEvent name="beforeCollapsedChange" parameters="self,arg"/></ClientEvents><Children><Child name="MainControl" fixed="true"><Rule name="Wrapper.MainControl" label="MainControl" nodeName="MainControl" icon="/com/bstek/dorado/view/widget/base/MainControl.png"><Children><Child rule="com.bstek.dorado.view.widget.Control" name="MainControl"></Child></Children></Rule></Child><Child name="SideControl" fixed="true"><Rule name="Wrapper.SideControl" label="SideControl" nodeName="SideControl" icon="/com/bstek/dorado/view/widget/base/SideControl.png"><Children><Child rule="com.bstek.dorado.view.widget.Control" name="SideControl"></Child></Children></Rule></Child></Children></Rule><Rule name="Accordion" parents="com.bstek.dorado.view.widget.Control" label="Accordion" type="com.bstek.dorado.view.widget.base.accordion.Accordion" sortFactor="2025" category="General" icon="/com/bstek/dorado/view/widget/base/accordion/Accordion.png" clientTypes="desktop"><Props>
+<Prop name="animate" type="java.lang.Boolean"/>
+<Prop name="currentSection" type="int"/>
+<Prop name="dynaHeight" defaultValue="false" type="boolean"/></Props><ClientEvents>
+<ClientEvent name="beforeCurrentSectionChange" parameters="self,arg"/>
+<ClientEvent name="onCurrentSectionChange" parameters="self,arg"/></ClientEvents><Children><Child rule="Section" name="Sections" aggregated="true"></Child></Children></Rule><Rule name="Slider" parents="com.bstek.dorado.view.widget.Control" label="Slider" type="com.bstek.dorado.view.widget.base.Slider" sortFactor="2026" category="General" icon="/com/bstek/dorado/view/widget/base/Slider.png" clientTypes="desktop"><Props>
+<Prop name="maxValue" defaultValue="100" type="float"/>
+<Prop name="minValue" type="float"/>
+<Prop name="orientation" defaultValue="horizental" enumValues="horizontal,horizontal,vertical"/>
+<Prop name="precision" type="int"/>
+<Prop name="step" type="float"/>
+<Prop name="value" type="float"/></Props><ClientEvents>
+<ClientEvent name="onValueChange" parameters="self,arg"/>
+<ClientEvent name="beforeValueChange" parameters="self,arg"/></ClientEvents></Rule><Rule name="ProgressBar" parents="AbstractPropertyDataControl" label="ProgressBar" type="com.bstek.dorado.view.widget.base.ProgressBar" sortFactor="2027" category="General" icon="/com/bstek/dorado/view/widget/base/ProgressBar.png" clientTypes="desktop,touch"><Props>
+<Prop name="effectEnable" type="boolean"/>
+<Prop name="maxValue" defaultValue="100" type="float"/>
+<Prop name="minValue" type="float"/>
+<Prop name="showText" defaultValue="true" type="boolean"/>
+<Prop name="textPattern" defaultValue="{percent}%"/>
+<Prop name="value"/></Props></Rule><Rule name="Tip" parents="com.bstek.dorado.view.widget.Control,FloatControl" label="Tip" type="com.bstek.dorado.view.widget.base.Tip" sortFactor="2028" category="Floatable" icon="/com/bstek/dorado/view/widget/base/Tip.png" clientTypes="desktop,touch"><Props>
+<Prop name="align" enumValues="left,innerleft,center,innerright,top" visible="false"/>
+<Prop name="anchorTarget" visible="false"/>
+<Prop name="animateTarget" visible="false"/>
+<Prop name="animateType" defaultValue="fade" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
+<Prop name="arrowAlign" defaultValue="center" enumValues="center,top,right,bottom,left"/>
+<Prop name="arrowDirection" defaultValue="none" enumValues="top,right,bottom,left,none"/>
+<Prop name="arrowOffset" type="int"/>
+<Prop name="autoAdjustPosition" defaultValue="true" type="boolean"/>
+<Prop name="caption"/>
+<Prop name="center" type="boolean"/>
+<Prop name="closeable" type="boolean"/>
+<Prop name="content" type="java.lang.Object"/>
+<Prop name="continuedFocus" defaultValue="true" type="boolean"/>
+<Prop name="floating" defaultValue="true" type="boolean"/>
+<Prop name="floatingClassName"/>
+<Prop name="focusAfterShow" defaultValue="false" type="boolean"/>
+<Prop name="handleOverflow" defaultValue="true" visible="false" type="boolean"/>
+<Prop name="hideAnimateType" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
+<Prop name="icon" enumValues="INFO,WARNING,ERROR,QUESTION"/>
+<Prop name="left" type="int"/>
+<Prop name="modal" type="boolean"/>
+<Prop name="modalType" enumValues="dark,transparent"/>
+<Prop name="offsetLeft" type="int"/>
+<Prop name="offsetTop" type="int"/>
+<Prop name="shadowMode" defaultValue="drop" enumValues="drop,sides,frame,none"/>
+<Prop name="showAnimateType" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
+<Prop name="showDuration" type="int"/>
+<Prop name="text" editor="multilines"/>
+<Prop name="top" type="int"/>
+<Prop name="vAlign" enumValues="top,innertop,center,innerbottom,bottom" visible="false"/>
+<Prop name="visible" type="java.lang.Boolean"/></Props><ClientEvents>
+<ClientEvent name="onClose" parameters="self,arg"/>
+<ClientEvent name="onShow" parameters="self,arg"/>
+<ClientEvent name="beforeHide" parameters="self,arg"/>
+<ClientEvent name="beforeClose" parameters="self,arg"/>
+<ClientEvent name="beforeShow" parameters="self,arg"/>
+<ClientEvent name="onHide" parameters="self,arg"/></ClientEvents></Rule><Rule name="FloatContainer" parents="Container,FloatControl" label="FloatContainer" type="com.bstek.dorado.view.widget.base.FloatContainer" sortFactor="2029" category="Floatable" icon="/com/bstek/dorado/view/widget/base/FloatContainer.png" clientTypes="desktop,touch"><Props>
+<Prop name="align" enumValues="left,innerleft,center,innerright,top" visible="false"/>
+<Prop name="anchorTarget" visible="false"/>
+<Prop name="animateTarget" visible="false"/>
+<Prop name="animateType" defaultValue="zoom" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
+<Prop name="autoAdjustPosition" defaultValue="true" type="boolean"/>
+<Prop name="center" type="boolean"/>
+<Prop name="continuedFocus" defaultValue="true" type="boolean"/>
+<Prop name="floating" defaultValue="true" type="boolean"/>
+<Prop name="floatingClassName"/>
+<Prop name="focusAfterShow" defaultValue="true" type="boolean"/>
+<Prop name="handleOverflow" defaultValue="true" visible="false" type="boolean"/>
+<Prop name="hideAnimateType" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
+<Prop name="left" type="int"/>
+<Prop name="modal" type="boolean"/>
+<Prop name="modalType" enumValues="dark,transparent"/>
+<Prop name="offsetLeft" type="int"/>
+<Prop name="offsetTop" type="int"/>
+<Prop name="shadowMode" defaultValue="sides" enumValues="drop,sides,frame,none"/>
+<Prop name="showAnimateType" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
+<Prop name="top" type="int"/>
+<Prop name="vAlign" enumValues="top,innertop,center,innerbottom,bottom" visible="false"/>
+<Prop name="visible" type="java.lang.Boolean"/></Props><ClientEvents>
+<ClientEvent name="onClose" parameters="self,arg"/>
+<ClientEvent name="onShow" parameters="self,arg"/>
+<ClientEvent name="beforeHide" parameters="self,arg"/>
+<ClientEvent name="beforeClose" parameters="self,arg"/>
+<ClientEvent name="beforeShow" parameters="self,arg"/>
+<ClientEvent name="onHide" parameters="self,arg"/></ClientEvents></Rule><Rule name="FloatPanel" parents="Panel,FloatControl" label="FloatPanel" type="com.bstek.dorado.view.widget.base.FloatPanel" sortFactor="2030" category="Floatable" icon="/com/bstek/dorado/view/widget/base/FloatPanel.png" clientTypes="desktop"><Props>
+<Prop name="align" enumValues="left,innerleft,center,innerright,top" visible="false"/>
+<Prop name="anchorTarget" visible="false"/>
+<Prop name="animateTarget" visible="false"/>
+<Prop name="animateType" defaultValue="zoom" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
+<Prop name="autoAdjustPosition" defaultValue="true" type="boolean"/>
+<Prop name="center" highlight="1" type="boolean"/>
+<Prop name="continuedFocus" defaultValue="true" type="boolean"/>
+<Prop name="floating" defaultValue="true" type="boolean"/>
+<Prop name="floatingClassName"/>
+<Prop name="focusAfterShow" defaultValue="true" type="boolean"/>
+<Prop name="handleOverflow" defaultValue="true" visible="false" type="boolean"/>
+<Prop name="hideAnimateType" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
+<Prop name="left" type="int"/>
+<Prop name="modal" highlight="1" type="boolean"/>
+<Prop name="modalType" enumValues="dark,transparent"/>
+<Prop name="offsetLeft" type="int"/>
+<Prop name="offsetTop" type="int"/>
+<Prop name="shadowMode" defaultValue="sides" enumValues="drop,sides,frame,none"/>
+<Prop name="showAnimateType" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
+<Prop name="top" type="int"/>
+<Prop name="vAlign" enumValues="top,innertop,center,innerbottom,bottom" visible="false"/>
+<Prop name="visible" type="java.lang.Boolean"/></Props><ClientEvents>
+<ClientEvent name="onClose" parameters="self,arg"/>
+<ClientEvent name="onShow" parameters="self,arg"/>
+<ClientEvent name="beforeHide" parameters="self,arg"/>
+<ClientEvent name="beforeClose" parameters="self,arg"/>
+<ClientEvent name="beforeShow" parameters="self,arg"/>
+<ClientEvent name="onHide" parameters="self,arg"/></ClientEvents></Rule><Rule name="Dialog" parents="FloatPanel" label="Dialog" type="com.bstek.dorado.view.widget.base.Dialog" sortFactor="2031" category="Floatable" icon="/com/bstek/dorado/view/widget/base/Dialog.png" clientTypes="desktop"><Props>
+<Prop name="center" defaultValue="true" type="boolean"/>
+<Prop name="closeable" defaultValue="true" type="boolean"/>
+<Prop name="dragOutside" type="boolean"/>
+<Prop name="draggable" defaultValue="true" type="boolean"/>
+<Prop name="maxHeight" type="int"/>
+<Prop name="maxWidth" type="int"/>
+<Prop name="minHeight" type="int"/>
+<Prop name="minWidth" type="int"/>
+<Prop name="minimizeable" type="boolean"/>
+<Prop name="minimized" type="boolean"/>
+<Prop name="modal" defaultValue="true" type="boolean"/>
+<Prop name="resizeable" defaultValue="true" type="boolean"/>
+<Prop name="shadowMode" defaultValue="frame" enumValues="drop,sides,frame,none"/></Props><ClientEvents>
+<ClientEvent name="onMinimize" parameters="self,arg"/>
+<ClientEvent name="beforeMinimize" parameters="self,arg"/></ClientEvents></Rule><Rule name="Menu" parents="com.bstek.dorado.view.widget.Control,FloatControl" label="Menu" type="com.bstek.dorado.view.widget.base.menu.Menu" sortFactor="2032" category="Floatable" icon="/com/bstek/dorado/view/widget/base/menu/Menu.png" autoGenerateId="true" clientTypes="desktop"><Props>
+<Prop name="align" enumValues="left,innerleft,center,innerright,top" visible="false"/>
+<Prop name="anchorTarget" visible="false"/>
+<Prop name="animateTarget" visible="false"/>
+<Prop name="animateType" defaultValue="zoom" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
+<Prop name="autoAdjustPosition" defaultValue="true" type="boolean"/>
+<Prop name="center" type="boolean"/>
+<Prop name="continuedFocus" defaultValue="true" type="boolean"/>
+<Prop name="floating" defaultValue="true" type="boolean"/>
+<Prop name="floatingClassName"/>
+<Prop name="focusAfterShow" defaultValue="true" type="boolean"/>
+<Prop name="handleOverflow" defaultValue="true" visible="false" type="boolean"/>
+<Prop name="hideAnimateType" defaultValue="fade" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
+<Prop name="iconPosition" defaultValue="left" enumValues="left,top"/>
+<Prop name="left" type="int"/>
+<Prop name="modal" type="boolean"/>
+<Prop name="modalType" enumValues="dark,transparent"/>
+<Prop name="offsetLeft" type="int"/>
+<Prop name="offsetTop" type="int"/>
+<Prop name="shadowMode" defaultValue="sides" enumValues="drop,sides,frame,none"/>
+<Prop name="showAnimateType" defaultValue="slide" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
+<Prop name="top" type="int"/>
+<Prop name="vAlign" enumValues="top,innertop,center,innerbottom,bottom" visible="false"/>
+<Prop name="visible" type="java.lang.Boolean"/></Props><ClientEvents>
+<ClientEvent name="onClose" parameters="self,arg"/>
+<ClientEvent name="onShow" parameters="self,arg"/>
+<ClientEvent name="beforeHide" parameters="self,arg"/>
+<ClientEvent name="beforeClose" parameters="self,arg"/>
+<ClientEvent name="beforeShow" parameters="self,arg"/>
+<ClientEvent name="onHide" parameters="self,arg"/>
+<ClientEvent name="onHideTopMenu" parameters="self,arg"/></ClientEvents><Children><Child rule="BaseMenuItem" name="Items" aggregated="true"></Child></Children></Rule><Rule name="DatePicker" parents="com.bstek.dorado.view.widget.Control" label="DatePicker" nodeName="DatePicker" type="com.bstek.dorado.view.widget.base.DatePicker" sortFactor="2033" category="General" icon="/com/bstek/dorado/view/widget/base/DatePicker.png" clientTypes="desktop"><Props>
+<Prop name="date" type="java.util.Date"/>
+<Prop name="selectionMode" defaultValue="singleDate" enumValues="singleDate,multiDate"/>
+<Prop name="showClearButton" defaultValue="true" type="boolean"/>
+<Prop name="showConfirmButton" defaultValue="true" type="boolean"/>
+<Prop name="showTimeSpinner" defaultValue="false" type="boolean"/>
+<Prop name="showTodayButton" defaultValue="true" type="boolean"/>
+<Prop name="yearMonthFormat"/></Props><ClientEvents>
+<ClientEvent name="onFilterDate" parameters="self,arg"/>
+<ClientEvent name="onClear" parameters="self,arg"/>
+<ClientEvent name="onCancel" parameters="self,arg"/>
+<ClientEvent name="onConfirm" parameters="self,arg"/>
+<ClientEvent name="onRefreshDateCell" parameters="self,arg"/>
+<ClientEvent name="onPick" parameters="self,arg"/></ClientEvents></Rule><Rule name="YearMonthPicker" parents="com.bstek.dorado.view.widget.Control" label="YearMonthPicker" nodeName="YearMonthPicker" type="com.bstek.dorado.view.widget.base.YearMonthPicker" sortFactor="2034" category="General" icon="/com/bstek/dorado/view/widget/base/YearMonthPicker.png" clientTypes="desktop"><Props>
+<Prop name="month" type="int"/>
+<Prop name="year" type="int"/></Props><ClientEvents>
+<ClientEvent name="onPick" parameters="self,arg"/>
+<ClientEvent name="onCancel" parameters="self,arg"/></ClientEvents></Rule><Rule name="Label" parents="AbstractPropertyDataControl" label="Label" type="com.bstek.dorado.view.widget.form.Label" sortFactor="2035" category="Form" icon="/com/bstek/dorado/view/widget/form/Label.png" clientTypes="desktop,touch"><Props>
+<Prop name="text" highlight="1"/>
+<Prop name="ui" enumValues="default,bold,h1,h2,h3"/></Props></Rule><Rule name="DataLabel" parents="AbstractPropertyDataControl" label="DataLabel" type="com.bstek.dorado.view.widget.form.DataLabel" sortFactor="2036" category="Form" icon="/com/bstek/dorado/view/widget/form/DataLabel.png" clientTypes="desktop,touch" deprecated="true"></Rule><Rule name="Link" parents="Label" label="Link" type="com.bstek.dorado.view.widget.form.Link" sortFactor="2037" category="Form" icon="/com/bstek/dorado/view/widget/form/Link.png" clientTypes="desktop,touch"><Props>
+<Prop name="href"/>
+<Prop name="target"/></Props></Rule><Rule name="Image" parents="AbstractPropertyDataControl" label="Image" type="com.bstek.dorado.view.widget.form.Image" sortFactor="2038" category="Form" icon="/com/bstek/dorado/view/widget/form/Image.png" clientTypes="desktop,touch"><Props>
+<Prop name="blankImage"/>
+<Prop name="image" highlight="1"/>
+<Prop name="packMode" defaultValue="center" enumValues="start,center,end"/>
+<Prop name="stretchMode" defaultValue="keepRatio" enumValues="fitWidth,fitHeight,keepRatio,fill,stretch,none"/></Props></Rule><Rule name="TemplateField" parents="AbstractDataControl" label="TemplateField" type="com.bstek.dorado.view.widget.form.TemplateField" sortFactor="2039" category="Form" icon="/com/bstek/dorado/view/widget/form/TemplateField.png" clientTypes="desktop,touch"><Props>
+<Prop name="template" highlight="1" editor="multiLines"/></Props></Rule><Rule name="TextEditor" parents="AbstractTextEditor" label="TextEditor" type="com.bstek.dorado.view.widget.form.TextEditor" sortFactor="2040" category="Form" icon="/com/bstek/dorado/view/widget/form/TextEditor.png" clientTypes="desktop,touch"><Props>
+<Prop name="dataType" type="com.bstek.dorado.data.type.DataType"/>
+<Prop name="displayFormat"/><Prop name="mapping" type="com.bstek.dorado.data.type.property.Mapping" compositeType="Fixed">
+<Prop name="keyProperty"/>
+<Prop name="mapValues" editor="collection[pojo]" type="java.lang.Object"/>
+<Prop name="valueProperty"/></Prop>
+<Prop name="password" visible="false" type="boolean"/>
+<Prop name="typeFormat"/></Props></Rule><Rule name="PasswordEditor" parents="AbstractTextEditor" label="PasswordEditor" type="com.bstek.dorado.view.widget.form.PasswordEditor" sortFactor="2041" category="Form" icon="/com/bstek/dorado/view/widget/form/PasswordEditor.png" clientTypes="desktop,touch"></Rule><Rule name="TextArea" parents="AbstractTextEditor" label="TextArea" type="com.bstek.dorado.view.widget.form.TextArea" sortFactor="2042" category="Form" icon="/com/bstek/dorado/view/widget/form/TextArea.png" clientTypes="desktop,touch"><Props>
+<Prop name="maxLength" type="int"/>
+<Prop name="minLength" type="int"/>
+<Prop name="required" type="boolean"/>
+<Prop name="selectTextOnFocus" defaultValue="false" type="boolean"/>
+<Prop name="text" editor="multiLines"/></Props></Rule><Rule name="CheckBox" parents="AbstractDataEditor" label="CheckBox" type="com.bstek.dorado.view.widget.form.CheckBox" sortFactor="2043" category="Form" icon="/com/bstek/dorado/view/widget/form/CheckBox.png" clientTypes="desktop,touch"><Props>
+<Prop name="caption"/>
+<Prop name="mixedValue" type="java.lang.Object"/>
+<Prop name="offValue" defaultValue="false" type="java.lang.Object"/>
+<Prop name="onValue" defaultValue="true" type="java.lang.Object"/>
+<Prop name="triState" type="boolean"/>
+<Prop name="value" defaultValue="false" type="java.lang.Object"/></Props><ClientEvents>
+<ClientEvent name="onValueChange" parameters="self,arg"/></ClientEvents></Rule><Rule name="RadioGroup" parents="AbstractDataEditor" label="RadioGroup" type="com.bstek.dorado.view.widget.form.RadioGroup" sortFactor="2044" category="Form" icon="/com/bstek/dorado/view/widget/form/RadioGroup.png" clientTypes="desktop,touch"><Props>
+<Prop name="columnCount" defaultValue="3" type="int"/>
+<Prop name="layout" defaultValue="flow" enumValues="vertical,flow,grid"/>
+<Prop name="value" type="java.lang.Object"/></Props><ClientEvents>
+<ClientEvent name="onValueChange" parameters="self,arg"/></ClientEvents><Children><Child rule="RadioButton" name="RadioButtons" aggregated="true"></Child></Children></Rule><Rule name="DataMessage" parents="AbstractPropertyDataControl" label="DataMessage" type="com.bstek.dorado.view.widget.form.DataMessage" sortFactor="2045" category="Form" icon="/com/bstek/dorado/view/widget/form/DataMessage.png" clientTypes="desktop,touch"><Props>
+<Prop name="showIconOnly" type="boolean"/>
+<Prop name="showMultiMessage" type="boolean"/></Props></Rule><Rule name="FormProfile" parents="Component" label="FormProfile" type="com.bstek.dorado.view.widget.form.FormProfile" sortFactor="2046" category="Form" icon="/com/bstek/dorado/view/widget/form/FormProfile.png" clientTypes="desktop,touch"><Props>
+<Prop name="className"/>
+<Prop name="dataPath" highlight="1"/>
+<Prop name="dataSet" highlight="1" reference="DataSet:id"/>
+<Prop name="editorWidth" type="int"/>
+<Prop name="exClassName"/>
+<Prop name="height"/>
+<Prop name="hintPosition" enumValues="right,bottom"/>
+<Prop name="hintSpacing" type="int"/>
+<Prop name="hintWidth" type="int"/>
+<Prop name="labelAlign" defaultValue="left" enumValues="left,center,right"/>
+<Prop name="labelPosition" defaultValue="left" enumValues="left,top"/>
+<Prop name="labelSeparator"/>
+<Prop name="labelSpacing" type="int"/>
+<Prop name="labelWidth" type="int"/>
+<Prop name="readOnly" type="boolean"/>
+<Prop name="showHint" defaultValue="true" type="boolean"/>
+<Prop name="showHintMessage" type="boolean"/>
+<Prop name="showLabel" defaultValue="true" type="boolean"/>
+<Prop name="trigger" enumValues="triggerClear,autoMappingDropDown1,autoMappingDropDown2,defaultDateDropDown,defaultDateTimeDropDown,defaultYearMonthDropDown,defaultYearDropDown,defaultMonthDropDown" reference="Trigger:id"/>
+<Prop name="type" defaultValue="text" enumValues="text,password,textArea,checkBox,radioGroup"/>
+<Prop name="ui"/>
+<Prop name="width"/></Props></Rule><Rule name="FormElement" parents="com.bstek.dorado.view.widget.Control" label="FormElement" type="com.bstek.dorado.view.widget.form.FormElement" sortFactor="2047" category="Form" icon="/com/bstek/dorado/view/widget/form/FormElement.png" clientTypes="desktop,touch"><Props>
+<Prop name="dataPath" highlight="1"/>
+<Prop name="dataSet" highlight="1" reference="DataSet:id"/>
+<Prop name="editable" defaultValue="true" type="boolean"/>
+<Prop name="editorType" highlight="1" enumValues="TextEditor,PasswordEditor,TextArea,CheckBox,RadioGroup,Label,NumberSpinner"/>
+<Prop name="editorWidth" type="int"/>
+<Prop name="formProfile" reference="FormProfile:id"/>
+<Prop name="hint"/>
+<Prop name="hintPosition" defaultValue="right" enumValues="right,bottom"/>
+<Prop name="hintSpacing" type="int"/>
+<Prop name="hintWidth" type="int"/>
+<Prop name="label" highlight="1"/>
+<Prop name="labelAlign" defaultValue="left" enumValues="left,center,right"/>
+<Prop name="labelPosition" defaultValue="left" enumValues="left,top"/>
+<Prop name="labelSeparator"/>
+<Prop name="labelSpacing" type="int"/>
+<Prop name="labelWidth" type="int"/>
+<Prop name="property" highlight="1"/>
+<Prop name="readOnly" type="boolean"/>
+<Prop name="showHint" defaultValue="true" type="boolean"/>
+<Prop name="showHintMessage" type="boolean"/>
+<Prop name="showLabel" defaultValue="true" type="boolean"/>
+<Prop name="trigger" enumValues="triggerClear,autoMappingDropDown1,autoMappingDropDown2,autoOpenMappingDropDown1,autoOpenMappingDropDown2,defaultDateDropDown,defaultDateTimeDropDown,defaultYearMonthDropDown,defaultYearDropDown,defaultMonthDropDown" reference="Trigger:id"/>
+<Prop name="type" enumValues="text,password,textArea,checkBox,radioGroup" visible="false"/></Props><ClientEvents>
+<ClientEvent name="onGetBindingData" parameters="self,arg"/>
+<ClientEvent name="onGetBindingDataType" parameters="self,arg"/></ClientEvents><Children><Child name="Editor" fixed="true"><Rule name="Wrapper.Editor" label="Editor" nodeName="Editor" icon="/com/bstek/dorado/view/widget/form/Editor.png"><Children><Child rule="com.bstek.dorado.view.widget.Control" name="Editor"></Child></Children></Rule></Child></Children></Rule><Rule name="AutoForm" parents="com.bstek.dorado.view.widget.Control" label="AutoForm" type="com.bstek.dorado.view.widget.form.autoform.AutoForm" sortFactor="2048" category="Form" icon="/com/bstek/dorado/view/widget/form/autoform/AutoForm.png" clientTypes="desktop,touch"><Props>
+<Prop name="autoCreateElements" type="boolean"/>
+<Prop name="colPadding" type="int"/>
+<Prop name="cols" highlight="1"/>
+<Prop name="createOwnEntity" defaultValue="true" type="boolean"/>
+<Prop name="createPrivateDataSet" type="boolean"/>
+<Prop name="dataPath" highlight="1"/>
+<Prop name="dataSet" highlight="1" reference="DataSet:id"/>
+<Prop name="dataType" type="com.bstek.dorado.data.type.EntityDataType"/>
+<Prop name="editorWidth" type="int"/>
+<Prop name="formProfile" reference="FormProfile:id"/>
+<Prop name="hintPosition" enumValues="right,bottom"/>
+<Prop name="hintSpacing" type="int"/>
+<Prop name="hintWidth" type="int"/>
+<Prop name="labelAlign" defaultValue="left" enumValues="left,center,right"/>
+<Prop name="labelPosition" defaultValue="left" enumValues="left,top"/>
+<Prop name="labelSeparator"/>
+<Prop name="labelSpacing" type="int"/>
+<Prop name="labelWidth" type="int"/>
+<Prop name="padding" type="int"/>
+<Prop name="readOnly" type="boolean"/>
+<Prop name="rowHeight" type="int"/>
+<Prop name="rowPadding" type="int"/>
+<Prop name="showHint" defaultValue="true" type="boolean"/>
+<Prop name="showHintMessage" type="boolean"/>
+<Prop name="showLabel" defaultValue="true" type="boolean"/>
+<Prop name="stretchWidth" type="boolean"/></Props><Children><Child rule="AutoFormElement" name="AutoFormElement" aggregated="true"></Child><Child rule="com.bstek.dorado.view.widget.Control" name="Elements" aggregated="true"></Child></Children></Rule><Rule name="NumberSpinner" parents="Spinner" label="NumberSpinner" type="com.bstek.dorado.view.widget.form.NumberSpinner" sortFactor="2049" category="Form" icon="/com/bstek/dorado/view/widget/form/NumberSpinner.png" clientTypes="desktop,touch"><Props>
+<Prop name="max" defaultValue="2147483647" type="int"/>
+<Prop name="min" defaultValue="-2147483648" type="int"/>
+<Prop name="selectTextOnFocus" defaultValue="true" type="boolean"/></Props></Rule><Rule name="DateTimeSpinner" parents="Spinner" label="DateTimeSpinner" type="com.bstek.dorado.view.widget.form.DateTimeSpinner" sortFactor="2050" category="Form" icon="/com/bstek/dorado/view/widget/form/DateTimeSpinner.png" clientTypes="desktop,touch"><Props>
+<Prop name="date" type="int"/>
+<Prop name="hours" type="int"/>
+<Prop name="minutes" type="int"/>
+<Prop name="month" type="int"/>
+<Prop name="seconds" type="int"/>
+<Prop name="type" defaultValue="time" enumValues="date,time,dateTime,hours,minutes,dateHours,dateMinutes"/>
+<Prop name="year" type="int"/></Props></Rule><Rule name="CustomSpinner" parents="Spinner" label="CustomSpinner" type="com.bstek.dorado.view.widget.form.CustomSpinner" sortFactor="2051" category="Form" icon="/com/bstek/dorado/view/widget/form/CustomSpinner.png" clientTypes="desktop,touch"><Props>
+<Prop name="pattern" highlight="1"/>
+<Prop name="text" visible="false"/>
+<Prop name="value"/></Props></Rule><Rule name="Trigger" parents="Component" label="Trigger" type="com.bstek.dorado.view.widget.form.trigger.Trigger" sortFactor="2052" category="Trigger" icon="/com/bstek/dorado/view/widget/form/trigger/Trigger.png" autoGenerateId="true" clientTypes="desktop,touch"><Props>
+<Prop name="buttonVisible" defaultValue="true" type="boolean"/>
+<Prop name="editable" defaultValue="true" type="boolean"/>
+<Prop name="icon"/>
+<Prop name="iconClass" enumValues="d-trigger-icon-drop,d-trigger-icon-search,d-trigger-icon-date,d-trigger-icon-custom"/></Props><ClientEvents>
+<ClientEvent name="onExecute" parameters="self,arg"/>
+<ClientEvent name="beforeExecute" parameters="self,arg"/></ClientEvents></Rule><Rule name="ListDropDown" parents="RowListDropDown" label="ListDropDown" type="com.bstek.dorado.view.widget.form.trigger.ListDropDown" sortFactor="2053" category="Trigger" icon="/com/bstek/dorado/view/widget/form/trigger/ListDropDown.png" autoGenerateId="true" clientTypes="desktop"><Props>
+<Prop name="items" highlight="1" editor="collection[any]" type="java.util.List"/></Props></Rule><Rule name="DataSetDropDown" parents="RowListDropDown" label="DataSetDropDown" type="com.bstek.dorado.view.widget.form.trigger.DataSetDropDown" sortFactor="2054" category="Trigger" icon="/com/bstek/dorado/view/widget/form/trigger/DataSetDropDown.png" autoGenerateId="true" clientTypes="desktop"><Props>
+<Prop name="dataPath" highlight="1"/>
+<Prop name="dataSet" highlight="1" reference="DataSet:id"/>
+<Prop name="filterMode" defaultValue="serverSide" enumValues="clientSide,serverSide"/>
+<Prop name="filterOnTyping" defaultValue="false" type="boolean"/>
+<Prop name="property" highlight="1"/>
+<Prop name="reloadDataOnOpen" type="boolean"/>
+<Prop name="useDataBinding" defaultValue="true" type="boolean"/></Props><ClientEvents>
+<ClientEvent name="onGetBindingData" parameters="self,arg"/>
+<ClientEvent name="onSetFilterParameter" parameters="self,arg"/>
+<ClientEvent name="onGetBindingDataType" parameters="self,arg"/></ClientEvents></Rule><Rule name="AutoMappingDropDown" parents="RowListDropDown" label="AutoMappingDropDown" type="com.bstek.dorado.view.widget.form.trigger.AutoMappingDropDown" sortFactor="2055" category="Trigger" icon="/com/bstek/dorado/view/widget/form/trigger/AutoMappingDropDown.png" autoGenerateId="true" clientTypes="desktop"><Props>
+<Prop name="dynaFilter" defaultValue="true" type="boolean"/>
+<Prop name="property" defaultValue="value"/></Props></Rule><Rule name="DateDropDown" parents="DropDown" label="DateDropDown" type="com.bstek.dorado.view.widget.form.trigger.DateDropDown" sortFactor="2056" category="Trigger" icon="/com/bstek/dorado/view/widget/form/trigger/DateDropDown.png" autoGenerateId="true" clientTypes="desktop"><Props>
+<Prop name="selectionMode" defaultValue="singleDate" enumValues="singleDate,multiDate"/>
+<Prop name="showConfirmButton" defaultValue="true" type="boolean"/>
+<Prop name="showTimeSpinner" type="boolean"/>
+<Prop name="showTodayButton" defaultValue="true" type="boolean"/></Props><ClientEvents>
+<ClientEvent name="onRefreshDateCell" parameters="self,arg"/>
+<ClientEvent name="onFilterDate" parameters="self,arg"/></ClientEvents></Rule><Rule name="YearMonthDropDown" parents="DropDown" label="YearMonthDropDown" type="com.bstek.dorado.view.widget.form.trigger.YearMonthDropDown" sortFactor="2057" category="Trigger" icon="/com/bstek/dorado/view/widget/form/trigger/YearMonthDropDown.png" autoGenerateId="true" clientTypes="desktop"></Rule><Rule name="YearDropDown" parents="DropDown" label="YearDropDown" type="com.bstek.dorado.view.widget.form.trigger.YearDropDown" sortFactor="2058" category="Trigger" icon="/com/bstek/dorado/view/widget/form/trigger/YearDropDown.png" autoGenerateId="true" clientTypes="desktop"></Rule><Rule name="MonthDropDown" parents="DropDown" label="MonthDropDown" type="com.bstek.dorado.view.widget.form.trigger.MonthDropDown" sortFactor="2059" category="Trigger" icon="/com/bstek/dorado/view/widget/form/trigger/MonthDropDown.png" autoGenerateId="true" clientTypes="desktop"></Rule><Rule name="CustomDropDown" parents="DropDown" label="CustomDropDown" type="com.bstek.dorado.view.widget.form.trigger.CustomDropDown" sortFactor="2060" category="Trigger" icon="/com/bstek/dorado/view/widget/form/trigger/CustomDropDown.png" autoGenerateId="true" clientTypes="desktop"><Children><Child rule="com.bstek.dorado.view.widget.Control" name="Control"></Child></Children></Rule><Rule name="DataPilot" parents="AbstractDataControl" label="DataPilot" type="com.bstek.dorado.view.widget.datacontrol.DataPilot" sortFactor="2061" category="General" icon="/com/bstek/dorado/view/widget/datacontrol/DataPilot.png" clientTypes="desktop"><Props>
+<Prop name="height" visible="false"/>
+<Prop name="itemCodes" highlight="1" enumValues="pages,|&lt;,&lt;,&gt;,&gt;|,goto,pageSize,info,+,-,x,|"/></Props><ClientEvents>
+<ClientEvent name="onSubControlAction" parameters="self,arg"/>
+<ClientEvent name="onSubControlRefresh" parameters="self,arg"/></ClientEvents></Rule><Rule name="ListBox" parents="AbstractListBox" label="ListBox" type="com.bstek.dorado.view.widget.list.ListBox" sortFactor="2062" category="Collection" icon="/com/bstek/dorado/view/widget/list/ListBox.png" clientTypes="desktop"><Props>
+<Prop name="items" highlight="1" editor="collection[any]" type="java.util.List"/></Props></Rule><Rule name="DataListBox" parents="AbstractListBox" label="DataListBox" type="com.bstek.dorado.view.widget.list.DataListBox" sortFactor="2063" category="Collection" icon="/com/bstek/dorado/view/widget/list/DataListBox.png" clientTypes="desktop"><Props>
+<Prop name="dataPath" highlight="1"/>
+<Prop name="dataSet" highlight="1" reference="DataSet:id"/></Props><ClientEvents>
+<ClientEvent name="onGetBindingData" parameters="self,arg"/>
+<ClientEvent name="onGetBindingDataType" parameters="self,arg"/></ClientEvents></Rule><Rule name="Grid" parents="AbstractGrid" label="Grid" type="com.bstek.dorado.view.widget.grid.Grid" sortFactor="2064" category="Collection" icon="/com/bstek/dorado/view/widget/grid/Grid.png" clientTypes="desktop"><Props>
+<Prop name="items" highlight="1" editor="collection[pojo]" type="java.util.List"/></Props></Rule><Rule name="DataGrid" parents="AbstractGrid" label="DataGrid" type="com.bstek.dorado.view.widget.grid.DataGrid" sortFactor="2065" category="Collection" icon="/com/bstek/dorado/view/widget/grid/DataGrid.png" clientTypes="desktop"><Props>
+<Prop name="appendOnLastEnter" type="boolean"/>
+<Prop name="autoCreateColumns" type="java.lang.Boolean"/>
+<Prop name="dataPath" highlight="1"/>
+<Prop name="dataSet" highlight="1" reference="DataSet:id"/>
+<Prop name="dataType" deprecated="true" type="com.bstek.dorado.data.type.EntityDataType"/>
+<Prop name="filterMode" defaultValue="clientSide" enumValues="clientSide,serverSide"/>
+<Prop name="rowSelectionProperty"/>
+<Prop name="sortMode" defaultValue="clientSide" enumValues="clientSide,serverSide"/>
+<Prop name="supportsPaging" type="boolean"/></Props><ClientEvents>
+<ClientEvent name="onGetBindingData" parameters="self,arg"/>
+<ClientEvent name="onGetBindingDataType" parameters="self,arg"/></ClientEvents></Rule><Rule name="Tree" parents="AbstractTree" label="Tree" type="com.bstek.dorado.view.widget.tree.Tree" sortFactor="2066" category="Collection" icon="/com/bstek/dorado/view/widget/tree/Tree.png" clientTypes="desktop"><Children><Child rule="BaseNode" name="Nodes" aggregated="true"></Child></Children></Rule><Rule name="DataTree" parents="AbstractTree" label="DataTree" type="com.bstek.dorado.view.widget.tree.DataTree" sortFactor="2067" category="Collection" icon="/com/bstek/dorado/view/widget/tree/DataTree.png" clientTypes="desktop"><Props>
+<Prop name="currentNodeDataPath"/>
+<Prop name="dataPath" highlight="1"/>
+<Prop name="dataSet" highlight="1" reference="DataSet:id"/></Props><ClientEvents>
+<ClientEvent name="onDataNodeCreate" parameters="self,arg"/>
+<ClientEvent name="onGetBindingDataType" parameters="self,arg"/>
+<ClientEvent name="onGetBindingData" parameters="self,arg"/>
+<ClientEvent name="beforeDataNodeCreate" parameters="self,arg"/></ClientEvents><Children><Child name="BindingConfigs" fixed="true"><Rule name="Wrapper.BindingConfigs" label="BindingConfigs" nodeName="BindingConfigs" icon="/com/bstek/dorado/view/widget/tree/BindingConfigs.png"><Children><Child rule="BindingConfig" name="BindingConfigs" aggregated="true"></Child></Children></Rule></Child></Children></Rule><Rule name="BlockView" parents="AbstractBlockView" label="BlockView" type="com.bstek.dorado.view.widget.blockview.BlockView" sortFactor="2068" category="Collection" icon="/com/bstek/dorado/view/widget/blockview/BlockView.png" clientTypes="desktop,touch"><Props>
+<Prop name="items" highlight="1" editor="collection[any]" type="java.util.List"/></Props></Rule><Rule name="DataBlockView" parents="AbstractBlockView" label="DataBlockView" type="com.bstek.dorado.view.widget.blockview.DataBlockView" sortFactor="2069" category="Collection" icon="/com/bstek/dorado/view/widget/blockview/DataBlockView.png" clientTypes="desktop,touch"><Props>
+<Prop name="dataPath" highlight="1"/>
+<Prop name="dataSet" highlight="1" reference="DataSet:id"/></Props><ClientEvents>
+<ClientEvent name="onGetBindingData" parameters="self,arg"/>
+<ClientEvent name="onGetBindingDataType" parameters="self,arg"/></ClientEvents></Rule><Rule name="TreeGrid" parents="AbstractTreeGrid" label="TreeGrid" type="com.bstek.dorado.view.widget.treegrid.TreeGrid" sortFactor="2070" category="Collection" icon="/com/bstek/dorado/view/widget/treegrid/TreeGrid.png" clientTypes="desktop"><Children><Child name="Nodes" fixed="true"><Rule name="Wrapper.Nodes" label="Nodes" nodeName="Nodes" icon="/com/bstek/dorado/view/widget/treegrid/Nodes.png"><Children><Child rule="BaseNode" name="Nodes" aggregated="true"></Child></Children></Rule></Child></Children></Rule><Rule name="DataTreeGrid" parents="AbstractTreeGrid" label="DataTreeGrid" type="com.bstek.dorado.view.widget.treegrid.DataTreeGrid" sortFactor="2071" category="Collection" icon="/com/bstek/dorado/view/widget/treegrid/DataTreeGrid.png" clientTypes="desktop"><Props>
+<Prop name="autoCreateColumns" type="java.lang.Boolean"/>
+<Prop name="currentNodeDataPath"/>
+<Prop name="dataPath" highlight="1"/>
+<Prop name="dataSet" highlight="1" reference="DataSet:id"/>
+<Prop name="dataType" type="com.bstek.dorado.data.type.EntityDataType"/></Props><ClientEvents>
+<ClientEvent name="onDataNodeCreate" parameters="self,arg"/>
+<ClientEvent name="onGetBindingDataType" parameters="self,arg"/>
+<ClientEvent name="onGetBindingData" parameters="self,arg"/>
+<ClientEvent name="beforeDataNodeCreate" parameters="self,arg"/></ClientEvents><Children><Child name="BindingConfigs" fixed="true"><Rule name="Wrapper.BindingConfigs" label="BindingConfigs" nodeName="BindingConfigs" icon="/com/bstek/dorado/view/widget/tree/BindingConfigs.png"><Children><Child rule="BindingConfig" name="BindingConfigs" aggregated="true"></Child></Children></Rule></Child></Children></Rule><Rule name="TagEditor" parents="AbstractTextEditor" label="TagEditor" type="com.bstek.dorado.view.widget.advance.TagEditor" sortFactor="2072" category="Form" icon="/com/bstek/dorado/view/widget/advance/TagEditor.png" clientTypes="desktop"><Props>
+<Prop name="acceptUnknownTag" defaultValue="true" type="boolean"/>
+<Prop name="availableTags" highlight="1" type="[Ljava.lang.String;"/>
+<Prop name="availableTagsDataPath" highlight="1"/>
+<Prop name="availableTagsDataSet" highlight="1" reference="DataSet:id"/>
+<Prop name="highlightRequiredTags" defaultValue="true" type="boolean"/>
+<Prop name="requiredTags" highlight="1" type="[Ljava.lang.String;"/>
+<Prop name="showAvailableTags" defaultValue="true" type="boolean"/>
+<Prop name="textSeperator" defaultValue=","/></Props><ClientEvents>
+<ClientEvent name="beforeTagAdd" parameters="self,arg"/>
+<ClientEvent name="beforeUnknownTagAccept" parameters="self,arg"/>
+<ClientEvent name="onUnknownTagAccept" parameters="self,arg"/>
+<ClientEvent name="onTagAdd" parameters="self,arg"/>
+<ClientEvent name="beforeTagRemove" parameters="self,arg"/>
+<ClientEvent name="onTagRemove" parameters="self,arg"/></ClientEvents></Rule><Rule name="ColorPicker" parents="com.bstek.dorado.view.widget.Control" label="ColorPicker" type="com.bstek.dorado.view.widget.advance.ColorPicker" sortFactor="2073" category="Form" icon="/com/bstek/dorado/view/widget/advance/ColorPicker.png" clientTypes="desktop"><Props>
+<Prop name="allowEmpty" type="boolean"/>
+<Prop name="color"/>
+<Prop name="disabled" type="boolean"/>
+<Prop name="palette" enumValues="#sixteen,#websafe,#named" type="[Ljava.lang.String;"/>
+<Prop name="preferredFormat" enumValues="none,hex,hex6,hsl,rgb,name"/>
+<Prop name="showAlpha" type="boolean"/>
+<Prop name="showButtons" defaultValue="true" type="boolean"/>
+<Prop name="showInitial" type="boolean"/>
+<Prop name="showInput" type="boolean"/>
+<Prop name="showPalette" type="boolean"/>
+<Prop name="showPaletteOnly" type="boolean"/></Props></Rule><Rule name="ColorEditor" parents="AbstractDataEditor" label="ColorEditor" type="com.bstek.dorado.view.widget.advance.ColorEditor" sortFactor="2074" category="Form" icon="/com/bstek/dorado/view/widget/advance/ColorEditor.png" clientTypes="desktop"><Props>
+<Prop name="allowEmpty" type="boolean"/>
+<Prop name="color"/>
+<Prop name="disabled" type="boolean"/>
+<Prop name="palette" enumValues="#sixteen,#websafe,#named" type="[Ljava.lang.String;"/>
+<Prop name="preferredFormat" defaultValue="name" enumValues="none,hex,hex6,hsl,rgb,name"/>
+<Prop name="showAlpha" type="boolean"/>
+<Prop name="showButtons" defaultValue="true" type="boolean"/>
+<Prop name="showInitial" type="boolean"/>
+<Prop name="showInput" type="boolean"/>
+<Prop name="showPalette" type="boolean"/>
+<Prop name="showPaletteOnly" type="boolean"/></Props></Rule><Rule name="UploadAction" parents="Action" label="UploadAction" type="com.bstek.dorado.uploader.widget.UploadAction" sortFactor="2075" category="Action" icon="/com/bstek/dorado/uploader/widget/UploadAction.png" autoGenerateId="true" clientTypes="desktop,touch"><Props>
+<Prop name="autoUpload" defaultValue="true" type="boolean"/>
+<Prop name="confirmMessage" visible="false"/>
+<Prop name="fileResolver" highlight="1"/>
+<Prop name="headers" editor="pojo" type="java.util.Map"/>
+<Prop name="hotkey" visible="false"/>
+<Prop name="maxFileSize" defaultValue="100MB"/>
+<Prop name="runtimes" defaultValue="html5,flash,silverlight,gears,browserplus,html4" visible="false"/>
+<Prop name="selectionMode" defaultValue="singleFile" enumValues="singleFile,multiFiles"/>
+<Prop name="url" defaultValue="&gt;dorado/uploader/fileupload" visible="false"/></Props><ClientEvents>
+<ClientEvent name="beforeExecute" parameters="self,arg" deprecated="true"/>
+<ClientEvent name="onStateChanged" parameters="self,arg"/>
+<ClientEvent name="onError" parameters="self,arg"/>
+<ClientEvent name="onRefresh" parameters="self,arg"/>
+<ClientEvent name="onExecute" parameters="self,arg" deprecated="true"/>
+<ClientEvent name="onChunkUploaded" parameters="self,arg"/>
+<ClientEvent name="onFailure" parameters="self,arg" deprecated="true"/>
+<ClientEvent name="beforeInit" parameters="self,arg"/>
+<ClientEvent name="onFilesAdded" parameters="self,arg"/>
+<ClientEvent name="onFilesRemoved" parameters="self,arg"/>
+<ClientEvent name="onQueueChanged" parameters="self,arg"/>
+<ClientEvent name="beforeFileUpload" parameters="self,arg"/>
+<ClientEvent name="onInit" parameters="self,arg"/>
+<ClientEvent name="beforeFileUploaded" parameters="self,arg"/>
+<ClientEvent name="onUploadProgress" parameters="self,arg"/>
+<ClientEvent name="onFileUploaded" parameters="self,arg"/>
+<ClientEvent name="onUploadComplete" parameters="self,arg"/>
+<ClientEvent name="onSuccess" parameters="self,arg" deprecated="true"/></ClientEvents><Children><Child name="Filters" fixed="true"><Rule name="Wrapper.Filters" label="Filters" nodeName="Filters"><Children><Child rule="Filter" name="Filters" aggregated="true"></Child></Children></Rule></Child></Children></Rule><Rule name="DownloadAction" parents="FormSubmitAction" label="DownloadAction" type="com.bstek.dorado.uploader.widget.DownloadAction" sortFactor="2076" category="Action" icon="/com/bstek/dorado/uploader/widget/DownloadAction.png" autoGenerateId="true" clientTypes="desktop,touch"><Props>
+<Prop name="action" defaultValue="&gt;dorado/uploader/filedownload" visible="false"/>
+<Prop name="fileProvider" highlight="1"/>
+<Prop name="inlineMode" defaultValue="off" enumValues="none,off,browser"/></Props></Rule><Rule name="Intro" parents="Component" label="Intro" type="com.bstek.dorado.intro.Intro" sortFactor="2077" category="Advance" icon="/com/bstek/dorado/intro/Intro.png" clientTypes="desktop,touch"><Props>
+<Prop name="doneLabel"/>
+<Prop name="exitOnEsc" defaultValue="true" type="boolean"/>
+<Prop name="exitOnOverlayClick" defaultValue="true" type="boolean"/>
+<Prop name="name"/>
+<Prop name="nextLabel"/>
+<Prop name="prevLabel"/>
+<Prop name="showNextButton" defaultValue="true" type="boolean"/>
+<Prop name="showPrevButton" defaultValue="true" type="boolean"/>
+<Prop name="showSkipButton" defaultValue="true" type="boolean"/>
+<Prop name="showStepNumbers" defaultValue="true" type="boolean"/>
+<Prop name="skipLabel"/>
+<Prop name="tooltipClass"/>
+<Prop name="tooltipPosition" highlight="1" enumValues="left,top,right,bottom" deprecated="true"/></Props><ClientEvents>
+<ClientEvent name="onStart" parameters="self,arg"/>
+<ClientEvent name="onChange" parameters="self,arg"/>
+<ClientEvent name="onExit" parameters="self,arg"/>
+<ClientEvent name="onBeforeStart" parameters="self,arg"/>
+<ClientEvent name="onComplete" parameters="self,arg"/>
+<ClientEvent name="onBeforeChange" parameters="self,arg"/></ClientEvents><Children><Child rule="Step" name="Step" aggregated="true"></Child><Child rule="Step" name="Steps" aggregated="true"></Child></Children></Rule><Rule name="Step" label="Step" type="com.bstek.dorado.intro.Step" sortFactor="2078" icon="/com/bstek/dorado/intro/Step.png" clientTypes="desktop,touch"><Props>
+<Prop name="arrowAlign" enumValues="left,top,center,right,bottom"/>
+<Prop name="arrowDirection" enumValues="left,top,right,bottom"/>
+<Prop name="element" highlight="1"/>
+<Prop name="ignored" type="boolean"/>
+<Prop name="intro" editor="multiLines"/>
+<Prop name="name"/>
+<Prop name="position" enumValues="left,top,right,bottom" deprecated="true"/>
+<Prop name="tags"/><Prop name="tooltipPosition" type="java.util.Map" compositeType="Open"></Prop>
+<Prop name="userData" type="java.lang.Object"/></Props></Rule><Rule name="SwfViewer" parents="com.bstek.dorado.view.widget.Control" label="SwfViewer" type="com.bstek.bdf2.swfviewer.widget.SwfViewer" sortFactor="2079" category="BDF2" clientTypes="desktop"><Props>
+<Prop name="attributes"/>
+<Prop name="expressInstallSwfurl"/>
+<Prop name="flashvars"/>
+<Prop name="handlerName"/>
+<Prop name="height" defaultValue="400"/>
+<Prop name="parameter"/>
+<Prop name="params"/>
+<Prop name="printEnabled" defaultValue="true" type="boolean"/>
+<Prop name="showType" defaultValue="complex" enumValues="simple,complex"/>
+<Prop name="swfUrl" highlight="1"/>
+<Prop name="version"/>
+<Prop name="width" defaultValue="400"/></Props></Rule><Rule name="Export2ReportAction" parents="AjaxAction" label="Export2ReportAction" type="com.bstek.bdf2.export.view.Export2ReportAction" sortFactor="2080" category="BDF2" icon="/com/bstek/bdf2/export/view/Export2ReportAction.png" autoGenerateId="true" clientTypes="desktop,touch"><Props>
+<Prop name="autoDownload" defaultValue="true" type="boolean"/>
+<Prop name="batchable" defaultValue="true" type="boolean"/>
+<Prop name="dataBgColor" defaultValue="#FFFFFF"/>
+<Prop name="dataFontColor" defaultValue="#000000"/>
+<Prop name="dataFontSize" defaultValue="10" type="int"/>
+<Prop name="dataScope" defaultValue="currentPage" enumValues="currentPage,serverAll"/>
+<Prop name="extension" defaultValue="xls" enumValues="xls,xlsx,pdf,csv"/>
+<Prop name="fileName"/>
+<Prop name="headerBgColor" defaultValue="#D8D8D8"/>
+<Prop name="headerFontColor" defaultValue="#000000"/>
+<Prop name="headerFontSize" defaultValue="10" type="int"/>
+<Prop name="interceptorName"/>
+<Prop name="maxSize" defaultValue="1000" type="int"/>
+<Prop name="rowSpace" defaultValue="1" type="int"/>
+<Prop name="showPageNumber" defaultValue="true" type="boolean"/>
+<Prop name="showTitle" defaultValue="false" type="boolean"/>
+<Prop name="template" highlight="1"/>
+<Prop name="timeout" type="long"/>
+<Prop name="titleBgColor" defaultValue="#FFFFFF"/>
+<Prop name="titleFontColor" defaultValue="#000000"/>
+<Prop name="titleFontSize" defaultValue="18" type="int"/>
+<Prop name="titleName"/></Props><ClientEvents>
+<ClientEvent name="onGetExportElement" parameters="self,arg"/>
+<ClientEvent name="onGetExportData" parameters="self,arg"/></ClientEvents></Rule><Rule name="AbstractViewElement" abstract="true" type="com.bstek.dorado.view.AbstractViewElement"><PrimitiveProps>
+<Prop name="id" highlight="1"/></PrimitiveProps><Props>
+<Prop name="ignored" type="boolean"/><Prop name="metaData" type="java.util.Map" compositeType="Open"></Prop>
+<Prop name="tags"/>
+<Prop name="userData" type="java.lang.Object"/></Props></Rule><Rule name="ClientEventSupportedElement" parents="AbstractViewElement" abstract="true" type="com.bstek.dorado.view.ClientEventSupportedElement"></Rule><Rule name="Component" parents="ClientEventSupportedElement" abstract="true" type="com.bstek.dorado.view.widget.Component" scope="protected"><PrimitiveProps>
+<Prop name="listener"/></PrimitiveProps><Props>
+<Prop name="userData" editor="any" type="java.lang.Object"/></Props><ClientEvents>
+<ClientEvent name="onCreate" parameters="self,arg"/>
+<ClientEvent name="onAttributeChange" parameters="self,arg"/>
+<ClientEvent name="onDestroy" parameters="self,arg"/>
+<ClientEvent name="onReady" parameters="self,arg"/></ClientEvents></Rule><Rule name="com.bstek.dorado.view.widget.Control" parents="Component" abstract="true" type="com.bstek.dorado.view.widget.Control" scope="protected" icon="/com/bstek/dorado/view/widget/Control.png" clientTypes="desktop"><PrimitiveProps>
+<Prop name="listener"/></PrimitiveProps><Props>
+<Prop name="className"/>
+<Prop name="dragTags"/>
+<Prop name="draggable" type="boolean"/>
+<Prop name="droppable" type="boolean"/>
+<Prop name="droppableTags"/>
+<Prop name="exClassName"/>
+<Prop name="height"/>
+<Prop name="hideMode" defaultValue="visibility" enumValues="visibility,display"/>
+<Prop name="layoutConstraint" type="java.lang.Object"/>
+<Prop name="lazyInit" type="java.lang.Boolean"/>
+<Prop name="renderOn"/>
+<Prop name="renderTo"/><Prop name="style" type="java.util.Map" compositeType="Open"></Prop>
+<Prop name="tip"/>
+<Prop name="ui" defaultValue="default"/>
+<Prop name="visible" type="java.lang.Boolean"/>
+<Prop name="width"/></Props><ClientEvents>
+<ClientEvent name="onKeyDown" parameters="self,arg"/>
+<ClientEvent name="onClick" parameters="self,arg" clientTypes="desktop"/>
+<ClientEvent name="onKeyPress" parameters="self,arg"/>
+<ClientEvent name="beforeRefreshDom" parameters="self,arg"/>
+<ClientEvent name="onRefreshDom" parameters="self,arg"/>
+<ClientEvent name="onDragMove" parameters="self,arg"/>
+<ClientEvent name="onSwipe" parameters="self,arg" clientTypes="touch"/>
+<ClientEvent name="onDoubleClick" parameters="self,arg" clientTypes="desktop"/>
+<ClientEvent name="onDraggingSourceOver" parameters="self,arg"/>
+<ClientEvent name="onTap" parameters="self,arg" clientTypes="touch"/>
+<ClientEvent name="onGetDraggingIndicator" parameters="self,arg"/>
+<ClientEvent name="onDraggingSourceMove" parameters="self,arg"/>
+<ClientEvent name="onCreateDom" parameters="self,arg"/>
+<ClientEvent name="onDraggingSourceOut" parameters="self,arg"/>
+<ClientEvent name="onDragStart" parameters="self,arg"/>
+<ClientEvent name="onMouseDown" parameters="self,arg"/>
+<ClientEvent name="onContextMenu" parameters="self,arg"/>
+<ClientEvent name="beforeDraggingSourceDrop" parameters="self,arg"/>
+<ClientEvent name="onTapHold" parameters="self,arg" clientTypes="touch"/>
+<ClientEvent name="onDraggingSourceDrop" parameters="self,arg"/>
+<ClientEvent name="onFocus" parameters="self,arg"/>
+<ClientEvent name="onDoubleTap" parameters="self,arg" clientTypes="touch"/>
+<ClientEvent name="onBlur" parameters="self,arg"/>
+<ClientEvent name="onResize" parameters="self,arg"/>
+<ClientEvent name="onDragStop" parameters="self,arg"/>
+<ClientEvent name="onMouseUp" parameters="self,arg"/></ClientEvents></Rule><Rule name="AsyncAction" parents="Action" abstract="true" type="com.bstek.dorado.view.widget.action.AsyncAction" scope="protected"><Props>
+<Prop name="async" defaultValue="true" type="boolean"/>
+<Prop name="executingMessage"/>
+<Prop name="modal" defaultValue="true" type="boolean"/></Props></Rule><Rule name="UpdateItem" label="UpdateItem" type="com.bstek.dorado.view.widget.action.UpdateItem" icon="/com/bstek/dorado/view/widget/action/UpdateItem.png"><Props>
+<Prop name="alias"/>
+<Prop name="autoResetEntityState" defaultValue="true" type="boolean"/>
+<Prop name="dataPath" defaultValue="!DIRTY_TREE" enumValues="!DIRTY_TREE,!CASCADE_DIRTY,[#dirty],[#all],[#visible],[#current]"/>
+<Prop name="dataSet" highlight="1" reference="DataSet:id"/>
+<Prop name="firstResultOnly" type="boolean"/>
+<Prop name="refreshMode" defaultValue="value" enumValues="none,state,value,cascade"/>
+<Prop name="submitDeletedEntity" type="java.lang.Boolean"/>
+<Prop name="submitOldData" type="boolean"/>
+<Prop name="submitSimplePropertyOnly" type="boolean"/>
+<Prop name="validateData" defaultValue="true" type="boolean"/></Props></Rule><Rule name="AbstractButton" parents="com.bstek.dorado.view.widget.Control" abstract="true" type="com.bstek.dorado.view.widget.base.AbstractButton" scope="protected" clientTypes="desktop"><Props>
+<Prop name="action" highlight="1" reference="Action:id"/>
+<Prop name="disabled" type="boolean"/>
+<Prop name="menu" reference="Menu:id"/>
+<Prop name="toggleOnShowMenu" defaultValue="true" type="boolean"/>
+<Prop name="toggleable" type="boolean"/>
+<Prop name="toggled" type="boolean"/></Props></Rule><Rule name="AbstractPanel" parents="Container" abstract="true" type="com.bstek.dorado.view.widget.base.AbstractPanel" scope="protected" clientTypes="desktop"><Props>
+<Prop name="buttonAlign" defaultValue="center" enumValues="left,center,right"/>
+<Prop name="caption"/>
+<Prop name="collapseable" defaultValue="true" type="boolean"/>
+<Prop name="collapsed" defaultValue="false" type="boolean"/>
+<Prop name="lazyInitChildren" type="boolean"/></Props><ClientEvents>
+<ClientEvent name="onCollapsedChange" parameters="self,arg"/>
+<ClientEvent name="beforeCollapsedChange" parameters="self,arg"/></ClientEvents><Children><Child name="Buttons" fixed="true"><Rule name="Wrapper.Buttons" label="Buttons" nodeName="Buttons" icon="/com/bstek/dorado/view/widget/base/Buttons.png"><Children><Child rule="Button" name="Buttons" aggregated="true"></Child></Children></Rule></Child><Child name="Children" fixed="true"><Rule name="Wrapper.Children" label="Children" nodeName="Children" icon="/com/bstek/dorado/view/widget/base/Children.png"><Children><Child rule="Component" name="Children" aggregated="true"></Child></Children></Rule></Child></Children></Rule><Rule name="ControlTab" parents="Tab" label="ControlTab" type="com.bstek.dorado.view.widget.base.tab.ControlTab" scope="protected" icon="/com/bstek/dorado/view/widget/base/tab/ControlTab.png"><Children><Child rule="com.bstek.dorado.view.widget.Control" name="Control"></Child></Children></Rule><Rule name="Tab" parents="ClientEventSupportedElement" label="Tab" type="com.bstek.dorado.view.widget.base.tab.Tab" scope="protected" icon="/com/bstek/dorado/view/widget/base/tab/Tab.png"><Props>
+<Prop name="caption" highlight="1"/>
+<Prop name="className"/>
+<Prop name="closeable" type="boolean"/>
+<Prop name="disabled" type="boolean"/>
+<Prop name="exClassName" deprecated="true"/>
+<Prop name="height"/>
+<Prop name="icon"/>
+<Prop name="iconClass"/>
+<Prop name="name"/><Prop name="style" type="java.util.Map" compositeType="Open"></Prop>
+<Prop name="tip"/>
+<Prop name="visible" defaultValue="true" type="boolean"/>
+<Prop name="width"/></Props><ClientEvents>
+<ClientEvent name="onClose" parameters="self,arg"/>
+<ClientEvent name="onClick" parameters="self,arg"/>
+<ClientEvent name="beforeClose" parameters="self,arg"/></ClientEvents></Rule><Rule name="IFrameTab" parents="Tab" label="IFrameTab" type="com.bstek.dorado.view.widget.base.tab.IFrameTab" scope="protected" icon="/com/bstek/dorado/view/widget/base/tab/IFrameTab.png"><Props>
+<Prop name="iframeHeight" type="java.lang.Integer"/>
+<Prop name="path" highlight="1"/></Props></Rule><Rule name="AbstractTabControl" parents="com.bstek.dorado.view.widget.Control" abstract="true" type="com.bstek.dorado.view.widget.base.tab.AbstractTabControl" scope="protected" clientTypes="desktop"><Props>
+<Prop name="alwaysShowNavButtons" type="boolean"/>
+<Prop name="currentTab" type="int"/></Props><ClientEvents>
+<ClientEvent name="onTabContextMenu" parameters="self,arg"/>
+<ClientEvent name="onTabChange" parameters="self,arg"/>
+<ClientEvent name="onTabRemove" parameters="self,arg"/>
+<ClientEvent name="beforeTabChange" parameters="self,arg"/></ClientEvents></Rule><Rule name="com.bstek.dorado.view.widget.base.toolbar.Label" parents="com.bstek.dorado.view.widget.Control" label="Label" nodeName="ToolBarLabel" type="com.bstek.dorado.view.widget.base.toolbar.Label" scope="protected" category="ToolBar" icon="/com/bstek/dorado/view/widget/base/toolbar/Label.png" clientTypes="desktop"><Props>
+<Prop name="text"/></Props></Rule><Rule name="MenuButton" parents="Button" label="MenuButton" nodeName="MenuButton" type="com.bstek.dorado.view.widget.base.toolbar.MenuButton" scope="protected" category="ToolBar" icon="/com/bstek/dorado/view/widget/base/toolbar/MenuButton.png" clientTypes="desktop"><Props>
+<Prop name="hideMenuOnMouseLeave" type="boolean"/>
+<Prop name="hideMenuOnMouseLeaveDelay" defaultValue="300" type="int"/>
+<Prop name="menu" deprecated="true" visible="false"/>
+<Prop name="showMenuOnHover" defaultValue="false" type="boolean"/></Props><Children><Child rule="BaseMenuItem" name="Items" aggregated="true"></Child></Children></Rule><Rule name="BaseMenuItem" parents="ClientEventSupportedElement" abstract="true" type="com.bstek.dorado.view.widget.base.menu.BaseMenuItem"><Props>
+<Prop name="className"/>
+<Prop name="exClassName"/>
+<Prop name="height"/>
+<Prop name="name"/><Prop name="style" type="java.util.Map" compositeType="Open"></Prop>
+<Prop name="tip"/>
+<Prop name="visible" defaultValue="true" type="boolean"/>
+<Prop name="width"/></Props></Rule><Rule name="Separator" parents="BaseMenuItem" label="Separator" type="com.bstek.dorado.view.widget.base.menu.Separator" icon="/com/bstek/dorado/view/widget/base/menu/Separator.png" clientTypes="desktop,touch"></Rule><Rule name="CheckableMenuItem" parents="MenuItem" label="CheckableMenuItem" type="com.bstek.dorado.view.widget.base.menu.CheckableMenuItem" icon="/com/bstek/dorado/view/widget/base/menu/CheckableMenuItem.png" clientTypes="desktop"><Props>
+<Prop name="checked" type="boolean"/>
+<Prop name="group"/></Props><ClientEvents>
+<ClientEvent name="onCheckedChange" parameters="self,arg"/></ClientEvents></Rule><Rule name="TextMenuItem" parents="BaseMenuItem" abstract="true" type="com.bstek.dorado.view.widget.base.menu.TextMenuItem"><Props>
+<Prop name="action" reference="Action:id"/>
+<Prop name="caption"/>
+<Prop name="disabled" type="boolean"/>
+<Prop name="hideOnClick" defaultValue="true" type="boolean"/>
+<Prop name="icon"/>
+<Prop name="iconClass"/></Props><ClientEvents>
+<ClientEvent name="onClick" parameters="self,arg"/></ClientEvents></Rule><Rule name="MenuItem" parents="TextMenuItem" label="MenuItem" type="com.bstek.dorado.view.widget.base.menu.MenuItem" icon="/com/bstek/dorado/view/widget/base/menu/MenuItem.png" clientTypes="desktop"><Children><Child rule="BaseMenuItem" name="Items" aggregated="true"></Child></Children></Rule><Rule name="ControlMenuItem" parents="TextMenuItem" label="ControlMenuItem" type="com.bstek.dorado.view.widget.base.menu.ControlMenuItem" icon="/com/bstek/dorado/view/widget/base/menu/ControlMenuItem.png" clientTypes="desktop"><Children><Child rule="FloatControl" name="Control"></Child></Children></Rule><Rule name="FloatControl" abstract="true" type="com.bstek.dorado.view.widget.FloatControl"><Props>
+<Prop name="align" enumValues="left,innerleft,center,innerright,top" visible="false"/>
+<Prop name="anchorTarget" visible="false"/>
+<Prop name="animateTarget" visible="false"/>
+<Prop name="animateType" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
+<Prop name="autoAdjustPosition" type="boolean"/>
+<Prop name="center" type="boolean"/>
+<Prop name="continuedFocus" type="boolean"/>
+<Prop name="floating" type="boolean"/>
+<Prop name="floatingClassName"/>
+<Prop name="focusAfterShow" type="boolean"/>
+<Prop name="handleOverflow" visible="false" type="boolean"/>
+<Prop name="hideAnimateType" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
+<Prop name="left" type="int"/>
+<Prop name="modal" type="boolean"/>
+<Prop name="modalType" enumValues="dark,transparent"/>
+<Prop name="offsetLeft" type="int"/>
+<Prop name="offsetTop" type="int"/>
+<Prop name="shadowMode" enumValues="drop,sides,frame,none"/>
+<Prop name="showAnimateType" enumValues="zoom,modernZoom,flip,slide,safeSlide,modernSlide,fade,none"/>
+<Prop name="top" type="int"/>
+<Prop name="vAlign" enumValues="top,innertop,center,innerbottom,bottom" visible="false"/></Props></Rule><Rule name="Fill" parents="com.bstek.dorado.view.widget.Control" label="Fill" type="com.bstek.dorado.view.widget.base.toolbar.Fill" scope="protected" category="ToolBar" icon="/com/bstek/dorado/view/widget/base/toolbar/Fill.png" clientTypes="desktop"></Rule><Rule name="com.bstek.dorado.view.widget.base.toolbar.Button" parents="Button" label="ToolBarButton" nodeName="ToolBarButton" type="com.bstek.dorado.view.widget.base.toolbar.Button" scope="protected" category="ToolBar" icon="/com/bstek/dorado/view/widget/base/toolbar/Button.png" clientTypes="desktop"><Props>
+<Prop name="hideMenuOnMouseLeave" type="boolean"/>
+<Prop name="hideMenuOnMouseLeaveDelay" defaultValue="300" type="int"/>
+<Prop name="showMenuOnHover" defaultValue="false" type="boolean"/></Props></Rule><Rule name="com.bstek.dorado.view.widget.base.toolbar.Separator" parents="com.bstek.dorado.view.widget.Control" label="Separator" type="com.bstek.dorado.view.widget.base.toolbar.Separator" scope="protected" category="ToolBar" icon="/com/bstek/dorado/view/widget/base/toolbar/Separator.png" clientTypes="desktop"></Rule><Rule name="Section" parents="ClientEventSupportedElement" label="Section" type="com.bstek.dorado.view.widget.base.accordion.Section" icon="/com/bstek/dorado/view/widget/base/accordion/Section.png"><Props>
+<Prop name="caption"/>
+<Prop name="className"/>
+<Prop name="disabled" type="boolean"/>
+<Prop name="exClassName"/>
+<Prop name="icon"/>
+<Prop name="iconClass"/>
+<Prop name="name"/><Prop name="style" type="java.util.Map" compositeType="Open"></Prop>
+<Prop name="tip"/>
+<Prop name="visible" defaultValue="true" type="boolean"/></Props><ClientEvents>
+<ClientEvent name="onCaptionClick" parameters="self,arg"/></ClientEvents><Children><Child rule="com.bstek.dorado.view.widget.Control" name="Control"></Child></Children></Rule><Rule name="AbstractDataControl" parents="com.bstek.dorado.view.widget.Control" abstract="true" type="com.bstek.dorado.view.widget.datacontrol.AbstractDataControl" scope="protected" clientTypes="desktop"><Props>
+<Prop name="dataPath" highlight="1"/>
+<Prop name="dataSet" highlight="1" reference="DataSet:id"/></Props><ClientEvents>
+<ClientEvent name="onGetBindingData" parameters="self,arg"/>
+<ClientEvent name="onGetBindingDataType" parameters="self,arg"/></ClientEvents></Rule><Rule name="AbstractPropertyDataControl" parents="AbstractDataControl" abstract="true" type="com.bstek.dorado.view.widget.datacontrol.AbstractPropertyDataControl" scope="protected" clientTypes="desktop"><Props>
+<Prop name="property" highlight="1"/></Props><ClientEvents>
+<ClientEvent name="onGetBindingData" parameters="self,arg"/>
+<ClientEvent name="onGetBindingDataType" parameters="self,arg"/></ClientEvents></Rule><Rule name="AbstractEditor" parents="com.bstek.dorado.view.widget.Control" abstract="true" type="com.bstek.dorado.view.widget.form.AbstractEditor" scope="protected" clientTypes="desktop"><Props>
+<Prop name="readOnly" type="boolean"/>
+<Prop name="supportsDirtyFlag" defaultValue="true" type="boolean"/></Props><ClientEvents>
+<ClientEvent name="onPost" parameters="self,arg"/>
+<ClientEvent name="beforePost" parameters="self,arg"/>
+<ClientEvent name="onPostFailed" parameters="self,arg"/></ClientEvents></Rule><Rule name="AbstractDataEditor" parents="AbstractEditor" abstract="true" type="com.bstek.dorado.view.widget.form.AbstractDataEditor" scope="protected" clientTypes="desktop"><Props>
+<Prop name="dataPath" highlight="1"/>
+<Prop name="dataSet" highlight="1" reference="DataSet:id"/>
+<Prop name="property" highlight="1"/></Props><ClientEvents>
+<ClientEvent name="onGetBindingData" parameters="self,arg"/>
+<ClientEvent name="onGetBindingDataType" parameters="self,arg"/></ClientEvents></Rule><Rule name="AbstractTextBox" parents="AbstractDataEditor" abstract="true" type="com.bstek.dorado.view.widget.form.AbstractTextBox" scope="protected" clientTypes="desktop"><Props>
+<Prop name="text"/>
+<Prop name="trigger" enumValues="triggerClear,autoMappingDropDown1,autoMappingDropDown2,autoOpenMappingDropDown1,autoOpenMappingDropDown2,defaultDateDropDown,defaultDateTimeDropDown,defaultYearMonthDropDown,defaultYearDropDown,defaultMonthDropDown" reference="Trigger:id"/></Props><ClientEvents>
+<ClientEvent name="onValidationStateChange" parameters="self,arg"/>
+<ClientEvent name="onTriggerClick" parameters="self,arg"/>
+<ClientEvent name="onTextEdit" parameters="self,arg"/></ClientEvents></Rule><Rule name="AbstractTextEditor" parents="AbstractTextBox" abstract="true" type="com.bstek.dorado.view.widget.form.AbstractTextEditor" scope="protected" clientTypes="desktop"><Props>
+<Prop name="blankText"/>
+<Prop name="editable" defaultValue="true" type="boolean"/>
+<Prop name="maxLength" type="int"/>
+<Prop name="minLength" type="int"/>
+<Prop name="required" type="boolean"/>
+<Prop name="selectTextOnFocus" defaultValue="true" type="boolean"/></Props></Rule><Rule name="RadioButton" label="RadioButton" type="com.bstek.dorado.view.widget.form.RadioButton" icon="/com/bstek/dorado/view/widget/form/RadioButton.png"><Props>
+<Prop name="readOnly" type="boolean"/>
+<Prop name="text"/>
+<Prop name="value" type="java.lang.Object"/></Props></Rule><Rule name="AutoFormElement" parents="FormElement" label="AutoFormElement" type="com.bstek.dorado.view.widget.form.autoform.AutoFormElement" scope="protected" category="AutoForm" icon="/com/bstek/dorado/view/widget/form/autoform/AutoFormElement.png" labelProperty="id,name,property" clientTypes="desktop,touch"><Props>
+<Prop name="name"/></Props></Rule><Rule name="Spinner" parents="AbstractTextBox" abstract="true" type="com.bstek.dorado.view.widget.form.Spinner" scope="protected" clientTypes="desktop"><Props>
+<Prop name="postValueOnSpin" defaultValue="true" type="boolean"/>
+<Prop name="showSpinTrigger" defaultValue="true" type="boolean"/>
+<Prop name="step" defaultValue="1" type="int"/></Props></Rule><Rule name="DropDown" parents="Trigger" abstract="true" type="com.bstek.dorado.view.widget.form.trigger.DropDown" scope="protected"><Props>
+<Prop name="assignmentMap"/>
+<Prop name="autoOpen" type="boolean"/>
+<Prop name="height" type="int"/>
+<Prop name="maxHeight" type="int"/>
+<Prop name="maxWidth" type="int"/>
+<Prop name="minHeight" type="int"/>
+<Prop name="minWidth" type="int"/>
+<Prop name="postValueOnSelect" defaultValue="true" type="boolean"/>
+<Prop name="width" type="int"/></Props><ClientEvents>
+<ClientEvent name="onValueSelect" parameters="self,arg"/>
+<ClientEvent name="onClose" parameters="self,arg"/>
+<ClientEvent name="onOpen" parameters="self,arg"/></ClientEvents></Rule><Rule name="RowListDropDown" parents="DropDown" abstract="true" type="com.bstek.dorado.view.widget.form.trigger.RowListDropDown" scope="protected"><Props>
+<Prop name="displayProperty"/>
+<Prop name="dynaFilter" type="boolean"/>
+<Prop name="filterOnOpen" type="boolean"/>
+<Prop name="filterOnTyping" defaultValue="true" type="boolean"/>
+<Prop name="minFilterInterval" defaultValue="300" type="int"/>
+<Prop name="property" highlight="1"/>
+<Prop name="useEmptyItem" type="boolean"/></Props><ClientEvents>
+<ClientEvent name="onFilterItems" parameters="self,arg"/>
+<ClientEvent name="onFilterItem" parameters="self,arg"/></ClientEvents><Children><Child rule="Column" name="Columns" aggregated="true"></Child></Children></Rule><Rule name="Column" parents="ClientEventSupportedElement" abstract="true" type="com.bstek.dorado.view.widget.grid.Column"><Props>
+<Prop name="align" enumValues="left,center,right"/>
+<Prop name="caption"/>
+<Prop name="headerAlign" defaultValue="center" enumValues="left,center,right"/>
+<Prop name="headerRenderer"/>
+<Prop name="name"/>
+<Prop name="supportsOptionMenu" defaultValue="true" type="boolean"/>
+<Prop name="visible" defaultValue="true" type="boolean"/></Props><ClientEvents>
+<ClientEvent name="onGetCellEditor" parameters="self,arg"/>
+<ClientEvent name="onHeaderClick" parameters="self,arg"/>
+<ClientEvent name="onRenderHeaderCell" parameters="self,arg"/></ClientEvents></Rule><Rule name="DataColumn" parents="AbstractDataColumn" label="DataColumn" type="com.bstek.dorado.view.widget.grid.DataColumn" icon="/com/bstek/dorado/view/widget/grid/DataColumn.png" labelProperty="name,property"><Props>
+<Prop name="align" enumValues="left,center,right"/>
+<Prop name="dataType" type="com.bstek.dorado.data.type.DataType"/>
+<Prop name="defaultFilterOperator"/>
+<Prop name="displayFormat"/>
+<Prop name="editable" defaultValue="true" type="boolean"/>
+<Prop name="editorType" defaultValue="TextEditor" highlight="1" enumValues="None,TextEditor,PasswordEditor,TextArea,CheckBox,RadioGroup,NumberSpinner"/>
+<Prop name="filterable" defaultValue="true" type="boolean"/>
+<Prop name="property" highlight="1"/>
+<Prop name="readOnly" type="boolean"/>
+<Prop name="required" type="boolean"/>
+<Prop name="sortState" defaultValue="none" enumValues="none,asc,desc"/>
+<Prop name="summaryType" enumValues="sum,average,count,max,min"/>
+<Prop name="trigger" enumValues="triggerClear,autoMappingDropDown1,autoMappingDropDown2,autoOpenMappingDropDown1,autoOpenMappingDropDown2,defaultDateDropDown,defaultDateTimeDropDown,defaultYearMonthDropDown,defaultYearDropDown,defaultMonthDropDown" reference="Trigger:id"/>
+<Prop name="typeFormat"/>
+<Prop name="wrappable" type="boolean"/></Props><Children><Child name="Editor" fixed="true"><Rule name="Wrapper.Editor" label="Editor" nodeName="Editor" icon="/com/bstek/dorado/view/widget/grid/Editor.png"><Children><Child rule="com.bstek.dorado.view.widget.Control" name="Editor"></Child></Children></Rule></Child></Children></Rule><Rule name="AbstractDataColumn" parents="Column" abstract="true" type="com.bstek.dorado.view.widget.grid.AbstractDataColumn"><Props>
+<Prop name="filterBarRenderer"/>
+<Prop name="footerRenderer"/>
+<Prop name="renderer"/>
+<Prop name="resizeable" defaultValue="true" type="boolean"/>
+<Prop name="width"/></Props><ClientEvents>
+<ClientEvent name="onRenderFooterCell" parameters="self,arg"/>
+<ClientEvent name="onRenderCell" parameters="self,arg"/></ClientEvents></Rule><Rule name="ColumnGroup" parents="Column" label="ColumnGroup" type="com.bstek.dorado.view.widget.grid.ColumnGroup" icon="/com/bstek/dorado/view/widget/grid/ColumnGroup.png"><Props>
+<Prop name="align" enumValues="left,center,right" visible="false"/></Props><Children><Child rule="Column" name="Columns" aggregated="true"></Child></Children></Rule><Rule name="IndicatorColumn" parents="AbstractDataColumn" label="IndicatorColumn" type="com.bstek.dorado.view.widget.grid.IndicatorColumn" icon="/com/bstek/dorado/view/widget/grid/IndicatorColumn.png"></Rule><Rule name="RowSelectorColumn" parents="AbstractDataColumn" label="RowSelectorColumn" type="com.bstek.dorado.view.widget.grid.RowSelectorColumn" icon="/com/bstek/dorado/view/widget/grid/RowSelectorColumn.png"></Rule><Rule name="RowNumColumn" parents="AbstractDataColumn" label="RowNumColumn" type="com.bstek.dorado.view.widget.grid.RowNumColumn" icon="/com/bstek/dorado/view/widget/grid/RowNumColumn.png"></Rule><Rule name="AbstractList" parents="com.bstek.dorado.view.widget.Control" abstract="true" type="com.bstek.dorado.view.widget.list.AbstractList" scope="protected" clientTypes="desktop"><Props>
+<Prop name="allowNoCurrent" type="boolean"/>
+<Prop name="dragMode" defaultValue="item" enumValues="item,control,itemOrControl"/>
+<Prop name="dropMode" defaultValue="insertItems" enumValues="onControl,onItem,insertItems,onOrInsertItems,onAnyWhere"/>
+<Prop name="scrollMode" defaultValue="lazyRender" enumValues="simple,lazyRender,viewport"/>
+<Prop name="selectionMode" defaultValue="none" enumValues="none,singleRow,multiRows"/>
+<Prop name="useNativeScrollbars" type="boolean"/></Props><ClientEvents>
+<ClientEvent name="onCompareItems" parameters="self,arg"/>
+<ClientEvent name="onCurrentChange" parameters="self,arg"/>
+<ClientEvent name="onFilterItem" parameters="self,arg"/>
+<ClientEvent name="onSelectionChange" parameters="self,arg"/>
+<ClientEvent name="beforeSelectionChange" parameters="self,arg"/></ClientEvents></Rule><Rule name="RowList" parents="AbstractList" abstract="true" type="com.bstek.dorado.view.widget.list.RowList" scope="protected" clientTypes="desktop"><Props>
+<Prop name="highlightCurrentRow" defaultValue="true" type="boolean"/>
+<Prop name="highlightHoverRow" defaultValue="true" type="boolean"/>
+<Prop name="highlightSelectedRow" defaultValue="true" type="boolean"/>
+<Prop name="rowHeight" type="int"/></Props><ClientEvents>
+<ClientEvent name="onDataRowClick" parameters="self,arg"/>
+<ClientEvent name="onDataRowDoubleClick" parameters="self,arg"/></ClientEvents></Rule><Rule name="AbstractListBox" parents="RowList" abstract="true" type="com.bstek.dorado.view.widget.list.AbstractListBox" scope="protected" clientTypes="desktop"><Props>
+<Prop name="property"/>
+<Prop name="renderer"/></Props><ClientEvents>
+<ClientEvent name="onRenderRow" parameters="self,arg"/></ClientEvents></Rule><Rule name="GridSupport" parents="RowList" abstract="true" type="com.bstek.dorado.view.widget.grid.GridSupport" scope="protected" clientTypes="desktop"><Props>
+<Prop name="cellRenderer"/>
+<Prop name="dynaRowHeight" type="boolean"/>
+<Prop name="fixedColumnCount" type="int"/>
+<Prop name="footerRenderer"/>
+<Prop name="footerRowHeight" type="int"/>
+<Prop name="headerRenderer"/>
+<Prop name="headerRowHeight" type="int"/>
+<Prop name="readOnly" type="boolean"/>
+<Prop name="rowRenderer"/>
+<Prop name="showFooter" type="boolean"/>
+<Prop name="showHeader" defaultValue="true" type="boolean"/>
+<Prop name="stretchColumnsMode" defaultValue="auto" enumValues="auto,off,stretchableColumns,lastColumn,allColumns,allResizeableColumns"/></Props><ClientEvents>
+<ClientEvent name="beforeCellValueEdit" parameters="self,arg"/>
+<ClientEvent name="onGetCellEditor" parameters="self,arg"/>
+<ClientEvent name="onRenderRow" parameters="self,arg"/>
+<ClientEvent name="onRenderFooterCell" parameters="self,arg"/>
+<ClientEvent name="onCellValueEdit" parameters="self,arg"/>
+<ClientEvent name="onRenderCell" parameters="self,arg"/>
+<ClientEvent name="onHeaderClick" parameters="self,arg"/>
+<ClientEvent name="onRenderHeaderCell" parameters="self,arg"/></ClientEvents><Children><Child rule="Column" name="Columns" aggregated="true"></Child></Children></Rule><Rule name="AbstractGrid" parents="GridSupport" abstract="true" type="com.bstek.dorado.view.widget.grid.AbstractGrid" scope="protected" clientTypes="desktop"><Props>
+<Prop name="filterBarRenderer"/>
+<Prop name="groupFooterRenderer"/>
+<Prop name="groupHeaderRenderer"/>
+<Prop name="groupOnSort" defaultValue="true" type="boolean"/>
+<Prop name="groupProperty"/>
+<Prop name="showFilterBar" type="boolean"/>
+<Prop name="showGroupFooter" type="boolean"/></Props></Rule><Rule name="AbstractTree" parents="RowList" abstract="true" type="com.bstek.dorado.view.widget.tree.AbstractTree" scope="protected" clientTypes="desktop"><Props>
+<Prop name="defaultExpandedIcon"/>
+<Prop name="defaultExpandedIconClass"/>
+<Prop name="defaultIcon"/>
+<Prop name="defaultIconClass"/>
+<Prop name="dropMode" defaultValue="onItem" enumValues="onControl,onItem,insertItems,onOrInsertItems,onAnyWhere"/>
+<Prop name="expandingAnimated" defaultValue="true" type="boolean"/>
+<Prop name="expandingMode" defaultValue="async" enumValues="async,sync"/>
+<Prop name="indent" type="int"/>
+<Prop name="renderer"/>
+<Prop name="scrollMode" enumValues="simple,lazyRender,viewport"/>
+<Prop name="showLines" type="boolean"/></Props><ClientEvents>
+<ClientEvent name="onRenderNode" parameters="self,arg"/>
+<ClientEvent name="onCollapse" parameters="self,arg"/>
+<ClientEvent name="onNodeAttached" parameters="self,arg"/>
+<ClientEvent name="beforeNodeCheckedChange" parameters="self,arg"/>
+<ClientEvent name="onExpand" parameters="self,arg"/>
+<ClientEvent name="beforeCollapse" parameters="self,arg"/>
+<ClientEvent name="beforeCurrentChange" parameters="self,arg"/>
+<ClientEvent name="beforeExpand" parameters="self,arg"/>
+<ClientEvent name="onNodeDetached" parameters="self,arg"/>
+<ClientEvent name="onNodeCheckedChange" parameters="self,arg"/></ClientEvents></Rule><Rule name="BaseNode" abstract="true" type="com.bstek.dorado.view.widget.tree.BaseNode"><Props>
+<Prop name="autoCheckChildren" defaultValue="true" type="boolean"/>
+<Prop name="checkable" type="boolean"/>
+<Prop name="checked" type="boolean"/>
+<Prop name="data" type="java.lang.Object"/>
+<Prop name="expanded" type="boolean"/>
+<Prop name="expandedIcon"/>
+<Prop name="expandedIconClass"/>
+<Prop name="hasChild" type="boolean"/>
+<Prop name="icon"/>
+<Prop name="iconClass"/>
+<Prop name="ignored" type="boolean"/>
+<Prop name="label"/>
+<Prop name="tags"/>
+<Prop name="tip"/>
+<Prop name="userData" type="java.lang.Object"/></Props><Children><Child rule="BaseNode" name="Nodes" aggregated="true"></Child></Children></Rule><Rule name="Node" parents="BaseNode" label="Node" type="com.bstek.dorado.view.widget.tree.Node" icon="/com/bstek/dorado/view/widget/tree/Node.png"><PrimitiveProps>
+<Prop name="id" highlight="1"/></PrimitiveProps><Props><Prop name="metaData" type="java.util.Map" compositeType="Open"></Prop></Props></Rule><Rule name="BindingConfig" label="BindingConfig" type="com.bstek.dorado.view.widget.tree.BindingConfig" icon="/com/bstek/dorado/view/widget/tree/BindingConfig.png"><Props>
+<Prop name="autoCheckChildren" defaultValue="true" type="boolean"/>
+<Prop name="checkable" type="boolean"/>
+<Prop name="checkedProperty"/>
+<Prop name="childrenProperty"/>
+<Prop name="expandLevel" type="int"/>
+<Prop name="expandedIcon"/>
+<Prop name="expandedIconClass"/>
+<Prop name="expandedIconProperty"/>
+<Prop name="hasChild" type="java.lang.Boolean"/>
+<Prop name="hasChildProperty"/>
+<Prop name="icon"/>
+<Prop name="iconClass"/>
+<Prop name="iconProperty"/>
+<Prop name="ignored" type="boolean"/>
+<Prop name="labelProperty"/>
+<Prop name="name"/>
+<Prop name="recursive" type="boolean"/>
+<Prop name="tags"/>
+<Prop name="tipProperty"/></Props><Children><Child rule="BindingConfig" name="ChildBindingConfigs" aggregated="true"></Child></Children></Rule><Rule name="AbstractBlockView" parents="AbstractList" abstract="true" type="com.bstek.dorado.view.widget.blockview.AbstractBlockView" scope="protected" clientTypes="desktop"><Props>
+<Prop name="blockDecoratorSize" defaultValue="4" type="int"/>
+<Prop name="blockHeight" defaultValue="80" type="int"/>
+<Prop name="blockLayout" defaultValue="vertical" enumValues="vertical,horizontal"/>
+<Prop name="blockWidth" defaultValue="80" type="int"/>
+<Prop name="fillLine" type="boolean"/>
+<Prop name="horiPadding" defaultValue="8" type="int"/>
+<Prop name="horiSpacing" defaultValue="8" type="int"/>
+<Prop name="lineSize" type="int"/>
+<Prop name="renderer"/>
+<Prop name="vertPadding" defaultValue="8" type="int"/>
+<Prop name="vertSpacing" defaultValue="8" type="int"/></Props><ClientEvents>
+<ClientEvent name="onBlockClick" parameters="self,arg" clientTypes="desktop"/>
+<ClientEvent name="onBlockDoubleClick" parameters="self,arg" clientTypes="desktop"/>
+<ClientEvent name="onRenderBlock" parameters="self,arg"/>
+<ClientEvent name="onBlockTap" parameters="self,arg" clientTypes="touch"/>
+<ClientEvent name="onBlockMouseDown" parameters="self,arg"/>
+<ClientEvent name="onBlockMouseUp" parameters="self,arg"/>
+<ClientEvent name="onBlockTapHold" parameters="self,arg" clientTypes="touch"/></ClientEvents></Rule><Rule name="AbstractTreeGrid" parents="GridSupport" abstract="true" type="com.bstek.dorado.view.widget.treegrid.AbstractTreeGrid" scope="protected" clientTypes="desktop"><Props>
+<Prop name="defaultExpandedIcon"/>
+<Prop name="defaultExpandedIconClass"/>
+<Prop name="defaultIcon"/>
+<Prop name="defaultIconClass"/>
+<Prop name="dropMode" defaultValue="onItem" enumValues="onControl,onItem,insertItems,onOrInsertItems,onAnyWhere"/>
+<Prop name="expandingAnimated" defaultValue="true" type="boolean"/>
+<Prop name="expandingMode" defaultValue="async" enumValues="async,sync"/>
+<Prop name="indent" type="int"/>
+<Prop name="showLines" type="boolean"/>
+<Prop name="treeColumn" highlight="1"/></Props><ClientEvents>
+<ClientEvent name="onRenderNode" parameters="self,arg"/>
+<ClientEvent name="onCollapse" parameters="self,arg"/>
+<ClientEvent name="onNodeAttached" parameters="self,arg"/>
+<ClientEvent name="beforeNodeCheckedChange" parameters="self,arg"/>
+<ClientEvent name="onExpand" parameters="self,arg"/>
+<ClientEvent name="beforeCollapse" parameters="self,arg"/>
+<ClientEvent name="beforeExpand" parameters="self,arg"/>
+<ClientEvent name="onNodeDetached" parameters="self,arg"/>
+<ClientEvent name="onNodeCheckedChange" parameters="self,arg"/></ClientEvents><Children><Child name="Columns" fixed="true"><Rule name="Wrapper.Columns" label="Columns" nodeName="Columns" icon="/com/bstek/dorado/view/widget/treegrid/Columns.png"><Children><Child rule="Column" name="Columns" aggregated="true"></Child></Children></Rule></Child></Children></Rule><Rule name="Filter" label="Filter" type="com.bstek.dorado.uploader.widget.Filter" labelProperty="title"><Props>
+<Prop name="extensions"/>
+<Prop name="title"/></Props></Rule><Rule name="DefaultView" parents="View" label="View" nodeName="View" type="com.bstek.dorado.view.DefaultView" category="General" icon="/com/bstek/dorado/view/DefaultView.png" clientTypes="desktop"></Rule></RuleSet>
\ No newline at end of file
diff --git a/igds-protocol-modbus/pom.xml b/igds-protocol-modbus/pom.xml
index 75ac12b..150f570 100644
--- a/igds-protocol-modbus/pom.xml
+++ b/igds-protocol-modbus/pom.xml
@@ -13,8 +13,6 @@
 	</properties>
 
 
-
-
 	<dependencies>
 
 		<!-- 寮曞叆IO鍖� -->
@@ -66,21 +64,32 @@
 
 	</dependencies>
 
- 	<build>
- 		<plugins>
- 			<plugin>
- 				<groupId>org.apache.maven.plugins</groupId>
- 				<artifactId>maven-compiler-plugin</artifactId>
- 				<configuration>
- 					<source>1.8</source>
- 					<target>1.8</target>
- 					<compilerArguments>
- 						<extdirs>src\main\webapp\WEB-INF\lib</extdirs>
- 					</compilerArguments>
- 				</configuration>
- 			</plugin>
- 		</plugins>
- 	</build>
+	<build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                </configuration>
+            </plugin>
+        </plugins>
+
+        <resources>
+            <resource>
+                <directory>src/main/java</directory>
+                <includes>
+                    <include>**/*.xml</include>
+                    <include>**/*.js</include>
+                </includes>
+                <filtering>true</filtering>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+            </resource>
+        </resources>
+    </build>
 
 
 <!--	<repositories>-->
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/modbus/DeviceModbus.view.xml b/igds-protocol-modbus/src/main/java/com/ld/igds/modbus/DeviceModbus.view.xml
new file mode 100644
index 0000000..0992467
--- /dev/null
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/modbus/DeviceModbus.view.xml
@@ -0,0 +1,313 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ViewConfig>
+  <Arguments/>
+  <Context/>
+  <Model>
+    <DataType name="dtMain">
+      <Property name="creationType">com.ld.igds.models.DeviceModbus</Property>
+      <PropertyDef name="id">
+        <Property/>
+        <Property name="label">ID</Property>
+      </PropertyDef>
+      <PropertyDef name="deviceCode">
+        <Property/>
+        <Property name="label">璁惧缂栫爜</Property>
+      </PropertyDef>
+      <PropertyDef name="open">
+        <Property/>
+        <Property name="label">寮�鍦板潃</Property>
+      </PropertyDef>
+      <PropertyDef name="openFun">
+        <Property/>
+        <Property name="label">鍔熻兘鍙�</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;deviceModbusPR#triggerFun&quot;).getResult()}</Property>
+          <Property name="keyProperty">code</Property>
+          <Property name="valueProperty">name</Property>
+        </Property>
+      </PropertyDef>
+      <PropertyDef name="close">
+        <Property/>
+        <Property name="label">鍏冲湴鍧�</Property>
+      </PropertyDef>
+      <PropertyDef name="closeFun">
+        <Property/>
+        <Property name="label">鍔熻兘鍙�</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;deviceModbusPR#triggerFun&quot;).getResult()}</Property>
+          <Property name="keyProperty">code</Property>
+          <Property name="valueProperty">name</Property>
+        </Property>
+      </PropertyDef>
+      <PropertyDef name="stop">
+        <Property/>
+        <Property name="label">鍋滃湴鍧�</Property>
+      </PropertyDef>
+      <PropertyDef name="stopFun">
+        <Property/>
+        <Property name="label">鍔熻兘鍙�</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;deviceModbusPR#triggerFun&quot;).getResult()}</Property>
+          <Property name="keyProperty">code</Property>
+          <Property name="valueProperty">name</Property>
+        </Property>
+      </PropertyDef>
+      <PropertyDef name="openEnd">
+        <Property/>
+        <Property name="label">鍋滃湴鍧�</Property>
+      </PropertyDef>
+      <PropertyDef name="openEndFun">
+        <Property/>
+        <Property name="label">鍔熻兘鍙�</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;deviceModbusPR#triggerFun&quot;).getResult()}</Property>
+          <Property name="keyProperty">code</Property>
+          <Property name="valueProperty">name</Property>
+        </Property>
+      </PropertyDef>
+      <PropertyDef name="closeEnd">
+        <Property/>
+        <Property name="label">鍏冲埌浣嶅湴鍧�</Property>
+      </PropertyDef>
+      <PropertyDef name="closeEndFun">
+        <Property/>
+        <Property name="label">鍔熻兘鍙�</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;deviceModbusPR#triggerFun&quot;).getResult()}</Property>
+          <Property name="keyProperty">code</Property>
+          <Property name="valueProperty">name</Property>
+        </Property>
+      </PropertyDef>
+      <PropertyDef name="openError">
+        <Property/>
+        <Property name="label">寮�鏁呴殰鍦板潃</Property>
+      </PropertyDef>
+      <PropertyDef name="openErrorFun">
+        <Property/>
+        <Property name="label">鍔熻兘鍙�</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;deviceModbusPR#triggerFun&quot;).getResult()}</Property>
+          <Property name="keyProperty">code</Property>
+          <Property name="valueProperty">name</Property>
+        </Property>
+      </PropertyDef>
+      <PropertyDef name="closeError">
+        <Property/>
+        <Property name="label">鍏虫晠闅滃湴鍧�</Property>
+      </PropertyDef>
+      <PropertyDef name="closeErrorFun">
+        <Property/>
+        <Property name="label">鍔熻兘鍙�</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;deviceModbusPR#triggerFun&quot;).getResult()}</Property>
+          <Property name="keyProperty">code</Property>
+          <Property name="valueProperty">name</Property>
+        </Property>
+      </PropertyDef>
+      <PropertyDef name="bizType">
+        <Property/>
+        <Property name="label">涓氬姟绫诲瀷</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider("dicTriggerPR#triggerBizType").getResult()}</Property>
+          <Property name="keyProperty">code</Property>
+          <Property name="valueProperty">name</Property>
+        </Property>
+      </PropertyDef>
+      <PropertyDef name="serId">
+        <Property/>
+        <Property name="label">鎵�灞炲垎鏈�</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;deviceSerPR#getAllSerCache&quot;).getResult()}</Property>
+          <Property name="keyProperty">id</Property>
+          <Property name="valueProperty">name</Property>
+        </Property>
+      </PropertyDef>
+    </DataType>
+  </Model>
+  <View layout="padding:5;regionPadding:5">
+    <Property name="packages">font-awesome,css-common</Property>
+    <DataSet id="dsMain">
+      <Property name="loadMode">lazy</Property>
+      <Property name="dataType">[dtMain]</Property>
+      <Property name="dataProvider">deviceModbusPR#listAll</Property>
+    </DataSet>
+    <Container layout="regionPadding:10" layoutConstraint="top">
+      <Property name="exClassName">bg-color</Property>
+      <Property name="contentOverflow">hidden</Property>
+      <Property name="height">55</Property>
+      <Label layoutConstraint="left">
+        <Property name="text">鑿滃崟鏍忥細</Property>
+      </Label>
+      <Button layoutConstraint="left">
+        <ClientEvent name="onClick">view.get(&quot;#dsMain&quot;).insert({});</ClientEvent>
+        <Property name="caption">鏂板</Property>
+        <Property name="exClassName">btn-default</Property>
+        <Property name="iconClass">fa fa-plus</Property>
+      </Button>
+      <Button>
+        <ClientEvent name="onClick"> view.get(&quot;#uaAction&quot;).execute();   </ClientEvent>
+        <Property name="caption">淇濆瓨</Property>
+        <Property name="iconClass">fa fa-check</Property>
+        <Property name="exClassName">btn-normal</Property>
+      </Button>
+      <Button layoutConstraint="left">
+        <ClientEvent name="onClick">var data = view.get(&quot;#dsMain.data:#&quot;);&#xD;
+if(!data){&#xD;
+	return;&#xD;
+}&#xD;
+view.get(&quot;#ajaxDel&quot;).set(&quot;parameter&quot;,data).execute(function(result){&#xD;
+	if(result){&#xD;
+		$alert(result);&#xD;
+		return;&#xD;
+	}else{&#xD;
+		data.remove();&#xD;
+	}&#xD;
+});           </ClientEvent>
+        <Property name="caption">鍒犻櫎</Property>
+        <Property name="exClassName">btn-warn</Property>
+        <Property name="iconClass">fa fa-minus</Property>
+      </Button>
+      <Button layoutConstraint="left">
+        <ClientEvent name="onClick">view.get(&quot;#dsMain&quot;).flushAsync(); </ClientEvent>
+        <Property name="caption">鍒锋柊</Property>
+        <Property name="exClassName">btn-default</Property>
+        <Property name="iconClass">fa fa-refresh</Property>
+      </Button>
+      <Button layoutConstraint="left">
+        <Property name="caption">鍒锋柊缂撳瓨</Property>
+        <Property name="exClassName">btn-default</Property>
+        <Property name="iconClass">fa fa-refresh</Property>
+        <Property name="action">ajaxFlushCache</Property>
+      </Button>
+    </Container>
+    <Container layout="regionPadding:10" layoutConstraint="center">
+      <Property name="exClassName">bg-color</Property>
+      <DataGrid layoutConstraint="center padding:5px">
+        <Property name="dataSet">dsMain</Property>
+        <RowNumColumn/>
+        <DataColumn name="deviceCode">
+          <Property name="property">deviceCode</Property>
+        </DataColumn>
+        <DataColumn name="serId">
+          <Property name="property">serId</Property>
+        </DataColumn>
+        <DataColumn name="bizType">
+          <Property name="property">bizType</Property>
+        </DataColumn>
+        <ColumnGroup>
+          <Property name="caption">寮�鎿嶄綔</Property>
+          <DataColumn name="open">
+            <Property name="property">open</Property>
+            <Property name="caption">鍦板潃</Property>
+            <Property name="width">80</Property>
+          </DataColumn>
+          <DataColumn name="openFun">
+            <Property name="property">openFun</Property>
+            <Property name="caption">鍔熻兘</Property>
+            <Property name="width">100</Property>
+            <Property name="trigger">autoMappingDropDown1</Property>
+          </DataColumn>
+        </ColumnGroup>
+        <ColumnGroup>
+          <Property name="caption">鍏虫搷浣�</Property>
+          <DataColumn name="close">
+            <Property name="property">close</Property>
+            <Property name="caption">鍦板潃</Property>
+            <Property name="width">80</Property>
+          </DataColumn>
+          <DataColumn name="closeFun">
+            <Property name="property">closeFun</Property>
+            <Property name="caption">鍔熻兘</Property>
+            <Property name="width">100</Property>
+            <Property name="trigger">autoMappingDropDown1</Property>
+          </DataColumn>
+        </ColumnGroup>
+        <ColumnGroup>
+          <Property name="caption">鍋滄搷浣�</Property>
+          <DataColumn name="stop">
+            <Property name="property">stop</Property>
+            <Property name="caption">鍦板潃</Property>
+            <Property name="width">80</Property>
+          </DataColumn>
+          <DataColumn name="stopFun">
+            <Property name="property">stopFun</Property>
+            <Property name="caption">鍔熻兘</Property>
+            <Property name="width">100</Property>
+            <Property name="trigger">autoMappingDropDown1</Property>
+          </DataColumn>
+        </ColumnGroup>
+        <ColumnGroup>
+          <Property name="caption">寮�鍒颁綅</Property>
+          <DataColumn name="openEnd">
+            <Property name="property">openEnd</Property>
+            <Property name="caption">鍦板潃</Property>
+            <Property name="width">80</Property>
+          </DataColumn>
+          <DataColumn name="openEndFun">
+            <Property name="property">openEndFun</Property>
+            <Property name="caption">鍔熻兘</Property>
+            <Property name="width">100</Property>
+            <Property name="trigger">autoMappingDropDown1</Property>
+          </DataColumn>
+        </ColumnGroup>
+        <ColumnGroup>
+          <Property name="caption">鍏冲埌浣�</Property>
+          <DataColumn name="closeEnd">
+            <Property name="property">closeEnd</Property>
+            <Property name="caption">鍦板潃</Property>
+            <Property name="width">80</Property>
+          </DataColumn>
+          <DataColumn name="closeEndFun">
+            <Property name="property">closeEndFun</Property>
+            <Property name="caption">鍔熻兘</Property>
+            <Property name="width">100</Property>
+            <Property name="trigger">autoMappingDropDown1</Property>
+          </DataColumn>
+        </ColumnGroup>
+        <ColumnGroup>
+          <Property name="caption">寮�鏁呴殰</Property>
+          <DataColumn name="openError">
+            <Property name="property">openError</Property>
+            <Property name="caption">鍦板潃</Property>
+            <Property name="width">80</Property>
+          </DataColumn>
+          <DataColumn name="openErrorFun">
+            <Property name="property">openErrorFun</Property>
+            <Property name="caption">鍔熻兘</Property>
+            <Property name="width">100</Property>
+            <Property name="trigger">autoMappingDropDown1</Property>
+          </DataColumn>
+        </ColumnGroup>
+        <ColumnGroup>
+          <Property name="caption">鍏虫晠闅�</Property>
+          <DataColumn name="closeError">
+            <Property name="property">closeError</Property>
+            <Property name="caption">鍦板潃</Property>
+            <Property name="width">80</Property>
+          </DataColumn>
+          <DataColumn name="closeErrorFun">
+            <Property name="property">closeErrorFun</Property>
+            <Property name="caption">鍔熻兘</Property>
+            <Property name="width">100</Property>
+            <Property name="trigger">autoMappingDropDown1</Property>
+          </DataColumn>
+        </ColumnGroup>
+      </DataGrid>
+    </Container>
+    <UpdateAction id="uaAction">
+      <Property name="dataResolver">deviceModbusPR#updateData</Property>
+      <UpdateItem>
+        <Property name="dataSet">dsMain</Property>
+        <Property name="dataPath">!DIRTY_TREE</Property>
+      </UpdateItem>
+    </UpdateAction>
+    <AjaxAction id="ajaxDel">
+      <Property name="service">deviceModbusPR#delData</Property>
+      <Property name="confirmMessage">纭畾瑕佸垹闄や箞锛�</Property>
+    </AjaxAction>
+    <AjaxAction id="ajaxFlushCache">
+      <Property name="service">deviceModbusPR#flushCache</Property>
+      <Property name="successMessage">缂撳瓨鏇存柊鎴愬姛</Property>
+    </AjaxAction>
+  </View>
+</ViewConfig>
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/modbus/DeviceModbusPR.java b/igds-protocol-modbus/src/main/java/com/ld/igds/modbus/DeviceModbusPR.java
new file mode 100644
index 0000000..361ee0e
--- /dev/null
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/modbus/DeviceModbusPR.java
@@ -0,0 +1,91 @@
+package com.ld.igds.modbus;
+
+import com.bstek.dorado.annotation.DataProvider;
+import com.bstek.dorado.annotation.DataResolver;
+import com.bstek.dorado.annotation.Expose;
+import com.ld.igds.modbus.service.HModbusService;
+import com.ld.igds.models.DeviceModbus;
+import com.ld.igds.models.DicTrigger;
+import com.ld.igds.util.ContextUtil;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * MOOBUS-TCP璁惧鍙傛暟閰嶇疆
+ */
+@Component
+public class DeviceModbusPR {
+
+    @Resource
+    private HModbusService deviceModbusService;
+
+    /**
+     * deviceModbusPR#listAll
+     *
+     * @return
+     */
+    @DataProvider
+    public List<DeviceModbus> listAll() {
+        String companyId = ContextUtil.getCompanyId();
+        return deviceModbusService.listAllDevice(companyId);
+    }
+
+    /**
+     * deviceModbusPR#flushCache
+     *
+     * @return
+     */
+    @Expose
+    public void flushCache() {
+        String companyId = ContextUtil.getCompanyId();
+        deviceModbusService.flushCacheDevice(companyId);
+    }
+
+    /**
+     * deviceModbusPR#delData
+     *
+     * @return
+     */
+    @Expose
+    public String delData(DeviceModbus data) {
+        if (null == data.getId()) return null;
+        return deviceModbusService.delDataDevice(data);
+    }
+
+    /**
+     * 鏁版嵁鏇存柊
+     * deviceModbusPR#updateData
+     *
+     * @param details
+     */
+    @DataResolver
+    public void updateData(List<DeviceModbus> details) {
+        deviceModbusService.updateDataDevice(details);
+    }
+
+
+    /**
+     * ${dorado.getDataProvider("deviceModbusPR#triggerFun").getResult()}
+     *
+     * @return
+     */
+    @DataProvider
+    public List<DicTrigger> triggerFun() {
+        List<DicTrigger> list = new ArrayList<>();
+
+        list.add(new DicTrigger(ModbusConstant.FUN_01, "01-璇荤嚎鍦�"));
+        list.add(new DicTrigger(ModbusConstant.FUN_02, "02-璇荤鏁i噺杈撳叆"));
+        list.add(new DicTrigger(ModbusConstant.FUN_03, "03-璇讳繚鎸佸瘎瀛樺櫒"));
+        list.add(new DicTrigger(ModbusConstant.FUN_04, "04-璇昏緭鍏ュ瘎瀛樺櫒"));
+        list.add(new DicTrigger(ModbusConstant.FUN_05, "05-鍐欏崟涓嚎鍦�"));
+        list.add(new DicTrigger(ModbusConstant.FUN_06, "06-鍐欏崟涓瘎瀛樺櫒"));
+        list.add(new DicTrigger(ModbusConstant.FUN_15, "15-鍐欏涓嚎鍦�"));
+        list.add(new DicTrigger(ModbusConstant.FUN_16, "16-鍐欏涓瘎瀛樺櫒"));
+        list.add(new DicTrigger(ModbusConstant.FUN_99, "鏈厤缃�"));
+        return list;
+    }
+
+}
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/modbus/GasModbus.view.xml b/igds-protocol-modbus/src/main/java/com/ld/igds/modbus/GasModbus.view.xml
new file mode 100644
index 0000000..2576894
--- /dev/null
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/modbus/GasModbus.view.xml
@@ -0,0 +1,378 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ViewConfig>
+  <Arguments/>
+  <Context/>
+  <Model>
+    <DataType name="dtMain">
+      <Property name="creationType">com.ld.igds.models.DeviceModbus</Property>
+      <PropertyDef name="id">
+        <Property></Property>
+        <Property name="label">ID</Property>
+      </PropertyDef>
+      <PropertyDef name="deviceCode">
+        <Property></Property>
+        <Property name="label">浠撳簱缂栫爜</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;depotPR#getAllCache&quot;).getResult()}</Property>
+          <Property name="keyProperty">id</Property>
+          <Property name="valueProperty">name</Property>
+        </Property>
+      </PropertyDef>
+      <PropertyDef name="open">
+        <Property></Property>
+        <Property name="label">寮�鍦板潃</Property>
+      </PropertyDef>
+      <PropertyDef name="openFun">
+        <Property></Property>
+        <Property name="label">鍔熻兘鍙�</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;deviceModbusPR#triggerFun&quot;).getResult()}</Property>
+          <Property name="keyProperty">code</Property>
+          <Property name="valueProperty">name</Property>
+        </Property>
+      </PropertyDef>
+      <PropertyDef name="close">
+        <Property></Property>
+        <Property name="label">鍏冲湴鍧�</Property>
+      </PropertyDef>
+      <PropertyDef name="closeFun">
+        <Property></Property>
+        <Property name="label">鍔熻兘鍙�</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;deviceModbusPR#triggerFun&quot;).getResult()}</Property>
+          <Property name="keyProperty">code</Property>
+          <Property name="valueProperty">name</Property>
+        </Property>
+      </PropertyDef>
+      <PropertyDef name="stop">
+        <Property></Property>
+        <Property name="label">鍋滃湴鍧�</Property>
+      </PropertyDef>
+      <PropertyDef name="stopFun">
+        <Property></Property>
+        <Property name="label">鍔熻兘鍙�</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;deviceModbusPR#triggerFun&quot;).getResult()}</Property>
+          <Property name="keyProperty">code</Property>
+          <Property name="valueProperty">name</Property>
+        </Property>
+      </PropertyDef>
+      <PropertyDef name="openEnd">
+        <Property></Property>
+        <Property name="label">寮�鍒颁綅</Property>
+      </PropertyDef>
+      <PropertyDef name="openEndFun">
+        <Property></Property>
+        <Property name="label">鍔熻兘鍙�</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;deviceModbusPR#triggerFun&quot;).getResult()}</Property>
+          <Property name="keyProperty">code</Property>
+          <Property name="valueProperty">name</Property>
+        </Property>
+      </PropertyDef>
+      <PropertyDef name="closeEnd">
+        <Property></Property>
+        <Property name="label">鍏冲埌浣�</Property>
+      </PropertyDef>
+      <PropertyDef name="closeEndFun">
+        <Property></Property>
+        <Property name="label">鍔熻兘鍙�</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;deviceModbusPR#triggerFun&quot;).getResult()}</Property>
+          <Property name="keyProperty">code</Property>
+          <Property name="valueProperty">name</Property>
+        </Property>
+      </PropertyDef>
+      <PropertyDef name="openError">
+        <Property></Property>
+        <Property name="label">寮�鏁呴殰</Property>
+      </PropertyDef>
+      <PropertyDef name="openErrorFun">
+        <Property></Property>
+        <Property name="label">鍔熻兘鍙�</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;deviceModbusPR#triggerFun&quot;).getResult()}</Property>
+          <Property name="keyProperty">code</Property>
+          <Property name="valueProperty">name</Property>
+        </Property>
+      </PropertyDef>
+      <PropertyDef name="closeError">
+        <Property></Property>
+        <Property name="label">鍏虫晠闅�</Property>
+      </PropertyDef>
+      <PropertyDef name="closeErrorFun">
+        <Property></Property>
+        <Property name="label">鍔熻兘鍙�</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;deviceModbusPR#triggerFun&quot;).getResult()}</Property>
+          <Property name="keyProperty">code</Property>
+          <Property name="valueProperty">name</Property>
+        </Property>
+      </PropertyDef>
+      <Reference name="listGas">
+        <Property name="dataType">[dtGas]</Property>
+        <Property name="dataProvider">gasModbusPR#listGasModBus</Property>
+        <Property name="parameter">$${this.deviceCode}</Property>
+      </Reference>
+    </DataType>
+    <DataType name="dtGas">
+      <Property name="creationType">com.ld.igds.models.GasModbus</Property>
+      <PropertyDef name="id">
+        <Property></Property>
+        <Property name="label">ID</Property>
+      </PropertyDef>
+      <PropertyDef name="depotId">
+        <Property></Property>
+        <Property name="label">鎵�灞炰粨搴�</Property>
+      </PropertyDef>
+      <PropertyDef name="passcode">
+        <Property name="dataType">int</Property>
+        <Property name="label">閫氶亾</Property>
+      </PropertyDef>
+      <PropertyDef name="co2">
+        <Property></Property>
+        <Property name="label">浜屾哀鍖栫⒊</Property>
+      </PropertyDef>
+      <PropertyDef name="co2Fun">
+        <Property></Property>
+        <Property name="label">鍔熻兘鍙�</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;deviceModbusPR#triggerFun&quot;).getResult()}</Property>
+          <Property name="keyProperty">code</Property>
+          <Property name="valueProperty">name</Property>
+        </Property>
+      </PropertyDef>
+      <PropertyDef name="o2">
+        <Property></Property>
+        <Property name="label">姘ф皵</Property>
+      </PropertyDef>
+      <PropertyDef name="o2Fun">
+        <Property></Property>
+        <Property name="label">鍔熻兘鍙�</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;deviceModbusPR#triggerFun&quot;).getResult()}</Property>
+          <Property name="keyProperty">code</Property>
+          <Property name="valueProperty">name</Property>
+        </Property>
+      </PropertyDef>
+      <PropertyDef name="ph3">
+        <Property></Property>
+        <Property name="label">纾峰寲姘�</Property>
+      </PropertyDef>
+      <PropertyDef name="ph3Fun">
+        <Property></Property>
+        <Property name="label">鍔熻兘鍙�</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;deviceModbusPR#triggerFun&quot;).getResult()}</Property>
+          <Property name="keyProperty">code</Property>
+          <Property name="valueProperty">name</Property>
+        </Property>
+      </PropertyDef>
+    </DataType>
+  </Model>
+  <View layout="padding:5;regionPadding:5">
+    <Property name="packages">font-awesome,css-common</Property>
+    <DataSet id="dsMain">
+      <Property name="loadMode">lazy</Property>
+      <Property name="dataType">dtMain</Property>
+      <Property name="dataProvider">gasModbusPR#getGasData</Property>
+      <Property name="parameter">${request.getParameter('depotId')}</Property>
+    </DataSet>
+    <Container layout="regionPadding:10" layoutConstraint="top">
+      <Property name="exClassName">bg-color</Property>
+      <Property name="contentOverflow">hidden</Property>
+      <Property name="height">55</Property>
+      <Label layoutConstraint="left">
+        <Property name="text">鑿滃崟鏍忥細</Property>
+      </Label>
+      <Button layoutConstraint="left">
+        <ClientEvent name="onClick">var list = view.get(&quot;#dsMain.data&quot;).get(&quot;listGas&quot;);&#xD;
+list.insert({});</ClientEvent>
+        <Property name="caption">鏂板閫氶亾</Property>
+        <Property name="exClassName">btn-default</Property>
+        <Property name="iconClass">fa fa-plus</Property>
+      </Button>
+      <Button>
+        <ClientEvent name="onClick">view.get(&quot;#uaAction&quot;).execute();   </ClientEvent>
+        <Property name="caption">淇濆瓨鏁版嵁</Property>
+        <Property name="iconClass">fa fa-check</Property>
+        <Property name="exClassName">btn-normal</Property>
+      </Button>
+      <Button layoutConstraint="left">
+        <ClientEvent name="onClick">var data = view.get(&quot;#dataGrid1&quot;).getCurrentItem();;&#xD;
+if(!data){&#xD;
+	return;&#xD;
+}&#xD;
+view.get(&quot;#ajaxDel&quot;).set(&quot;parameter&quot;,data).execute(function(result){&#xD;
+	if(result){&#xD;
+		$alert(result);&#xD;
+		return;&#xD;
+	}else{&#xD;
+		data.remove();&#xD;
+	}&#xD;
+});           </ClientEvent>
+        <Property name="caption">鍒犻櫎閫氶亾</Property>
+        <Property name="exClassName">btn-warn</Property>
+        <Property name="iconClass">fa fa-minus</Property>
+      </Button>
+    </Container>
+    <Container layout="regionPadding:10" layoutConstraint="center">
+      <Property name="exClassName">bg-color</Property>
+      <AutoForm>
+        <Property name="dataSet">dsMain</Property>
+        <Property name="cols">*,*,*,*</Property>
+        <Property name="labelAlign">right</Property>
+        <Property name="labelSeparator">锛�</Property>
+        <Property name="labelWidth">100</Property>
+        <AutoFormElement layoutConstraint="colSpan:2">
+          <Property name="name">deviceCode</Property>
+          <Property name="property">deviceCode</Property>
+          <Property name="label">浠撳簱缂栫爜</Property>
+          <Property name="labelWidth">100</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">open</Property>
+          <Property name="property">open</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">openFun</Property>
+          <Property name="property">openFun</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">close</Property>
+          <Property name="property">close</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">closeFun</Property>
+          <Property name="property">closeFun</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">stop</Property>
+          <Property name="property">stop</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">stopFun</Property>
+          <Property name="property">stopFun</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">openEnd</Property>
+          <Property name="property">openEnd</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">openEndFun</Property>
+          <Property name="property">openEndFun</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">closeEnd</Property>
+          <Property name="property">closeEnd</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">closeEndFun</Property>
+          <Property name="property">closeEndFun</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">openError</Property>
+          <Property name="property">openError</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">openErrorFun</Property>
+          <Property name="property">openErrorFun</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">closeError</Property>
+          <Property name="property">closeError</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">closeErrorFun</Property>
+          <Property name="property">closeErrorFun</Property>
+          <Editor/>
+        </AutoFormElement>
+      </AutoForm>
+      <ToolBar>
+        <ToolBarLabel>
+          <Property name="text">妫�娴嬮�氶亾閰嶇疆</Property>
+          <Property name="style">
+            <Property name="font-weight">bold</Property>
+          </Property>
+        </ToolBarLabel>
+      </ToolBar>
+      <DataGrid id="dataGrid1" layoutConstraint="center padding:5px">
+        <Property name="dataSet">dsMain</Property>
+        <Property name="dataPath">#.listGas</Property>
+        <RowNumColumn/>
+        <DataColumn>
+          <Property name="property">passcode</Property>
+          <Property name="name">passcode</Property>
+          <Editor/>
+        </DataColumn>
+        <ColumnGroup>
+          <Property name="caption">CO2</Property>
+          <DataColumn>
+            <Property name="property">co2</Property>
+            <Property name="caption">鍦板潃</Property>
+            <Property name="name">co2</Property>
+          </DataColumn>
+          <DataColumn>
+            <Property name="property">co2Fun</Property>
+            <Property name="caption">鍔熻兘</Property>
+            <Property name="trigger">autoMappingDropDown1</Property>
+            <Property name="name">co2Fun</Property>
+          </DataColumn>
+        </ColumnGroup>
+        <ColumnGroup>
+          <Property name="caption">O2</Property>
+          <DataColumn>
+            <Property name="property">o2</Property>
+            <Property name="caption">鍦板潃</Property>
+            <Property name="name">o2</Property>
+          </DataColumn>
+          <DataColumn>
+            <Property name="property">o2Fun</Property>
+            <Property name="caption">鍔熻兘</Property>
+            <Property name="trigger">autoMappingDropDown1</Property>
+            <Property name="name">o2Fun</Property>
+          </DataColumn>
+        </ColumnGroup>
+        <ColumnGroup>
+          <Property name="caption">PH3</Property>
+          <DataColumn>
+            <Property name="property">ph3</Property>
+            <Property name="caption">鍦板潃</Property>
+            <Property name="name">ph3</Property>
+          </DataColumn>
+          <DataColumn>
+            <Property name="property">ph3Fun</Property>
+            <Property name="caption">鍔熻兘</Property>
+            <Property name="trigger">autoMappingDropDown1</Property>
+            <Property name="name">ph3Fun</Property>
+          </DataColumn>
+        </ColumnGroup>
+      </DataGrid>
+    </Container>
+    <UpdateAction id="uaAction">
+      <Property name="dataResolver">gasModbusPR#updateData</Property>
+      <UpdateItem>
+        <Property name="dataSet">dsMain</Property>
+        <Property name="dataPath">[#current]</Property>
+      </UpdateItem>
+    </UpdateAction>
+    <AjaxAction id="ajaxDel">
+      <Property name="service">gasModbusPR#delData</Property>
+      <Property name="confirmMessage">纭畾瑕佸垹闄や箞锛�</Property>
+    </AjaxAction>
+  </View>
+</ViewConfig>
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/modbus/GasModbusPR.java b/igds-protocol-modbus/src/main/java/com/ld/igds/modbus/GasModbusPR.java
new file mode 100644
index 0000000..05d89ff
--- /dev/null
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/modbus/GasModbusPR.java
@@ -0,0 +1,83 @@
+package com.ld.igds.modbus;
+
+import com.bstek.dorado.annotation.DataProvider;
+import com.bstek.dorado.annotation.DataResolver;
+import com.bstek.dorado.annotation.Expose;
+import com.ld.igds.constant.BizType;
+import com.ld.igds.modbus.service.HModbusService;
+import com.ld.igds.models.DeviceModbus;
+import com.ld.igds.models.GasModbus;
+import com.ld.igds.util.ContextUtil;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * MOOBUS-TCP璁惧鍙傛暟閰嶇疆
+ */
+@Component
+public class GasModbusPR {
+
+    @Resource
+    private HModbusService modbusService;
+
+    /**
+     * gasModbusPR#getGasData
+     *
+     * @return
+     */
+    @DataProvider
+    public DeviceModbus getGasData(String depotId) {
+        if (null == depotId) return new DeviceModbus();
+
+        String bizType = BizType.GAS.getCode();
+
+        String companyId = ContextUtil.getCompanyId();
+
+        DeviceModbus result = modbusService.getGasData(companyId, depotId, bizType);
+
+        if (null == result) {
+            result = new DeviceModbus();
+            result.setBizType(bizType);
+            result.setDeviceCode(depotId);
+            result.setListGas(new ArrayList<>());
+        }
+
+        return result;
+    }
+
+    /**
+     * gasModbusPR#listGasModBus
+     *
+     * @param depotId
+     * @return
+     */
+    @DataProvider
+    public List<GasModbus> listGasModBus(String depotId) {
+        return modbusService.listGasModBus(depotId);
+    }
+
+
+    /**
+     * gasModbusPR#updateData
+     * @param data
+     */
+    @DataResolver
+    public void updateData(DeviceModbus data){
+        modbusService.updateGasModbus(data);
+    }
+
+    /**
+     * deviceModbusPR#delData
+     *
+     * @return
+     */
+    @Expose
+    public String delData(GasModbus data) {
+        if (null == data.getId()) return null;
+        return modbusService.delDataGas(data);
+    }
+
+}
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/modbus/ModbusConstant.java b/igds-protocol-modbus/src/main/java/com/ld/igds/modbus/ModbusConstant.java
new file mode 100644
index 0000000..299052e
--- /dev/null
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/modbus/ModbusConstant.java
@@ -0,0 +1,36 @@
+package com.ld.igds.modbus;
+
+/**
+ * MOdBUS-鍩虹甯搁噺淇℃伅
+ */
+public class ModbusConstant {
+
+
+    //01-璇荤嚎鍦�
+    public static final String FUN_01 = "01";
+    //02-璇荤鏁i噺杈撳叆
+    public static final String FUN_02 = "02";
+    //03-璇讳繚鎸佸瘎瀛樺櫒
+    public static final String FUN_03 = "03";
+    //04-璇昏緭鍏ュ瘎瀛樺櫒
+    public static final String FUN_04 = "04";
+    //05-鍐欏崟涓嚎鍦�
+    public static final String FUN_05 = "05";
+    //06-鍐欏崟涓瘎瀛樺櫒
+    public static final String FUN_06 = "06";
+    //15-鍐欏涓嚎鍦�
+    public static final String FUN_15 = "15";
+    //16-鍐欏涓瘎瀛樺櫒
+    public static final String FUN_16 = "16";
+    //99-涓嶆搷浣�
+    public static final String FUN_99 = "99";
+
+
+
+    public static final String MODBUS_DEVICE_CACHE = "MODBUS_DEVICE";
+
+    public static final String MODBUS_GAS_CACHE_LIST = "MODBUS_GAS_LIST";
+
+
+
+}
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/modbus/service/HModbusService.java b/igds-protocol-modbus/src/main/java/com/ld/igds/modbus/service/HModbusService.java
new file mode 100644
index 0000000..9ade627
--- /dev/null
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/modbus/service/HModbusService.java
@@ -0,0 +1,240 @@
+package com.ld.igds.modbus.service;
+
+import com.bstek.bdf2.core.orm.hibernate.HibernateDao;
+import com.ld.igds.constant.BizType;
+import com.ld.igds.constant.Constant;
+import com.ld.igds.constant.RedisConst;
+import com.ld.igds.modbus.ModbusConstant;
+import com.ld.igds.models.DeviceModbus;
+import com.ld.igds.models.GasModbus;
+import com.ld.igds.util.ContextUtil;
+import com.ld.igds.util.RedisUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.hibernate.Session;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@Component
+public class HModbusService extends HibernateDao {
+
+    @Resource
+    private RedisUtil redisUtil;
+
+
+    public List<DeviceModbus> listAllDevice(String companyId) {
+
+        String hql = " from " + DeviceModbus.class.getName() + " where 1=1 order by deviceCode+0";
+
+        return this.query(hql);
+    }
+
+    public void flushCacheDevice(String companyId) {
+
+        if (null == companyId) companyId = ContextUtil.getDefaultCompanyId();
+
+        List<DeviceModbus> listAll = this.listAllDevice(companyId);
+
+        if (null == listAll || listAll.isEmpty()) return;
+
+
+        String key;
+        DeviceModbus entityDevice;
+        for (DeviceModbus hibDevice : listAll) {
+            entityDevice = new DeviceModbus();
+            BeanUtils.copyProperties(hibDevice, entityDevice);
+
+            if (null == hibDevice.getBizType()) hibDevice.setBizType(BizType.AREATION.getCode());
+            if (BizType.AREATION.getCode().equals(hibDevice.getBizType())) {
+                key = RedisConst.buildKey(companyId, ModbusConstant.MODBUS_DEVICE_CACHE, hibDevice.getDeviceCode());
+            } else {
+                key = RedisConst.buildKey(companyId, ModbusConstant.MODBUS_DEVICE_CACHE, hibDevice.getDeviceCode(), hibDevice.getBizType());
+            }
+            redisUtil.set(key, entityDevice);
+        }
+    }
+
+    public DeviceModbus getCacheDeviceModbus(String companyId, String deviceCode) {
+        return getCacheDeviceModbus(companyId, deviceCode, null);
+    }
+
+    public DeviceModbus getCacheDeviceModbus(String companyId, String deviceCode, String bizType) {
+        String key = RedisConst.buildKey(companyId, ModbusConstant.MODBUS_DEVICE_CACHE, deviceCode);
+        if (null != bizType && !BizType.AREATION.equals(bizType)) {
+            key = RedisConst.buildKey(companyId, ModbusConstant.MODBUS_DEVICE_CACHE, deviceCode, bizType);
+        }
+        return (DeviceModbus) redisUtil.get(key);
+    }
+
+    public void updateDataDevice(List<DeviceModbus> details) {
+        if (null == details || details.isEmpty()) return;
+
+        Session session = this.getSessionFactory().openSession();
+        try {
+            for (DeviceModbus device : details) {
+
+
+                device = updateInitData(device);
+
+                if (null == device.getId()) {
+                    device.setId(ContextUtil.getUUID());
+                    session.save(device);
+                } else {
+                    session.update(device);
+                }
+            }
+
+            flushCacheDevice(null);
+
+        } catch (Exception e) {
+
+        } finally {
+            session.flush();
+            session.close();
+        }
+    }
+
+    private DeviceModbus updateInitData(DeviceModbus device) {
+        if (StringUtils.isEmpty(device.getOpen())) device.setOpen(Constant.YN_N);
+        if (StringUtils.isEmpty(device.getOpenFun())) device.setOpenFun(ModbusConstant.FUN_99);
+
+        if (StringUtils.isEmpty(device.getOpenEnd())) device.setOpenEnd(Constant.YN_N);
+        if (StringUtils.isEmpty(device.getOpenEndFun())) device.setOpenEndFun(ModbusConstant.FUN_99);
+
+        if (StringUtils.isEmpty(device.getOpenError())) device.setOpenError(Constant.YN_N);
+        if (StringUtils.isEmpty(device.getOpenErrorFun())) device.setOpenErrorFun(ModbusConstant.FUN_99);
+
+        if (StringUtils.isEmpty(device.getClose())) device.setClose(Constant.YN_N);
+        if (StringUtils.isEmpty(device.getCloseFun())) device.setCloseFun(ModbusConstant.FUN_99);
+
+        if (StringUtils.isEmpty(device.getCloseEnd())) device.setCloseEnd(Constant.YN_N);
+        if (StringUtils.isEmpty(device.getCloseEndFun())) device.setCloseEndFun(ModbusConstant.FUN_99);
+
+        if (StringUtils.isEmpty(device.getCloseError())) device.setCloseError(Constant.YN_N);
+        if (StringUtils.isEmpty(device.getCloseErrorFun())) device.setCloseErrorFun(ModbusConstant.FUN_99);
+
+        if (StringUtils.isEmpty(device.getStop())) device.setStop(Constant.YN_N);
+        if (StringUtils.isEmpty(device.getStopFun())) device.setStopFun(ModbusConstant.FUN_99);
+
+
+        if (StringUtils.isEmpty(device.getBizType())) device.setBizType(BizType.AREATION.getCode());
+
+        return device;
+    }
+
+    public String delDataDevice(DeviceModbus data) {
+        Session session = this.getSessionFactory().openSession();
+        try {
+            session.delete(data);
+            flushCacheDevice(null);
+        } catch (Exception e) {
+        } finally {
+            session.flush();
+            session.close();
+        }
+        return null;
+    }
+
+    /**
+     * 鏍规嵁绫诲瀷鑾峰彇Modbus鑳借�楄澶囬厤缃俊鎭�
+     * @param bizType
+     * @param serId
+     * @return
+     */
+    public List<DeviceModbus> getDataByBizType(String bizType, String serId) {
+
+        String hql = " from " + DeviceModbus.class.getName() + " where bizType=:bizType and serId =:serId";
+
+        Map<String, Object> param = new HashMap<>();
+        param.put("bizType", bizType);
+        param.put("serId", serId);
+
+        return this.query(hql, param);
+    }
+
+
+    public DeviceModbus getGasData(String companyId, String depotId, String bizType) {
+
+        String hql = " from " + DeviceModbus.class.getName() + " where bizType=:bizType and deviceCode =:deviceCode";
+
+        Map<String, Object> param = new HashMap<>();
+        param.put("bizType", bizType);
+        param.put("deviceCode", depotId);
+        List<DeviceModbus> list = this.query(hql, param);
+
+        if (null == list || list.isEmpty()) {
+            return null;
+        }
+        return list.get(0);
+    }
+
+
+    public List<GasModbus> listGasModBus(String depotId) {
+        String hql = " from " + GasModbus.class.getName();
+
+        if (null == depotId) {
+            return this.query(hql);
+        } else {
+            hql += " where depotId=:depotId order by passcode";
+            Map<String, Object> param = new HashMap<>();
+            param.put("depotId", depotId);
+            return this.query(hql, param);
+        }
+    }
+
+    public void updateGasModbus(DeviceModbus data) {
+        Session session = this.getSessionFactory().openSession();
+        try {
+
+            data = updateInitData(data);
+            data.setBizType(BizType.GAS.getCode());
+
+            if (StringUtils.isEmpty(data.getId())) {
+                data.setId(ContextUtil.getUUID());
+                session.save(data);
+            } else {
+                session.update(data);
+            }
+            flushCacheDevice(null);
+
+            this.updateListGas(session, data);
+
+        } catch (Exception e) {
+        } finally {
+            session.flush();
+            session.close();
+        }
+    }
+
+    private void updateListGas(Session session, DeviceModbus data) {
+        List<GasModbus> list = data.getListGas();
+        if (null == list || list.isEmpty()) return;
+        for (GasModbus gas : list) {
+            gas.setDepotId(data.getDeviceCode());
+            if (StringUtils.isEmpty(gas.getId())) {
+                gas.setId(ContextUtil.getUUID());
+                session.save(gas);
+            } else {
+                session.update(gas);
+            }
+        }
+    }
+
+
+    public String delDataGas(GasModbus data) {
+        Session session = this.getSessionFactory().openSession();
+        try {
+            session.delete(data);
+        } catch (Exception e) {
+        } finally {
+            session.flush();
+            session.close();
+        }
+        return null;
+    }
+}
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/models/DeviceModbus.java b/igds-protocol-modbus/src/main/java/com/ld/igds/models/DeviceModbus.java
new file mode 100644
index 0000000..3c0e3d3
--- /dev/null
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/models/DeviceModbus.java
@@ -0,0 +1,101 @@
+package com.ld.igds.models;
+
+import com.bstek.dorado.annotation.PropertyDef;
+import com.ld.igds.constant.BizType;
+import com.ld.igds.constant.Constant;
+import lombok.Data;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 鏍规嵁璁惧閰嶇疆鐨凪odbus-TCP鍙傛暟閰嶇疆
+ */
+@Data
+@Entity
+@Table(name = "D_DEVICE_MODBUS")
+public class DeviceModbus implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "ID_", length = 40)
+    @PropertyDef(label = "ID")
+    private String id;
+
+    @Column(name = "DEVICE_CODE_", length = 40)
+    @PropertyDef(label = "璁惧缂栫爜")
+    private String deviceCode;
+    
+    @Column(name = "BIZ_TYEP_", length = 10)
+    @PropertyDef(label = "涓氬姟绫诲瀷")
+    private String bizType = BizType.AREATION.getCode();
+
+    @Column(name = "OPEN_", length = 10)
+    @PropertyDef(label = "寮�鍦板潃", description = "寮�鍦板潃銆佽兘鑰楄鍙栧湴鍧�")
+    private String open = Constant.YN_N;
+
+
+    @Column(name = "OPEN_FUN", length = 4)
+    @PropertyDef(label = "鍔熻兘鍙�")
+    private String openFun = "99";
+
+    @Column(name = "CLOSE_", length = 10)
+    @PropertyDef(label = "鍏冲湴鍧�", description = "鍏冲湴鍧�銆佺┖璋冩俯搴﹁缃湴鍧�")
+    private String close = Constant.YN_N;
+
+    @Column(name = "CLOSE_FUN", length = 4)
+    @PropertyDef(label = "鍔熻兘鍙�")
+    private String closeFun = "99";
+
+    @Column(name = "STOP_", length = 10)
+    @PropertyDef(label = "鍋滃湴鍧�")
+    private String stop = Constant.YN_N;
+
+    @Column(name = "STOP_FUN", length = 4)
+    @PropertyDef(label = "鍔熻兘鍙�")
+    private String stopFun = "99";
+
+    @Column(name = "OPEN_END_", length = 10)
+    @PropertyDef(label = "寮�鍒颁綅鍦板潃", description = "寮�鍒颁綅鍦板潃銆佽繍琛岀姸鎬佸湴鍧�(椋庢満鍜岀┖璋�)")
+    private String openEnd = Constant.YN_N;
+
+    @Column(name = "OPEN_END_FUN", length = 4)
+    @PropertyDef(label = "鍔熻兘鍙�")
+    private String openEndFun = "99";
+
+    @Column(name = "CLOSE_END_", length = 10)
+    @PropertyDef(label = "鍏冲埌浣嶅湴鍧�")
+    private String closeEnd = Constant.YN_N;
+
+    @Column(name = "CLOSE_END_FUN", length = 4)
+    @PropertyDef(label = "鍔熻兘鍙�")
+    private String closeEndFun = "99";
+
+    @Column(name = "OPEN_ERROR_", length = 10)
+    @PropertyDef(label = "寮�鏁呴殰鍦板潃")
+    private String openError = Constant.YN_N;
+
+    @Column(name = "OPEN_ERROR_FUN", length = 4)
+    @PropertyDef(label = "鍔熻兘鍙�")
+    private String openErrorFun = "99";
+
+    @Column(name = "CLOSE_ERROR_", length = 10)
+    @PropertyDef(label = "鍏虫晠闅滃湴鍧�")
+    private String closeError = Constant.YN_N;
+
+    @Column(name = "CLOSE_ERROR_FUN", length = 4)
+    @PropertyDef(label = "鍔熻兘鍙�")
+    private String closeErrorFun = "99";
+
+    //杞存祦椋庢満鍜岃酱娴佺獥鍙兘涓嶅湪涓�涓垎鏈轰笂锛孖P涓嶅悓
+    @Column(name = "SER_ID_", length = 10)
+    @PropertyDef(label = "鎵�灞炲垎鏈�")
+    private String serId;
+
+
+    @Transient
+    private List<GasModbus> listGas;
+
+}
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/models/GasModbus.java b/igds-protocol-modbus/src/main/java/com/ld/igds/models/GasModbus.java
new file mode 100644
index 0000000..d7b3872
--- /dev/null
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/models/GasModbus.java
@@ -0,0 +1,60 @@
+package com.ld.igds.models;
+
+import com.bstek.dorado.annotation.PropertyDef;
+import com.ld.igds.constant.Constant;
+import lombok.Data;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+
+/**
+ * 閰嶇疆娴嬫皵鍜屾祴铏殑MODBUS锛峊CP閰嶇疆淇℃伅
+ */
+@Data
+@Entity
+@Table(name = "D_GAS_MODBUS")
+public class GasModbus implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "ID_", length = 40)
+    @PropertyDef(label = "ID")
+    private String id;
+
+    @Column(name = "DEPOT_ID_", length = 50)
+    @PropertyDef(label = "鎵�灞炰粨搴�")
+    private String depotId;
+
+    @Column(name = "PASS_CODE_")
+    @PropertyDef(label = "閫氶亾")
+    private int passcode;
+
+    @Column(name = "CO2_", length = 10)
+    @PropertyDef(label = "浜屾哀鍖栫⒊")
+    private String co2 = Constant.YN_N;
+
+    @Column(name = "CO2_FUN", length = 4)
+    @PropertyDef(label = "鍔熻兘鍙�")
+    private String co2Fun = "99";
+
+    @Column(name = "O2_", length = 10)
+    @PropertyDef(label = "姘ф皵")
+    private String o2 = Constant.YN_N;
+
+    @Column(name = "O2_FUN", length = 4)
+    @PropertyDef(label = "鍔熻兘鍙�")
+    private String o2Fun = "99";
+
+    @Column(name = "PH3_", length = 10)
+    @PropertyDef(label = "纾峰寲姘�")
+    private String ph3= Constant.YN_N;
+
+    @Column(name = "PH3_FUN", length = 4)
+    @PropertyDef(label = "鍔熻兘鍙�")
+    private String ph3Fun = "99";
+
+}
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusConfig.java b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusConfig.java
deleted file mode 100644
index 59d269d..0000000
--- a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusConfig.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.ld.igds.protocol.modbus;
-
-import com.serotonin.modbus4j.ModbusFactory;
-import com.serotonin.modbus4j.ModbusMaster;
-import com.serotonin.modbus4j.exception.ModbusInitException;
-import com.serotonin.modbus4j.ip.IpParameters;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
-
-import java.util.HashMap;
-
-@Configuration
-@Import(com.serotonin.modbus4j.ModbusFactory.class)
-public class ModbusConfig {
-
-
-    @Bean
-    public HashMap<String, ModbusMaster> contextModbusMap() {
-        return new HashMap<>();
-    }
-
-    @Autowired
-    private ModbusFactory modbusFactory;
-
-    @Autowired
-    @Qualifier("contextModbusMap")
-    private HashMap<String, ModbusMaster> masterMap;
-
-    /**
-     * @Description: 閫氳繃ip鑾峰彇瀵瑰簲鐨刴odbus杩炴帴鍣�
-     */
-    public ModbusMaster getMaster(String ip, int port) {
-        ModbusMaster modbusMaster = masterMap.get(ip);
-        if (modbusMaster == null || !modbusMaster.isConnected()) {
-            setMaster(ip, port);
-            modbusMaster = masterMap.get(ip);
-        }
-        return modbusMaster;
-
-    }
-
-    /**
-     * @Description: 璁剧疆ip瀵瑰簲鐨刴odbus杩炴帴鍣�
-     */
-    private void setMaster(String ip, Integer port) {
-        ModbusMaster master;
-        IpParameters params = new IpParameters();
-        params.setHost(ip);
-        params.setPort(port);
-        //璁剧疆涓簍rue锛屼細瀵艰嚧TimeoutException: request=com.serotonin.modbus4j.ip.encap.EncapMessageRequest@774dfba5",
-        //params.setEncapsulated(true);
-        master = modbusFactory.createTcpMaster(params, false);// TCP 鍗忚
-        try {
-            //璁剧疆瓒呮椂鏃堕棿
-            master.setTimeout(2 * 1000);
-            //璁剧疆閲嶈繛娆℃暟
-            master.setRetries(3);
-            //鍒濆鍖�
-            master.init();
-        } catch (ModbusInitException e) {
-            e.printStackTrace();
-        }
-        masterMap.put(ip, master);
-    }
-}
\ No newline at end of file
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusTest.java b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusTest.java
new file mode 100644
index 0000000..20e82cd
--- /dev/null
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusTest.java
@@ -0,0 +1,234 @@
+package com.ld.igds.protocol.modbus;
+
+import com.serotonin.modbus4j.ModbusFactory;
+import com.serotonin.modbus4j.ModbusMaster;
+import com.serotonin.modbus4j.exception.ErrorResponseException;
+import com.serotonin.modbus4j.exception.ModbusInitException;
+import com.serotonin.modbus4j.exception.ModbusTransportException;
+import com.serotonin.modbus4j.ip.IpParameters;
+import com.serotonin.modbus4j.locator.BaseLocator;
+import com.serotonin.modbus4j.msg.*;
+
+/**
+ * Modbus 宸ュ叿绫�
+ */
+public class ModbusTest {
+
+    /**
+     * 宸ュ巶
+     */
+    static ModbusFactory modbusFactory;
+    static ModbusMaster modbusMaster;
+
+    static {
+        if (modbusFactory == null) {
+            modbusFactory = new ModbusFactory();
+        }
+    }
+
+
+    /**
+     * 鑾峰彇master
+     *
+     * @return
+     */
+    public static ModbusMaster getMaster() throws ModbusInitException {
+        if (modbusMaster == null) {
+            IpParameters ipParameters = new IpParameters();
+            ipParameters.setHost("127.0.0.1");
+            ipParameters.setPort(502);
+            modbusMaster = modbusFactory.createTcpMaster(ipParameters, true);
+            modbusMaster.init();
+            return modbusMaster;
+        }
+        return modbusMaster;
+    }
+
+
+    /**
+     * 璇诲彇绾垮湀寮�鍏崇姸鎬佹暟鎹�  0x01
+     *
+     * @param slaveId
+     * @param offset
+     * @return
+     * @throws ModbusInitException
+     * @throws ModbusTransportException
+     * @throws ErrorResponseException
+     */
+    public static Boolean readCoilStatus(int slaveId, int offset) throws ModbusInitException, ModbusTransportException, ErrorResponseException {
+        BaseLocator<Boolean> coilStatus = BaseLocator.coilStatus(slaveId, offset);
+        Boolean res = getMaster().getValue(coilStatus);
+        return res;
+    }
+
+    /**
+     * 璇荤鏁h緭鍏ュ瘎瀛樺櫒鐘舵�佹暟鎹�  0x02
+     *
+     * @param slaveId
+     * @param offset
+     * @return
+     * @throws ModbusInitException
+     * @throws ModbusTransportException
+     * @throws ErrorResponseException
+     */
+    public static Boolean inputStatus(int slaveId, int offset) throws ModbusInitException, ModbusTransportException, ErrorResponseException {
+        BaseLocator<Boolean> inputStatus = BaseLocator.inputStatus(slaveId, offset);
+        Boolean res = getMaster().getValue(inputStatus);
+        return res;
+    }
+
+    /**
+     * 璇讳繚鎸佸瘎瀛樺櫒鏁版嵁  0x03
+     *
+     * @param slaveId
+     * @param offset
+     * @param dataType
+     * @return
+     * @throws ModbusInitException
+     * @throws ModbusTransportException
+     * @throws ErrorResponseException
+     */
+    public static Number holdingRegister(int slaveId, int offset, int dataType) throws ModbusInitException, ModbusTransportException, ErrorResponseException {
+        BaseLocator<Number> holdingRegister = BaseLocator.holdingRegister(slaveId, offset, dataType);
+        Number value = getMaster().getValue(holdingRegister);
+        return value;
+    }
+
+    /**
+     * 璇昏緭鍏ュ瘎瀛樺櫒鏁版嵁   0x04
+     *
+     * @param slaveId
+     * @param offset
+     * @param dataType
+     * @return
+     * @throws ModbusInitException
+     * @throws ModbusTransportException
+     * @throws ErrorResponseException
+     */
+    public static Number inputRegister(int slaveId, int offset, int dataType) throws ModbusInitException, ModbusTransportException, ErrorResponseException {
+        BaseLocator<Number> inputRegister = BaseLocator.inputRegister(slaveId, offset, dataType);
+        Number value = getMaster().getValue(inputRegister);
+        return value;
+    }
+
+
+    /**
+     * 鍐欑嚎鍦堝紑鍏崇姸鎬佹暟鎹�  0x05
+     *
+     * @param slaveId
+     * @param offset
+     * @param status
+     * @return
+     * @throws ModbusTransportException
+     * @throws ModbusInitException
+     */
+    public static Boolean writeCoilStatus(int slaveId, int offset, boolean status) throws ModbusTransportException, ModbusInitException {
+        boolean coilValue = status;
+        WriteCoilRequest coilRequest = new WriteCoilRequest(slaveId, offset, coilValue);
+        WriteCoilResponse coilResponse = (WriteCoilResponse) getMaster().send(coilRequest);
+        return !coilResponse.isException();
+    }
+
+
+    /**
+     * 鍐欏崟涓繚鎸佸瘎瀛樺櫒鏁版嵁 0x06
+     *
+     * @param slaveId
+     * @param offset
+     * @param vlaue
+     * @return
+     * @throws ModbusTransportException
+     * @throws ModbusInitException
+     */
+    public static Boolean writeRegister(int slaveId, int offset, int vlaue) throws ModbusTransportException, ModbusInitException {
+        WriteRegisterRequest registerRequest = new WriteRegisterRequest(slaveId, offset, vlaue);
+        WriteRegisterResponse registerResponse = (WriteRegisterResponse) getMaster().send(registerRequest);
+        return !registerResponse.isException();
+
+    }
+
+    /**
+     * 鍐欑嚎鍦堝紑鍏崇姸鎬佹暟鎹�愬銆�  0x0f
+     *
+     * @param slaveId
+     * @param offset
+     * @param booleans
+     * @return
+     * @throws ModbusTransportException
+     * @throws ModbusInitException
+     */
+    public static Boolean writeCoils(int slaveId, int offset, boolean[] booleans) throws ModbusTransportException, ModbusInitException {
+        WriteCoilsRequest writeCoils = new WriteCoilsRequest(slaveId, offset, booleans);
+        WriteCoilsResponse coilsResponse = (WriteCoilsResponse) getMaster().send(writeCoils);
+        return !coilsResponse.isException();
+    }
+
+
+    /**
+     * 鍐欎繚瀛樺瘎瀛樺櫒鏁版嵁銆愬銆�  0x10
+     *
+     * @param slaveId
+     * @param offset
+     * @param nums
+     * @return
+     * @throws ModbusTransportException
+     * @throws ModbusInitException
+     */
+    public static Boolean writeRegisters(int slaveId, int offset, short[] nums) throws ModbusTransportException, ModbusInitException {
+        WriteRegistersRequest writeRegisters = new WriteRegistersRequest(slaveId, offset, nums);
+        WriteRegistersResponse registersResponse = (WriteRegistersResponse) getMaster().send(writeRegisters);
+        return !registersResponse.isException();
+    }
+
+
+    public static void main(String[] args) throws ModbusInitException, ModbusTransportException, ErrorResponseException {
+        // 01娴嬭瘯
+        Boolean v0001 = readCoilStatus(1, 2148);
+        System.out.println("get 2148 :" + v0001);
+
+
+        // 03娴嬭瘯
+//        Number v0001 = holdingRegister(136, 3, DataType.TWO_BYTE_INT_SIGNED);
+//        Number v0003 = holdingRegister(1, 2, DataType.TWO_BYTE_INT_SIGNED);
+//        Number v0009 = holdingRegister(1, 8, DataType.TWO_BYTE_INT_SIGNED);
+//        System.out.println("get v0001  result:" + v0001);
+//        System.out.println("get v0003  result:" + v0003);
+//        System.out.println("get v0009  result:" + v0009);
+
+        // 04娴嬭瘯
+//        Number v0001 = inputRegister(136, 0, DataType.TWO_BYTE_INT_SIGNED);
+//        Number v0003 = inputRegister(136, 2, DataType.TWO_BYTE_INT_SIGNED);
+//        Number v0009 = inputRegister(136, 8, DataType.TWO_BYTE_INT_SIGNED);
+//        System.out.println("get v0001  result:" + v0001);
+//        System.out.println("get v0003  result:" + v0003);
+//        System.out.println("get v0009  result:" + v0009);
+
+
+        // 05娴嬭瘯
+//        Boolean v0001 = writeCoilStatus(1, 0, true);
+//        Boolean v0002 = writeCoilStatus(1, 1, false);
+//        Boolean v0007 = writeCoilStatus(1, 6, true);
+//        System.out.println("update v0001 status result:" + v0001);
+//        System.out.println("update v0002 status result:" + v0002);
+//        System.out.println("update v0007 status result:" + v0007);
+
+
+        // 06娴嬭瘯
+//        Boolean v0001 = writeRegister(136, 0, 98);
+//        Boolean v0002 = writeRegister(136, 1, 0);
+//        Boolean v0007 = writeRegister(136, 6, 100);
+//        System.out.println("update v0001 status result:" + v0001);
+//        System.out.println("update v0002 status result:" + v0002);
+//        System.out.println("update v0007 status result:" + v0007);
+
+
+        // 0f娴嬭瘯
+        //Boolean res1 = writeCoils(1, 1, new boolean[]{true, true, false, true});
+        // 10娴嬭瘯
+        //Boolean res2 = writeRegisters(136, 7, new short[]{1, 2, 3});
+        //Boolean res3 = writeRegisters(136, 7, new short[]{991, 778, 25, 0});
+
+    }
+
+
+}
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil.java b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil.java
deleted file mode 100644
index 416e7cb..0000000
--- a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil.java
+++ /dev/null
@@ -1,208 +0,0 @@
-package com.ld.igds.protocol.modbus;
-
-import com.serotonin.modbus4j.BatchRead;
-import com.serotonin.modbus4j.BatchResults;
-import com.serotonin.modbus4j.ModbusMaster;
-import com.serotonin.modbus4j.code.DataType;
-import com.serotonin.modbus4j.exception.ModbusInitException;
-import com.serotonin.modbus4j.exception.ModbusTransportException;
-import com.serotonin.modbus4j.locator.BaseLocator;
-import com.serotonin.modbus4j.msg.ReadCoilsRequest;
-import com.serotonin.modbus4j.msg.ReadCoilsResponse;
-import com.serotonin.modbus4j.msg.ReadDiscreteInputsRequest;
-import com.serotonin.modbus4j.msg.ReadDiscreteInputsResponse;
-import com.serotonin.modbus4j.msg.ReadHoldingRegistersRequest;
-import com.serotonin.modbus4j.msg.ReadHoldingRegistersResponse;
-import com.serotonin.modbus4j.msg.ReadInputRegistersRequest;
-import com.serotonin.modbus4j.msg.ReadInputRegistersResponse;
-import com.serotonin.modbus4j.msg.WriteCoilRequest;
-import com.serotonin.modbus4j.msg.WriteCoilResponse;
-import com.serotonin.modbus4j.msg.WriteCoilsRequest;
-import com.serotonin.modbus4j.msg.WriteCoilsResponse;
-import com.serotonin.modbus4j.msg.WriteRegisterRequest;
-import com.serotonin.modbus4j.msg.WriteRegisterResponse;
-import com.serotonin.modbus4j.msg.WriteRegistersRequest;
-import com.serotonin.modbus4j.msg.WriteRegistersResponse;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-/**
- * @Desc: 宸ュ叿绫�
- * @author: Andy
- * @update-time: 2023/8/11
- */
-@Slf4j
-@Component
-public class ModbusUtil {
-
-    //浠庢満榛樿鍊�
-    private Integer slaveId = 1;
-
-    @Autowired
-    private ModbusConfig modbusConfig;
-
-
-    /**
-     * 璇荤嚎鍦�--01
-     *
-     * @param ip
-     * @param port
-     * @param offset
-     * @param numberOfRegister
-     */
-    public boolean[] readStatus01(String ip, int port, int offset, int numberOfRegister) throws ModbusTransportException {
-
-        ModbusMaster master = modbusConfig.getMaster(ip, port);
-        ReadCoilsRequest request = new ReadCoilsRequest(slaveId, offset, numberOfRegister);
-        ReadCoilsResponse response = (ReadCoilsResponse) master.send(request);
-        boolean[] booleans = response.getBooleanData();
-
-        return valueRegroup(numberOfRegister, booleans);
-    }
-
-    /**
-     * @Description: 02H-璇荤鏁h緭鍏ラ噺
-     * @Param: [ip, offset, numberOfRegister]
-     * @return: boolean[]
-     * @throws:
-     */
-    public boolean[] readStatus02(String ip, int port, int offset, int numberOfRegister) throws ModbusTransportException {
-        ModbusMaster master = modbusConfig.getMaster(ip, port);
-        ReadDiscreteInputsRequest request = new ReadDiscreteInputsRequest(slaveId, offset, numberOfRegister);
-        ReadDiscreteInputsResponse response = (ReadDiscreteInputsResponse) master.send(request);
-        boolean[] booleans = response.getBooleanData();
-        return valueRegroup(numberOfRegister, booleans);
-    }
-
-    /**
-     * @Description: 03H-璇讳繚鎸佸瘎瀛樺櫒
-     * @Param: [ip, offset, numberOfRegister]
-     * @return: short[]
-     * @throws:
-     */
-    public short[] readStatus03(String ip, int port, int offset, int numberOfRegister) throws ModbusTransportException {
-
-        ModbusMaster master = modbusConfig.getMaster(ip, port);
-        ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(slaveId, offset, numberOfRegister);
-        ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master.send(request);
-        return response.getShortData();
-    }
-
-    /**
-     * @Description: 04H-璇昏緭鍏ュ瘎瀛樺櫒
-     * @Param: [ip, offset, numberOfRegister]
-     * @return: short[]
-     * @throws:
-     */
-    public short[] readStatus04(String ip, int port, int offset, int numberOfRegister) throws ModbusTransportException {
-        ModbusMaster master = modbusConfig.getMaster(ip, port);
-        ReadInputRegistersRequest request = new ReadInputRegistersRequest(slaveId, offset, numberOfRegister);
-        ReadInputRegistersResponse response = (ReadInputRegistersResponse) master.send(request);
-        return response.getShortData();
-    }
-
-
-    public BatchResults<Integer> readBatch(String ip, int port) throws Exception {
-        ModbusMaster master = modbusConfig.getMaster(ip, port);
-
-        if (null == master) return null;
-
-        return readBatch(master);
-    }
-
-    /**
-     * 鎵归噺璇诲彇澶氫釜
-     *
-     * @param master
-     * @throws ModbusTransportException
-     */
-    public BatchResults<Integer> readBatch(ModbusMaster master) throws Exception {
-        BatchRead<Integer> batch = new BatchRead<>();
-        batch.addLocator(0, BaseLocator.holdingRegister(1, 1, DataType.TWO_BYTE_INT_SIGNED));
-        batch.addLocator(1, BaseLocator.inputStatus(1, 0));
-        batch.setContiguousRequests(true);
-        BatchResults<Integer> results = master.send(batch);
-        log.info("batchRead:" + results.getValue(0));
-        log.info("batchRead:" + results.getValue(1));
-
-        return results;
-    }
-
-    /**
-     * @Description: 鍐欏崟涓紙绾垮湀锛夊紑鍏抽噺鏁版嵁锛岀浉褰撲簬鍔熻兘鐮侊細05H-鍐欏崟涓嚎鍦�
-     * @Param: [ip, writeOffset, writeValue]
-     * @return: boolean
-     * @throws:
-     */
-    public boolean writeValue05(String ip, int port, int writeOffset, boolean writeValue) throws ModbusTransportException {
-
-        ModbusMaster tcpMaster = modbusConfig.getMaster(ip, port);
-        WriteCoilRequest request = new WriteCoilRequest(slaveId, writeOffset, writeValue);
-        WriteCoilResponse response = (WriteCoilResponse) tcpMaster.send(request);
-        return !response.isException();
-    }
-
-    /**
-     * @Description: 鍐欏涓紑鍏抽噺鏁版嵁锛堢嚎鍦堬級锛岀浉褰撲簬鍔熻兘鐮侊細0FH-鍐欏涓嚎鍦�
-     * @Param: [ip, startOffset, data]
-     * @return: boolean
-     * @throws:
-     */
-    public boolean writeValues15(String ip, int port, int startOffset, boolean[] data) throws ModbusTransportException {
-
-        ModbusMaster tcpMaster = modbusConfig.getMaster(ip, port);
-        WriteCoilsRequest request = new WriteCoilsRequest(slaveId, startOffset, data);
-        WriteCoilsResponse response = (WriteCoilsResponse) tcpMaster.send(request);
-        return !response.isException();
-
-    }
-
-    /**
-     * @Description: 鍐欏崟涓繚鎸佸瘎瀛樺櫒锛岀浉褰撲簬鍔熻兘鐮侊細06H-鍐欏崟涓繚鎸佸瘎瀛樺櫒
-     * @Param: [ip, writeOffset, writeValue]
-     * @return: boolean
-     * @throws:
-     */
-    public boolean writeValue06(String ip, int port, int writeOffset, short writeValue) throws ModbusTransportException, ModbusInitException {
-
-        ModbusMaster tcpMaster = modbusConfig.getMaster(ip, port);
-        WriteRegisterRequest request = new WriteRegisterRequest(slaveId, writeOffset, writeValue);
-        WriteRegisterResponse response = (WriteRegisterResponse) tcpMaster.send(request);
-        return !response.isException();
-
-    }
-
-    /**
-     * @Description: 鍐欏涓繚鎸佸瘎瀛樺櫒锛岀浉褰撲簬鍔熻兘鐮侊細10H-鍐欏涓繚鎸佸瘎瀛樺櫒
-     * @Param: [ip, startOffset, data]
-     * @return: boolean
-     * @throws:
-     */
-    public boolean writeValues16(String ip, int port, int startOffset, short[] data) throws ModbusTransportException, ModbusInitException {
-
-        ModbusMaster tcpMaster = modbusConfig.getMaster(ip, port);
-        WriteRegistersRequest request = new WriteRegistersRequest(slaveId, startOffset, data);
-        WriteRegistersResponse response = (WriteRegistersResponse) tcpMaster.send(request);
-        return !response.isException();
-    }
-
-    /**
-     * @Description: 杞崲宸ュ叿锛屽皢Boolean杞崲鎴�0锛�1
-     * @Param: [numberOfBits, values]
-     * @return: boolean[]
-     * @throws:
-     */
-    private boolean[] valueRegroup(int numberOfBits, boolean[] values) {
-        boolean[] bs = new boolean[numberOfBits];
-        int temp = 1;
-        for (boolean b : values) {
-            bs[temp - 1] = b;
-            temp++;
-            if (temp > numberOfBits) {
-                break;
-            }
-        }
-        return bs;
-    }
-}
\ No newline at end of file
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil2.java b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil2.java
new file mode 100644
index 0000000..4eb27c7
--- /dev/null
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil2.java
@@ -0,0 +1,203 @@
+package com.ld.igds.protocol.modbus;
+
+import com.serotonin.modbus4j.ModbusFactory;
+import com.serotonin.modbus4j.ModbusMaster;
+import com.serotonin.modbus4j.code.DataType;
+import com.serotonin.modbus4j.exception.ErrorResponseException;
+import com.serotonin.modbus4j.exception.ModbusInitException;
+import com.serotonin.modbus4j.exception.ModbusTransportException;
+import com.serotonin.modbus4j.ip.IpParameters;
+import com.serotonin.modbus4j.locator.BaseLocator;
+import com.serotonin.modbus4j.msg.*;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * @Desc: 宸ュ叿绫�
+ * @author: Andy
+ * @update-time: 2023/8/11
+ */
+@Slf4j
+public class ModbusUtil2 {
+
+    //浠庢満榛樿鍊�
+    private static Integer slaveId = 1;
+
+    /**
+     * 宸ュ巶
+     */
+    static ModbusFactory modbusFactory;
+
+    static {
+        if (modbusFactory == null) {
+            modbusFactory = new ModbusFactory();
+        }
+    }
+
+
+    /**
+     * 鑾峰彇master
+     *
+     * @return
+     */
+    public static ModbusMaster getMaster(String ip, int port) throws ModbusInitException, InterruptedException {
+
+        IpParameters ipParameters = new IpParameters();
+        ipParameters.setHost(ip);
+        ipParameters.setPort(port);
+        ModbusMaster modbusMaster = modbusFactory.createTcpMaster(ipParameters, false);
+        modbusMaster.init();
+
+        //鍒濆鍖栦箣鍚庣瓑寰咃紝閬垮厤鍑虹幇杩炴帴鏈垱寤�
+        Thread.sleep(2500);
+
+        return modbusMaster;
+    }
+
+
+    /**
+     * 璇诲彇绾垮湀寮�鍏崇姸鎬佹暟鎹�  0x01
+     *
+     * @param offset
+     * @return
+     * @throws ModbusInitException
+     * @throws ModbusTransportException
+     * @throws ErrorResponseException
+     */
+    public static Boolean readCoilStatus(String ip, int port, int offset) throws ModbusInitException, ModbusTransportException, ErrorResponseException, InterruptedException {
+        BaseLocator<Boolean> coilStatus = BaseLocator.coilStatus(slaveId, offset);
+        Boolean res = getMaster(ip, port).getValue(coilStatus);
+        return res;
+    }
+
+    /**
+     * 璇荤鏁h緭鍏ュ瘎瀛樺櫒鐘舵�佹暟鎹�  0x02
+     *
+     * @param offset
+     * @return
+     * @throws ModbusInitException
+     * @throws ModbusTransportException
+     * @throws ErrorResponseException
+     */
+    public static Boolean readInputStatus(String ip, int port, int offset) throws ModbusInitException, ModbusTransportException, ErrorResponseException, InterruptedException {
+        BaseLocator<Boolean> inputStatus = BaseLocator.inputStatus(slaveId, offset);
+
+        // Thread.sleep(3000);
+        Boolean res = getMaster(ip, port).getValue(inputStatus);
+        return res;
+    }
+
+    /**
+     * 璇讳繚鎸佸瘎瀛樺櫒鏁版嵁  0x03
+     *
+     * @param offset
+     * @param dataType
+     * @return
+     * @throws ModbusInitException
+     * @throws ModbusTransportException
+     * @throws ErrorResponseException
+     */
+    public static Number readHoldingRegister(String ip, int port, int offset, int dataType) throws ModbusInitException, ModbusTransportException, ErrorResponseException, InterruptedException {
+        BaseLocator<Number> holdingRegister = BaseLocator.holdingRegister(slaveId, offset, dataType);
+        Number value = getMaster(ip, port).getValue(holdingRegister);
+        return value;
+    }
+
+    public static Number readHoldingRegister(String ip, int port, int offset) throws ModbusInitException, ModbusTransportException, ErrorResponseException, InterruptedException {
+        int dataType = DataType.TWO_BYTE_INT_SIGNED;
+        return readHoldingRegister(ip, port, offset, dataType);
+    }
+
+    /**
+     * 璇昏緭鍏ュ瘎瀛樺櫒鏁版嵁   0x04
+     *
+     * @param offset
+     * @param dataType
+     * @return
+     * @throws ModbusInitException
+     * @throws ModbusTransportException
+     * @throws ErrorResponseException
+     */
+    public static Number readInputRegister(String ip, int port, int offset, int dataType) throws ModbusInitException, ModbusTransportException, ErrorResponseException, InterruptedException {
+        BaseLocator<Number> inputRegister = BaseLocator.inputRegister(slaveId, offset, dataType);
+        Number value = getMaster(ip, port).getValue(inputRegister);
+        return value;
+    }
+
+    /**
+     * 璇昏緭鍏ュ瘎瀛樺櫒鏁版嵁   0x04
+     *
+     * @param offset
+     * @return
+     * @throws ModbusInitException
+     * @throws ModbusTransportException
+     * @throws ErrorResponseException
+     */
+    public static Number readInputRegister(String ip, int port, int offset) throws ModbusInitException, ModbusTransportException, ErrorResponseException, InterruptedException {
+        int dataType = DataType.TWO_BYTE_INT_SIGNED;
+        return readInputRegister(ip, port, offset, dataType);
+    }
+
+
+    /**
+     * 鍐欑嚎鍦堝紑鍏崇姸鎬佹暟鎹�  0x05
+     *
+     * @param offset
+     * @param status
+     * @return
+     * @throws ModbusTransportException
+     * @throws ModbusInitException
+     */
+    public static Boolean writeCoilStatus(String ip, int port, int offset, boolean status) throws ModbusTransportException, ModbusInitException, InterruptedException {
+        WriteCoilRequest coilRequest = new WriteCoilRequest(slaveId, offset, status);
+        WriteCoilResponse coilResponse = (WriteCoilResponse) getMaster(ip, port).send(coilRequest);
+        return !coilResponse.isException();
+    }
+
+
+    /**
+     * 鍐欏崟涓繚鎸佸瘎瀛樺櫒鏁版嵁 0x06
+     *
+     * @param offset
+     * @param value
+     * @return
+     * @throws ModbusTransportException
+     * @throws ModbusInitException
+     */
+    public static Boolean writeRegister(String ip, int port, int offset, int value) throws ModbusTransportException, ModbusInitException, InterruptedException {
+        WriteRegisterRequest registerRequest = new WriteRegisterRequest(slaveId, offset, value);
+        WriteRegisterResponse registerResponse = (WriteRegisterResponse) getMaster(ip, port).send(registerRequest);
+        return !registerResponse.isException();
+
+    }
+
+    /**
+     * 鍐欑嚎鍦堝紑鍏崇姸鎬佹暟鎹�愬銆�  0x0f
+     *
+     * @param offset
+     * @param booleans
+     * @return
+     * @throws ModbusTransportException
+     * @throws ModbusInitException
+     */
+    public static Boolean writeCoils(String ip, int port, int offset, boolean[] booleans) throws ModbusTransportException, ModbusInitException, InterruptedException {
+        WriteCoilsRequest writeCoils = new WriteCoilsRequest(slaveId, offset, booleans);
+        WriteCoilsResponse coilsResponse = (WriteCoilsResponse) getMaster(ip, port).send(writeCoils);
+        return !coilsResponse.isException();
+    }
+
+
+    /**
+     * 鍐欎繚瀛樺瘎瀛樺櫒鏁版嵁銆愬銆�  0x10
+     *
+     * @param offset
+     * @param nums
+     * @return
+     * @throws ModbusTransportException
+     * @throws ModbusInitException
+     */
+    public static Boolean writeRegisters(String ip, int port, int offset, short[] nums) throws ModbusTransportException, ModbusInitException, InterruptedException {
+        WriteRegistersRequest writeRegisters = new WriteRegistersRequest(slaveId, offset, nums);
+        WriteRegistersResponse registersResponse = (WriteRegistersResponse) getMaster(ip, port).send(writeRegisters);
+        return !registersResponse.isException();
+    }
+}
\ No newline at end of file
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ServerUtil.java b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ServerUtil.java
index b31119c..93a3fa4 100644
--- a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ServerUtil.java
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ServerUtil.java
@@ -1,6 +1,9 @@
 package com.ld.igds.protocol.modbus;
 
+import com.ld.igds.constant.Constant;
+import com.ld.igds.constant.DeviceStatus;
 import com.ld.igds.util.ContextUtil;
+import org.apache.commons.lang3.StringUtils;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -11,10 +14,9 @@
 public class ServerUtil {
 
 
-    /**
-     * 鐢ㄦ潵缂撳瓨锛孴CP璁惧鎵ц鏃堕棿璁板綍key = TCP鍞竴鏍囧織锛寁alue = 褰撳墠鎵ц鏃堕棿
-     */
-    public static Map<String, Long> contextExeModbusTcp = new HashMap<>();
+
+    public static  final String RUN_TAG = "RUN_TAG";
+
 
 
     /**
@@ -31,6 +33,35 @@
      * @param status     涓嶈�冭檻璁惧绫诲瀷锛屽彧鍦ㄩ�氶亾涓婃爣璁版槸OPEN鎴栬�匔LOSE鍗冲彲
      */
     public static void add2StatusMap(String companyId, String serId, String deviceCode, String status) {
+//        System.out.println(mainLink);
+//        //鑻ヤ笉涓虹┖锛屽垯鏌ヨ涓昏澶囩姸鎬�
+//        if(StringUtils.isNotEmpty(mainLink)){
+//            String oldStatus = contextStatusMap.get(ContextUtil.buildDeviceStatusKey(companyId, serId, mainLink));
+//            //鑻ラ绐楁垨椋庡彛寮�
+//            if(DeviceStatus.OPEN.getCode().equals(oldStatus)){
+//                //鑻ラ鏈哄紑
+//                if(DeviceStatus.OPEN.getCode().equals(status)){
+//                    status = DeviceStatus.F_OPEN.getCode();
+//                }
+//                //鑻ラ鏈哄叧
+//                if(DeviceStatus.CLOSE.getCode().equals(status)){
+//                    status = DeviceStatus.W_OPEN.getCode();
+//                }
+//            }
+//            //鑻ラ绐楁垨椋庡彛寮�
+//            if(DeviceStatus.CLOSE.getCode().equals(oldStatus)){
+//                //鑻ラ鏈哄紑
+//                if(DeviceStatus.OPEN.getCode().equals(status)){
+//                    status = DeviceStatus.ERROR.getCode();
+//                }
+//                //鑻ラ鏈哄叧
+//                if(DeviceStatus.CLOSE.getCode().equals(status)){
+//                    status = DeviceStatus.W_CLOSE.getCode();
+//                }
+//            }
+//            contextStatusMap.put(ContextUtil.buildDeviceStatusKey(companyId, serId, mainLink), status);
+//            return;
+//        }
         contextStatusMap.put(ContextUtil.buildDeviceStatusKey(companyId, serId, deviceCode), status);
     }
 
@@ -38,4 +69,17 @@
         return contextStatusMap;
     }
 
+
+
+
+
+
+    public static int getAddrExe(String temp) {
+        if (Constant.YN_N.equals(temp)) return 65535;
+        if (temp.length() > 4) {
+            temp = temp.substring(temp.length() - 4);
+        }
+        return Integer.valueOf(temp) - 1;
+    }
+
 }
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/AnalysisService.java b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/AnalysisService.java
index 710329d..37b58e2 100644
--- a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/AnalysisService.java
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/AnalysisService.java
@@ -1,15 +1,29 @@
 package com.ld.igds.protocol.modbus.command;
 
 import com.ld.igds.common.CoreDeviceService;
+import com.ld.igds.constant.BizType;
+import com.ld.igds.es.dto.EsData;
+import com.ld.igds.es.service.CoreEsService;
+import com.ld.igds.gas.CoreGasService;
 import com.ld.igds.io.constant.OrderRespEnum;
 import com.ld.igds.io.notify.NotifyWebInvoker;
+import com.ld.igds.io.request.BaseRequest;
+import com.ld.igds.io.request.CheckGasRequest;
 import com.ld.igds.io.request.DeviceControlRequest;
+import com.ld.igds.models.Gas;
 import com.ld.igds.protocol.modbus.ServerUtil;
+import com.ld.igds.protocol.modbus.data.ModbusGasResult;
+import com.ld.igds.util.ContextUtil;
+import com.ld.igds.util.NumberUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import java.text.DecimalFormat;
+import java.util.Date;
+import java.util.List;
 
 /**
  * 瑙f瀽
@@ -19,9 +33,13 @@
 public class AnalysisService {
 
     @Resource
-    private CoreDeviceService deviceService;
+    private CoreDeviceService coreDeviceService;
     @Resource
     private NotifyWebInvoker notifyInvoker;
+    @Autowired
+    private CoreGasService gasService;
+    @Autowired
+    private CoreEsService esService;
 
 
     /**
@@ -38,7 +56,7 @@
                 Thread.sleep(sleepTime);
             }
 
-            deviceService.updateStatus(request.getCompanyId(), request.getSerId(), ServerUtil.getStatusMap());
+            coreDeviceService.updateStatus(request.getCompanyId(), request.getSerId(), ServerUtil.getStatusMap());
 
             notifyInvoker.notifyAnalysisStatusSuccess(request.getCompanyId(), request.getSerId(), OrderRespEnum.MSG_SUCCESS, "璁惧鐘舵�佹煡璇㈡垚鍔熷苟瀹屾垚瑙f瀽锛�");
 
@@ -46,4 +64,159 @@
             log.error("---MODBUS-TCP-鐘舵�佽В鏋愬紓甯竰}", e);
         }
     }
+
+
+    /**
+     * 瑙f瀽姘斾綋妫�娴嬬粨鏋�
+     *
+     * @param request
+     * @param results
+     */
+    public void analysisGas(CheckGasRequest request, List<ModbusGasResult> results) {
+
+        log.debug("----------寮�濮嬫墽琛屾皵浣撶粨鏋滆В鏋�----{}", request.getDepotId());
+
+        String batchId = ContextUtil.getDefaultBatchId();
+        //涓讳綋淇℃伅
+        Gas gas = new Gas(batchId, request.getCompanyId(), request.getDepotId(), new Date());
+        gas.setCheckNum(results.size());
+        gas.setGasEnd(results.size());
+        gas.setGasStart(1);
+        gas.setReceiveDate(new Date());
+
+        int sumNum = results.size();
+        double co2, o2, ph3, n2;
+        DecimalFormat df = new DecimalFormat("#0.00");
+        double sumO2 = 0.0, sumCo2 = 0.0, sumPh3 = 0.0, sumN2 = 0.0;
+        int num = 1;
+        StringBuffer sb = new StringBuffer();
+        for (ModbusGasResult gasResult : results) {
+            //浜屾哀鍖栫⒊锛屽崟浣嶏細PPM锛岀洿鎺ヤ娇鐢�
+            co2 = gasResult.getCo2().doubleValue();
+            //姘ф皵锛岄櫎浠�10锛屽崟浣嶏細鐧惧垎姣�
+            o2 = Double.valueOf(df.format(gasResult.getO2().doubleValue()*0.1));
+            //纾峰寲姘紝鍗曚綅锛歅PM锛岀洿鎺ヤ娇鐢�
+            ph3 = gasResult.getPh3().doubleValue();
+            n2 = Double.valueOf(df.format(99.9 - o2));;
+
+            if(num == 1){
+                gas.setPerCo2Min(co2);
+                gas.setPerO2Min(o2);
+                gas.setPerPh3Min(ph3);
+                gas.setPerN2Min(n2);
+            }
+            num ++;
+            if (gas.getPerCo2Max() < co2) {
+                gas.setPerCo2Max(co2);
+            }
+            if (gas.getPerCo2Min() > co2) {
+                gas.setPerCo2Min(co2);
+            }
+            if (gas.getPerO2Max() < o2) {
+                gas.setPerO2Max(o2);
+            }
+            if (gas.getPerO2Min() > o2) {
+                gas.setPerO2Min(o2);
+            }
+            if (gas.getPerPh3Max() < ph3) {
+                gas.setPerPh3Max(ph3);
+            }
+            if (gas.getPerPh3Min() > ph3) {
+                gas.setPerPh3Min(ph3);
+            }
+            if (gas.getPerN2Max() < n2) {
+                gas.setPerN2Max(n2);
+            }
+            if (gas.getPerN2Min() > n2) {
+                gas.setPerN2Min(n2);
+            }
+
+            //鍥哄畾涓猴細passCode,co2,o2,ph3,n2;passCode,co2,o2,ph3,n2;"
+            sb.append(gasResult.getPasscode());
+            sb.append(",");
+            sb.append(co2);
+            sb.append(",");
+            sb.append(o2);
+            sb.append(",");
+            sb.append(ph3);
+            sb.append(",");
+            sb.append(n2);
+            sb.append(";");
+
+            sumCo2 += co2;
+            sumO2 += o2;
+            sumPh3 += ph3;
+            sumN2 += n2;
+
+        }
+        gas.setPoints(sb.toString());
+        gas.setPerCo2(NumberUtil.keepPrecision(sumCo2 / sumNum, 2));
+        gas.setPerO2(NumberUtil.keepPrecision(sumO2 / sumNum, 2));
+        gas.setPerN2(NumberUtil.keepPrecision(sumN2 / sumNum, 2));
+        gas.setPerPh3(NumberUtil.keepPrecision(sumPh3 / sumNum, 2));
+
+        gasService.saveOrUpdateData(gas);
+
+        // 璋冪敤閫氱煡鍓嶇
+        notifyInvoker.notifyWeb(gas.getCompanyId(), OrderRespEnum.MSG_SUCCESS, BizType.GAS, request.getDepotId() + " 姘斾綋妫�娴嬶細缁撴灉杩斿洖鎴愬姛.");
+        log.info("鎺у埗鏌�----->>>骞冲彴锛氭皵浣撹В鏋愬畬鎴�-浠撳簱={}", request.getDepotId());
+    }
+
+    /**
+     * 瑙f瀽鑳借�楁暟鎹�
+     *
+     * @param request
+     * @param result
+     */
+    public void analysisEs(BaseRequest request, Number result) {
+
+        log.debug("----------寮�濮嬫墽琛岃兘鑰楃粨鏋滆В鏋�----{}", request.getDepotId());
+
+
+        //鏈夊姛鐢佃兘鍒ゆ柇鏄惁杩斿洖鏈夋晥鏁版嵁
+        if (null == result) {
+            log.error("---鑳借�楁暟鎹繑鍥炴暟鎹笉瀹屾暣锛屽仠姝㈣В鏋�----{}", result.toString());
+            return;
+        }
+
+        EsData esData = new EsData();
+        esData.setCompanyId(request.getCompanyId());
+        esData.setDepotId(request.getDepotId());
+        esData.setUpdateTime(new Date());
+
+        esData.setEp(result.doubleValue());
+        esData.setEs(result.doubleValue());
+
+        log.info("Modbus鐢佃〃----->>>骞冲彴锛氳兘鑰楁暟鎹В鏋愬畬鎴�-浠撳簱={}", esData.getDepotId());
+        esService.saveAndUpdateInc(esData);
+    }
+
+    /**
+     * 瑙f瀽绌鸿皟鐘舵��
+     *
+     * @param request
+     * @param result
+     */
+    public void analysisTempStatus(BaseRequest request, Number result) {
+
+        log.debug("----------寮�濮嬫墽琛岃兘鑰楃粨鏋滆В鏋�----{}", request.getDepotId());
+
+
+        //鏈夊姛鐢佃兘鍒ゆ柇鏄惁杩斿洖鏈夋晥鏁版嵁
+        if (null == result) {
+            log.error("---鑳借�楁暟鎹繑鍥炴暟鎹笉瀹屾暣锛屽仠姝㈣В鏋�----{}", result.toString());
+            return;
+        }
+
+        EsData esData = new EsData();
+        esData.setCompanyId(request.getCompanyId());
+        esData.setDepotId(request.getDepotId());
+        esData.setUpdateTime(new Date());
+
+        esData.setEp(result.doubleValue());
+        esData.setEs(result.doubleValue());
+
+        log.info("Modbus鐢佃〃----->>>骞冲彴锛氳兘鑰楁暟鎹В鏋愬畬鎴�-浠撳簱={}", esData.getDepotId());
+        esService.saveAndUpdateInc(esData);
+    }
 }
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java
index 100023b..7057bc8 100644
--- a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java
@@ -1,8 +1,11 @@
 package com.ld.igds.protocol.modbus.command;
 
 import com.ld.igds.common.CoreDeviceService;
+import com.ld.igds.common.CoreSerService;
+import com.ld.igds.constant.BizType;
 import com.ld.igds.constant.Constant;
 import com.ld.igds.constant.DeviceStatus;
+import com.ld.igds.constant.DeviceType;
 import com.ld.igds.io.RemoteControlService;
 import com.ld.igds.io.constant.OrderRespEnum;
 import com.ld.igds.io.constant.ProtocolEnum;
@@ -11,11 +14,15 @@
 import com.ld.igds.io.request.ExeDevice;
 import com.ld.igds.io.request.TempControlRequest;
 import com.ld.igds.io.response.DeviceControlResponse;
+import com.ld.igds.modbus.service.HModbusService;
 import com.ld.igds.models.Device;
-import com.ld.igds.protocol.modbus.ModbusUtil;
+import com.ld.igds.models.DeviceModbus;
+import com.ld.igds.models.DeviceSer;
+import com.ld.igds.protocol.modbus.ModbusUtil2;
 import com.ld.igds.protocol.modbus.ServerUtil;
 import com.ld.igds.protocol.modbus.data.ModbusTcp;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
@@ -35,16 +42,18 @@
     public static final String BEAN_ID = "modbus.remoteControlService";
 
     @Resource
-    private CoreDeviceService deviceService;
+    private CoreDeviceService coreDeviceService;
+    @Resource
+    private HModbusService deviceModbusService;
     @Resource
     private AnalysisService analysisService;
     @Resource
-    private ModbusUtil modbusUtil;
+    private CoreSerService coreSerService;
 
 
     @Override
     public String getProtocol() {
-        return ProtocolEnum.MODBUS_TCP.getCode();
+        return ProtocolEnum.TCP_MODBUS.getCode();
     }
 
     @Override
@@ -56,99 +65,122 @@
         }
 
         try {
-            Device device;
+            DeviceModbus deviceModbus;
             ModbusTcp modbusTcp;
             ModbusTcp modbusTcpLink = null;
             String temp = Constant.YN_N;
+            DeviceSer deviceSer;
             for (ExeDevice exeDevice : deviceList) {
-                device = deviceService.getCacheDeviceById(exeDevice.getCompanyId(), exeDevice.getId());
+                deviceModbus = deviceModbusService.getCacheDeviceModbus(request.getCompanyId(), exeDevice.getPassCode() + "");
 
-                if (null == device) continue;
-
-                if (null == device.getModbus()) continue;
-
-                modbusTcp = new ModbusTcp(device.getModbus());
-                modbusTcp.setIp(request.getIp());
-                modbusTcp.setPort(request.getPort());
-                modbusTcp.setDeviceCode(device.getPassCode() + "");
-                modbusTcp.setSerId(request.getSerId());
-                modbusTcp.setCompanyId(request.getCompanyId());
-
-                if (null != device.getLinkModbus()) {
-                    modbusTcpLink = new ModbusTcp(device.getLinkModbus());
-                    modbusTcpLink.setIp(request.getIp());
-                    modbusTcpLink.setPort(request.getPort());
-                    modbusTcpLink.setDeviceCode(device.getLink());
-                    modbusTcpLink.setSerId(request.getSerId());
-                    modbusTcpLink.setCompanyId(request.getCompanyId());
-                }
-
-                //鏍规嵁璁惧鐩爣鐩爣鐘舵�侊紝閫夋嫨闇�瑕佹墽琛岀殑閫氶亾
-                if (DeviceStatus.CLOSE.getCode().equals(device.getTargetStatus())) {
-                    temp = modbusTcp.getAddrClose();
-                }
-
-                if (DeviceStatus.OPEN.getCode().equals(device.getTargetStatus())) {
-                    temp = modbusTcp.getAddrOpen();
-                }
-
-                if (null == modbusTcpLink) {
-                    //鏍规嵁璁惧鐩爣鐘舵�侊紝璋冪敤MODBUS鎵ц
-                    modbusTcp.setAddrExe(this.getAddrExe(temp));
-                    doWriteExe(modbusTcp, device.getTargetStatus());
+                if (null == deviceModbus) {
+                    log.error("褰撳墠璁惧---{}{},涓鸿幏鍙栧埌閰嶇疆鐨凪ODBUS淇℃伅", exeDevice.getSerId(), exeDevice.getName());
                     continue;
                 }
 
+                modbusTcp = new ModbusTcp(deviceModbus);
+                modbusTcp.setIp(request.getIp());
+                modbusTcp.setPort(request.getPort());
+                //鑻odbus璁惧閰嶇疆鍒嗘満锛屽垯浣跨敤鎵�閰嶇疆鍒嗘満鐨処P銆佺鍙�
+                if (StringUtils.isNotEmpty(deviceModbus.getSerId())) {
+                    deviceSer = coreSerService.getCacheSer(request.getCompanyId(), deviceModbus.getSerId());
+                    modbusTcp.setIp(deviceSer.getIp());
+                    modbusTcp.setPort(deviceSer.getPort());
+                }
+                modbusTcp.setBizCode(exeDevice.getPassCode() + "");
+                modbusTcp.setSerId(request.getSerId());
+                modbusTcp.setCompanyId(request.getCompanyId());
+
+                //鏍规嵁璁惧鐩爣鐩爣鐘舵�侊紝閫夋嫨闇�瑕佹墽琛岀殑閫氶亾
+                if (DeviceStatus.CLOSE.getCode().equals(exeDevice.getTargetStatus())) {
+                    temp = modbusTcp.getDeviceModbus().getClose();
+                }
+
+                if (DeviceStatus.OPEN.getCode().equals(exeDevice.getTargetStatus())) {
+                    temp = modbusTcp.getDeviceModbus().getOpen();
+                }
+
+                //鐜祦椋庢満-鍏�
+                if (DeviceStatus.F_CLOSE.getCode().equals(exeDevice.getTargetStatus())) {
+                    temp = modbusTcp.getDeviceModbus().getStop();
+                }
+
+                //鐜祦椋庢満-寮�
+                if (DeviceStatus.F_OPEN.getCode().equals(exeDevice.getTargetStatus())) {
+                    temp = modbusTcp.getDeviceModbus().getOpen();
+                }
+
+                if (StringUtils.isBlank(exeDevice.getLink()) || "null".equals(exeDevice.getLink())) {
+                    //鏍规嵁璁惧鐩爣鐘舵�侊紝璋冪敤MODBUS鎵ц
+                    modbusTcp.setAddrExe(ServerUtil.getAddrExe(temp));
+                    doWriteExe(modbusTcp, exeDevice.getTargetStatus());
+
+                    continue;
+                }
+
+                deviceModbus = deviceModbusService.getCacheDeviceModbus(request.getCompanyId(), exeDevice.getLink());
+                if (null == deviceModbus) continue;
+                modbusTcpLink = new ModbusTcp(deviceModbus);
+                modbusTcpLink.setIp(request.getIp());
+                modbusTcpLink.setPort(request.getPort());
+                modbusTcpLink.setBizCode(exeDevice.getLink());
+                modbusTcpLink.setSerId(request.getSerId());
+                modbusTcpLink.setCompanyId(request.getCompanyId());
+
+                //鑻odbus璁惧閰嶇疆鍒嗘満锛屽垯浣跨敤鎵�閰嶇疆鍒嗘満鐨処P銆佺鍙�
+                if (StringUtils.isNotEmpty(deviceModbus.getSerId())) {
+                    deviceSer = coreSerService.getCacheSer(request.getCompanyId(), deviceModbus.getSerId());
+                    modbusTcpLink.setIp(deviceSer.getIp());
+                    modbusTcpLink.setPort(deviceSer.getPort());
+                }
 
                 //濡傛灉鏄紑椋庢満
-                if (DeviceStatus.F_OPEN.getCode().equals(device.getTargetStatus())) {
+                if (DeviceStatus.F_OPEN.getCode().equals(exeDevice.getTargetStatus())) {
 
                     //鍏堝紑绐楀彛
-                    temp = modbusTcp.getAddrOpen();
-                    modbusTcp.setAddrExe(this.getAddrExe(temp));
-
+                    temp = modbusTcp.getDeviceModbus().getOpen();
+                    modbusTcp.setAddrExe(ServerUtil.getAddrExe(temp));
                     doWriteExe(modbusTcp, DeviceStatus.OPEN.getCode());
-
 
                     Thread.sleep(300);
 
                     //鍐嶅紑椋庢満
-                    temp = modbusTcpLink.getAddrOpen();
-                    modbusTcpLink.setAddrExe(this.getAddrExe(temp));
+                    temp = modbusTcpLink.getDeviceModbus().getOpen();
+                    modbusTcpLink.setAddrExe(ServerUtil.getAddrExe(temp));
 
                     doWriteExe(modbusTcpLink, DeviceStatus.OPEN.getCode());
                 }
 
                 //濡傛灉鍏抽鏈�
-                if (DeviceStatus.F_CLOSE.equals(device.getTargetStatus())) {
-                    temp = modbusTcpLink.getAddrClose();
-                    modbusTcpLink.setAddrExe(this.getAddrExe(temp));
+                if (DeviceStatus.F_CLOSE.getCode().equals(exeDevice.getTargetStatus())) {
+                    temp = modbusTcpLink.getDeviceModbus().getStop();
+                    modbusTcpLink.setAddrExe(ServerUtil.getAddrExe(temp));
 
                     doWriteExe(modbusTcpLink, DeviceStatus.CLOSE.getCode());
                 }
 
 
                 //濡傛灉寮�绐�
-                if (DeviceStatus.W_OPEN.equals(device.getTargetStatus())) {
-                    temp = modbusTcp.getAddrOpen();
-                    modbusTcp.setAddrExe(this.getAddrExe(temp));
+                if (DeviceStatus.W_OPEN.getCode().equals(exeDevice.getTargetStatus())) {
+                    temp = modbusTcp.getDeviceModbus().getOpen();
+                    modbusTcp.setAddrExe(ServerUtil.getAddrExe(temp));
 
-                    doWriteExe(modbusTcp, device.getTargetStatus());
+                    doWriteExe(modbusTcp, exeDevice.getTargetStatus());
                 }
 
                 //濡傛灉鏄叧绐楁埛
-                if (DeviceStatus.W_CLOSE.equals(device.getTargetStatus())) {
+                if (DeviceStatus.W_CLOSE.getCode().equals(exeDevice.getTargetStatus())) {
 
                     //鍏堝叧椋庢満
-                    temp = modbusTcpLink.getAddrClose();
-                    modbusTcpLink.setAddrExe(this.getAddrExe(temp));
+                    temp = modbusTcpLink.getDeviceModbus().getStop();
+                    modbusTcpLink.setAddrExe(ServerUtil.getAddrExe(temp));
                     doWriteExe(modbusTcpLink, DeviceStatus.CLOSE.getCode());
 
                     Thread.sleep(300);
 
                     //鍦ㄥ叧绐楁埛
-                    temp = modbusTcp.getAddrClose();
-                    modbusTcp.setAddrExe(this.getAddrExe(temp));
+                    temp = modbusTcp.getDeviceModbus().getClose();
+                    modbusTcp.setAddrExe(ServerUtil.getAddrExe(temp));
 
                     doWriteExe(modbusTcp, DeviceStatus.CLOSE.getCode());
                 }
@@ -162,18 +194,14 @@
         return new DeviceControlResponse(OrderRespEnum.ORDER_SUCCESS);
     }
 
-    private int getAddrExe(String temp) {
-        if (Constant.YN_N.equals(temp)) return 65535;
-        if (temp.length() > 4) {
-            temp = temp.substring(temp.length() - 4);
-        }
-        return Integer.valueOf(temp) - 1;
-    }
-
     private void doWriteExe(ModbusTcp modbusTcp, String targetStatus) throws Exception {
-        boolean exeResult = modbusUtil.writeValue05(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrExe(), true);
+        boolean exeResult = ModbusUtil2.writeCoilStatus(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrExe(), true);
         if (exeResult) {
-            ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getDeviceCode(), targetStatus);
+            //鏍规嵁Modbus-TCP锛屽皢鍐欒繃鐨勫�硷紝鎭㈠鍘熸潵鐨勫��
+            ModbusUtil2.writeCoilStatus(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrExe(), false);
+
+            log.debug("--------鍐欏叆鍊�---{}-{}-{}", modbusTcp.getSerId(), modbusTcp.getBizCode(), targetStatus);
+            ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getBizCode(), targetStatus);
         }
     }
 
@@ -186,55 +214,67 @@
     @Override
     public DeviceControlResponse queryStatus(DeviceControlRequest request) {
         try {
-            List<Device> list = deviceService.getCacheDeviceBySerId(request.getCompanyId(), request.getSerId());
+            List<Device> list = coreDeviceService.getCacheDeviceBySerId(request.getCompanyId(), request.getSerId());
 
             if (null == list || list.isEmpty()) {
                 return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "鏈幏鍙栧埌璁惧鍒楄〃淇℃伅");
             }
-
+            DeviceModbus deviceModbus;
             ModbusTcp modbusTcp;
             ModbusTcp modbusTcpLink;
-            int addrExe;
             for (Device device : list) {
+                deviceModbus = deviceModbusService.getCacheDeviceModbus(request.getCompanyId(), device.getPassCode() + "");
 
-                if (null == device.getModbus()) continue;
+                //绌鸿皟璁惧鍗曠嫭鏌ヨ
+                if(DeviceType.TYPE_05.getCode().equals(device.getType())){
+                    deviceModbus = deviceModbusService.getCacheDeviceModbus(request.getCompanyId(), device.getPassCode() + "", BizType.TEMPCONTROL.getCode());
+                }
 
+                if (null == deviceModbus) {
+                    log.error("褰撳墠璁惧---{}{},涓鸿幏鍙栧埌閰嶇疆鐨凪ODBUS淇℃伅", device.getSerId(), device.getName());
+                    continue;
+                }
 
-                modbusTcp = new ModbusTcp(device.getModbus());
+                if (Constant.YN_N.equals(deviceModbus.getOpen())) continue;
+
+                modbusTcp = new ModbusTcp(deviceModbus);
                 modbusTcp.setIp(request.getIp());
                 modbusTcp.setPort(request.getPort());
-                modbusTcp.setDeviceCode(device.getPassCode() + "");
+                modbusTcp.setBizCode(device.getPassCode() + "");
                 modbusTcp.setSerId(device.getSerId());
                 modbusTcp.setCompanyId(device.getCompanyId());
 
+                //绌鸿皟鐘舵�佸崟鐙鍙�
+                if(DeviceType.TYPE_05.getCode().equals(device.getType())){
+                    doReadTempStatus(modbusTcp);
+                    continue;
+                }
 
-                if (Constant.YN_N.equals(modbusTcp.getAddrOpenEnd())) continue;
+                doReadStatus(modbusTcp, false);
 
-                addrExe = Integer.valueOf(modbusTcp.getAddrOpenEnd()) - 1;
-                modbusTcp.setAddrExe(addrExe);
-
-                doReadExe(modbusTcp);
-
-                if (null == device.getLinkModbus()) continue;
+                if (StringUtils.isBlank(device.getLink()) || "null".equals(device.getLink())) continue;
 
                 Thread.sleep(300);
 
-                modbusTcpLink = new ModbusTcp(device.getModbus());
+                deviceModbus = deviceModbusService.getCacheDeviceModbus(request.getCompanyId(), device.getLink());
+
+                if (null == deviceModbus) continue;
+
+                modbusTcpLink = new ModbusTcp(deviceModbus);
                 modbusTcpLink.setIp(request.getIp());
                 modbusTcpLink.setPort(request.getPort());
                 modbusTcpLink.setSerId(device.getSerId());
-                modbusTcpLink.setDeviceCode(device.getLink());
+                modbusTcpLink.setBizCode(device.getLink());
                 modbusTcpLink.setCompanyId(device.getCompanyId());
-                addrExe = Integer.valueOf(modbusTcpLink.getAddrOpenEnd()) - 1;
-                modbusTcpLink.setAddrExe(addrExe);
 
-                doReadExe(modbusTcpLink);
+                modbusTcpLink.setAddrExe(ServerUtil.getAddrExe(modbusTcp.getDeviceModbus().getOpenEnd()));
 
+                doReadStatus(modbusTcpLink, true);
             }
 
         } catch (Exception e) {
             log.error("璋冪敤MODBUS-TCP鎵ц寮傚父锛歿}", e);
-            return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "鍚庡彴鎵ц寮傚父锛�" + e.getMessage());
+            return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "鍚庡彴鎵ц寮傚父锛�" + e.getLocalizedMessage());
         }
 
         analysisService.analysisDevice(request, 3000);
@@ -246,26 +286,125 @@
      * 璇诲彇鐘舵�侊紝鍚屾椂璇诲彇寮�鐘舵�佸拰鍏抽棴鐘舵��
      *
      * @param modbusTcp
+     * @param flag  鏄惁鏄叧鑱旇澶�
      * @throws Exception
      */
-    private void doReadExe(ModbusTcp modbusTcp) throws Exception {
+    private void doReadStatus(ModbusTcp modbusTcp, Boolean flag) throws Exception {
 
-        if (Constant.YN_N.equals(modbusTcp.getAddrOpenEnd())) return;
+        if (Constant.YN_N.equals(modbusTcp.getDeviceModbus().getOpen())) return;
+        if (Constant.YN_N.equals(modbusTcp.getDeviceModbus().getOpenEnd())) return;
 
-        boolean[] result = modbusUtil.readStatus02(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrExe(), 2);
-        log.debug("---------璇诲彇鐘舵��------{}--{}", modbusTcp.getDeviceCode(), result.toString());
-
-        if (result[0]) {
-            ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getDeviceCode(), DeviceStatus.OPEN.getCode());
+        int addrExe = ServerUtil.getAddrExe(modbusTcp.getDeviceModbus().getOpenEnd());
+        boolean result = ModbusUtil2.readInputStatus(modbusTcp.getIp(), modbusTcp.getPort(), addrExe);
+        log.debug("---------璇婚绐楅鍙e紑鍒颁綅鐘舵��(鎴栧叾浠栬澶囪繍琛岀姸鎬�)------{}-{}-{}", modbusTcp.getBizCode(), addrExe, result);
+        String statusOpen = DeviceStatus.OPEN.getCode();
+        String statusClose = DeviceStatus.CLOSE.getCode();
+        if(flag){
+            statusOpen = DeviceStatus.F_OPEN.getCode();
+            statusClose = DeviceStatus.F_CLOSE.getCode();
         }
-        if (result[1]) {
-            ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getDeviceCode(), DeviceStatus.CLOSE.getCode());
+        if (result) {
+            ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getBizCode(), statusOpen);
+        }else {
+            ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getBizCode(), statusClose);
+        }
+
+        if (Constant.YN_N.equals(modbusTcp.getDeviceModbus().getCloseEnd())) return;
+        addrExe = ServerUtil.getAddrExe(modbusTcp.getDeviceModbus().getCloseEnd());
+        result = ModbusUtil2.readInputStatus(modbusTcp.getIp(), modbusTcp.getPort(), addrExe);
+        log.debug("---------璇婚绐楅鍙e叧鍒颁綅鐘舵��------{}-{}-{}", modbusTcp.getBizCode(), addrExe, result);
+        if (result) {
+            ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getBizCode(), DeviceStatus.CLOSE.getCode());
+        }else {
+            ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getBizCode(), DeviceStatus.OPEN.getCode());
+        }
+    }
+
+    /**
+     * 璇诲彇绌鸿皟璁惧鐘舵��
+     *
+     * @param modbusTcp
+     * @throws Exception
+     */
+    private void doReadTempStatus(ModbusTcp modbusTcp) throws Exception {
+
+        if (Constant.YN_N.equals(modbusTcp.getDeviceModbus().getOpenEnd())) return;
+
+        int addrExe = ServerUtil.getAddrExe(modbusTcp.getDeviceModbus().getOpenEnd());
+        Number number = ModbusUtil2.readHoldingRegister(modbusTcp.getIp(), modbusTcp.getPort(), addrExe);
+        log.debug("---------璇荤┖璋冭繍琛岀姸鎬�------{}-{}-{}", modbusTcp.getBizCode(), addrExe, number);
+
+        int num = number.intValue();
+        if(num == 1){
+            ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getBizCode(), DeviceStatus.OPEN.getCode());
+        }
+        if(num == 2){
+            ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getBizCode(), DeviceStatus.CLOSE.getCode());
         }
     }
 
     @Override
     public DeviceControlResponse tempControl(TempControlRequest request) {
-        return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "缁堢鏌滀綋鏈帴鍏ュ綋鍓嶆帶鍒�");
+        ExeDevice exeDevice = request.getExeDevice();
+
+        if (null == exeDevice) {
+            return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "娌℃湁闇�瑕佹墽琛岀殑璁惧");
+        }
+
+        try {
+            ModbusTcp modbusTcp;
+            String temp = Constant.YN_N;
+            DeviceSer deviceSer;
+
+            DeviceModbus deviceModbus = deviceModbusService.getCacheDeviceModbus(request.getCompanyId(), exeDevice.getPassCode() + "", BizType.TEMPCONTROL.getCode());
+            if (null == deviceModbus) {
+                return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "鏈幏鍙栧埌閰嶇疆鐨凪ODBUS淇℃伅");
+            }
+
+            modbusTcp = new ModbusTcp(deviceModbus);
+            modbusTcp.setIp(request.getIp());
+            modbusTcp.setPort(request.getPort());
+
+            //鑻odbus璁惧閰嶇疆鍒嗘満锛屽垯浣跨敤鎵�閰嶇疆鍒嗘満鐨処P銆佺鍙�
+            if (StringUtils.isNotEmpty(deviceModbus.getSerId())) {
+                deviceSer = coreSerService.getCacheSer(request.getCompanyId(), deviceModbus.getSerId());
+                modbusTcp.setIp(deviceSer.getIp());
+                modbusTcp.setPort(deviceSer.getPort());
+            }
+
+            modbusTcp.setBizCode(exeDevice.getPassCode() + "");
+            modbusTcp.setSerId(request.getSerId());
+            modbusTcp.setCompanyId(request.getCompanyId());
+
+            //寮�绌鸿皟鏃讹紝闇�瑕佸彂閫佷袱鏉″懡浠わ紝涓�鏉¤缃俯搴﹀懡浠わ紝涓�鏉″紑鍚懡浠�
+            if (DeviceStatus.OPEN.getCode().equals(exeDevice.getTargetStatus())) {
+
+                //璁剧疆娓╁害
+                temp = modbusTcp.getDeviceModbus().getClose();
+                modbusTcp.setAddrExe(ServerUtil.getAddrExe(temp));
+                doWriteExe(modbusTcp, exeDevice.getTargetStatus());
+                boolean exeResult = ModbusUtil2.writeRegister(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrExe(), Integer.valueOf(request.getTargetTemp()));
+
+                //寮�绌鸿皟
+                if (exeResult) {
+                    temp = modbusTcp.getDeviceModbus().getOpen();
+                    modbusTcp.setAddrExe(ServerUtil.getAddrExe(temp));
+                    doWriteExe(modbusTcp, exeDevice.getTargetStatus());
+                }
+            }
+
+            //鍏崇┖璋冩椂锛屽彧鍙戦�佷竴鏉″叧闂懡浠�
+            if (DeviceStatus.CLOSE.getCode().equals(exeDevice.getTargetStatus())) {
+                temp = modbusTcp.getDeviceModbus().getStop();
+                modbusTcp.setAddrExe(ServerUtil.getAddrExe(temp));
+                doWriteExe(modbusTcp, exeDevice.getTargetStatus());
+            }
+        } catch (Exception e) {
+            log.error("璋冪敤MODBUS-TCP鎵ц寮傚父锛歿}", e);
+            return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "鍚庡彴鎵ц寮傚父锛�" + e.getMessage());
+        }
+
+        return new DeviceControlResponse(OrderRespEnum.ORDER_SUCCESS);
     }
 
     @Override
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteEsServiceImpl.java b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteEsServiceImpl.java
index beee3fe..2c72b32 100644
--- a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteEsServiceImpl.java
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteEsServiceImpl.java
@@ -1,10 +1,24 @@
 package com.ld.igds.protocol.modbus.command;
 
+import com.ld.igds.common.CoreSerService;
+import com.ld.igds.constant.BizType;
 import com.ld.igds.io.RemoteEsService;
+import com.ld.igds.io.constant.OrderRespEnum;
+import com.ld.igds.io.constant.ProtocolEnum;
 import com.ld.igds.io.request.BaseRequest;
 import com.ld.igds.io.response.BaseResponse;
+import com.ld.igds.io.response.GasResponse;
+import com.ld.igds.modbus.service.HModbusService;
+import com.ld.igds.models.DeviceModbus;
+import com.ld.igds.models.DeviceSer;
+import com.ld.igds.protocol.modbus.ModbusUtil2;
+import com.ld.igds.protocol.modbus.ServerUtil;
+import com.ld.igds.protocol.modbus.data.ModbusTcp;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
+import javax.annotation.Resource;
+import java.util.List;
 
 /**
  * 褰撳墠鍗忚閽堝鏍囧噯Modbus-TCP鍗忚
@@ -19,13 +33,60 @@
 
     public static final String BEAN_ID = "modbus.remoteEsService";
 
+    @Resource
+    private HModbusService modbusService;
+    @Resource
+    private AnalysisService analysisService;
+    @Resource
+    private CoreSerService coreSerService;
+
     @Override
     public String getProtocol() {
-        return null;
+        return ProtocolEnum.TCP_MODBUS.getCode();
     }
 
     @Override
     public BaseResponse checkEs(BaseRequest request) {
-        return null;
+
+        String passCode = request.getDepotId();
+
+        try {
+            //鑾峰彇闇�瑕佹墽琛岀殑璁惧閰嶇疆
+            List<DeviceModbus> list = modbusService.getDataByBizType(BizType.ES.getCode(), request.getSerId());
+
+            if(null == list || list.isEmpty()){
+                return new GasResponse(OrderRespEnum.ORDER_ERROR.getCode(), "鏈幏鍙栧埌Modbus鑳借�楅厤缃俊鎭�");
+            }
+            ModbusTcp modbusTcp;
+            DeviceSer deviceSer;
+            for (DeviceModbus deviceModbus : list) {
+                modbusTcp = new ModbusTcp(deviceModbus);
+                modbusTcp.setIp(request.getIp());
+                modbusTcp.setPort(request.getPort());
+
+                //鑻odbus璁惧閰嶇疆鍒嗘満锛屽垯浣跨敤鎵�閰嶇疆鍒嗘満鐨処P銆佺鍙�
+                if(StringUtils.isNotEmpty(deviceModbus.getSerId())){
+                    deviceSer = coreSerService.getCacheSer(request.getCompanyId(), deviceModbus.getSerId());
+                    modbusTcp.setIp(deviceSer.getIp());
+                    modbusTcp.setPort(deviceSer.getPort());
+                }
+
+                modbusTcp.setBizCode(passCode);
+                modbusTcp.setSerId(request.getSerId());
+                modbusTcp.setCompanyId(request.getCompanyId());
+
+                modbusTcp.setAddrExe(ServerUtil.getAddrExe(deviceModbus.getOpen()));
+
+                log.debug("--------鍚姩鑳借�楁煡璇�---{}-{}", modbusTcp.getSerId(), modbusTcp.getBizCode());
+                Number check = ModbusUtil2.readHoldingRegister(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrExe());
+
+                //瑙f瀽鑳借�楁暟鎹�
+                analysisService.analysisEs(request, check);
+            }
+        } catch (Exception e) {
+            return new GasResponse(OrderRespEnum.ORDER_ERROR.getCode(), "鍚庡彴鎵ц寮傚父锛�" + e.getLocalizedMessage());
+        }
+
+        return new GasResponse(OrderRespEnum.ORDER_SUCCESS);
     }
 }
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteGasServiceImpl.java b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteGasServiceImpl.java
index 8862faa..6918ae1 100644
--- a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteGasServiceImpl.java
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteGasServiceImpl.java
@@ -1,10 +1,28 @@
 package com.ld.igds.protocol.modbus.command;
 
+import com.ld.igds.constant.BizType;
+import com.ld.igds.constant.RedisConst;
 import com.ld.igds.io.RemoteGasService;
+import com.ld.igds.io.constant.OrderRespEnum;
+import com.ld.igds.io.constant.ProtocolEnum;
 import com.ld.igds.io.request.CheckGasRequest;
+import com.ld.igds.io.response.DeviceControlResponse;
 import com.ld.igds.io.response.GasResponse;
+import com.ld.igds.modbus.service.HModbusService;
+import com.ld.igds.models.DeviceModbus;
+import com.ld.igds.models.GasModbus;
+import com.ld.igds.protocol.modbus.ModbusUtil2;
+import com.ld.igds.protocol.modbus.ServerUtil;
+import com.ld.igds.protocol.modbus.data.ModbusGasResult;
+import com.ld.igds.protocol.modbus.data.ModbusTcp;
+import com.ld.igds.util.RedisUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 褰撳墠鍗忚閽堝鏍囧噯Modbus-TCP鍗忚
@@ -19,23 +37,182 @@
 
     public static final String BEAN_ID = "modbus.remoteGasService";
 
+    @Resource
+    private HModbusService modbusService;
+    @Resource
+    private AnalysisService analysisService;
+    @Resource
+    private RedisUtil redisUtil;
+
+
     @Override
     public String getProtocol() {
-        return null;
+        return ProtocolEnum.TCP_MODBUS.getCode();
     }
 
     @Override
     public GasResponse checkGas(CheckGasRequest request) {
-        return null;
+
+        boolean isRun = isRun(request);
+        if (isRun) {
+            return new GasResponse(OrderRespEnum.ORDER_ERROR.getCode(), "鎻愰啋锛氬綋鍓嶄粨姝e湪鎵ц妫�娴�");
+        }
+
+        String passCode = request.getDepotId();
+
+        try {
+            //鑾峰彇闇�瑕佹墽琛岀殑璁惧閰嶇疆
+            DeviceModbus deviceModbus = modbusService.getCacheDeviceModbus(request.getCompanyId(), passCode, BizType.GAS.getCode());
+
+            ModbusTcp modbusTcp = new ModbusTcp(deviceModbus);
+            modbusTcp.setIp(request.getIp());
+            modbusTcp.setPort(request.getPort());
+            modbusTcp.setBizCode(passCode);
+            modbusTcp.setSerId(request.getSerId());
+            modbusTcp.setCompanyId(request.getCompanyId());
+
+            modbusTcp.setAddrExe(ServerUtil.getAddrExe(deviceModbus.getOpen()));
+
+            boolean exeResult = ModbusUtil2.writeCoilStatus(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrExe(), true);
+            if (exeResult) {
+                addRun(request);
+                //璋冪敤寮傛鑾峰彇缁撴灉
+                progressGasResult(request, modbusTcp);
+                log.debug("--------鍚姩娴嬫皵---{}-{}", modbusTcp.getSerId(), modbusTcp.getBizCode());
+            }
+
+        } catch (Exception e) {
+            return new GasResponse(OrderRespEnum.ORDER_ERROR.getCode(), "鍚庡彴鎵ц寮傚父锛�" + e.getLocalizedMessage());
+        }
+
+        return new GasResponse(OrderRespEnum.ORDER_SUCCESS);
     }
+
+    private void addRun(CheckGasRequest request) {
+        String key = RedisConst.buildKey(request.getCompanyId(), ServerUtil.RUN_TAG, request.getDepotId());
+
+        redisUtil.set(key, request, 6 * 60);
+    }
+
+    private void delRun(CheckGasRequest request) {
+        String key = RedisConst.buildKey(request.getCompanyId(), ServerUtil.RUN_TAG, request.getDepotId());
+
+        redisUtil.del(key);
+    }
+
+    private boolean isRun(CheckGasRequest request) {
+        String key = RedisConst.buildKey(request.getCompanyId(), ServerUtil.RUN_TAG, request.getDepotId());
+
+        Object obj = redisUtil.get(key);
+        if (null == obj) return false;
+
+        return true;
+    }
+
+    /**
+     * 寮傛鎵ц杩涘害鏌ヨ
+     *
+     * @param modbusTcp
+     */
+    @Async
+    public void progressGasResult(CheckGasRequest request, ModbusTcp modbusTcp) {
+
+
+        log.debug("--------------寮傛鎵ц姘斾綋妫�娴嬭杩囪幏鍙�-------------");
+
+        try {
+            List<GasModbus> list = modbusService.listGasModBus(modbusTcp.getBizCode());
+
+            if (null == list || list.isEmpty()) {
+                log.error("------------鏇存柊姘斾綋妫�娴嬬粨鏋滆繘搴﹀け璐ワ紝娌℃湁鑾峰彇鍒版娴嬮�氶亾閰嶇疆淇℃伅-----{}", modbusTcp.getBizCode());
+                return;
+            }
+
+            //鏍规嵁閫氶亾鏁伴噺绾跨▼绛夊緟锛屾瘡涓�氶亾绛夊緟60绉�
+            Thread.sleep(list.size() * 50 * 1000);
+            log.debug("--------------绛夊緟鏃堕棿瀹屾垚锛屽紑濮嬭幏鍙栨娴嬬粨鏋�-------------{}", modbusTcp.getBizCode());
+
+            boolean isRun = isRun(request);
+            if (!isRun) {
+                log.info("--------------褰撳墠浠撳簱妫�娴嬪凡缁忓仠姝紝鍙栨秷缁撴灉鏌ヨ-------------{}", modbusTcp.getBizCode());
+                return;
+            }
+
+            ModbusTcp modbusTcpTemp = modbusTcp;
+            List<ModbusGasResult> results = new ArrayList<>();
+            ModbusGasResult gasResult;
+            Number check;
+            for (GasModbus gasModbus : list) {
+                gasResult = new ModbusGasResult();
+                gasResult.setPasscode(gasModbus.getPasscode());
+
+                //浜屾哀鍖栫⒊
+                modbusTcpTemp.setAddrExe(ServerUtil.getAddrExe(gasModbus.getCo2()));
+                check = ModbusUtil2.readHoldingRegister(modbusTcpTemp.getIp(), modbusTcpTemp.getPort(), modbusTcpTemp.getAddrExe());
+                gasResult.setCo2(check);
+
+                //姘ф皵
+                modbusTcpTemp.setAddrExe(ServerUtil.getAddrExe(gasModbus.getO2()));
+                check = ModbusUtil2.readHoldingRegister(modbusTcpTemp.getIp(), modbusTcpTemp.getPort(), modbusTcpTemp.getAddrExe());
+                gasResult.setO2(check);
+
+                //纾峰寲姘�
+                modbusTcpTemp.setAddrExe(ServerUtil.getAddrExe(gasModbus.getPh3()));
+                check = ModbusUtil2.readHoldingRegister(modbusTcpTemp.getIp(), modbusTcpTemp.getPort(), modbusTcpTemp.getAddrExe());
+                gasResult.setPh3(check);
+                log.debug("----閫氶亾{}锛孋o2={}锛孫2={}锛孭h3={}", gasModbus.getPasscode(), gasResult.getCo2(), gasResult.getO2(), gasResult.getPh3());
+                results.add(gasResult);
+            }
+
+            //鍒犻櫎杩愯鏍囪
+            delRun(request);
+
+            log.debug("----鑾峰彇鐨勬皵浣撴娴嬬粨鏋�---{}--{}", request.getDepotId(), results.toString());
+            //閫氱煡瑙f瀽
+            analysisService.analysisGas(request, results);
+        } catch (Exception e) {
+            log.error("------------鏇存柊姘斾綋妫�娴嬬粨鏋滆繘搴﹀け璐ワ紝鎵ц寮傚父-----{}--{}", modbusTcp.getBizCode(), e);
+        }
+
+    }
+
 
     @Override
     public GasResponse checkGasByPoint(CheckGasRequest request) {
-        return null;
+        return new GasResponse(OrderRespEnum.ORDER_ERROR.getCode(), "褰撳墠鎺у埗鏌滀笉鏀寔閫夋嫨鐐逛綅閲囬泦");
     }
 
     @Override
     public GasResponse stopCheckGas(CheckGasRequest request) {
-        return null;
+        String passCode = request.getDepotId();
+
+        try {
+            //鑾峰彇闇�瑕佹墽琛岀殑璁惧閰嶇疆
+            DeviceModbus deviceModbus = modbusService.getCacheDeviceModbus(request.getCompanyId(), passCode, BizType.GAS.getCode());
+
+            ModbusTcp modbusTcp = new ModbusTcp(deviceModbus);
+            modbusTcp.setIp(request.getIp());
+            modbusTcp.setPort(request.getPort());
+            modbusTcp.setBizCode(passCode);
+            modbusTcp.setSerId(request.getSerId());
+            modbusTcp.setCompanyId(request.getCompanyId());
+
+            modbusTcp.setAddrExe(ServerUtil.getAddrExe(deviceModbus.getStop()));
+
+            boolean exeResult = ModbusUtil2.writeCoilStatus(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrExe(), true);
+            if (exeResult) {
+                log.debug("--------鍏抽棴娴嬫皵---{}-{}", modbusTcp.getSerId(), modbusTcp.getBizCode());
+
+                //閫氱煡寮傛缁撴潫缁撴灉閲囬泦
+                delRun(request);
+            }
+
+        } catch (Exception e) {
+            return new GasResponse(OrderRespEnum.ORDER_ERROR.getCode(), "鍚庡彴鎵ц寮傚父锛�" + e.getLocalizedMessage());
+        }
+
+        return new GasResponse(OrderRespEnum.ORDER_SUCCESS);
     }
+
+
 }
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/data/ModbusGasResult.java b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/data/ModbusGasResult.java
new file mode 100644
index 0000000..5285f72
--- /dev/null
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/data/ModbusGasResult.java
@@ -0,0 +1,31 @@
+package com.ld.igds.protocol.modbus.data;
+
+import lombok.Data;
+
+/**
+ * @Desc: 鐢ㄤ簬灏佽ModBUsTCP鐨勪俊鎭�
+ * @author: andy.jia
+ * @update-time: 2023/8/12 15:29
+ */
+@Data
+public class ModbusGasResult {
+
+    private int passcode;
+
+    private Number co2;
+
+    private Number o2;
+
+    private Number ph3;
+
+
+    @Override
+    public String toString() {
+        return "GasResult{" +
+                "passcode=" + passcode +
+                ", co2=" + co2 +
+                ", o2=" + o2 +
+                ", ph3=" + ph3 +
+                '}';
+    }
+}
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/data/ModbusTcp.java b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/data/ModbusTcp.java
index 88d5d63..f743c9d 100644
--- a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/data/ModbusTcp.java
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/data/ModbusTcp.java
@@ -1,6 +1,6 @@
 package com.ld.igds.protocol.modbus.data;
 
-import com.ld.igds.constant.Constant;
+import com.ld.igds.models.DeviceModbus;
 import lombok.Data;
 
 /**
@@ -13,8 +13,9 @@
 
 
     private String companyId;
-    
-    private String deviceCode;
+
+    //涓氬姟鐩稿叧缂栫爜
+    private String bizCode;
 
     private String serId;
 
@@ -22,76 +23,24 @@
 
     private int port;
 
-    /**
-     * 寮�鍦板潃
-     **/
-    private String addrOpen = Constant.YN_N;
+    private DeviceModbus deviceModbus;
 
-    /**
-     * 鍏冲湴鍧�
-     **/
-    private String addrClose = Constant.YN_N;
-
-    /**
-     * 鍋滃湴鍧�
-     **/
-    private String addrStop = Constant.YN_N;
-
-    /**
-     * 寮�鍒颁綅鍦板潃
-     **/
-    private String addrOpenEnd = Constant.YN_N;
-
-    /**
-     * 鍏冲埌浣嶅湴鍧�
-     **/
-    private String addrCloseEnd = Constant.YN_N;
-
-    /**
-     * 寮�鏁呴殰鍦板潃
-     **/
-    private String addrOpenError = Constant.YN_N;
-
-    /**
-     * 鍏虫晠闅滃湴鍧�
-     **/
-    private String addrCloseError = Constant.YN_N;
-
-    private int addrExe = 65535;
-
+    private int addrExe;
 
     public ModbusTcp() {
         super();
     }
 
-    public ModbusTcp(String modbusStr) {
-        //modbus瑙勫垯锛氬紑鍦板潃-鍏冲湴鍧�-鍋滃湴鍧�-寮�鍒颁綅-鍏冲埌浣�-寮�鏁呴殰-鍏虫晠闅滐紝鏃犲湴鍧�鐢∟浠f浛
-        String[] addr = modbusStr.split("-");
-        this.addrOpen = addr[0];
-        this.addrClose = addr[1];
-        this.addrStop = addr[2];
-        this.addrOpenEnd = addr[3];
-        this.addrCloseEnd = addr[4];
-        this.addrOpenError = addr[5];
-        this.addrCloseError = addr[6];
+    public ModbusTcp(DeviceModbus deviceModbus) {
+        this.deviceModbus = deviceModbus;
     }
-//
-//    public ModbusTcp(String modbusStr) {
-//        //modbus瑙勫垯锛氬紑鍦板潃-鍏冲湴鍧�-鍋滃湴鍧�-寮�鍒颁綅-鍏冲埌浣�-寮�鏁呴殰-鍏虫晠闅滐紝鏃犲湴鍧�鐢∟浠f浛
-//        String[] addr = modbusStr.split("-");
-//        String temp = addr[0];
-//        if (!Constant.YN_N.equals(temp)) this.addrOpen = temp;
-//        temp = addr[1];
-//        if (!Constant.YN_N.equals(temp)) this.addrClose = temp;
-//        temp = addr[2];
-//        if (!Constant.YN_N.equals(temp)) this.addrStop = temp;
-//        temp = addr[3];
-//        if (!Constant.YN_N.equals(temp)) this.addrOpenEnd = temp;
-//        temp = addr[4];
-//        if (!Constant.YN_N.equals(temp)) this.addrCloseEnd = temp;
-//        temp = addr[5];
-//        if (!Constant.YN_N.equals(temp)) this.addrOpenError = temp;
-//        temp = addr[6];
-//        if (!Constant.YN_N.equals(temp)) this.addrCloseError = temp;
-//    }
+
+    public ModbusTcp(String companyId, String bizCode, String serId, String ip, int port, DeviceModbus deviceModbus) {
+        this.companyId = companyId;
+        this.bizCode = bizCode;
+        this.serId = serId;
+        this.ip = ip;
+        this.port = port;
+        this.deviceModbus = deviceModbus;
+    }
 }
diff --git a/igds-protocol-zldz/pom.xml b/igds-protocol-zldz/pom.xml
new file mode 100644
index 0000000..1087ef5
--- /dev/null
+++ b/igds-protocol-zldz/pom.xml
@@ -0,0 +1,49 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>com.ld.igds</groupId>
+	<artifactId>igds-protocol-zldz</artifactId>
+	<version>4.0.0-RELEASE</version>
+	<packaging>jar</packaging>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<java.version>1.8</java.version>
+		<igds.version>4.0.0-RELEASE</igds.version>
+	</properties>
+
+	<dependencies>
+
+		<!-- 寮曞叆涔夊姟鏍稿績鍖� -->
+		<dependency>
+			<groupId>com.ld.igds</groupId>
+			<artifactId>igds-core</artifactId>
+			<version>${igds.version}</version>
+		</dependency>
+
+		<!-- 寮曞叆IO鍖� -->
+		<dependency>
+			<groupId>com.ld.base.io</groupId>
+			<artifactId>base-io-netty</artifactId>
+			<version>1.0.0-SNAPSHOT</version>
+		</dependency>
+
+	</dependencies>
+
+ 	<build>
+ 		<plugins>
+ 			<plugin>
+ 				<groupId>org.apache.maven.plugins</groupId>
+ 				<artifactId>maven-compiler-plugin</artifactId>
+ 				<configuration>
+ 					<source>1.8</source>
+ 					<target>1.8</target>
+ 					<compilerArguments>
+ 						<extdirs>src\main\webapp\WEB-INF\lib</extdirs>
+ 					</compilerArguments>
+ 				</configuration>
+ 			</plugin>
+ 		</plugins>
+ 	</build>
+
+</project>
\ No newline at end of file
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/ServerRunner.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/ServerRunner.java
new file mode 100644
index 0000000..c15bfff
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/ServerRunner.java
@@ -0,0 +1,53 @@
+package com.ld.igds.protocol.zldz;
+
+import com.ld.igds.data.ConfigData;
+import com.ld.igds.protocol.zldz.server.ZldzServerEngine;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+/**
+ * 鍙互鏍规嵁閰嶇疆鏂囦欢鐏垫椿璋冩暣
+ * 閰嶇疆闅忕郴缁熻嚜鍔ㄥ惎鍔ㄦ湇鍔� -- 鎵ц椤哄簭20-29
+ */
+@Component(ServerRunner.BEAN_ID)
+@Order(value = 22)
+public class ServerRunner implements CommandLineRunner {
+
+    public static final String BEAN_ID = "zldz.serverRunner";
+
+    @Autowired
+    private ConfigData configData;
+
+    @Override
+    public void run(String... strings) throws Exception {
+        //
+        if ("fzzy".equals(configData.getActive())) {
+            ZldzServerEngine.start(9201);
+            return;
+        }
+
+        //椋庢鑷磋繙榛樿閮ㄧ讲鏈嶅姟褰撳墠搴旂敤浣跨敤9000绔彛
+        if (configData.getActive().equals("dev")) {
+            ZldzServerEngine.start(9201);
+            return;
+        }
+
+        //椋庢鑷磋繙榛樿閮ㄧ讲鏈嶅姟褰撳墠搴旂敤浣跨敤9000绔彛
+        if (configData.getActive().indexOf("pro") >= 0) {
+            //FZZY骞冲彴
+//            ZldzServerEngine.start(9201);
+            //鍏朵粬骞冲彴
+            ZldzServerEngine.start(9000);
+            return;
+        }
+
+        //璇锋敞鎰忥紝姝f潵鐢靛瓙鏈簨鏈嶅姟鍣ㄩ儴缃茬敤鐨勭鍙f槸锛�8000
+        if (configData.getActive().equals("zldz")) {
+            ZldzServerEngine.start(ZldzServerEngine.PORT);
+            return;
+        }
+
+    }
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/AnalysisConf.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/AnalysisConf.java
new file mode 100644
index 0000000..53c153c
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/AnalysisConf.java
@@ -0,0 +1,381 @@
+package com.ld.igds.protocol.zldz.analysis;
+
+import com.ld.igds.common.CoreSerService;
+import com.ld.igds.constant.BizType;
+import com.ld.igds.constant.Constant;
+import com.ld.igds.constant.RedisConst;
+import com.ld.igds.grain.dto.GrainSerCableData;
+import com.ld.igds.io.notify.NotifyWebInvoker;
+import com.ld.igds.io.constant.OrderRespEnum;
+import com.ld.igds.io.request.GrainSerConfRequest;
+import com.ld.igds.models.DeviceSer;
+import com.ld.igds.protocol.zldz.analysis.message.ReMessage;
+import com.ld.igds.protocol.zldz.command.BaseRemoteImpl;
+import com.ld.igds.protocol.zldz.command.builder.CommandBuilder8829;
+import com.ld.igds.protocol.zldz.command.message.Message;
+import com.ld.igds.protocol.zldz.task.CommandReSendService;
+import com.ld.igds.protocol.zldz.util.ServerUtils;
+import com.ld.igds.util.BytesUtil;
+import com.ld.igds.util.RedisUtil;
+import com.ld.igds.view.manager.TempManager;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author vince
+ */
+@Slf4j
+@Component(AnalysisConf.BEAN_ID)
+public class AnalysisConf extends BaseRemoteImpl {
+
+    public static final String BEAN_ID = "zldz.analysisConf";
+
+    @Autowired
+    private NotifyWebInvoker notifyWebInvoker;
+
+    @Autowired
+    private CoreSerService serService;
+
+    @Autowired
+    private RedisUtil redisUtil;
+    @Autowired
+    private TempManager thManager;
+
+    @Autowired
+    private CommandReSendService commandReSendService;
+
+    /**
+     * 瑙f瀽鍒嗘満閰嶇疆淇℃伅
+     *
+     * @param message
+     * @param ser
+     */
+    public void analysis8816(ReMessage message, DeviceSer ser) {
+
+        log.debug("鍒嗘満---->>>骞冲彴锛氭秷鎭被鍨�=8816----{}-{}.{}", ser.getCompanyId(),
+                ser.getIp(), ser.getPort());
+
+        // 娓呴櫎缂撳瓨
+        commandReSendService.cleanKey(message.getCompanyId(), message.getIp(),
+                message.getPort(), ServerUtils.MSG_TYPE_8816);
+
+        // 娓呮鍒濆鍖栫櫥闄嗙殑瑙f瀽
+        commandReSendService.cleanKey(ServerUtils.DEFAULT_COMPANY,
+                message.getIp(), message.getPort(), ServerUtils.MSG_TYPE_8816);
+
+        ser.setStatus(Constant.YN_Y);
+
+        String content = message.getBody().getContent();
+
+        // 璇诲啓鏍囧織
+        int start = 0, len = 1;
+        String temp = content.substring(start * 2, start * 2 + len * 2);
+        int readTag = BytesUtil.hexToInt(temp);
+
+        // 璁惧ID锛屽叏灞�鍞竴
+        start = 1;
+        len = 2;
+        temp = content.substring(start * 2, start * 2 + len * 2);
+
+        // 缃戠粶ID
+        start = 3;
+        len = 1;
+        temp = content.substring(start * 2, start * 2 + len * 2);
+
+        // 淇¢亾
+        start = 4;
+        len = 1;
+        temp = content.substring(start * 2, start * 2 + len * 2);
+
+        // 閫熺巼
+        start = 5;
+        len = 1;
+        temp = content.substring(start * 2, start * 2 + len * 2);
+
+        // 灞傛暟
+        start = 6;
+        len = 1;
+        temp = content.substring(start * 2, start * 2 + len * 2);
+        ser.setCableZ(BytesUtil.hexToInt(temp));
+
+        // 琛屾暟
+        start = 7;
+        len = 1;
+        temp = content.substring(start * 2, start * 2 + len * 2);
+        ser.setCableY(BytesUtil.hexToInt(temp));
+
+        // 鍒楁暟
+        start = 8;
+        len = 1;
+        temp = content.substring(start * 2, start * 2 + len * 2);
+        ser.setCableX(BytesUtil.hexToInt(temp));
+
+        // 鐢电紗鍒跺紡
+        start = 9;
+        len = 1;
+        temp = content.substring(start * 2, start * 2 + len * 2);
+        ser.setCableFormat("0" + BytesUtil.hexToInt(temp));
+
+        // 鐢电紗绫诲瀷
+        start = 10;
+        len = 1;
+        temp = content.substring(start * 2, start * 2 + len * 2);
+        ser.setCableType("0" + BytesUtil.hexToInt(temp));
+
+        // 渚涚數妯″紡
+        start = 11;
+        len = 1;
+        temp = content.substring(start * 2, start * 2 + len * 2);
+        ser.setPowerModel("0" + BytesUtil.hexToInt(temp));
+
+        String msg = ser.getName() + " 杩滅▼鑾峰彇閰嶇疆鎴愬姛锛岃鍒锋柊鏁版嵁鏌ョ湅锛�";
+
+        // 缁勭粐缂栫爜
+        start = 12;
+        temp = content.substring(start * 2);
+        if (readTag == 1) {// 琛ㄧず鍐欑殑鎴愬姛杩斿洖
+            ser.setOrgId(ser.getCompanyId());
+            msg = ser.getName() + " 杩滅▼鍐欏叆鎴愬姛锛岃鍒锋柊鏁版嵁鏌ョ湅锛�";
+        } else {
+            ser.setOrgId(BytesUtil.hexToInt(BytesUtil.tran_LH(temp)) + "");
+        }
+
+        if (null == ser.getSn()) {
+            ser.setSn(ser.getId());
+        }
+        ser.setIp(message.getIp());
+        ser.setPort(message.getPort());
+
+        // 寮�濮嬪垪榛樿=1
+        if (ser.getCableStart() == 0) {
+            ser.setCableStart(1);
+        }
+
+        log.info("鍒嗘満---->>>骞冲彴锛氬垎鏈洪厤缃В鏋愬畬鎴�----{}-{}-{}-{}锛屾洿鏂板埌鏈嶆湇鍔″櫒",
+                ser.getCompanyId(), ser.getIp(), ser.getPort(), ser.getName());
+        serService.updateSerById(ser);
+
+        // 鏇存柊浼氳瘽淇℃伅
+        super.updateSession(ser.getIp(), ser.getPort(), ser.getCompanyId());
+
+        notifyWebInvoker.notifyWeb(ser.getCompanyId(),
+                OrderRespEnum.MSG_SUCCESS, BizType.SYS, msg);
+
+        //鍒嗘満涓婄嚎杩涜涓�娆℃俯婀垮害閲囬泦
+        thManager.checkThBySer(ser.getCompanyId(), ser.getId());
+    }
+
+    /**
+     * 鐢电紗鍒濆鍖栨垚鍔�
+     *
+     * @param reMessage
+     * @param ser
+     */
+    public void analysis8822(ReMessage reMessage, DeviceSer ser) {
+        log.debug("-----------analysis8822------------{}-{}.{}",
+                ser.getCompanyId(), ser.getIp(), ser.getPort());
+
+        // 娓呴櫎缂撳瓨
+        commandReSendService.cleanKey(reMessage.getCompanyId(),
+                reMessage.getIp(), reMessage.getPort(),
+                ServerUtils.MSG_TYPE_8822);
+
+        String msg = ser.getName() + " 鍒濆鍖栫數缂嗗畬鎴愶紒锛�";
+        notifyWebInvoker.notifyWeb(ser.getCompanyId(),
+                OrderRespEnum.MSG_SUCCESS, BizType.SYS, msg);
+    }
+
+    /**
+     * 鐢电紗淇敼杩斿洖锛�
+     *
+     * @param reMessage
+     * @param ser
+     */
+    public void analysis8826(ReMessage reMessage, DeviceSer ser) {
+        log.debug("-----------analysis8826------------{}-{}.{}",
+                ser.getCompanyId(), ser.getIp(), ser.getPort());
+
+        // 娓呴櫎缂撳瓨
+        commandReSendService.cleanKey(reMessage.getCompanyId(),
+                reMessage.getIp(), reMessage.getPort(),
+                ServerUtils.MSG_TYPE_8826);
+
+        String msg = ser.getName() + " 鐢电紗淇敼鎿嶄綔瀹屾垚";
+
+        notifyWebInvoker.notifyWeb(ser.getCompanyId(),
+                OrderRespEnum.MSG_SUCCESS, BizType.SYS, msg);
+    }
+
+    /**
+     * 閫氶亾鐢电紗鑾峰彇杩斿洖锛屽垎鏈鸿繑鍥炴敹鍒板懡浠や俊鎭紝瀹為檯杩斿洖鍊煎湪8829涓鏄�
+     *
+     * @param reMessage
+     * @param ser
+     */
+    public void analysis8825(ReMessage reMessage, DeviceSer ser) {
+
+        log.debug("-----------analysis8825------------{}-{}.{}",
+                ser.getCompanyId(), ser.getIp(), ser.getPort());
+
+        // 娓呴櫎缂撳瓨
+        commandReSendService.cleanKey(reMessage.getCompanyId(),
+                reMessage.getIp(), reMessage.getPort(),
+                ServerUtils.MSG_TYPE_8825);
+
+        String msg = ser.getName() + " 璇诲彇閫氶亾鐢电紗寮�濮嬭繑鍥�";
+
+        notifyWebInvoker.notifyWeb(ser.getCompanyId(),
+                OrderRespEnum.MSG_SUCCESS, BizType.SYS, msg);
+
+    }
+
+    /**
+     * 缁堢鍙戦�侀�氶亾鐢电紗鏁版嵁缁欏悗鍙帮紝鍒嗘満涓诲姩鎺ㄩ��
+     *
+     * @param reMessage
+     * @param ser
+     */
+    @SuppressWarnings("unchecked")
+    public void analysis1129(ReMessage reMessage, DeviceSer ser) {
+
+        // 寮�濮嬭В鏋�
+        String content = reMessage.getBody().getContent();
+
+        // 閫氶亾鍙�
+        int start = 0, len = 1;
+        String temp = content.substring(start * 2, start * 2 + len * 2);
+        int passCode = BytesUtil.hexToInt(temp);
+
+        // 鐐瑰簭鍙凤紝鎸夌収杩斿洖椤哄簭濉啓浠�1寮�濮�
+        start = 1;
+        len = 1;
+        temp = content.substring(start * 2, start * 2 + len * 2);
+        int iotNum = BytesUtil.hexToInt(temp);
+
+        // 鎬诲寘鏁�
+        start = 2;
+        len = 1;
+        temp = content.substring(start * 2, start * 2 + len * 2);
+        int sumPacket = BytesUtil.hexToInt(temp);
+
+        // 褰撳墠鍖�
+        start = 3;
+        len = 1;
+        temp = content.substring(start * 2, start * 2 + len * 2);
+        int curPacket = BytesUtil.hexToInt(temp);
+
+        // -----------鍚庣閫氱煡缁堢鏀跺埌淇℃伅----------------------//
+        GrainSerConfRequest request = new GrainSerConfRequest();
+        request.setSerId(ser.getId());
+        request.setBizType(BizType.SYS.getCode());
+        request.setIp(ser.getIp());
+        request.setPort(ser.getPort());
+        request.setCompanyId(ser.getCompanyId());
+        request.setValue1(curPacket);
+
+        Message message = CommandBuilder8829.getInstance()
+                .buildMessage(request);
+        log.info("骞冲彴------>>>鍒嗘満锛�" + request.getSerName() + "鍚庡彴鏀跺埌鐢电紗鏁版嵁搴旂瓟="
+                + message.toString());
+        // 鍙戦�佸懡浠�
+        send(request.getIp(), request.getPort(), message.getByteMsg());
+
+        // -----------鍚庣閫氱煡缁堢鏀跺埌淇℃伅 EDN----------------------//
+
+        log.info("鍒嗘満------>>>骞冲彴锛氳繑鍥炵數缂嗕俊鎭紝鍒嗘満={}锛屽綋鍓嶅寘锛歿}锛屼俊鎭�={}", ser.getName(),
+                curPacket, content);
+
+        // 璇︾粏淇℃伅锛屾瘡闀垮害5涓轰竴缁勬暟鎹�
+        start = 4;
+        temp = content.substring(start * 2);
+
+        String redisKey = RedisConst.buildKey(ser.getCompanyId(),
+                RedisConst.KEY_TEMP_PREFIX, "CABLE_DATA_" + ser.getId() + "_"
+                        + passCode);
+
+        List<GrainSerCableData> dataList = null;
+        if (curPacket != 1) {
+            dataList = (List<GrainSerCableData>) redisUtil.get(redisKey);
+        }
+        if (null == dataList)
+            dataList = new ArrayList<>();
+
+        GrainSerCableData data;
+
+        String str1 = temp.substring(0, 160);// 娓╁害鐐� 40涓�
+        String str2 = temp.substring(160, 400);// 1涓牴鍙凤紝1涓偣鍙凤紝1涓厤缃紝鍔熻兘40缁�
+        String temp1, temp2;
+        for (int i = 0; i < 40; i++) {
+            data = new GrainSerCableData();
+            data.setPassCode(passCode);
+            data.setIotNum(i + 1);
+            data.setReceiveDate(new Date());
+            //data.setPointIndex(dataList.size() + i + 1);
+
+            // 娓╁害
+            temp1 = str1.substring(i * 4, i * 4 + 4);
+            data.setTemp(BytesUtil.hexToInt(BytesUtil.tran_LH(temp1)) / 10.0);
+
+            //鏍瑰彿
+            temp2 = str2.substring(i * 6, i * 6 + 6);
+            data.setRootIndex(BytesUtil.hexToInt(temp2.substring(0, 2)));
+
+            //鐐瑰彿
+            data.setPointIndex(BytesUtil.hexToInt(temp2.substring(2, 4)));
+
+            //閰嶇疆
+            data.setConf(temp2.substring(4, 6));
+
+            dataList.add(data);
+        }
+
+        // 瀛樻斁绶╁瓨
+        redisUtil.set(redisKey, dataList, 5 * 60);
+
+        notifyWebInvoker.notifyWeb(ser.getCompanyId(),
+                OrderRespEnum.MSG_SUCCESS, BizType.SYS, "绯荤粺鏀跺埌鐢电紗閰嶇疆淇℃伅锛岃鎵嬪姩鍒锋柊锛屽垎鏈�="
+                        + ser.getName() + ",閫氶亾=" + passCode + ",鎬诲寘="
+                        + sumPacket + ",褰撳墠鍖�=" + curPacket);
+    }
+
+    /**
+     * 鐢电紗姹囨�诲簲绛�
+     *
+     * @param reMessage
+     * @param ser
+     */
+    public void analysis8823(ReMessage reMessage, DeviceSer ser) {
+        // 寮�濮嬭В鏋�
+        String content = reMessage.getBody().getContent();
+
+        // 鍔ㄦ�佹嫾鎺ュ璞�
+        List<GrainSerCableData> dataList = new ArrayList<GrainSerCableData>();
+        String tempStr;
+        GrainSerCableData cableData;
+        for (int i = 0; i < content.length() / 4; i++) {
+            tempStr = content.substring(i * 4, i * 4 + 4);
+            cableData = new GrainSerCableData();
+            cableData.setPassCode(i + 1);
+            cableData.setReceiveDate(new Date());
+            cableData.setIotNum(BytesUtil.hexToInt(tempStr.substring(0, 2)));
+            cableData.setIotErrNum(BytesUtil.hexToInt(tempStr.substring(2, 4)));
+
+            dataList.add(cableData);
+        }
+
+        String redisKey = RedisConst.buildKey(ser.getCompanyId(),
+                RedisConst.KEY_TEMP_PREFIX, "CABLE_DATA_" + ser.getId());
+
+        // 瀛樻斁绶╁瓨
+        redisUtil.set(redisKey, dataList, 5 * 60);
+
+        notifyWebInvoker.notifyWeb(ser.getCompanyId(),
+                OrderRespEnum.MSG_SUCCESS, BizType.SYS,
+                "绯荤粺鏀跺埌鐢电紗姹囨�讳俊鎭紝璇锋墜鍔ㄦ洿鏂版煡鐪嬶紝杩斿洖淇℃伅锛氬垎鏈�=" + ser.getName());
+    }
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/AnalysisGrain.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/AnalysisGrain.java
new file mode 100644
index 0000000..983803d
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/AnalysisGrain.java
@@ -0,0 +1,763 @@
+package com.ld.igds.protocol.zldz.analysis;
+
+import com.ld.igds.common.CoreCommonService;
+import com.ld.igds.common.dto.THDto;
+import com.ld.igds.constant.BizType;
+import com.ld.igds.constant.Constant;
+import com.ld.igds.constant.DepotType;
+import com.ld.igds.grain.GrainUtil;
+import com.ld.igds.grain.dto.GrainItemInfo;
+import com.ld.igds.io.notify.NotifyGrainInvoker;
+import com.ld.igds.io.constant.OrderRespEnum;
+import com.ld.igds.io.request.BaseRequest;
+import com.ld.igds.models.DepotConf;
+import com.ld.igds.models.DeviceSer;
+import com.ld.igds.models.DicSysConf;
+import com.ld.igds.models.Grain;
+import com.ld.igds.order.ExeOrderService;
+import com.ld.igds.order.data.ExeRequest;
+import com.ld.igds.protocol.zldz.analysis.message.ReMessage;
+import com.ld.igds.protocol.zldz.command.RemoteGrainServiceImpl;
+import com.ld.igds.protocol.zldz.task.CommandReSendService;
+import com.ld.igds.protocol.zldz.util.ServerUtils;
+import com.ld.igds.th.CoreThService;
+import com.ld.igds.util.BytesUtil;
+import com.ld.igds.util.ContextUtil;
+import com.ld.igds.warn.WarnUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 绮儏瑙f瀽
+ *
+ * @author Andy
+ */
+@Slf4j
+@Component(AnalysisGrain.BEAN_ID)
+public class AnalysisGrain {
+
+    public static final String BEAN_ID = "zldz.analysisGrain";
+
+    @Autowired
+    private CoreCommonService commonService;
+    @Autowired
+    private CoreThService thService;
+    @Autowired
+    private ExeOrderService exeOrderService;
+    @Autowired
+    private GrainUtil grainUtil;
+    @Autowired
+    private NotifyGrainInvoker notifyGrainInvoker;
+    @Autowired
+    private RemoteGrainServiceImpl remoteGrainService;
+    @Autowired
+    private CommandReSendService commandReSendService;
+    @Autowired
+    private WarnUtils warnUtils;
+
+    public static Map<String, Map<String, String>> contextMap = new HashMap<>();
+
+    public static double ERROR_CHECK_TAG = -100.0;
+
+    public static double FAULT_CHECK_TAG = 85.0;
+
+    public static double ERROR_CHECK_TAG2 = 50;
+
+    public static double MAX_TEMP = -50.0;
+    public static double MIN_TEMP = 50.0;
+
+    /**
+     * 鍚庡彴鍙戦�佽姹傚悗锛岀粓绔殑鍝嶅簲
+     *
+     * @param reMessage
+     * @param ser
+     */
+    public void analysis8815(ReMessage reMessage, DeviceSer ser) {
+        BaseRequest request = new BaseRequest();
+        request.setSerId(ser.getId());
+        request.setCompanyId(ser.getCompanyId());
+        request.setIp(reMessage.getIp());
+        request.setPort(reMessage.getPort());
+        request.setSerName(ser.getName());
+
+        remoteGrainService.reply8815(request);
+    }
+
+    /**
+     * 鎺ユ敹鍒扮伯鎯呯殑鍥炲
+     *
+     * @param reMessage
+     * @param ser
+     */
+    public void reply8817(ReMessage reMessage, DeviceSer ser) {
+        String bodyMsg = reMessage.getBody().getContent();
+
+        log.info("鍒嗘満------>>>骞冲彴锛氭敹鍒扮殑绮儏淇℃伅-{}-{}-{}", ser.getCompanyId(),
+                ser.getName(), reMessage.getStrMsg());
+        // Step1鏍规嵁闇�瑕佺畝鍖栭渶瑕佺殑淇℃伅
+        String ua = bodyMsg.substring(0 * 2, 1 * 2);
+        log.debug("鑾峰彇鍒扮殑鐢靛帇淇℃伅锛岀郴缁熶笉淇濈暀={}", ua);
+
+        // 鎬诲寘鏁�
+        // int sumPacket = BytesUtil.hexToInt(bodyMsg.substring(1 * 2, 1 * 2 + 1
+        // * 2));
+        // 褰撳墠鍖�
+        String hexCurPacket = bodyMsg.substring(2 * 2, 2 * 2 + 1 * 2);
+        // int curPacket = BytesUtil.hexToInt(hexCurPacket);
+
+        BaseRequest request = new BaseRequest();
+        request.setSerId(ser.getId());
+        request.setCompanyId(ser.getCompanyId());
+        request.setIp(reMessage.getIp());
+        request.setPort(reMessage.getPort());
+        request.setSerName(ser.getName());
+
+        remoteGrainService.reply8817(request, hexCurPacket);
+    }
+
+    @Transactional
+    public void analysis8817(ReMessage msg, DeviceSer ser) {
+        // 鎺ュ埌淇℃伅鍥炲--涓绘満
+        reply8817(msg, ser);
+
+        // 棣栧厛鑾峰彇鍒扮郴缁熷弬鏁帮紝鍒ゆ柇鏄惁闇�瑕佹壒娆¤嚜鍔ㄤ紭鍖�
+        DicSysConf sysConf = commonService.getCacheSysConf(ser.getCompanyId());
+
+        List<ExeRequest> list = exeOrderService.getInProgressOrderBySerId(BizType.GRAIN.getCode(), ser.getId());
+
+        if (null == list || list.isEmpty()) {
+            String info = "绮儏瑙f瀽澶辫触:鍒嗘満=" + ser.getName() + "娌℃湁鑾峰彇鍒版墍灞炰粨搴撲俊鎭��";
+            log.error("鍒嗘満------>>>骞冲彴锛�" + info);
+            notifyGrainInvoker.notifyWeb(ser.getCompanyId(),
+                    OrderRespEnum.MSG_ERROR, BizType.GRAIN, info);
+            return;
+        }
+        ExeRequest exeRequest = list.get(0);
+        log.info("鑾峰彇绮儏鍛戒护淇℃伅={}", exeRequest);
+        DepotConf depotConf = commonService.getCacheDepotConf(
+                exeRequest.getCompanyId(), exeRequest.getDepotId());
+        if (null == depotConf) {
+            String info = "绮儏瑙f瀽澶辫触:鍒嗘満=" + ser.getName() + "娌℃湁鑾峰彇鍒扮伯鎯呭弬鏁伴厤缃俊鎭��";
+            log.error("鍒嗘満------>>>骞冲彴锛�" + info);
+            notifyGrainInvoker.notifyWeb(ser.getCompanyId(),
+                    OrderRespEnum.MSG_ERROR, BizType.GRAIN, info);
+            return;
+        }
+
+        analysisStep(depotConf, msg, ser, exeRequest, sysConf);
+    }
+
+
+    /**
+     * 寮�濮嬭В鏋�
+     *
+     * @param ser
+     * @param msg
+     * @throws Exception
+     */
+    private void analysisStep(DepotConf depotConf, ReMessage msg,
+                              DeviceSer ser, ExeRequest exeRequest, DicSysConf sysConf) {
+        // 绮儏鐨勬壒娆″彿閲嶆柊鏍规嵁棰戠巼璋冩暣
+        msg.setBatchId(ContextUtil.getBatchIdByFireq(depotConf.getGrainFreq()));
+
+        String bodyMsg = msg.getBody().getContent();
+
+        log.debug("{}-{}=鏀跺埌鐨勭伯鎯呬俊鎭�={}", ser.getCompanyId(), ser.getName(),
+                msg.getStrMsg());
+
+        // Step1鏍规嵁闇�瑕佺畝鍖栭渶瑕佺殑淇℃伅
+        String ua = bodyMsg.substring(0 * 2, 1 * 2);
+        log.debug("鑾峰彇鍒扮殑鐢靛帇淇℃伅锛岀郴缁熶笉淇濈暀={}", ua);
+
+        // 鎬诲寘鏁�
+        int sumPacket = BytesUtil.hexToInt(bodyMsg.substring(1 * 2,
+                1 * 2 + 1 * 2));
+        // 褰撳墠鍖�
+        String hexCurPacket = bodyMsg.substring(2 * 2, 2 * 2 + 1 * 2);
+        int curPacket = BytesUtil.hexToInt(hexCurPacket);
+
+        log.debug("鍒嗘満={},鍖呮�绘暟={},褰撳墠鍖�={}", ser.getName(), sumPacket, curPacket);
+
+        // 绮娓╁害淇℃伅
+        String grainStr = bodyMsg.substring(3 * 2);
+
+        String contextKey = this.buildContextKey(msg, depotConf.getDepotId());
+        String curKey = this.buildCurKey(msg, curPacket);
+
+        Map<String, String> curMap = contextMap.get(contextKey);
+        if (null == curMap) {
+            curMap = new HashMap<>();
+            contextMap.put(contextKey, curMap);
+        }
+        contextMap.get(contextKey).put(curKey, grainStr);
+
+        // 鏁版嵁鍑嗗濂斤紝寮�濮嬫墽琛岃В鏋�
+        if (curPacket == sumPacket) {
+            analysisStep0(depotConf, msg, ser, exeRequest, contextKey,
+                    sumPacket, sysConf);
+
+            log.info("鍒嗘満------>>>骞冲彴锛氬懡浠ょ被鍨�=8817--绮儏鍏ㄩ儴鏀跺埌锛屽紑濮嬭В鏋�-{}-{}",
+                    ser.getCompanyId(), ser.getName());
+            // 娓呴櫎鍛戒护
+            commandReSendService.cleanKey(msg.getCompanyId(), msg.getIp(),
+                    msg.getPort(), ServerUtils.MSG_TYPE_8817);
+        }
+    }
+
+    private void analysisStep0(DepotConf depotConf, ReMessage msg,
+                               DeviceSer ser, ExeRequest exeRequest, String contextKey,
+                               int sumPacket, DicSysConf sysConf) {
+
+        Map<String, String> curMap = contextMap.get(contextKey);
+
+        List<DepotConf> depotConfs = null;
+
+        // 涓�鍒嗘満澶氫粨锛屾妸璧峰鍒楁斁鍒版渶澶ц繘琛岄噰闆�
+        if (Constant.YN_Y.equals(sysConf.getGrainMoreTag())) {
+            depotConfs = commonService.getCacheDepotConfBySerId2(
+                    depotConf.getCompanyId(), ser.getId());
+        }
+
+        if (null == depotConfs) {// 涓�涓垎鏈�1涓粨
+            if (DepotType.TYPE_02.getCode().equals(depotConf.getDepotType())) {
+                analysisStep2(depotConf, msg, ser, exeRequest, curMap, sumPacket, sysConf);
+            } else if (DepotType.TYPE_04.getCode().equals(depotConf.getDepotType())) {
+                analysisStep2(depotConf, msg, ser, exeRequest, curMap, sumPacket, sysConf);
+            } else {
+                analysisStep1(depotConf, msg, ser, exeRequest, curMap, sumPacket, sysConf);
+            }
+
+            return;
+        }
+
+        // 涓�鍒嗗嚑澶氫粨鎯呭喌锛岃�冭檻鍗曚粨閲囬泦鍜屽浠撻噰闆�
+        // 鍗曚粨閲囬泦鏃跺�欐暟鎹粠0杩斿洖
+        if (StringUtils.isEmpty(exeRequest.getDepotIds())) {
+
+            depotConf.setCableEnd(depotConf.getCableEnd() - depotConf.getCableStart() + 1);
+            depotConf.setCableStart(ser.getCableStart());
+
+            if (DepotType.TYPE_02.getCode().equals(depotConf.getDepotType())) {
+                analysisStep2(depotConf, msg, ser, exeRequest, curMap, sumPacket, sysConf);
+            } else if (DepotType.TYPE_04.getCode().equals(depotConf.getDepotType())) {
+                analysisStep2(depotConf, msg, ser, exeRequest, curMap, sumPacket, sysConf);
+            } else {
+                analysisStep1(depotConf, msg, ser, exeRequest, curMap, sumPacket, sysConf);
+            }
+
+            return;
+
+        }
+
+        // 鎵归噺閲囬泦鎵�鏈夊叧鑱斾竴璧烽噰闆嗭紝閬嶅巻鎵ц
+        for (DepotConf depotConfTemp : depotConfs) {
+            if (DepotType.TYPE_02.getCode().equals(depotConfTemp.getDepotType())) {
+                analysisStep2(depotConfTemp, msg, ser, exeRequest, curMap, sumPacket, sysConf);
+            } else if (DepotType.TYPE_04.getCode().equals(depotConfTemp.getDepotType())) {
+                analysisStep2(depotConfTemp, msg, ser, exeRequest, curMap, sumPacket, sysConf);
+            } else {
+                analysisStep1(depotConfTemp, msg, ser, exeRequest, curMap, sumPacket, sysConf);
+            }
+        }
+    }
+
+    /**
+     * 鍦嗙瓛浠撶殑绮儏瑙f瀽
+     *
+     * @param depotConf
+     * @param msg
+     * @param ser
+     * @param exeRequest
+     * @param packetMap
+     * @param sumPackets
+     */
+    private void analysisStep2(DepotConf depotConf, ReMessage msg,
+                               DeviceSer ser, ExeRequest exeRequest,
+                               Map<String, String> packetMap, int sumPackets, DicSysConf sysConf) {
+        if (StringUtils.isEmpty(depotConf.getCableRule())
+                || StringUtils.isEmpty(depotConf.getCableCir())) {
+            log.error("鍒嗘満------>>>骞冲彴锛氬綋鍓嶄粨搴擄細{}-{}锛屾病鏈夋病鏈夐厤缃竷绾胯鍒欙紝鏃犳硶瑙f瀽绮儏淇℃伅鈥︹��",
+                    ser.getCompanyId(), depotConf.getDepotName());
+            return;
+        }
+
+        String[] cableRuleAtt = depotConf.getCableRule().split("-");
+        String[] cableCirAtt = depotConf.getCableCir().split("-");
+
+        if (cableRuleAtt.length != cableCirAtt.length) {
+            log.error("鍒嗘満------>>>骞冲彴锛氬綋鍓嶄粨搴擄細{}-{}锛屽竷绾胯鍒欎笉姝g‘锛屾棤娉曡В鏋愮伯鎯呬俊鎭�︹��", ser.getCompanyId(), depotConf.getDepotName());
+            return;
+        }
+
+
+        //閬垮厤绌烘寚閽�
+        if (null == depotConf.getCableCone()) depotConf.setCableCone(Constant.CABLE_CONE_0);
+
+        // 鑾峰彇鏈�澶х殑灞傞厤缃�--榛樿姣忎竴鍦堥兘涓�鏍�
+        int layMax = Integer.valueOf(cableCirAtt[0]);
+        for (int i = 0; i < cableCirAtt.length; i++) {
+            if (Integer.valueOf(cableCirAtt[i]) >= layMax) layMax = Integer.valueOf(cableCirAtt[i]);
+        }
+
+        // 鑾峰彇瀹屾暣鐨勭伯鎯呭寘淇℃伅
+        String strPoints = "";
+        for (int i = 1; i <= sumPackets; i++) {
+            strPoints += packetMap.get(buildCurKey(msg, i));
+        }
+
+        log.info("------绛掍粨瀹屾暣鐨勭伯鎯呮姤鏂�={}------", strPoints);
+
+        int sumNum = 0, cableZ = 1;// sumNum 鍏卞灏戞牴鐢电紗锛沜ableZ 灞傜殑鏈�澶у�硷紝閿ュ舰浠撹ˉ榻愭渶澶у眰
+        for (int i = 0; i < cableCirAtt.length; i++) {
+            if (Integer.valueOf(cableCirAtt[i]) > cableZ) {
+                cableZ = Integer.valueOf(cableCirAtt[i]);
+            }
+            sumNum += Integer.valueOf(cableRuleAtt[i]);
+        }
+
+        // 鏍规嵁灞傝鍒楄幏鍙栨寚瀹氶暱搴�
+        int start = 4 * (depotConf.getCableStart() - ser.getCableStart()) * cableZ;
+        int len = 4 * cableZ * sumNum;
+
+        strPoints = strPoints.substring(start, start + len);
+        log.info("鍒嗘満------>>>骞冲彴锛氳繑鍥炵伯鎯呭畬鏁翠俊鎭紝鎵�灞炵粍缁�={}锛屽垎鏈�={}", ser.getCompanyId(), ser.getName());
+
+        // 灏嗙伯鎯呰В鏋愭垚鏁扮粍
+        List<Double> temps = new ArrayList<>();
+        double tempValue;
+        String temp;
+        int curLay = 1;//鎵�鍦ㄥ眰浠�1寮�濮�
+        int curRoot = 1;//鎵�鍦ㄦ牴
+        int curCir = 1;//鎵�鍦ㄥ湀
+        int cirLay = 1;//褰撳墠鍦堢殑灞�
+        for (int i = 0; i < strPoints.length() / 4; i++) {
+            temp = strPoints.substring(i * 4, i * 4 + 4);
+            if (temp == null) {
+                temp = "0000";
+            }
+            tempValue = BytesUtil.hexToInt(BytesUtil.tran_LH(temp)) / 10.0;
+
+            //闈炴甯稿��
+            if (tempValue > ERROR_CHECK_TAG2) {
+                tempValue = Constant.ERROR_TEMP;
+            }
+
+            // 鏁呴殰鍊煎鐞�
+            if (tempValue >= FAULT_CHECK_TAG) {
+                tempValue = Constant.FAULT_TEMP;
+            }
+
+            // 澶囩敤鍊�
+            if (tempValue == ERROR_CHECK_TAG) {
+                tempValue = Constant.ERROR_TEMP;
+
+
+                //楠岃瘉鏄笉鏄敟褰粨琛ュ伩鍊�
+                curLay = (i % layMax) + 1;
+                curRoot = (i / layMax) + 1;
+                curCir = getCurCir(curRoot, cableRuleAtt);
+
+                cirLay = Integer.valueOf(cableCirAtt[curCir - 1]);
+
+                //姣斿閰嶇疆浜�5灞備絾鏄綋鍓嶆槸6灞傦紝璇存槑褰撳墠鐐逛负琛ュ伩鐐�
+                if (curLay > cirLay) {
+                    tempValue = Constant.ADD_TEMP;
+
+                    //鍒ゆ柇鏄笉鏄笂閿ュ舰锛屽皢琛ョ偣杞Щ鍒颁笂鏂�
+                    if (Constant.CABLE_CONE_1.equals(depotConf.getCableCone())) {
+                        int index = i - curLay - 1;
+                        temps.add(index, tempValue);
+                    }else {
+                        temps.add(tempValue);
+                    }
+
+                } else {
+                    temps.add(tempValue);
+                }
+
+            } else {
+                temps.add(tempValue);
+            }
+        }
+
+        log.debug("-------CheckGrainRequest--={}", exeRequest.toString());
+        THDto thDto = thService.getCacheTH(exeRequest.getCompanyId(), exeRequest.getTempSerId(), exeRequest.getThConf());
+        if (null != thDto) {
+            log.debug("-------THDto--={}", thDto.toString());
+        }
+
+        // 灏嗛泦鍚堣В鏋愭垚鍧愭爣鏁版嵁
+        addPoint2(temps, msg, depotConf, exeRequest, thDto, sysConf);
+    }
+
+    /**
+     * 鑾峰彇褰撳墠璺熸墍鍦ㄥ湀
+     *
+     * @param curRoot
+     * @param cableRuleAtt
+     * @return
+     */
+    private int getCurCir(int curRoot, String[] cableRuleAtt) {
+
+        int sum = 0;
+        for (int i = 0; i < cableRuleAtt.length; i++) {
+            sum += Integer.valueOf(cableRuleAtt[i]);
+            if (curRoot <= sum) return i + 1;
+        }
+
+        return 1;
+    }
+
+    /**
+     * 骞虫柟浠撶殑瑙f瀽锛岃В鏋愰渶瑕佽�冭檻褰撳墠鏄惁鍚敤鐨勪竴鍒嗘満澶氫粨
+     *
+     * @param depotConf
+     * @param msg
+     * @param ser
+     * @param exeRequest
+     * @param packetMap
+     * @param sumPackets
+     */
+    private void analysisStep1(DepotConf depotConf, ReMessage msg,
+                               DeviceSer ser, ExeRequest exeRequest,
+                               Map<String, String> packetMap, int sumPackets, DicSysConf sysConf) {
+        // 鑾峰彇瀹屾暣鐨勭伯鎯呭寘淇℃伅
+        String strPoints = "";
+        for (int i = 1; i <= sumPackets; i++) {
+            strPoints += packetMap.get(buildCurKey(msg, i));
+        }
+        String[] attCable = depotConf.getCableRule().split("-");
+        int cableZ = Integer.valueOf(attCable[0]);
+        int cableY = Integer.valueOf(attCable[1]);
+        int cableX = Integer.valueOf(attCable[2]);
+
+        // 鏍规嵁灞傝鍒楄幏鍙栨寚瀹氶暱搴�
+        int start = 4 * (depotConf.getCableStart() - ser.getCableStart())
+                * cableZ * cableY;
+        int len = 4 * cableZ * cableY * cableX;
+
+        log.info("鍒嗘満------>>>骞冲彴锛氳繑鍥炵伯鎯呭畬鏁翠俊鎭紝鎵�灞炵粍缁�={}锛屽垎鏈�={}", ser.getCompanyId(), ser.getName());
+
+        strPoints = strPoints.substring(start, start + len);
+
+        // 灏嗙伯鎯呰В鏋愭垚鏁扮粍
+        List<Double> temps = new ArrayList<>();
+        double tempValue;
+        String temp;
+        for (int i = 0; i < strPoints.length() / 4; i++) {
+            temp = strPoints.substring(i * 4, i * 4 + 4);
+            if (temp == null) {
+                temp = "0000";
+            }
+            tempValue = BytesUtil.hexToInt(BytesUtil.tran_LH(temp)) / 10.0;
+            // 璇存槑瑙f瀽鐨勬暟鎹湁闂
+            if (tempValue == ERROR_CHECK_TAG || tempValue == ERROR_CHECK_TAG2) {
+                tempValue = Constant.ERROR_TEMP;
+            }
+            // 鏁呴殰鍊煎鐞�
+            if (tempValue >= FAULT_CHECK_TAG) {
+                tempValue = Constant.FAULT_TEMP;
+            }
+            temps.add(tempValue);
+        }
+
+        log.debug("-------CheckGrainRequest--={}", exeRequest.toString());
+        THDto thDto = thService.getCacheTH(exeRequest.getCompanyId(),
+                exeRequest.getTempSerId(), exeRequest.getThConf());
+        if (null != thDto) {
+            log.debug("-------THDto--={}", thDto.toString());
+        }
+        // 灏嗛泦鍚堣В鏋愭垚鍧愭爣鏁版嵁
+        addPoint1(temps, msg, depotConf, ser, exeRequest, thDto, sysConf);
+    }
+
+    private String buildCurKey(ReMessage msg, int curPacket) {
+        return msg.getSourceId() + "_" + curPacket;
+    }
+
+    private String buildContextKey(ReMessage msg, String depotId) {
+        return msg.getCompanyId() + "_" + msg.getSourceId() + "_" + depotId;
+    }
+
+    /**
+     * 骞虫埧浠擄紝瑙f瀽绗簩姝ワ紝瑙f瀽鍒板潗鏍囨暟鎹�
+     *
+     * @param temps
+     * @throws Exception
+     */
+    private void addPoint1(List<Double> temps, ReMessage msg,
+                           DepotConf depotConf, DeviceSer ser, ExeRequest exeRequest,
+                           THDto thDto, DicSysConf sysConf) {
+
+        //鏍规嵁鐢电紗璧峰鏂逛綅鍜屽竷绾挎柟鍚戯紝瀵圭伯鎯呮暟鎹繘琛岃皟鏁�
+        if (null != depotConf.getStartOrientation()) {
+            temps = reversalGrainPoint(temps, depotConf);
+        }
+
+        //鑻ヨ捣鐐圭偣浣嶄负搴曢儴锛屽垯灏嗙伯鎯呮暟鎹繘琛岀炕杞�
+        if (null != depotConf.getStartPoint()
+                && Constant.GRAIN_START_POINT_BELOW.equals(depotConf.getStartPoint())) {
+            temps = grainUtil.reversalUpAndDown(temps, depotConf.getCableRule());
+        }
+
+        //鑻ラ厤缃眰琛岃浆鎹紝鍒欏皢绮儏鏁版嵁杩涜灞傝杞崲
+        if (StringUtils.isNotEmpty(depotConf.getStartConvert())) {
+            temps = convertGrainPoint(temps, depotConf);
+            String[] cableRule = depotConf.getCableRule().split("-");
+            //杞崲灞傝鍒楅厤缃�
+            if(Constant.GRAIN_CONVERT_CLOCKWISE.equals(depotConf.getStartConvert())
+                    || Constant.GRAIN_CONVERT_ANTICLOCKWISE.equals(depotConf.getStartConvert())){
+                depotConf.setCableRule(Integer.valueOf(cableRule[1]) + "-" + Integer.valueOf(cableRule[0]) + "-" + Integer.valueOf(cableRule[2]));
+            }
+        }
+
+        String[] attCable = depotConf.getCableRule().split("-");
+        int cableZ = Integer.valueOf(attCable[0]);
+        int cableY = Integer.valueOf(attCable[1]);
+        int cableX = Integer.valueOf(attCable[2]);
+
+        Grain grain = new Grain();
+        grain.setDepotId(depotConf.getDepotId());
+        grain.setCompanyId(depotConf.getCompanyId());
+        grain.setCable(depotConf.getCableRule());
+        grain.setBatchId(msg.getBatchId());
+        grain.setTempIn(Constant.ERROR_TEMP);
+        grain.setHumidityIn(Constant.ERROR_TEMP);
+
+        if (null != thDto) {
+            log.debug("绮儏瑙f瀽涓幏鍙栧埌鐨勬俯婀垮害淇℃伅={}", thDto.toString());
+            grain.setHumidityIn(thDto.getHumidityIn());
+            grain.setTempIn(thDto.getTempIn());
+        }
+        grain.setReceiveDate(msg.getReceiveDate());
+        grain.setRemark("绮俯姝e父");
+
+        // 鑾峰彇缂撳瓨涓殑鍛戒护淇℃伅
+        grain.setCheckUser(exeRequest.getExeUser());
+
+        double max = MAX_TEMP, min = MIN_TEMP, sumT = 0.0, sumNum = cableX
+                * cableY * cableZ;
+
+        // 鏍¢獙鍜屽疄鐜扮粺璁★紝鐢熸垚閲囬泦鐐逛俊鎭�
+        List<GrainItemInfo> listGrainItems = new ArrayList<>();
+        int i = 1;
+        for (Double temp : temps) {
+            if (temp == Constant.ERROR_TEMP || temp == Constant.FAULT_TEMP || temp == Constant.ADD_TEMP) {
+                sumNum--;
+            } else {
+                sumT += temp;
+                if (temp > max) {
+                    max = temp;
+                }
+                if (temp < min) {
+                    min = temp;
+                }
+            }
+            listGrainItems.add(new GrainItemInfo(i, temp));
+            i++;
+        }
+
+        if (sumNum == 0) {
+            sumNum = 1;
+            grain.setRemark("褰撳墠绮儏閲囬泦寮傚父");
+        }
+        //杩囨护姣旇緝鐢ㄧ殑鏈�澶ф渶灏忓��
+        if(max == MAX_TEMP){
+            max = 0.0;
+        }
+        if(min == MIN_TEMP){
+            min = 0.0;
+        }
+        if (null != depotConf.getTempMax() && max > depotConf.getTempMax()) {
+            grain.setRemark("浠撳簱閰嶇疆楂樻俯璀﹀憡鍊硷細" + depotConf.getTempMax() + "锛屽綋鍓嶆娴嬮珮娓╁�硷細"
+                    + max);
+            warnUtils.addGrainWarn(depotConf, grain);
+        }
+
+        grain.setTempAve(sumT / sumNum);
+        grain.setTempMax(max);
+        grain.setTempMin(min);
+        grain.setPoints(StringUtils.join(temps, ","));
+
+        String depotIds = exeRequest.getDepotIds();
+
+        boolean notifyWeb = true;
+        if (null != depotIds && depotIds.indexOf(depotConf.getDepotId()) == -1) {
+            notifyWeb = false;
+        }
+        // 鐢ㄦ埛灏佽濂芥暟鎹嵆鍙�
+        notifyGrainInvoker.analysisSuccess(grain, listGrainItems, depotConf,
+                sysConf, notifyWeb, exeRequest);
+    }
+
+    /**
+     * 鍦嗙瓛浠撹В鏋愭楠�
+     *
+     * @param temps
+     * @param msg
+     * @param depotConf
+     * @param exeRequest
+     * @param thDto
+     */
+    private void addPoint2(List<Double> temps, ReMessage msg,
+                           DepotConf depotConf, ExeRequest exeRequest, THDto thDto,
+                           DicSysConf sysConf) {
+
+        Grain grain = new Grain();
+        grain.setDepotId(depotConf.getDepotId());
+        grain.setCompanyId(depotConf.getCompanyId());
+        grain.setCable(depotConf.getCableRule());
+        grain.setCableCir(depotConf.getCableCir());
+        grain.setBatchId(msg.getBatchId());
+        grain.setTempIn(Constant.ERROR_TEMP);
+        grain.setHumidityIn(Constant.ERROR_TEMP);
+        if (null != thDto) {
+            log.debug("绮儏瑙f瀽涓幏鍙栧埌鐨勬俯婀垮害淇℃伅={}", thDto.toString());
+            grain.setHumidityIn(thDto.getHumidityIn());
+            grain.setTempIn(thDto.getTempIn());
+        }
+        grain.setReceiveDate(msg.getReceiveDate());
+        grain.setRemark("绮俯姝e父");
+        grain.setCheckUser(exeRequest.getExeUser());
+
+        double max = MAX_TEMP, min = MIN_TEMP, sumT = 0.0;
+
+        int sumNum = temps.size();
+        List<GrainItemInfo> listGrainItems = new ArrayList<>();
+        int i = 1;
+        for (Double temp : temps) {
+            if (temp == Constant.ERROR_TEMP || temp == Constant.FAULT_TEMP || temp == Constant.ADD_TEMP) {
+                sumNum--;
+            } else {
+                sumT += temp;
+                if (temp > max) {
+                    max = temp;
+                }
+                if (temp < min) {
+                    min = temp;
+                }
+            }
+            listGrainItems.add(new GrainItemInfo(i, temp));
+            i++;
+        }
+
+        if (sumNum == 0) {
+            sumNum = 1;
+            grain.setRemark("褰撳墠绮儏閲囬泦寮傚父");
+        }
+        //杩囨护姣旇緝鐢ㄧ殑鏈�澶ф渶灏忓��
+        if(max == MAX_TEMP){
+            max = 0.0;
+        }
+        if(min == MIN_TEMP){
+            min = 0.0;
+        }
+        if (null != depotConf.getTempMax() && max > depotConf.getTempMax()) {
+            grain.setRemark("浠撳簱閰嶇疆楂樻俯璀﹀憡鍊硷細" + depotConf.getTempMax() + "锛屽綋鍓嶆娴嬮珮娓╁�硷細"
+                    + max);
+            warnUtils.addGrainWarn(depotConf, grain);
+        }
+
+        grain.setTempAve(sumT / sumNum);
+        grain.setTempMax(max);
+        grain.setTempMin(min);
+        grain.setPoints(StringUtils.join(temps, ","));
+
+        String depotIds = exeRequest.getDepotIds();
+        boolean notifyWeb = true;
+        if (null != depotIds && depotIds.indexOf(depotConf.getDepotId()) == -1) {
+            notifyWeb = false;
+        }
+
+        // 鐢ㄦ埛灏佽濂芥暟鎹嵆鍙�
+        notifyGrainInvoker.analysisSuccess(grain, listGrainItems, depotConf,
+                sysConf, notifyWeb, exeRequest);
+    }
+
+    private List<Double> convertGrainPoint(List<Double> temps, DepotConf conf) {
+        if (Constant.GRAIN_CONVERT_DEFAULT.equals(conf.getStartConvert())) {
+            //鑻ュ眰琛岃浆鎹负榛樿锛屽垯鐩存帴杩斿洖
+            return temps;
+        }
+
+        //椤烘椂閽堣浆鎹�
+        if(Constant.GRAIN_CONVERT_CLOCKWISE.equals(conf.getStartConvert())){
+            return grainUtil.convertRight(temps, conf.getCableRule());
+        }
+        //閫嗘椂閽堣浆鎹�
+        if(Constant.GRAIN_CONVERT_ANTICLOCKWISE.equals(conf.getStartConvert())){
+            return grainUtil.convertLeft(temps, conf.getCableRule());
+        }
+
+        return temps;
+    }
+
+    private List<Double> reversalGrainPoint(List<Double> temps, DepotConf conf) {
+        if (StringUtils.isEmpty(conf.getStartOrientation())) {
+            //鑻ヨ捣濮嬫柟浣嶄负绌猴紝鍒欓粯璁よ捣濮嬫柟浣嶅拰鏂瑰悜锛岀洿鎺ヨ繑鍥�
+            return temps;
+        }
+        //璧峰鏂逛綅涓哄彸杈规椂
+        if (Constant.GRAIN_START_ORIENTATION_RIGHT.equals(conf.getStartOrientation())) {
+            if (StringUtils.isEmpty(conf.getStartDirection())) {
+                //鍙宠竟璧峰锛岄粯璁ょ旱鍚戝竷绾匡紝鐩存帴杩斿洖
+                return temps;
+            }
+            if (Constant.GRAIN_START_DIRECTION_TRANSVERSE.equals(conf.getStartDirection())) {
+                //鍙宠竟璧峰锛屾í鍚戝竷绾�
+                return grainUtil.reversalRight1(temps, conf.getCableRule());
+            }
+            //鍙宠竟璧峰锛岄粯璁ょ旱鍚戝竷绾匡紝鐩存帴杩斿洖
+            return temps;
+        }
+        //璧峰鏂逛綅涓哄彸涓婃椂
+        if (Constant.GRAIN_START_ORIENTATION_RIGHT_UP.equals(conf.getStartOrientation())) {
+            if (StringUtils.isEmpty(conf.getStartDirection())) {
+                //鍙充笂璧峰锛岄粯璁ょ旱鍚戝竷绾�
+                return grainUtil.reversalRightUp2(temps, conf.getCableRule());
+            }
+            if (Constant.GRAIN_START_DIRECTION_TRANSVERSE.equals(conf.getStartDirection())) {
+                //鍙充笂璧峰锛屾í鍚戝竷绾�
+                return grainUtil.reversalRightUp1(temps, conf.getCableRule());
+            }
+            //鍙充笂璧峰锛岄粯璁ょ旱鍚戝竷绾�
+            return grainUtil.reversalRightUp2(temps, conf.getCableRule());
+        }
+        //璧峰鏂逛綅涓哄乏杈规椂
+        if (Constant.GRAIN_START_ORIENTATION_LEFT.equals(conf.getStartOrientation())) {
+            if (StringUtils.isEmpty(conf.getStartDirection())) {
+                //宸﹁竟璧峰锛岄粯璁ょ旱鍚戝竷绾�
+                return grainUtil.reversalLeft2(temps, conf.getCableRule());
+            }
+            if (Constant.GRAIN_START_DIRECTION_TRANSVERSE.equals(conf.getStartDirection())) {
+                //宸﹁竟璧峰锛屾í鍚戝竷绾�
+                return grainUtil.reversalLeft1(temps, conf.getCableRule());
+            }
+            //宸﹁竟璧峰锛岄粯璁ょ旱鍚戝竷绾�
+            return grainUtil.reversalLeft2(temps, conf.getCableRule());
+        }
+        //璧峰鏂逛綅涓哄乏涓婃椂
+        if (Constant.GRAIN_START_ORIENTATION_LEFT_UP.equals(conf.getStartOrientation())) {
+            if (StringUtils.isEmpty(conf.getStartDirection())) {
+                //宸︿笂璧峰锛岄粯璁ょ旱鍚戝竷绾�
+                return grainUtil.reversalLeftUp2(temps, conf.getCableRule());
+            }
+            if (Constant.GRAIN_START_DIRECTION_TRANSVERSE.equals(conf.getStartDirection())) {
+                //宸︿笂璧峰锛屾í鍚戝竷绾�
+                return grainUtil.reversalLeftUp1(temps, conf.getCableRule());
+            }
+            //宸︿笂璧峰锛岄粯璁ょ旱鍚戝竷绾�
+            return grainUtil.reversalLeftUp2(temps, conf.getCableRule());
+        }
+
+        return temps;
+    }
+}
\ No newline at end of file
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/AnalysisService.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/AnalysisService.java
new file mode 100644
index 0000000..b61c0a6
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/AnalysisService.java
@@ -0,0 +1,211 @@
+package com.ld.igds.protocol.zldz.analysis;
+
+import com.ld.igds.common.CoreSerService;
+import com.ld.igds.constant.BizType;
+import com.ld.igds.io.constant.OrderRespEnum;
+import com.ld.igds.io.notify.NotifyWebInvoker;
+import com.ld.igds.models.DeviceSer;
+import com.ld.igds.order.ExeOrderService;
+import com.ld.igds.order.data.ExeRequest;
+import com.ld.igds.protocol.zldz.analysis.builder.ReMessageBuilder;
+import com.ld.igds.protocol.zldz.analysis.message.ReMessage;
+import com.ld.igds.protocol.zldz.task.CommandReSendService;
+import com.ld.igds.protocol.zldz.util.CRC8;
+import com.ld.igds.protocol.zldz.util.ServerUtils;
+import com.ld.igds.util.BytesUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 鍗忚瑙f瀽鍏ュ彛
+ *
+ * @author jiazx
+ */
+@Slf4j
+@Component(AnalysisService.BEAN_ID)
+public class AnalysisService {
+
+    public static final String BEAN_ID = "zldz.analysisService";
+
+    @Autowired
+    private CoreSerService coreSerService;
+    @Autowired
+    private AnalysisTH analysisTH;
+    @Autowired
+    private AnalysisGrain analysisGrain;
+    @Autowired
+    private AnalysisConf analysisConf;
+    @Autowired
+    private NotifyWebInvoker notifyWebInvoker;
+    @Autowired
+    private ExeOrderService exeOrderService;
+    @Autowired
+    private CommandReSendService commandReSendService;
+
+
+    /**
+     * @param sessionKey ip:port
+     * @param strMsg
+     */
+    public void analysis2(String sessionKey, String strMsg) {
+        String[] attr = sessionKey.split(":");
+        String ip = attr[0];
+        Integer port = Integer.valueOf(attr[1]);
+
+        ReMessage reMessage = ReMessageBuilder.getInstance().buildMessage(null, ip, port, strMsg);
+
+        if (null == reMessage || null == reMessage.getCompanyId()) {
+            log.error("鍒嗘満----->>>骞冲彴锛氳繑鍥炰俊鎭病鏈夎幏鍙栫粍缁囩紪鐮佷俊鎭紝鏃犳硶缁х画瑙f瀽----{}", sessionKey);
+            return;
+        }
+
+        DeviceSer ser = coreSerService.getCacheSer(reMessage.getCompanyId(), reMessage.getSourceId());
+
+        if (null == ser) {
+            String info = "鍒嗘満=" + reMessage.getSourceId() + "杩斿洖淇℃伅娌℃湁鍖归厤鍒板垎鏈猴紝绯荤粺韪㈠嚭绂荤嚎銆�";
+            log.error("鍒嗘満----->>>骞冲彴锛�" + info);
+            notifyWebInvoker.notifyWeb(reMessage.getCompanyId(), OrderRespEnum.MSG_ERROR, BizType.SYS, info);
+
+            // 娓呴櫎缂撳瓨骞堕攢姣侀摼鎺�
+            commandReSendService.destoryAndDelCache(reMessage.getCompanyId(), ip, port, reMessage.getMessageType());
+            return;
+        }
+
+        log.debug("鍒嗘満----->>>骞冲彴锛氭墍灞炵粍缁�-{}锛屽垎鏈�-{} 杩斿洖鐨勫懡浠や俊鎭�={}", ser.getCompanyId(), ser.getName(), reMessage.toString());
+
+        String checkMsg = this.checkMsg(reMessage, ser);
+        if (null != checkMsg) {
+            // 绯荤粺鎷︽埅鍒颁簡寮傚父鍘熷洜锛屼笉韪㈠嚭杩炴帴
+            if (ServerUtils.MSG_TYPE_8815.equals(reMessage.getMessageType()) || ServerUtils.MSG_TYPE_8817.equals(reMessage.getMessageType())) {
+                commandReSendService.cleanKey(ser.getCompanyId(), ser.getIp(), ser.getPort(), ServerUtils.MSG_TYPE_8817);
+
+                List<ExeRequest> list = exeOrderService.getInProgressOrderBySerId(BizType.GRAIN.getCode(), ser.getId());
+
+                if (null != list && list.size() > 0) {
+                    exeOrderService.progressError(ser.getCompanyId(), BizType.GRAIN.getCode(), list.get(0).getDepotId(), checkMsg);
+                } else {
+                    notifyWebInvoker.notifyWeb(ser.getCompanyId(), OrderRespEnum.MSG_ERROR, BizType.SYS, checkMsg);
+                }
+            } else {
+                commandReSendService.cleanKey(ser.getCompanyId(), ser.getIp(), ser.getPort(), reMessage.getMessageType());
+
+                notifyWebInvoker.notifyWeb(ser.getCompanyId(), OrderRespEnum.MSG_ERROR, BizType.SYS, checkMsg);
+            }
+
+            log.error("鍒嗘満----->>>骞冲彴锛氬懡浠ら獙璇佸紓甯革細鎵�灞炵粍缁�-{}锛屽紓甯镐俊鎭�-{}锛屾姤鏂囦俊鎭�-{}", ser.getCompanyId(), checkMsg, reMessage.getStrMsg());
+            return;
+        }
+
+        switch (reMessage.getMessageType()) {
+            case ServerUtils.MSG_TYPE_8828:// 娓╂箍搴﹁В鏋�
+                analysisTH.analysis8828(reMessage, ser);
+                break;
+
+            case ServerUtils.MSG_TYPE_8815:// 缁堢搴旂瓟绮儏璇锋眰
+                analysisGrain.analysis8815(reMessage, ser);
+                break;
+
+            case ServerUtils.MSG_TYPE_1117:// 绮儏鏁版嵁淇℃伅
+                analysisGrain.analysis8817(reMessage, ser);
+                break;
+                
+                
+            case ServerUtils.MSG_TYPE_1129:// 缁堢鍙戦�侀�氶亾鐢电紗鏁版嵁缁欏悗鍙�
+            	analysisConf.analysis1129(reMessage, ser);
+                break;
+
+            case ServerUtils.MSG_TYPE_8816:// 瑙f瀽閰嶇疆
+                analysisConf.analysis8816(reMessage, ser);
+                break;
+
+            case ServerUtils.MSG_TYPE_8822:// 鐢电紗鍒濆鍖栨垚鍔�
+                analysisConf.analysis8822(reMessage, ser);
+                break;
+                
+            case ServerUtils.MSG_TYPE_8823:// 鐢电紗姹囨�诲簲绛�
+                analysisConf.analysis8823(reMessage, ser);
+                break;
+
+            case ServerUtils.MSG_TYPE_8825:// 璇诲彇閫氶亾鐢电紗閰嶇疆
+                analysisConf.analysis8825(reMessage, ser);
+                break;
+
+            case ServerUtils.MSG_TYPE_8826:// 淇敼鐢电紗鐨勮繑鍥�
+                analysisConf.analysis8826(reMessage, ser);
+                break;
+            default:
+                break;
+        }
+    }
+
+    /**
+     * 鏍¢獙锛屾甯歌繑鍥濶ULL锛屽紓甯歌繑鍥炲紓甯稿師鍥狅紝姝e父寮傚父鍘熷洜杩斿洖涓嶈涪鎺夐噸鏂拌繛鎺�
+     *
+     * @param message
+     * @param ser
+     * @return
+     * @throws Exception
+     */
+    private String checkMsg(ReMessage message, DeviceSer ser) {
+        String result;
+        if (message.getResult() == 1) {
+            result = "鍒嗘満=" + ser.getName() + " 鍗忚瑙f瀽澶辫触锛屽師鍥狅細鎺ユ敹鐨勫簲绛旀牎楠屽紓甯�";
+            return result;
+        }
+        if (message.getResult() == 2) {
+            result = "鍒嗘満=" + ser.getName() + " 鍗忚瑙f瀽澶辫触锛屽師鍥狅細鍙戦�佺殑鏁版嵁鏍¢獙寮傚父";
+            return result;
+        }
+        if (message.getResult() == 3) {
+            result = "鍒嗘満=" + ser.getName() + " 鍗忚瑙f瀽澶辫触锛屽師鍥狅細鎺掗槦涓�";
+            return result;
+        }
+        if (message.getResult() == 4) {
+            result = "鍒嗘満=" + ser.getName() + " 鍗忚瑙f瀽澶辫触锛屽師鍥狅細鍙戦�佽秴鏃堕敊璇�";
+            return result;
+        }
+        if (message.getResult() == 9) {
+            result = "鍒嗘満=" + ser.getName() + " 鍗忚瑙f瀽澶辫触锛屽師鍥狅細Io妯″潡涓嶅湪绾�";
+            return result;
+        }
+        if (message.getResult() == 10) {
+            result = "鍒嗘満=" + ser.getName() + " 鍗忚瑙f瀽澶辫触锛屽師鍥狅細鍙戦�佷腑";
+            return result;
+        }
+        if (message.getResult() == 11) {
+            result = "鍒嗘満=" + ser.getName() + " 鍗忚瑙f瀽澶辫触锛屽師鍥狅細鏃犵嚎妯″潡鏁呴殰";
+            return result;
+        }
+        if (message.getResult() == 12) {
+            result = "鍒嗘満=" + ser.getName()
+                    + " 鍗忚瑙f瀽澶辫触锛屽師鍥狅細涓昏鏄弽棣堝潗鏍囩偣浜ゆ崲鍛戒护鎴栬�呮槸鐢电紗淇敼鍛戒护鐨勯敊璇紝鎴栬�呯伯鎯呴噰闆嗙殑鍙傛暟涓嶅";
+            return result;
+        }
+        if (message.getResult() == 13) {
+            result = "鍒嗘満=" + ser.getName() + " 鍗忚瑙f瀽澶辫触锛屽師鍥狅細缃戝叧鏈敞鍐�";
+            return result;
+        }
+
+        // 鑾峰彇鏍¢獙鐨勬姤鏂囦俊鎭�
+        int end = 4 + 18 * 2 + message.getBody().getLength() * 2;
+        String checkStr = message.getStrMsg().substring(4, end);
+
+        byte[] byteCrc16 = BytesUtil.hexStrToBytes(checkStr);
+        short crc16Hex2 = CRC8.calculateCrc16(byteCrc16, (short) 0,
+                (short) (byteCrc16.length));
+        byte[] crc16Hex2Bytes = BytesUtil.shortToByte(crc16Hex2);
+        int crc16 = BytesUtil.bytesToInt(crc16Hex2Bytes);
+        String hexCrc16 = BytesUtil.intToHexStr(crc16);
+
+        if (message.getHexCrc16().equals(hexCrc16)) {
+            return null;
+        } else {
+            result = "鍒嗘満=" + ser.getName() + " 鍗忚瑙f瀽澶辫触锛屽師鍥狅細CRC16鏍¢獙寮傚父";
+            return result;
+        }
+    }
+
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/AnalysisTH.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/AnalysisTH.java
new file mode 100644
index 0000000..de2c7d2
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/AnalysisTH.java
@@ -0,0 +1,120 @@
+package com.ld.igds.protocol.zldz.analysis;
+
+import com.ld.igds.common.dto.THDto;
+import com.ld.igds.constant.BizType;
+import com.ld.igds.constant.Constant;
+import com.ld.igds.io.notify.NotifyWebInvoker;
+import com.ld.igds.io.constant.OrderRespEnum;
+import com.ld.igds.models.DeviceSer;
+import com.ld.igds.order.ExeOrderService;
+import com.ld.igds.order.data.ExeRequest;
+import com.ld.igds.protocol.zldz.analysis.message.ReMessage;
+import com.ld.igds.th.CoreThService;
+import com.ld.igds.util.BytesUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 瑙f瀽娓╂箍搴︿俊鎭�
+ *
+ * @author Andy
+ */
+@Slf4j
+@Component(AnalysisTH.BEAN_ID)
+public class AnalysisTH {
+
+    public static final String BEAN_ID = "zldz.analysisTH";
+
+    @Autowired
+    private CoreThService thService;
+
+    @Autowired
+    private NotifyWebInvoker notifyWebInvoker;
+
+    @Autowired
+    private ExeOrderService exeOrderService;
+
+    public static int ERROR_TH_TAG = -50;
+
+    /**
+     * 瑙f瀽浠撳簱娓╂箍搴︿俊鎭紝灏嗕俊鎭斁鍦ㄧ紦瀛樹腑锛屼互渚跨伯鎯呬娇鐢�
+     *
+     * @param msg
+     * @param ser
+     */
+    public void analysis8828(ReMessage msg, DeviceSer ser) {
+
+        log.debug("-----------analysis8828------------{}-{}.{}", ser.getCompanyId(), ser.getIp(), ser.getPort());
+
+        String content = msg.getBody().getContent();
+
+        //娓╂箍搴﹀湴鍧�,鎴彇4浣�
+        String temp = content.substring(0, 0 + 2 * 2);
+        //楂樹綆浣嶈浆鎹�
+        temp = BytesUtil.tran_LH(temp);
+        int thConf = BytesUtil.hexToInt(temp);
+
+        List<ExeRequest> list = exeOrderService.getInProgressOrderBySerId(BizType.SYS.getCode(), ser.getId() + "_" + thConf);
+        ExeRequest exeRequest = list.get(0);
+
+        int t, h;
+
+        THDto th = new THDto();
+        th.setCompanyId(ser.getCompanyId());
+        th.setTempIn(Constant.ERROR_TEMP);
+        th.setHumidityIn(Constant.ERROR_TEMP);
+
+        //娓╁害
+        int start = 2, len = 1;
+        temp = content.substring(start * 2, start * 2 + len * 2);
+        t = BytesUtil.hexToInt(temp);
+        if (t > 127) {//璇存槑鏄礋鏁�
+            t = BytesUtil.hexToInt("FF" + temp);
+        }
+        if (t == ERROR_TH_TAG) {
+            log.error("{}娓╂箍搴﹁В鏋愬紓甯革紝鍘熷洜锛氭病鏈夋娴嬪埌浼犳劅鍣�", ser.getName());
+            th.setRemark(ser.getName() + "娓╂箍搴﹁В鏋愬紓甯革紝鍘熷洜锛氭病鏈夋娴嬪埌浼犳劅鍣�");
+        } else {
+            th.setTempIn(Double.valueOf(t));
+        }
+
+        //婀垮害
+        start = 3;
+        len = 1;
+        temp = content.substring(start * 2, start * 2 + len * 2);
+        h = BytesUtil.hexToInt(temp);
+        if (h > 127) {//璇存槑鏄礋鏁�
+            h = BytesUtil.hexToInt("FF" + temp);
+        }
+        if (h == ERROR_TH_TAG) {
+            log.error("{}娓╂箍搴﹁В鏋愬紓甯革紝鍘熷洜锛氭病鏈夋娴嬪埌浼犳劅鍣�", ser.getName());
+            th.setRemark(ser.getName() + "娓╂箍搴﹁В鏋愬紓甯革紝鍘熷洜锛氭病鏈夋娴嬪埌浼犳劅鍣�");
+        } else {
+            th.setHumidityIn(Double.valueOf(h));
+        }
+
+        th.setSerId(ser.getId());
+        if (null != exeRequest) {
+            th.setThConf(exeRequest.getThConf());
+        } else {
+            th.setThConf(thConf + "");
+        }
+
+        log.info("浠撴俯浠撴箍瑙f瀽瀹屾垚={}", th.toString());
+
+        //鎸夌収鍒嗘満閲囬泦鏉ョ‘瀹�
+        thService.setCacheTH(th);
+
+        String info = ser.getName() + " 娓╂箍搴﹁幏鍙栧畬鎴�";
+        if (null != exeRequest) {
+            //瀹屾垚
+            exeRequest.setMsg(info);
+            exeOrderService.completeCache(exeRequest, false);
+        }
+        notifyWebInvoker.notifyWeb(ser.getCompanyId(), OrderRespEnum.MSG_SUCCESS, BizType.SYS, info);
+
+    }
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/builder/ReMessageBuilder.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/builder/ReMessageBuilder.java
new file mode 100644
index 0000000..07e3a9a
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/builder/ReMessageBuilder.java
@@ -0,0 +1,130 @@
+package com.ld.igds.protocol.zldz.analysis.builder;
+
+import com.ld.igds.protocol.zldz.analysis.message.ReMessage;
+import com.ld.igds.protocol.zldz.analysis.message.ReMessageBody;
+import com.ld.igds.util.BytesUtil;
+import com.ld.igds.util.ContextUtil;
+
+import java.util.Date;
+
+/**
+ * 鏍规嵁鎺ユ敹鍒扮殑淇℃伅杩涜灏佽
+ *
+ * @author Andy
+ */
+public class ReMessageBuilder {
+
+    private final static ReMessageBuilder instance = new ReMessageBuilder();
+
+    private ReMessageBuilder() {
+    }
+
+    public static ReMessageBuilder getInstance() {
+        return instance;
+    }
+
+    /**
+     * 浣跨敤涓彂鐜癈RC16鍙兘浠E缁撳熬锛孨ETTY璇互涓烘槸缁撳熬瀵艰嚧鎴彇灏戜簡涓�涓狤E锛屽綋鍓嶆柟娉曞繀椤讳粠澶村悜鍚庢埅鍙栵紝淇濊瘉CRC16鐨勪綅缃噯纭�
+     *
+     * @param bytes
+     * @param ip
+     * @param port
+     * @param strMsg
+     * @return
+     */
+    public ReMessage buildMessage(byte[] bytes, String ip, int port, String strMsg) {
+
+        ReMessage message = new ReMessage();
+        message.setIp(ip);
+        message.setPort(port);
+        message.setStrMsg(strMsg);
+        message.setByteMsg(bytes);
+
+        // 婧怚D锛屽垎鏈哄敮涓�ID
+        int start = 2, len = 2;
+        String temp = strMsg.substring(start * 2, start * 2 + len * 2);
+        message.setSourceId(BytesUtil.hexToInt(BytesUtil.tran_LH(temp)) + "");
+
+        //鍒嗘満鎵�灞炵粍缁囩紪鐮�
+        String companyId = ContextUtil.getCompanyIdBySn(message.getSourceId());
+
+        // 鐩爣ID
+        start = 4;
+        len = 2;
+        temp = strMsg.substring(start * 2, start * 2 + len * 2);
+        message.setTargetId(BytesUtil.hexToInt(BytesUtil.tran_LH(temp)) + "");
+
+        // 鍙戦�両D
+        start = 6;
+        len = 2;
+        temp = strMsg.substring(start * 2, start * 2 + len * 2);
+        message.setSendId(BytesUtil.hexToInt(BytesUtil.tran_LH(temp)) + "");
+
+        // 璺敱淇℃伅锛屼笉瑙f瀽
+
+        // 娑堟伅绫诲瀷
+        start = 12;
+        len = 2;
+        temp = strMsg.substring(start * 2, start * 2 + len * 2);
+        message.setMessageType(BytesUtil.tran_LH(temp));
+
+        // 澶勭悊缁撴灉
+        start = 14;
+        len = 1;
+        temp = strMsg.substring(start * 2, start * 2 + len * 2);
+        message.setResult(BytesUtil.hexToInt(temp));
+
+        // 缁勭粐缂栫爜
+        start = 15;
+        len = 2;
+        temp = strMsg.substring(start * 2, start * 2 + len * 2);
+        if(null == companyId){
+            message.setCompanyId(BytesUtil.hexToInt(BytesUtil.tran_LH(temp)) + "");
+        }else{
+            message.setCompanyId(companyId);
+        }
+
+        //鍖呭ご鏍¢獙
+        start = 17;
+        len = 1;
+        temp = strMsg.substring(start * 2, start * 2 + len * 2);
+        message.setHexCrc8(temp);
+
+        // 鍛戒护浣�-闀垮害
+        message.setBody(buildBody());
+        start = 18;
+        len = 2;
+        temp = strMsg.substring(start * 2, start * 2 + len * 2);
+        int bodyLen = BytesUtil.hexToInt(BytesUtil.tran_LH(temp));
+        message.getBody().setLength(bodyLen);
+
+        //鍛戒护浣�-鍐呭
+        start = 20;
+        len = bodyLen;
+        temp = strMsg.substring(start * 2, start * 2 + len * 2);
+        message.getBody().setContent(temp);
+
+        // crc16楠岃瘉
+        start = 20 + bodyLen;
+        len = 2;
+        temp = strMsg.substring(start * 2, start * 2 + len * 2);
+        message.setHexCrc16(temp);
+
+        message.setReceiveDate(new Date());
+        message.setBatchId(ContextUtil.getDefaultBatchId());
+        return message;
+    }
+
+    /**
+     * 鍒涘缓BODY瀵硅薄
+     *
+     * @param
+     * @return
+     */
+    public ReMessageBody buildBody() {
+        ReMessageBody body = new ReMessageBody();
+        body.setLength(0);
+        body.setContent("");
+        return body;
+    }
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/message/Metadata.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/message/Metadata.java
new file mode 100644
index 0000000..6f2fd59
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/message/Metadata.java
@@ -0,0 +1,18 @@
+package com.ld.igds.protocol.zldz.analysis.message;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.FIELD;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(FIELD)
+public @interface Metadata {
+	
+	String label() default "";
+	
+	int bytes() default 0;
+
+	int startIndex() default 0;
+}
\ No newline at end of file
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/message/ReMessage.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/message/ReMessage.java
new file mode 100644
index 0000000..20e201f
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/message/ReMessage.java
@@ -0,0 +1,74 @@
+package com.ld.igds.protocol.zldz.analysis.message;
+
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 娑堟伅澶村璞�
+ * 
+ * @author Andy
+ *
+ */
+@Data
+public class ReMessage {
+
+	private String ip;
+
+	private int port;
+
+	private String begin;
+
+	private String sourceId;// 婧� ID
+
+	private String targetId;// 鐩爣ID
+
+	private String sendId;//鍙戦�佽�匢D
+
+	private String gateway1;//璺敱1
+
+	private String gateway2;//璺敱2
+
+	private String messageType;// 娑堟伅绫诲瀷
+
+	private int result;// 澶勭悊缁撴灉
+
+	private String companyId;// 缁勭粐缂栫爜
+
+	private String hexCrc8;//crc8鍖呭ご鏍¢獙
+
+	private ReMessageBody body;
+
+	private String hexCrc16;//crc16鏍¢獙
+
+	private String end;
+
+	private byte[] byteMsg;// 褰撳墠鍛戒护鐨勫瓧鑺備俊鎭�
+
+	private String strMsg;// 褰撳墠鍛戒护杞崲涓哄瓧绗︿覆鐨勪俊鎭�
+
+	private String batchId;
+
+	private Date receiveDate;
+
+	// 寮傚父淇℃伅
+	private String error;
+
+	@Override
+	public String toString() {
+		return "ReMessage{" +
+				"ip='" + ip + '\'' +
+				", port=" + port +
+				", sourceId='" + sourceId + '\'' +
+				", targetId='" + targetId + '\'' +
+				", sendId='" + sendId + '\'' +
+				", messageType='" + messageType + '\'' +
+				", result=" + result +
+				", companyId='" + companyId + '\'' +
+				", hexCrc8='" + hexCrc8 + '\'' +
+				", hexCrc16='" + hexCrc16 + '\'' +
+				", strMsg='" + strMsg + '\'' +
+				'}';
+	}
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/message/ReMessageBody.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/message/ReMessageBody.java
new file mode 100644
index 0000000..f8db78b
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/message/ReMessageBody.java
@@ -0,0 +1,18 @@
+package com.ld.igds.protocol.zldz.analysis.message;
+
+import lombok.Data;
+
+/**
+ * 娑堟伅-娑堟伅浣�
+ * 
+ * @author Andy
+ *
+ */
+@Data
+public class ReMessageBody {
+
+	private int length;
+
+	private String content;
+	
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/BaseRemoteImpl.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/BaseRemoteImpl.java
new file mode 100644
index 0000000..d037461
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/BaseRemoteImpl.java
@@ -0,0 +1,46 @@
+package com.ld.igds.protocol.zldz.command;
+
+import com.ld.igds.io.constant.ProtocolEnum;
+import com.ld.igds.protocol.zldz.server.ZldzServerEngine;
+import com.ld.io.api.InvokeResult;
+import com.ld.io.api.IoSession;
+
+public class BaseRemoteImpl {
+
+	public String getProtocol() {
+		return ProtocolEnum.TCP_ZLDZ_GRAIN_V1.getCode();
+	}
+
+	/**
+	 * 鍙戦�佸懡浠�
+	 * 
+	 * @param ip
+	 * @param port
+	 * @param msg
+	 * @return
+	 */
+	public InvokeResult send(String ip, int port, byte[] msg) {
+		IoSession session = ZldzServerEngine.getSession(ip,port);
+		if (null == session) {
+			return InvokeResult.CHANNEL_CLOSED;
+		}
+		return session.invoke(msg);
+	}
+
+	public static void updateSession(String ip, int port, String companyId) {
+		IoSession ioSession = ZldzServerEngine.getSession(ip,port);
+		if(null != ioSession){
+			ioSession.setCompanyId(companyId);
+		}
+	}
+
+	public static InvokeResult destory(String ip, int port) {
+		IoSession session = ZldzServerEngine.getSession(ip,port);
+		if (null == session) {
+			return InvokeResult.SUCCESS;
+		}
+		// 鎵ц杩炴帴閿�姣�
+		session.destroy();
+		return InvokeResult.SUCCESS;
+	}
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/RemoteCommonImpl.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/RemoteCommonImpl.java
new file mode 100644
index 0000000..1bcebd8
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/RemoteCommonImpl.java
@@ -0,0 +1,426 @@
+package com.ld.igds.protocol.zldz.command;
+
+import com.ld.igds.io.RemoteCommonService;
+import com.ld.igds.io.constant.OrderRespEnum;
+import com.ld.igds.io.request.*;
+import com.ld.igds.io.response.BaseResponse;
+import com.ld.igds.io.response.GrainResponse;
+import com.ld.igds.protocol.zldz.command.builder.*;
+import com.ld.igds.protocol.zldz.command.message.Message;
+import com.ld.igds.protocol.zldz.task.CommandReSendService;
+import com.ld.igds.protocol.zldz.task.CommandTask;
+import com.ld.igds.protocol.zldz.util.ServerUtils;
+import com.ld.io.api.InvokeResult;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 褰撳墠鍗忚瀹炵幇锛岀伯鎯呮ā鍧楀懡浠ゆ帴鍙�
+ *
+ * @author jiazx
+ */
+@Slf4j
+@Component(RemoteCommonImpl.BEAN_ID)
+public class RemoteCommonImpl extends BaseRemoteImpl implements RemoteCommonService {
+
+    public static final String BEAN_ID = "zldz.remoteCommonService";
+
+    @Autowired
+    private CommandReSendService commandReSendService;
+
+    @Override
+    public BaseResponse heartBeat(BaseRequest request) {
+        return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(), "鍗忚涓嶆敮鎸�");
+    }
+
+    @Override
+    public BaseResponse pullDevice(BaseRequest request) {
+        return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(), "鍗忚涓嶆敮鎸�");
+    }
+
+    @Override
+    public BaseResponse pullDepot(BaseRequest request) {
+        return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(), "鍗忚涓嶆敮鎸�");
+    }
+
+    @Override
+    public BaseResponse pullAccess(AccessRequest request) {
+        return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(), "鍗忚涓嶆敮鎸�");
+    }
+
+    @Override
+    public BaseResponse pullDepotStatus(DepotStatusRequest request) {
+        return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(), "鍗忚涓嶆敮鎸�");
+    }
+
+
+    @Override
+    public BaseResponse checkTh(CheckThRequest request) {
+        try {
+            Message message = CommandBuilder1128.getInstance().buildMessage(request);
+
+            log.info("骞冲彴------>>>鍒嗘満锛�" + request.getSerName() + "-娓╂箍搴﹀懡浠や俊鎭�=" + message.toString());
+
+            // 鍙戦�佸懡浠�
+            InvokeResult result = send(request.getIp(), request.getPort(), message.getByteMsg());
+
+            // 灏佽杩斿洖淇℃伅
+            if (InvokeResult.SUCCESS == result) {
+                return new BaseResponse(OrderRespEnum.ORDER_SUCCESS.getCode(),
+                        "鍒嗘満=" + request.getSerName() + "鍙戦�佹俯婀垮害鍛戒护鎴愬姛");
+            } else {
+                return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                        "鍒嗘満=" + request.getSerName() + "鍙戦�佹俯婀垮害鍛戒护澶辫触锛�" + result.getMessage());
+            }
+
+
+        } catch (Exception e) {
+            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(), "鍒嗘満=" + request.getSerName() + "娓╂箍搴﹀懡浠ゅけ璐ワ細" + e.getMessage());
+        }
+    }
+
+    @Override
+    public BaseResponse writeConf(GrainSerConfRequest request) {
+        try {
+            // Step1 鐢熸垚鍛戒护
+            Message message = CommandBuilder1116_1.getInstance().buildMessage(request);
+
+            log.info("骞冲彴------>>>鍒嗘満锛�" + request.getSerName() + "-鍐欏叆閰嶇疆鍛戒护=" + message.toString());
+
+            // 鍙戦�佸懡浠�
+            InvokeResult result = send(request.getIp(), request.getPort(), message.getByteMsg());
+
+            // 灏佽杩斿洖淇℃伅
+            if (InvokeResult.SUCCESS == result) {
+
+                CommandTask commandData = new CommandTask();
+                commandData.setCompanyId(request.getCompanyId());
+                commandData.setIp(request.getIp());
+                commandData.setPort(request.getPort());
+                commandData.setByteCommand(message.getByteMsg());
+                commandData.setCommand(message.getStrMsg());
+                commandData.setResultType(ServerUtils.MSG_TYPE_8816);
+                commandReSendService.reSendTask(commandData);
+
+                return new BaseResponse(OrderRespEnum.ORDER_SUCCESS.getCode(),
+                        "鍒嗘満=" + request.getSerName() + "鍐欏叆閰嶇疆鍛戒护鍙戦�佹垚鍔�");
+            } else {
+                return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                        "鍒嗘満=" + request.getSerName() + "鍐欏叆閰嶇疆鍛戒护鍙戦�佸紓甯革細" + result.getMessage());
+            }
+
+        } catch (Exception e) {
+            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(), "鍒嗘満=" + request.getSerName() + "鍐欏叆閰嶇疆鍛戒护鍙戦�佸紓甯革細" + e.getMessage());
+        }
+    }
+
+    @Override
+    public BaseResponse readConf(GrainSerConfRequest request) {
+        try {
+            // Step1 鐢熸垚鍛戒护
+            Message message = CommandBuilder1116_0.getInstance().buildMessage(request);
+
+            log.info("骞冲彴------>>>鍒嗘満锛�" + request.getSerName() + "-璇诲彇閰嶇疆鍛戒护=" + message.toString());
+
+            // 鍙戦�佸懡浠�
+            InvokeResult result = send(request.getIp(), request.getPort(), message.getByteMsg());
+
+            // 灏佽杩斿洖淇℃伅
+            if (InvokeResult.SUCCESS == result) {
+                CommandTask commandData = new CommandTask();
+                commandData.setCompanyId(request.getCompanyId());
+                commandData.setIp(request.getIp());
+                commandData.setPort(request.getPort());
+                commandData.setByteCommand(message.getByteMsg());
+                commandData.setCommand(message.getStrMsg());
+                commandData.setResultType(ServerUtils.MSG_TYPE_8816);
+                commandReSendService.reSendTask(commandData);
+
+                return new GrainResponse(OrderRespEnum.ORDER_SUCCESS.getCode(),
+                        "鍒嗘満=" + request.getSerName() + "璇诲彇閰嶇疆鍛戒护鍙戦�佹垚鍔�");
+            } else {
+
+                return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                        "鍒嗘満=" + request.getSerName() + "璇诲彇閰嶇疆鍛戒护鍙戦�佸紓甯革細" + result.getMessage());
+            }
+        } catch (Exception e) {
+            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(), "鍒嗘満=" + request.getSerName() + "璇诲彇閰嶇疆鍛戒护鍙戦�佸紓甯革細" + e.getMessage());
+        }
+    }
+
+    @Override
+    public BaseResponse initCable(BaseRequest request) {
+        try {
+            // Step1 鐢熸垚绮儏淇℃伅
+            Message message = CommandBuilder1122.getInstance().buildMessage(request);
+
+            log.info("骞冲彴------>>>鍒嗘満锛�" + request.getSerName() + "-鍒濆鍖栫數缂嗗懡浠�=" + message.toString());
+
+            // 鍙戦�佸懡浠�
+            InvokeResult result = send(request.getIp(), request.getPort(),
+                    message.getByteMsg());
+
+            // 灏佽杩斿洖淇℃伅
+            if (InvokeResult.SUCCESS == result) {
+                CommandTask commandData = new CommandTask();
+                commandData.setCompanyId(request.getCompanyId());
+                commandData.setIp(request.getIp());
+                commandData.setPort(request.getPort());
+                commandData.setByteCommand(message.getByteMsg());
+                commandData.setCommand(message.getStrMsg());
+                commandData.setResultType(ServerUtils.MSG_TYPE_8822);
+                commandReSendService.reSendTask(commandData);
+
+                return new BaseResponse(OrderRespEnum.ORDER_SUCCESS.getCode(),
+                        "鍒嗘満=" + request.getSerName() + "鍒濆鍖栫數缂嗗彂閫佹垚鍔�");
+            } else {
+                return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                        "鍒嗘満=" + request.getSerName() + "鍒濆鍖栫數缂嗗懡浠ゅ彂閫佸け璐ワ細" + result.getMessage());
+            }
+        } catch (Exception e) {
+            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(), "鍒嗘満=" + request.getSerName() + "鍒濆鍖栫數缂嗗懡浠ゆ墽琛屽け璐ワ細" + e.getMessage());
+        }
+    }
+
+    @Override
+    public BaseResponse updateGrainSerCable(GrainSerConfRequest request) {
+        if (null == request.getEditTag()) {
+            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                    "褰撳墠鎿嶄綔娌℃湁鍒跺畾淇敼鏍囪瘑锛屾棤娉曟墽琛岋紒");
+        }
+
+        //鏍规嵁淇敼鏍囪瘑澶勭悊涓嶅悓鐨勯�昏緫 -- 2鐐瑰彿淇敼 3鍒楀彿淇敼锛�4鏍瑰彿淇敼锛�5鍚屾鐢电紗锛�6鏍瑰彿鏇挎崲
+        if (2 == request.getEditTag()) {
+            return updateGrainSerCable2(request);
+        }
+        if (3 == request.getEditTag()) {
+            return updateGrainSerCable3(request);
+        }
+        if (4 == request.getEditTag()) {
+            return updateGrainSerCable4(request);
+        }
+        if (5 == request.getEditTag()) {
+            return updateGrainSerCable5(request);
+        }
+        if (6 == request.getEditTag()) {
+            return updateGrainSerCable6(request);
+        }
+        return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                "娌℃湁鍖归厤鍒板綋鍓嶉渶瑕佹搷浣滅殑鏍囪瘑锛屾爣璇�=" + request.getEditTag());
+    }
+
+    /**
+     * 鏍瑰彿鏇挎崲
+     *
+     * @param request
+     * @return
+     */
+    private BaseResponse updateGrainSerCable6(GrainSerConfRequest request) {
+        if (null == request.getValue1() || null == request.getValue2()) {
+            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                    "鏇挎崲鎿嶄綔涓紝娌℃湁鑾峰彇鍒版柊鏃у弬鏁伴厤缃紒");
+        }
+
+        // Step1
+        Message message = CommandBuilder1126.getInstance().buildMessage(request);
+
+        log.info("骞冲彴------>>>鍒嗘満锛�" + request.getSerName() + "鐢电紗-鏍瑰彿鏇挎崲鍛戒护=" + message.toString());
+
+        // 鍙戦�佸懡浠�
+        InvokeResult result = send(request.getIp(), request.getPort(),
+                message.getByteMsg());
+
+        // 灏佽杩斿洖淇℃伅
+        if (InvokeResult.SUCCESS == result) {
+            return new BaseResponse(OrderRespEnum.ORDER_SUCCESS.getCode(),
+                    "鍒嗘満=" + request.getSerName() + "鐢电紗-鏍瑰彿鏇挎崲鍙戦�佹垚鍔燂紒");
+        } else {
+            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                    "鍒嗘満=" + request.getSerName() + "鐢电紗-鏍瑰彿鏇挎崲鍙戦�佸け璐ワ細" + result.getMessage());
+        }
+
+    }
+
+    /**
+     * @param request
+     * @return
+     */
+    private BaseResponse updateGrainSerCable5(GrainSerConfRequest request) {
+        if (null == request.getValue1() || null == request.getValue2()) {
+            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                    "鍚屾鐢电紗澶辫触锛屽悓姝ョ數缂嗗弬鏁颁笉瀹屾暣");
+        }
+
+
+        // Step1
+        Message message = CommandBuilder1126.getInstance().buildMessage(request);
+
+        log.info("骞冲彴------>>>鍒嗘満锛�" + request.getSerName() + "鍚屾鐢电紗-鍛戒护=" + message.toString());
+
+        // 鍙戦�佸懡浠�
+        InvokeResult result = send(request.getIp(), request.getPort(),
+                message.getByteMsg());
+
+        // 灏佽杩斿洖淇℃伅
+        if (InvokeResult.SUCCESS == result) {
+            return new BaseResponse(OrderRespEnum.ORDER_SUCCESS.getCode(),
+                    "鍒嗘満=" + request.getSerName() + "鐢电紗-鏍瑰彿鏇挎崲鍙戦�佹垚鍔燂紒");
+        } else {
+            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                    "鍒嗘満=" + request.getSerName() + "鐢电紗-鏍瑰彿鏇挎崲鍙戦�佸け璐ワ細" + result.getMessage());
+        }
+    }
+
+    private BaseResponse updateGrainSerCable4(GrainSerConfRequest request) {
+        if (null == request.getValue1() || null == request.getValue2()) {
+            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                    "鏇挎崲鎿嶄綔涓紝娌℃湁鑾峰彇鍒版柊鏃у弬鏁伴厤缃紒");
+        }
+
+        //杈撳叆鍊奸渶瑕�-1
+        request.setValue1(request.getValue1() - 1);
+        request.setValue2(request.getValue2() - 1);
+
+        // Step1
+        Message message = CommandBuilder1126.getInstance().buildMessage(request);
+
+        log.info("骞冲彴------>>>鍒嗘満锛�" + request.getSerName() + "-鐢电紗-鏍瑰彿淇敼鍛戒护=" + message.toString());
+
+        // 鍙戦�佸懡浠�
+        InvokeResult result = send(request.getIp(), request.getPort(),
+                message.getByteMsg());
+
+        // 灏佽杩斿洖淇℃伅
+        if (InvokeResult.SUCCESS == result) {
+            return new BaseResponse(OrderRespEnum.ORDER_SUCCESS.getCode(),
+                    "鍒嗘満=" + request.getSerName() + "鐢电紗-鏍瑰彿淇敼鍛戒护鍙戦�佹垚鍔燂紒");
+        } else {
+            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                    "鍒嗘満=" + request.getSerName() + "鐢电紗-鏍瑰彿淇敼鍛戒护鍙戦�佸け璐ワ細" + result.getMessage());
+        }
+    }
+
+    private BaseResponse updateGrainSerCable3(GrainSerConfRequest request) {
+
+        if (null == request.getEditCol()) {
+            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                    "鏇挎崲鎿嶄綔涓紝娌℃湁鑾峰彇鍒楀弬鏁帮紒");
+        }
+
+        // Step1
+        Message message = CommandBuilder1126.getInstance().buildMessage(request);
+
+        log.info("骞冲彴------>>>鍒嗘満锛�" + request.getSerName() + "鐢电紗-鍒楀彿淇敼鍛戒护=" + message.toString());
+
+        // 鍙戦�佸懡浠�
+        InvokeResult result = send(request.getIp(), request.getPort(),
+                message.getByteMsg());
+
+        // 灏佽杩斿洖淇℃伅
+        if (InvokeResult.SUCCESS == result) {
+            return new BaseResponse(OrderRespEnum.ORDER_SUCCESS.getCode(),
+                    "鍒嗘満=" + request.getSerName() + "鐢电紗-鍒楀彿淇敼鍛戒护鍙戦�佹垚鍔燂紒");
+        } else {
+            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                    "鍒嗘満=" + request.getSerName() + "鐢电紗-鍒楀彿淇敼鍛戒护鍙戦�佸け璐ワ細" + result.getMessage());
+        }
+    }
+
+    private BaseResponse updateGrainSerCable2(GrainSerConfRequest request) {
+
+        if (null == request.getValue1() || null == request.getValue2()) {
+            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                    "鏇挎崲鎿嶄綔涓紝娌℃湁鑾峰彇鍒版柊鏃у弬鏁伴厤缃紒");
+        }
+
+        //杈撳叆鍊奸渶瑕�-1
+        request.setValue1(request.getValue1() - 1);
+        request.setValue2(request.getValue2() == null ? 0 : request.getValue2());
+
+        // Step1 鐢熸垚鍛戒护
+        Message message = CommandBuilder1126.getInstance().buildMessage(request);
+
+        log.info("骞冲彴------>>>鍒嗘満锛�" + request.getSerName() + "鐢电紗-鐐瑰彿淇敼鍛戒护=" + message.toString());
+
+        // 鍙戦�佸懡浠�
+        InvokeResult result = send(request.getIp(), request.getPort(), message.getByteMsg());
+
+        // 灏佽杩斿洖淇℃伅
+        if (InvokeResult.SUCCESS == result) {
+            return new BaseResponse(OrderRespEnum.ORDER_SUCCESS.getCode(),
+                    "鍒嗘満=" + request.getSerName() + "鐢电紗-鐐瑰彿淇敼鍛戒护鍙戦�佹垚鍔燂紒");
+        } else {
+            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                    "鍒嗘満=" + request.getSerName() + "鐢电紗-鐐瑰彿淇敼鍛戒护鍙戦�佸け璐ワ細" + result.getMessage());
+        }
+    }
+
+
+    /**
+     * 鑾峰彇閫氶亾鐢电紗
+     *
+     * @param request
+     * @return
+     */
+    @Override
+    public BaseResponse checkGrainSerCable(GrainSerConfRequest request) {
+
+        // Step1 鐢熸垚绮儏淇℃伅
+        Message message = CommandBuilder1125.getInstance().buildMessage(request);
+
+        log.info("骞冲彴------>>>鍒嗘満锛�" + request.getSerName() + "鑾峰彇閫氶亾鐢电紗鍛戒护=" + message.toString());
+
+        // 鍙戦�佸懡浠�
+        InvokeResult result = send(request.getIp(), request.getPort(), message.getByteMsg());
+
+        // 灏佽杩斿洖淇℃伅
+        if (InvokeResult.SUCCESS == result) {
+            return new BaseResponse(OrderRespEnum.ORDER_SUCCESS.getCode(),
+                    "鍒嗘満=" + request.getSerName() + "鑾峰彇閫氶亾鐢电紗鍛戒护鍙戦�佹垚鍔燂紒");
+        } else {
+            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                    "鍒嗘満=" + request.getSerName() + "鑾峰彇閫氶亾鐢电紗鍛戒护鍙戦�佸け璐ワ細" + result.getMessage());
+        }
+
+    }
+
+
+    @Override
+    public BaseResponse destroyCon(BaseRequest request) {
+        InvokeResult result = destory(request.getIp(), request.getPort());
+        if (InvokeResult.SUCCESS == result) {
+            return new BaseResponse(OrderRespEnum.ORDER_SUCCESS.getCode(),
+                    "鍒嗘満=" + request.getSerName() + "鏂紑杩炴帴鎵ц鎴愬姛");
+        } else {
+            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(), "鍒嗘満=" + request.getSerName() + "鏂紑杩炴帴澶辫触锛�" + result.getMessage());
+        }
+    }
+
+    @Override
+    public BaseResponse updateSysDepotConf(BaseRequest request) {
+        return new BaseResponse(OrderRespEnum.NO_FUNCTION);
+    }
+
+    @Override
+    public BaseResponse sumGrainSerCable(GrainSerConfRequest request) {
+        // Step1
+        Message message = CommandBuilder1123.getInstance().buildMessage(request);
+
+        log.info("骞冲彴------>>>鍒嗘満锛�" + request.getSerName() + "鐢电紗姹囨�诲懡浠�=" + message.toString());
+
+        // 鍙戦�佸懡浠�
+        InvokeResult result = send(request.getIp(), request.getPort(), message.getByteMsg());
+
+        // 灏佽杩斿洖淇℃伅
+        if (InvokeResult.SUCCESS == result) {
+            return new BaseResponse(OrderRespEnum.ORDER_SUCCESS.getCode(),
+                    "鍒嗘満=" + request.getSerName() + "鐢电紗姹囨�诲懡浠ゅ彂閫佹垚鍔燂紒");
+        } else {
+            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                    "鍒嗘満=" + request.getSerName() + "鐢电紗姹囨�诲懡浠ゅ彂閫佸け璐ワ細" + result.getMessage());
+        }
+    }
+
+
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/RemoteGrainServiceImpl.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/RemoteGrainServiceImpl.java
new file mode 100644
index 0000000..676bcc1
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/RemoteGrainServiceImpl.java
@@ -0,0 +1,129 @@
+package com.ld.igds.protocol.zldz.command;
+
+import com.ld.igds.io.RemoteGrainService;
+import com.ld.igds.io.constant.OrderRespEnum;
+import com.ld.igds.io.request.BaseRequest;
+import com.ld.igds.io.request.CheckGrainRequest;
+import com.ld.igds.io.response.BaseResponse;
+import com.ld.igds.io.response.GrainResponse;
+import com.ld.igds.protocol.zldz.command.builder.CommandBuilder1115;
+import com.ld.igds.protocol.zldz.command.builder.CommandBuilder8815;
+import com.ld.igds.protocol.zldz.command.builder.CommandBuilder8817;
+import com.ld.igds.protocol.zldz.command.message.Message;
+import com.ld.igds.protocol.zldz.task.CommandReSendService;
+import com.ld.igds.protocol.zldz.task.CommandTask;
+import com.ld.igds.protocol.zldz.util.ServerUtils;
+import com.ld.io.api.InvokeResult;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 绮儏鍗忚锛岀洿鎺ヨ幏鍙栫伯鎯咃紝娓╂箍搴︿俊鎭�氳繃蹇冭烦瀹氭椂鑾峰彇銆�
+ *
+ * @author jiazx
+ */
+@Slf4j
+@Component(RemoteGrainServiceImpl.BEAN_ID)
+public class RemoteGrainServiceImpl extends BaseRemoteImpl implements
+        RemoteGrainService {
+
+    public static final String BEAN_ID = "zldz.remoteGrainService";
+
+    @Autowired
+    private CommandReSendService commandReSendService;
+
+    /**
+     * 绮儏妫�娴嬶紝棣栧厛闇�瑕佹墽琛屾俯婀垮害妫�娴嬶紝娓╂箍搴︽娴嬪畬鎴愬悗锛屽啀杩涚伯鎯呮娴嬨��
+     * 娓╂箍搴︾殑淇℃伅鏍规嵁鍒嗘満鍜屾俯婀垮害鍦板潃瀛樺湪缂撳瓨30鍒嗛挓锛�30鍒嗛挓鍐呬笉閲嶅閲囬泦锛岀郴缁熷垽鏂笌褰撳墠鏃堕棿宸窛绂诲綋鍓嶆椂闂存槸鍚﹁秴杩�25鍒嗛挓
+     * 锛岃秴杩囬噸鏂拌幏鍙栵紝娌℃湁瓒呰繃鐩存帴閲囬泦绮儏
+     *
+     * @param request
+     * @return
+     */
+    @Override
+    public GrainResponse checkGrain(CheckGrainRequest request) {
+        // Step1 鐢熸垚绮儏淇℃伅
+        Message message = CommandBuilder1115.getInstance().buildMessage(request);
+
+        log.info("骞冲彴------>>>鍒嗘満锛�" +request.getSerName() + "-绮儏閲囬泦鍛戒护=" + message.toString());
+
+        InvokeResult result = send(request.getIp(), request.getPort(), message.getByteMsg());
+
+        // 灏佽杩斿洖淇℃伅
+        if (InvokeResult.SUCCESS == result) {
+            CommandTask commandData = new CommandTask();
+            commandData.setCompanyId(request.getCompanyId());
+            commandData.setIp(request.getIp());
+            commandData.setPort(request.getPort());
+            commandData.setByteCommand(message.getByteMsg());
+            commandData.setCommand(message.getStrMsg());
+            commandData.setResultType(ServerUtils.MSG_TYPE_8817);
+            commandData.setCableRule(request.getCableRule());
+            commandData.setSerName(request.getSerName());
+            commandData.setDepotId(request.getDepotId());
+            commandReSendService.reSendGrainTask(commandData);
+            return new GrainResponse(OrderRespEnum.ORDER_SUCCESS.getCode(),
+                    "绮儏閲囬泦鍛戒护鍙戦�佹垚鍔�");
+        } else {
+            log.info("鍒嗘満" + request.getSerName() + "绮儏閲囬泦鍛戒护鍙戦�佸け璐ワ細" + result.getMessage());
+            return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(), result.getMessage());
+        }
+    }
+
+    /**
+     * 鏈嶅姟鍣ㄥ洖澶嶇粓绔殑鏀跺埌璇锋眰
+     *
+     * @param request
+     */
+    public BaseResponse reply8815(BaseRequest request) {
+        // Step1 鐢熸垚绮儏淇℃伅
+        Message message = CommandBuilder8815.getInstance().buildMessage(
+                request);
+
+        log.debug("骞冲彴------>>>鍒嗘満锛�" +request.getSerName() + "-绮儏鏈嶅姟绔洖澶嶅懡浠�=" + message.toString());
+
+        // 鍙戦�佸懡浠�
+        InvokeResult result = send(request.getIp(), request.getPort(),
+                message.getByteMsg());
+        // 灏佽杩斿洖淇℃伅
+        if (InvokeResult.SUCCESS == result) {
+            return new BaseResponse(OrderRespEnum.ORDER_SUCCESS.getCode(),
+                    "鍒嗘満" + request.getSerName() + "绮儏鏈嶅姟绔洖澶嶅懡浠ゅ彂閫佹垚鍔�");
+        } else {
+            log.error("鍒嗘満" + request.getSerName() + "绮儏鏈嶅姟绔洖澶嶅懡浠ゅ彂閫佸け璐ワ細" + result.getMessage());
+            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                    "鍒嗘満" + request.getSerName() + "绮儏鏈嶅姟绔洖澶嶅懡浠ゅ彂閫佸け璐ワ細" + result.getMessage());
+        }
+    }
+
+    /**
+     * 鍥炲鍛戒护
+     *
+     * @param request
+     * @param hexCurPacket 褰撳墠鍖呯殑hex
+     */
+    public BaseResponse reply8817(BaseRequest request, String hexCurPacket) {
+        // Step1 鐢熸垚绮儏淇℃伅锛屾妸淇℃伅鏀惧湪request
+        request.setBizType(hexCurPacket);
+
+        Message message = CommandBuilder8817.getInstance().buildMessage(request);
+
+        log.debug("骞冲彴------>>>鍒嗘満锛�" +request.getSerName() + "-绮儏鏈嶅姟绔洖澶嶆敹鍒扮伯鎯呭寘鍛戒护=" + message.toString());
+
+        // 鍙戦�佸懡浠�
+        InvokeResult result = send(request.getIp(), request.getPort(),
+                message.getByteMsg());
+
+        // 灏佽杩斿洖淇℃伅
+        if (InvokeResult.SUCCESS == result) {
+            return new BaseResponse(OrderRespEnum.ORDER_SUCCESS.getCode(),
+                    "鍒嗘満" + request.getSerName() + "绮儏鏈嶅姟绔洖澶嶆敹鍒扮伯鎯呭寘鍛戒护鍙戦�佹垚鍔�");
+        } else {
+            log.info("鍒嗘満" + request.getSerName() + "绮儏鏈嶅姟绔洖澶嶆敹鍒扮伯鎯呭寘鍛戒护鍙戦�佸け璐ワ細" + result.getMessage());
+
+            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
+                    "鍒嗘満" + request.getSerName() + "绮儏鏈嶅姟绔洖澶嶆敹鍒扮伯鎯呭寘鍛戒护鍙戦�佸け璐ワ細" + result.getMessage());
+        }
+    }
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder.java
new file mode 100644
index 0000000..de3f9c0
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder.java
@@ -0,0 +1,144 @@
+package com.ld.igds.protocol.zldz.command.builder;
+
+import com.ld.igds.io.request.BaseRequest;
+import com.ld.igds.protocol.zldz.command.message.Message;
+import com.ld.igds.protocol.zldz.command.message.MessageBody;
+import com.ld.igds.protocol.zldz.util.CRC8;
+import com.ld.igds.protocol.zldz.util.ServerUtils;
+import com.ld.igds.util.BytesUtil;
+
+
+/**
+ * 鍛戒护鐢熸垚鍣�
+ *
+ * @author Andy
+ */
+public abstract class CommandBuilder {
+
+    /*
+     * 鍛戒护鍒涘缓
+     *
+     * @param order
+     */
+    public Message buildMessage(BaseRequest request) {
+        Message message = new Message();
+
+        message.setBegin(ServerUtils.MSG_START);
+
+        // 璋冩暣Message澶撮儴淇℃伅
+        buildHeader(message, request);
+
+        //鍖呭ご鏍¢獙
+        buildCrc8(message);
+
+        // 鍒涘缓娑堟伅浣�
+        buildBody(message, request);
+
+        // 娣诲姞鏍¢獙
+        buildCrc16(message);
+
+        message.setEnd(ServerUtils.MSG_END);
+
+        // 鐢熸垚鏁翠綋鍛戒护淇℃伅鍜孊Yte淇℃伅
+        build(message);
+
+        return message;
+    }
+
+
+    public void buildHeader(Message message, BaseRequest request) {
+        String hexCompanyId = BytesUtil.getTargetId(request.getCompanyId(),true);
+        hexCompanyId = BytesUtil.tran_LH(hexCompanyId);
+        message.setSourceId(hexCompanyId);
+        message.setSendId(hexCompanyId);
+        message.setCompanyId(hexCompanyId);
+
+        message.setSourceId(BytesUtil.getTargetId(request.getSerId(), true));
+
+        message.setMessageType(ServerUtils.MSG_TYPE_1116);
+    }
+
+    public void buildBody(Message message, BaseRequest request) {
+        MessageBody body = new MessageBody();
+        body.setContent("");
+        body.setLength(0);
+        message.setBody(body);
+    }
+
+    public void buildCrc8(Message message) {
+        StringBuffer hexSbCrc8 = new StringBuffer();
+        hexSbCrc8.append(message.getSourceId());
+        hexSbCrc8.append(message.getTargetId());
+        hexSbCrc8.append(message.getSendId());
+        hexSbCrc8.append(message.getGateway1());
+        hexSbCrc8.append(message.getGateway2());
+        hexSbCrc8.append(message.getMessageType());
+        hexSbCrc8.append(message.getResult());
+        hexSbCrc8.append(message.getCompanyId());
+
+        byte[] bytes = BytesUtil.hexStrToBytes(hexSbCrc8.toString());
+        byte crc8 = CRC8.calcCrc8(bytes, (short) 0, (short) (bytes.length),
+                (byte) 0);
+
+        message.setHexCrc8(BytesUtil.byteToHex(crc8));
+    }
+
+
+    public void buildCrc16(Message message) {
+        StringBuffer hexSbCrc16 = new StringBuffer();
+		hexSbCrc16.append(message.getSourceId());
+		hexSbCrc16.append(message.getTargetId());
+		hexSbCrc16.append(message.getSendId());
+		hexSbCrc16.append(message.getGateway1());
+		hexSbCrc16.append(message.getGateway2());
+		hexSbCrc16.append(message.getMessageType());
+		hexSbCrc16.append(message.getResult());
+		hexSbCrc16.append(message.getCompanyId());
+
+		hexSbCrc16.append(message.getHexCrc8());
+
+        hexSbCrc16.append(BytesUtil.tran_LH(BytesUtil
+                .getHex2LenStr(message.getBody().getLength())));
+
+        hexSbCrc16.append(message.getBody().getContent());
+
+        byte[] byteCrc16 = BytesUtil.hexStrToBytes(hexSbCrc16.toString());
+        short crc16Hex2 = CRC8.calculateCrc16(byteCrc16, (short) 0, (short) (byteCrc16.length));
+        byte[] crc16Hex2Bytes = BytesUtil.shortToByte(crc16Hex2);
+        int crc16 = BytesUtil.bytesToInt(crc16Hex2Bytes);
+
+
+        message.setHexCrc16(BytesUtil.intToHexStr(crc16));
+    }
+
+    /**
+     * 鏍规嵁鐢熸垚鐨勫懡浠わ紝杩涜璋冩暣
+     *
+     * @param message
+     */
+    public void build(Message message) {
+        StringBuffer hexSb = new StringBuffer();
+
+		hexSb.append(message.getBegin());
+		hexSb.append(message.getSourceId());
+		hexSb.append(message.getTargetId());
+		hexSb.append(message.getSendId());
+		hexSb.append(message.getGateway1());
+		hexSb.append(message.getGateway2());
+		hexSb.append(message.getMessageType());
+		hexSb.append(message.getResult());
+		hexSb.append(message.getCompanyId());
+		hexSb.append(message.getHexCrc8());
+
+        hexSb.append(BytesUtil.tran_LH(BytesUtil
+                .getHex2LenStr(message.getBody().getLength())));
+
+        hexSb.append(message.getBody().getContent());
+        hexSb.append(message.getHexCrc16());
+        hexSb.append(message.getEnd());
+
+        message.setStrMsg(hexSb.toString());
+        message.setByteMsg(BytesUtil.hexStrToBytes(message.getStrMsg()));
+    }
+
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1115.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1115.java
new file mode 100644
index 0000000..5e4c908
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1115.java
@@ -0,0 +1,79 @@
+package com.ld.igds.protocol.zldz.command.builder;
+
+import com.ld.igds.io.request.BaseRequest;
+import com.ld.igds.io.request.CheckGrainRequest;
+import com.ld.igds.protocol.zldz.command.message.Message;
+import com.ld.igds.protocol.zldz.command.message.MessageBody;
+import com.ld.igds.protocol.zldz.util.ServerUtils;
+import com.ld.igds.util.BytesUtil;
+
+
+/**
+ * 绮儏淇℃伅鍛戒护
+ *
+ * @author Andy
+ */
+public class CommandBuilder1115 extends CommandBuilder {
+
+
+    private final static CommandBuilder1115 instance = new CommandBuilder1115();
+
+    private CommandBuilder1115() {
+
+    }
+
+    public static CommandBuilder1115 getInstance() {
+        return instance;
+    }
+
+    public Message buildMessage(CheckGrainRequest request) {
+
+        //request.setCompanyId("1");
+
+        Message message = new Message();
+
+        message.setBegin(ServerUtils.MSG_START);
+
+        // 璋冩暣Message澶撮儴淇℃伅
+        buildHeader(message, request);
+
+        //鍖呭ご鏍¢獙
+        buildCrc8(message);
+
+        // 鍒涘缓娑堟伅浣�
+        buildBody(message, request);
+
+        // 娣诲姞鏍¢獙
+        buildCrc16(message);
+
+        message.setEnd(ServerUtils.MSG_END);
+
+        // 鐢熸垚鏁翠綋鍛戒护淇℃伅鍜孊Yte淇℃伅
+        build(message);
+
+        return message;
+    }
+
+    public void buildHeader(Message message, BaseRequest order) {
+        String hexCompanyId = BytesUtil.getTargetId(order.getCompanyId(),true);
+        hexCompanyId = BytesUtil.tran_LH(hexCompanyId);
+
+        message.setSourceId(hexCompanyId);
+        message.setSendId(hexCompanyId);
+        message.setCompanyId(hexCompanyId);
+
+        message.setTargetId(BytesUtil.tran_LH(BytesUtil.getTargetId(order.getSerId(), true)));
+        message.setMessageType(BytesUtil.tran_LH(ServerUtils.MSG_TYPE_1115));
+    }
+
+
+    public void buildBody(Message message, CheckGrainRequest order) {
+        MessageBody body = new MessageBody();
+        body.setLength(2);
+        int start = order.getCableStart();
+        int end = order.getCableEnd();
+        body.setContent(BytesUtil.toHexString(start) + BytesUtil.toHexString(end));
+        message.setBody(body);
+    }
+
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1116_0.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1116_0.java
new file mode 100644
index 0000000..a290402
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1116_0.java
@@ -0,0 +1,83 @@
+package com.ld.igds.protocol.zldz.command.builder;
+
+import com.ld.igds.io.request.GrainSerConfRequest;
+import com.ld.igds.protocol.zldz.command.message.Message;
+import com.ld.igds.protocol.zldz.command.message.MessageBody;
+import com.ld.igds.protocol.zldz.util.ServerUtils;
+import com.ld.igds.util.BytesUtil;
+
+
+/**
+ *
+ * @author Andy
+ */
+public class CommandBuilder1116_0 extends CommandBuilder {
+
+
+    private final static CommandBuilder1116_0 instance = new CommandBuilder1116_0();
+
+    private CommandBuilder1116_0() {
+
+    }
+
+    public static CommandBuilder1116_0 getInstance() {
+        return instance;
+    }
+    
+    public Message buildMessage(GrainSerConfRequest request) {
+
+        Message message = new Message();
+
+        message.setBegin(ServerUtils.MSG_START);
+
+        // 璋冩暣Message澶撮儴淇℃伅
+        buildHeader(message, request);
+
+        //鍖呭ご鏍¢獙
+        buildCrc8(message);
+
+        // 鍒涘缓娑堟伅浣�
+        buildBody(message, request);
+
+        // 娣诲姞鏍¢獙
+        buildCrc16(message);
+
+        message.setEnd(ServerUtils.MSG_END);
+
+        // 鐢熸垚鏁翠綋鍛戒护淇℃伅鍜孊Yte淇℃伅
+        build(message);
+
+        return message;
+    }
+   
+    public void buildHeader(Message message, GrainSerConfRequest request) {
+    	
+//        String hexCompanyId = BytesUtil.getTargetId(request.getCompanyId(),true);
+//
+//        hexCompanyId = BytesUtil.tran_LH(hexCompanyId);
+//        message.setSourceId(hexCompanyId);
+//        message.setSendId(hexCompanyId);
+//
+//        //鍙戦�佺殑蹇呴』鏄師鏉ョ殑缁勭粐缂栫爜
+//         String orgId = BytesUtil.tran_LH(BytesUtil.getTargetId(request.getOrgId(),true));
+//         message.setCompanyId(orgId);
+//
+//        message.setTargetId(BytesUtil.tran_LH(BytesUtil.getTargetId(request.getSerId(), true)));
+
+        message.setSourceId("0000");
+        message.setSendId("0000");
+        message.setCompanyId("0000");
+        message.setTargetId("FFFF");
+
+        message.setMessageType(BytesUtil.tran_LH(ServerUtils.MSG_TYPE_1116));
+    }
+
+
+    public void buildBody(Message message, GrainSerConfRequest request) {
+        MessageBody body = new MessageBody();
+        body.setContent("0000000000000000000000000000");
+        body.setLength(14);
+        message.setBody(body);
+    }
+
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1116_1.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1116_1.java
new file mode 100644
index 0000000..fbec3fd
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1116_1.java
@@ -0,0 +1,97 @@
+package com.ld.igds.protocol.zldz.command.builder;
+
+import com.ld.igds.io.request.GrainSerConfRequest;
+import com.ld.igds.protocol.zldz.command.message.Message;
+import com.ld.igds.protocol.zldz.command.message.MessageBody;
+import com.ld.igds.protocol.zldz.util.ServerUtils;
+import com.ld.igds.util.BytesUtil;
+import org.apache.commons.lang3.StringUtils;
+
+
+/**
+ *
+ * @author Andy
+ */
+public class CommandBuilder1116_1 extends CommandBuilder {
+
+
+    private final static CommandBuilder1116_1 instance = new CommandBuilder1116_1();
+
+    private CommandBuilder1116_1() {
+
+    }
+
+    public static CommandBuilder1116_1 getInstance() {
+        return instance;
+    }
+    
+    public Message buildMessage(GrainSerConfRequest request) {
+
+        Message message = new Message();
+
+        message.setBegin(ServerUtils.MSG_START);
+
+        // 璋冩暣Message澶撮儴淇℃伅
+        buildHeader(message, request);
+
+        //鍖呭ご鏍¢獙
+        buildCrc8(message);
+
+        // 鍒涘缓娑堟伅浣�
+        buildBody(message, request);
+
+        // 娣诲姞鏍¢獙
+        buildCrc16(message);
+
+        message.setEnd(ServerUtils.MSG_END);
+
+        // 鐢熸垚鏁翠綋鍛戒护淇℃伅鍜孊Yte淇℃伅
+        build(message);
+
+        return message;
+    }
+
+    public void buildHeader(Message message, GrainSerConfRequest request) {
+    	
+        String hexCompanyId = BytesUtil.getTargetId(request.getCompanyId(),true);
+        hexCompanyId = BytesUtil.tran_LH(hexCompanyId);
+
+        message.setSourceId(hexCompanyId);
+        message.setSendId(hexCompanyId);
+        
+        //鍙戦�佺殑蹇呴』鏄師鏉ョ殑缁勭粐缂栫爜
+        String orgId = BytesUtil.tran_LH(BytesUtil.getTargetId(request.getOrgId(),true));
+        message.setCompanyId(orgId);
+
+        message.setTargetId(BytesUtil.tran_LH(BytesUtil.getTargetId(request.getSerId(), true)));
+        message.setMessageType(BytesUtil.tran_LH(ServerUtils.MSG_TYPE_1116));
+    }
+
+
+    public void buildBody(Message message, GrainSerConfRequest request) {
+        MessageBody body = new MessageBody();
+        StringBuffer content = new StringBuffer();
+        content.append("01");//鍐欐爣璁�
+        content.append(message.getTargetId());
+        content.append(BytesUtil.getTargetId("01",false));//缃戠粶ID
+        content.append("0A");//榛樿10 淇¢亾
+        content.append(BytesUtil.getTargetId("03",false));//閫熺巼
+        content.append(BytesUtil.toHexString(request.getCableZ()));
+        content.append(BytesUtil.toHexString(request.getCableY()));
+        content.append(BytesUtil.toHexString(request.getCableX()));
+        content.append(BytesUtil.getTargetId(request.getCableFormat(),false));
+        content.append(BytesUtil.getTargetId(request.getCableType(),false));
+        
+        if(StringUtils.isEmpty(request.getPowerModel())){
+        	request.setPowerModel("02");
+        }
+        content.append(BytesUtil.getTargetId(request.getPowerModel(),false));
+        
+        content.append(message.getSourceId());
+
+        body.setContent(content.toString());
+        body.setLength(14);
+        message.setBody(body);
+    }
+
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1122.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1122.java
new file mode 100644
index 0000000..22ed886
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1122.java
@@ -0,0 +1,46 @@
+package com.ld.igds.protocol.zldz.command.builder;
+
+import com.ld.igds.io.request.BaseRequest;
+import com.ld.igds.protocol.zldz.command.message.Message;
+import com.ld.igds.protocol.zldz.command.message.MessageBody;
+import com.ld.igds.protocol.zldz.util.ServerUtils;
+import com.ld.igds.util.BytesUtil;
+
+/**
+ * 鍒濆鍖栫數缂嗙數缂�
+ * 
+ * @author Andy
+ */
+public class CommandBuilder1122 extends CommandBuilder {
+
+	private final static CommandBuilder1122 instance = new CommandBuilder1122();
+
+	private CommandBuilder1122() {
+
+	}
+
+	public static CommandBuilder1122 getInstance() {
+		return instance;
+	}
+
+	public void buildHeader(Message message, BaseRequest request) {
+		
+		String hexCompanyId = BytesUtil.getTargetId(request.getCompanyId(),true);
+		hexCompanyId = BytesUtil.tran_LH(hexCompanyId);
+
+		message.setSourceId(hexCompanyId);
+		message.setSendId(hexCompanyId);
+		message.setCompanyId(hexCompanyId);
+
+		message.setTargetId(BytesUtil.tran_LH(BytesUtil.getTargetId(request.getSerId(), true)));
+		message.setMessageType(BytesUtil.tran_LH(ServerUtils.MSG_TYPE_1122));
+	}
+
+	public void buildBody(Message message, BaseRequest request) {
+		MessageBody body = new MessageBody();
+		body.setContent("01");
+		body.setLength(1);
+		message.setBody(body);
+	}
+
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1123.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1123.java
new file mode 100644
index 0000000..2991602
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1123.java
@@ -0,0 +1,65 @@
+package com.ld.igds.protocol.zldz.command.builder;
+
+import com.ld.igds.io.request.GrainSerConfRequest;
+import com.ld.igds.protocol.zldz.command.message.Message;
+import com.ld.igds.protocol.zldz.util.ServerUtils;
+import com.ld.igds.util.BytesUtil;
+
+/**
+ * 绮儏鍒嗘満-鐢电紗姹囨��
+ *
+ * @author Andy
+ */
+public class CommandBuilder1123 extends CommandBuilder {
+
+	private final static CommandBuilder1123 instance = new CommandBuilder1123();
+
+	private CommandBuilder1123() {
+
+	}
+
+	public static CommandBuilder1123 getInstance() {
+		return instance;
+	}
+
+	public Message buildMessage(GrainSerConfRequest request) {
+
+		Message message = new Message();
+
+		message.setBegin(ServerUtils.MSG_START);
+
+		// 璋冩暣Message澶撮儴淇℃伅
+		buildHeader(message, request);
+
+		// 鍖呭ご鏍¢獙
+		buildCrc8(message);
+
+		// 鍒涘缓娑堟伅浣�
+		buildBody(message, request);
+
+		// 娣诲姞鏍¢獙
+		buildCrc16(message);
+
+		message.setEnd(ServerUtils.MSG_END);
+
+		// 鐢熸垚鏁翠綋鍛戒护淇℃伅鍜孊Yte淇℃伅
+		build(message);
+
+		return message;
+	}
+
+	public void buildHeader(Message message, GrainSerConfRequest request) {
+		String hexCompanyId = BytesUtil.getTargetId(request.getCompanyId(),
+				true);
+		hexCompanyId = BytesUtil.tran_LH(hexCompanyId);
+
+		message.setSourceId(hexCompanyId);
+		message.setSendId(hexCompanyId);
+		message.setCompanyId(hexCompanyId);
+
+		message.setTargetId(BytesUtil.tran_LH(BytesUtil.getTargetId(
+				request.getSerId(), true)));
+
+		message.setMessageType(BytesUtil.tran_LH(ServerUtils.MSG_TYPE_1123));
+	}
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1125.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1125.java
new file mode 100644
index 0000000..0344230
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1125.java
@@ -0,0 +1,73 @@
+package com.ld.igds.protocol.zldz.command.builder;
+
+import com.ld.igds.io.request.GrainSerConfRequest;
+import com.ld.igds.protocol.zldz.command.message.Message;
+import com.ld.igds.protocol.zldz.command.message.MessageBody;
+import com.ld.igds.protocol.zldz.util.ServerUtils;
+import com.ld.igds.util.BytesUtil;
+
+/**
+ * 绮儏鍒嗘満-鐢电紗妫�娴�
+ *
+ * @author Andy
+ */
+public class CommandBuilder1125 extends CommandBuilder {
+
+	private final static CommandBuilder1125 instance = new CommandBuilder1125();
+
+	private CommandBuilder1125() {
+
+	}
+
+	public static CommandBuilder1125 getInstance() {
+		return instance;
+	}
+
+	public Message buildMessage(GrainSerConfRequest request) {
+
+		Message message = new Message();
+
+		message.setBegin(ServerUtils.MSG_START);
+
+		// 璋冩暣Message澶撮儴淇℃伅
+		buildHeader(message, request);
+
+		// 鍖呭ご鏍¢獙
+		buildCrc8(message);
+
+		// 鍒涘缓娑堟伅浣�
+		buildBody(message, request);
+
+		// 娣诲姞鏍¢獙
+		buildCrc16(message);
+
+		message.setEnd(ServerUtils.MSG_END);
+
+		// 鐢熸垚鏁翠綋鍛戒护淇℃伅鍜孊Yte淇℃伅
+		build(message);
+
+		return message;
+	}
+
+	public void buildHeader(Message message, GrainSerConfRequest request) {
+		String hexCompanyId = BytesUtil.getTargetId(request.getCompanyId(),
+				true);
+		hexCompanyId = BytesUtil.tran_LH(hexCompanyId);
+
+		message.setSourceId(hexCompanyId);
+		message.setSendId(hexCompanyId);
+		message.setCompanyId(hexCompanyId);
+
+		message.setTargetId(BytesUtil.tran_LH(BytesUtil.getTargetId(
+				request.getSerId(), true)));
+		message.setMessageType(BytesUtil.tran_LH(ServerUtils.MSG_TYPE_1125));
+	}
+
+	public void buildBody(Message message, GrainSerConfRequest request) {
+		MessageBody body = new MessageBody();
+		body.setLength(1);
+		body.setContent(BytesUtil.toHexString(request.getPassCode()));
+		message.setBody(body);
+	}
+
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1126.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1126.java
new file mode 100644
index 0000000..13a1ed3
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1126.java
@@ -0,0 +1,100 @@
+package com.ld.igds.protocol.zldz.command.builder;
+
+import com.ld.igds.io.request.GrainSerConfRequest;
+import com.ld.igds.protocol.zldz.command.message.Message;
+import com.ld.igds.protocol.zldz.command.message.MessageBody;
+import com.ld.igds.protocol.zldz.util.ServerUtils;
+import com.ld.igds.util.BytesUtil;
+
+/**
+ * 绮儏鍒嗘満-淇敼閫氶亾鐢电紗
+ *
+ * @author Andy
+ */
+public class CommandBuilder1126 extends CommandBuilder {
+
+	private final static CommandBuilder1126 instance = new CommandBuilder1126();
+
+	private CommandBuilder1126() {
+
+	}
+
+	public static CommandBuilder1126 getInstance() {
+		return instance;
+	}
+
+	public Message buildMessage(GrainSerConfRequest request) {
+
+		Message message = new Message();
+
+		message.setBegin(ServerUtils.MSG_START);
+
+		// 璋冩暣Message澶撮儴淇℃伅
+		buildHeader(message, request);
+
+		// 鍖呭ご鏍¢獙
+		buildCrc8(message);
+
+		// 鍒涘缓娑堟伅浣�
+		buildBody(message, request);
+
+		// 娣诲姞鏍¢獙
+		buildCrc16(message);
+
+		message.setEnd(ServerUtils.MSG_END);
+
+		// 鐢熸垚鏁翠綋鍛戒护淇℃伅鍜孊Yte淇℃伅
+		build(message);
+
+		return message;
+	}
+
+	public void buildHeader(Message message, GrainSerConfRequest request) {
+		String hexCompanyId = BytesUtil.getTargetId(request.getCompanyId(),
+				true);
+		hexCompanyId = BytesUtil.tran_LH(hexCompanyId);
+
+		message.setSourceId(hexCompanyId);
+		message.setSendId(hexCompanyId);
+		message.setCompanyId(hexCompanyId);
+
+		message.setTargetId(BytesUtil.tran_LH(BytesUtil.getTargetId(
+				request.getSerId(), true)));
+		message.setMessageType(BytesUtil.tran_LH(ServerUtils.MSG_TYPE_1126));
+	}
+
+	public void buildBody(Message message, GrainSerConfRequest request) {
+		MessageBody body = new MessageBody();
+		body.setLength(5);
+		StringBuilder bodyStr = new StringBuilder();
+		// 淇敼鏍囪瘑
+		bodyStr.append(BytesUtil.toHexString(request.getEditTag()));
+		// 閫氶亾鍙�
+		bodyStr.append(BytesUtil.toHexString(request.getPassCode()));
+		// 鍒楀彿
+		bodyStr.append(BytesUtil.toHexString(request.getEditCol()));
+
+		// 鐐瑰簭鍙�/鍘熸牴鍙�/璧峰鏍瑰彿/鏍瑰簭鍙�
+		// 鏂扮偣鍙�/鏂版牴鍙�/鐢电紗灞傛暟/鏂版牴鍙�
+		if (6 == request.getEditTag()) {
+			bodyStr.append(BytesUtil.toHexString(request.getValue1()));
+			bodyStr.append(BytesUtil.toHexString(request.getValue2()));
+		} else if (5 == request.getEditTag()) {
+			bodyStr.append(BytesUtil.toHexString(request.getValue1()));
+			bodyStr.append(BytesUtil.toHexString(request.getValue2()));
+		} else if (4 == request.getEditTag()) {
+			bodyStr.append(BytesUtil.toHexString(request.getValue1()));
+			bodyStr.append(BytesUtil.toHexString(request.getValue2()));
+		} else if (2 == request.getEditTag()) {
+			bodyStr.append(BytesUtil.toHexString(request.getValue1()));
+			bodyStr.append(BytesUtil.toHexString(request.getValue2()));
+		} else {
+			bodyStr.append("00");
+			bodyStr.append("00");
+		}
+
+		body.setContent(bodyStr.toString());
+		message.setBody(body);
+	}
+
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1128.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1128.java
new file mode 100644
index 0000000..0f0af60
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1128.java
@@ -0,0 +1,74 @@
+package com.ld.igds.protocol.zldz.command.builder;
+
+import com.ld.igds.io.request.CheckThRequest;
+import com.ld.igds.protocol.zldz.command.message.Message;
+import com.ld.igds.protocol.zldz.command.message.MessageBody;
+import com.ld.igds.protocol.zldz.util.ServerUtils;
+import com.ld.igds.util.BytesUtil;
+
+
+/**
+ * 浠撴俯浠撴箍鍛戒护
+ *
+ * @author Andy
+ */
+public class CommandBuilder1128 extends CommandBuilder {
+
+
+    private final static CommandBuilder1128 instance = new CommandBuilder1128();
+
+    private CommandBuilder1128() {
+
+    }
+
+    public static CommandBuilder1128 getInstance() {
+        return instance;
+    }
+
+    public Message buildMessage(CheckThRequest request) {
+
+        Message message = new Message();
+
+        message.setBegin(ServerUtils.MSG_START);
+
+        // 璋冩暣Message澶撮儴淇℃伅
+        buildHeader(message, request);
+
+        //鍖呭ご鏍¢獙
+        buildCrc8(message);
+
+        // 鍒涘缓娑堟伅浣�
+        buildBody(message, request);
+
+        // 娣诲姞鏍¢獙
+        buildCrc16(message);
+
+        message.setEnd(ServerUtils.MSG_END);
+
+        // 鐢熸垚鏁翠綋鍛戒护淇℃伅鍜孊Yte淇℃伅
+        build(message);
+
+        return message;
+    }
+
+    public void buildHeader(Message message, CheckThRequest request) {
+        String hexCompanyId = BytesUtil.getTargetId(request.getCompanyId(), true);
+        hexCompanyId = BytesUtil.tran_LH(hexCompanyId);
+
+        message.setSourceId(hexCompanyId);
+        message.setSendId(hexCompanyId);
+        message.setCompanyId(hexCompanyId);
+
+        message.setTargetId(BytesUtil.tran_LH(BytesUtil.getTargetId(request.getSerId(), true)));
+        message.setMessageType(BytesUtil.tran_LH(ServerUtils.MSG_TYPE_1128));
+    }
+
+
+    public void buildBody(Message message, CheckThRequest request) {
+        MessageBody body = new MessageBody();
+        body.setLength(2);
+        body.setContent(BytesUtil.tran_LH(BytesUtil.getTargetId(request.getThConf(), true)));
+        message.setBody(body);
+    }
+
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder8815.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder8815.java
new file mode 100644
index 0000000..cc4d84f
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder8815.java
@@ -0,0 +1,41 @@
+package com.ld.igds.protocol.zldz.command.builder;
+
+import com.ld.igds.io.request.BaseRequest;
+import com.ld.igds.protocol.zldz.command.message.Message;
+import com.ld.igds.protocol.zldz.util.ServerUtils;
+import com.ld.igds.util.BytesUtil;
+
+
+/**
+ * 绮儏淇℃伅鍛戒护
+ *
+ * @author Andy
+ */
+public class CommandBuilder8815 extends CommandBuilder {
+
+
+    private final static CommandBuilder8815 instance = new CommandBuilder8815();
+
+    private CommandBuilder8815() {
+
+    }
+
+    public static CommandBuilder8815 getInstance() {
+        return instance;
+    }
+
+
+    public void buildHeader(Message message, BaseRequest request) {
+        String hexCompanyId = BytesUtil.getTargetId(request.getCompanyId(),true);
+        hexCompanyId = BytesUtil.tran_LH(hexCompanyId);
+
+        message.setSourceId(hexCompanyId);
+        message.setSendId(hexCompanyId);
+        message.setCompanyId(hexCompanyId);
+
+        message.setTargetId(BytesUtil.tran_LH(BytesUtil.getTargetId(request.getSerId(), true)));
+
+        message.setMessageType(BytesUtil.tran_LH(ServerUtils.MSG_TYPE_8815));
+    }
+
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder8817.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder8817.java
new file mode 100644
index 0000000..8185e2e
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder8817.java
@@ -0,0 +1,54 @@
+package com.ld.igds.protocol.zldz.command.builder;
+
+import com.ld.igds.io.request.BaseRequest;
+import com.ld.igds.protocol.zldz.command.message.Message;
+import com.ld.igds.protocol.zldz.command.message.MessageBody;
+import com.ld.igds.protocol.zldz.util.ServerUtils;
+import com.ld.igds.util.BytesUtil;
+
+
+/**
+ * 绮儏淇℃伅鍛戒护
+ *
+ * @author Andy
+ */
+public class CommandBuilder8817 extends CommandBuilder {
+
+
+    private final static CommandBuilder8817 instance = new CommandBuilder8817();
+
+    private CommandBuilder8817() {
+
+    }
+
+    public static CommandBuilder8817 getInstance() {
+        return instance;
+    }
+
+
+    public void buildHeader(Message message, BaseRequest request) {
+    	
+    	//request.setCompanyId("1");
+    	
+        String hexCompanyId = BytesUtil.getTargetId(request.getCompanyId(),true);
+        hexCompanyId = BytesUtil.tran_LH(hexCompanyId);
+
+        message.setSourceId(hexCompanyId);
+        message.setSendId(hexCompanyId);
+        message.setCompanyId(hexCompanyId);
+
+        message.setTargetId(BytesUtil.tran_LH(BytesUtil.getTargetId(request.getSerId(), true)));
+
+        message.setMessageType(BytesUtil.tran_LH(ServerUtils.MSG_TYPE_8817));
+    }
+
+
+    public void buildBody(Message message, BaseRequest request) {
+        MessageBody body = new MessageBody();
+        body.setContent(request.getBizType());
+        body.setLength(1);
+        message.setBody(body);
+    }
+
+
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder8829.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder8829.java
new file mode 100644
index 0000000..8364a41
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder8829.java
@@ -0,0 +1,73 @@
+package com.ld.igds.protocol.zldz.command.builder;
+
+import com.ld.igds.io.request.GrainSerConfRequest;
+import com.ld.igds.protocol.zldz.command.message.Message;
+import com.ld.igds.protocol.zldz.command.message.MessageBody;
+import com.ld.igds.protocol.zldz.util.ServerUtils;
+import com.ld.igds.util.BytesUtil;
+
+/**
+ * 绮儏鍒嗘満-鐢电紗姹囨��
+ *
+ * @author Andy
+ */
+public class CommandBuilder8829 extends CommandBuilder {
+
+	private final static CommandBuilder8829 instance = new CommandBuilder8829();
+
+	private CommandBuilder8829() {
+
+	}
+
+	public static CommandBuilder8829 getInstance() {
+		return instance;
+	}
+
+	public Message buildMessage(GrainSerConfRequest request) {
+
+		Message message = new Message();
+
+		message.setBegin(ServerUtils.MSG_START);
+
+		// 璋冩暣Message澶撮儴淇℃伅
+		buildHeader(message, request);
+
+		// 鍖呭ご鏍¢獙
+		buildCrc8(message);
+
+		// 鍒涘缓娑堟伅浣�
+		buildBody(message, request);
+
+		// 娣诲姞鏍¢獙
+		buildCrc16(message);
+
+		message.setEnd(ServerUtils.MSG_END);
+
+		// 鐢熸垚鏁翠綋鍛戒护淇℃伅鍜孊Yte淇℃伅
+		build(message);
+
+		return message;
+	}
+
+	public void buildHeader(Message message, GrainSerConfRequest request) {
+		String hexCompanyId = BytesUtil.getTargetId(request.getCompanyId(),
+				true);
+		hexCompanyId = BytesUtil.tran_LH(hexCompanyId);
+
+		message.setSourceId(hexCompanyId);
+		message.setSendId(hexCompanyId);
+		message.setCompanyId(hexCompanyId);
+
+		message.setTargetId(BytesUtil.tran_LH(BytesUtil.getTargetId(
+				request.getSerId(), true)));
+
+		message.setMessageType(BytesUtil.tran_LH(ServerUtils.MSG_TYPE_8829));
+	}
+	
+    public void buildBody(Message message, GrainSerConfRequest request) {
+        MessageBody body = new MessageBody();
+        body.setLength(1);
+        body.setContent(BytesUtil.toHexString(request.getValue1()));
+        message.setBody(body);
+    }
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/OnLineCommandBuilder.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/OnLineCommandBuilder.java
new file mode 100644
index 0000000..178e7cb
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/OnLineCommandBuilder.java
@@ -0,0 +1,40 @@
+package com.ld.igds.protocol.zldz.command.builder;
+
+import com.ld.igds.io.request.BaseRequest;
+import com.ld.igds.protocol.zldz.command.message.Message;
+import com.ld.igds.protocol.zldz.command.message.MessageBody;
+import com.ld.igds.protocol.zldz.util.ServerUtils;
+import com.ld.igds.util.BytesUtil;
+
+/**
+ *
+ * @author Andy
+ */
+public class OnLineCommandBuilder extends CommandBuilder {
+
+	private final static OnLineCommandBuilder instance = new OnLineCommandBuilder();
+
+	private OnLineCommandBuilder() {
+
+	}
+
+	public static OnLineCommandBuilder getInstance() {
+		return instance;
+	}
+
+	public void buildHeader(Message message, BaseRequest request) {
+		message.setSourceId("0000");
+		message.setSendId("0000");
+		message.setCompanyId("0000");
+		message.setTargetId("FFFF");
+		message.setMessageType(BytesUtil.tran_LH(ServerUtils.MSG_TYPE_1116));
+	}
+
+	public void buildBody(Message message, BaseRequest request) {
+		MessageBody body = new MessageBody();
+		body.setContent("0000000000000000000000000000");
+		body.setLength(14);
+		message.setBody(body);
+	}
+
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/message/Message.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/message/Message.java
new file mode 100644
index 0000000..cc0916a
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/message/Message.java
@@ -0,0 +1,52 @@
+package com.ld.igds.protocol.zldz.command.message;
+
+import lombok.Data;
+
+/**
+ * 瀛楃涓插�煎潎閲囩敤鍗佸叚杩涘埗锛屾柟渚挎牎楠屽拰寮�鍙�
+ */
+@Data
+public class Message {
+
+    private String begin;
+
+    private String sourceId;// 婧� ID
+
+    private String targetId="FFFF";// 鐩爣ID
+
+    private String sendId;//鍙戦�佽�匢D
+
+    private String gateway1 = "0100";//璺敱1
+
+    private String gateway2 = "0000";//璺敱2
+
+    private String messageType;// 娑堟伅绫诲瀷
+
+    private String result ="00";// 澶勭悊缁撴灉
+
+    private String companyId;// 缁勭粐缂栫爜
+
+    private String hexCrc8;//crc8鍖呭ご鏍¢獙
+
+    private MessageBody body;
+
+    private String hexCrc16;//crc16鏍¢獙
+
+    private String end;
+
+    private byte[] byteMsg;// 褰撳墠鍛戒护鐨勫瓧鑺備俊鎭�
+
+    private String strMsg;// 褰撳墠鍛戒护杞崲涓哄瓧绗︿覆鐨勪俊鎭�
+
+	@Override
+	public String toString() {
+		return "Message [sourceId=" + sourceId
+				+ ", targetId=" + targetId
+				+ ", messageType=" + messageType
+				+ ", result=" + result + ", companyId=" + companyId
+				+ ", hexCrc8=" + hexCrc8 + ", body=" + body + ", hexCrc16="
+				+ hexCrc16 + ", strMsg=" + strMsg + "]";
+	}
+    
+
+}
\ No newline at end of file
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/message/MessageBody.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/message/MessageBody.java
new file mode 100644
index 0000000..0e4f961
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/message/MessageBody.java
@@ -0,0 +1,13 @@
+package com.ld.igds.protocol.zldz.command.message;
+
+import lombok.Data;
+
+@Data
+public class MessageBody {
+
+    //榛樿10杩涘埗闀垮害
+    private int length = 0;
+
+    //娑堟伅浣撳唴瀹�
+    private String content = "";
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/mq/PublisherControl.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/mq/PublisherControl.java
new file mode 100644
index 0000000..325eb22
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/mq/PublisherControl.java
@@ -0,0 +1,42 @@
+package com.ld.igds.protocol.zldz.mq;
+
+import com.ld.igds.io.constant.ProtocolEnum;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+/**
+ * 鎺у埗缁堢浣滀负鍙戝竷鑰呭彂甯冧俊鎭紝鏈嶅姟绔綔涓鸿闃呰�呰闃咃紝閫氶亾瀹氫箟涓哄綋鍓嶅崗璁紪鐮�
+ */
+@Slf4j
+@Component(PublisherControl.BEAN_ID)
+public class PublisherControl {
+
+    public static final String BEAN_ID = "zldz.redisPublisher";
+
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+
+
+    /**
+     * 姝e父杩斿洖淇℃伅鑾峰彇
+     *
+     * @param reMessage
+     */
+    public void publishMessage(String reMessage) {
+        redisTemplate.convertAndSend(ProtocolEnum.TCP_ZLDZ_GRAIN_V1.getCode(), reMessage);
+        log.debug("-----------鎶ユ枃淇℃伅瀛樺叆闃熷垪------{}", reMessage);
+    }
+
+    /**
+     * 鐧诲綍淇℃伅鑾峰彇
+     *
+     * @param sessionKey
+     */
+    public void publishLoginMessage(String sessionKey) {
+        redisTemplate.convertAndSend(ProtocolEnum.TCP_ZLDZ_GRAIN_V1.getCode() + "_LOGIN", sessionKey);
+        log.debug("-----------鐧诲綍淇℃伅瀛樺叆闃熷垪------{}", sessionKey);
+    }
+
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/mq/ReceiverServer.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/mq/ReceiverServer.java
new file mode 100644
index 0000000..ab0bed4
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/mq/ReceiverServer.java
@@ -0,0 +1,90 @@
+package com.ld.igds.protocol.zldz.mq;
+
+import com.ld.igds.io.request.BaseRequest;
+import com.ld.igds.protocol.zldz.analysis.AnalysisService;
+import com.ld.igds.protocol.zldz.command.builder.OnLineCommandBuilder;
+import com.ld.igds.protocol.zldz.command.message.Message;
+import com.ld.igds.protocol.zldz.server.ZldzServerEngine;
+import com.ld.igds.protocol.zldz.util.ServerUtils;
+import com.ld.io.api.InvokeResult;
+import com.ld.io.api.IoSession;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.RandomUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.concurrent.CountDownLatch;
+
+/**
+ * 鎶ユ枃鎺ュ彈鍒板悗澶勭悊
+ */
+@Slf4j
+public class ReceiverServer {
+
+    private CountDownLatch latch;
+
+    @Autowired
+    public ReceiverServer(CountDownLatch latch) {
+        this.latch = latch;
+    }
+
+    @Autowired
+    private AnalysisService analysisService;
+
+
+
+
+    public void onMessage(String message) {
+    	message = message.replaceAll("\"", "");
+        log.info("-------鑾峰彇闃熷垪淇℃伅---" + message);
+        try {
+            String[] attr = message.split("_");
+            String sessionKey = attr[0];
+            String msg = attr[1];
+            analysisService.analysis2(sessionKey, msg);
+        } catch (Exception e) {
+            latch.countDown();
+            log.error("[姝f潵鐢靛瓙--娑堟伅闃熷垪鏁版嵁澶辫触锛屽け璐ヤ俊鎭�:{}]", e.getMessage(),e);
+        }
+        latch.countDown();
+    }
+
+
+    public void onLoginMessage(String sessionKey) {
+        log.info("-------鑾峰彇鐧诲綍闃熷垪淇℃伅---{}", sessionKey);
+        try {
+        	sessionKey = sessionKey.replaceAll("\"", "");
+            String[] attr = sessionKey.split(":");
+            IoSession session = ZldzServerEngine.getSession(attr[0],Integer.valueOf(attr[1]));
+
+            if (null == session) {
+                log.warn("---------------娌℃湁鑾峰彇鍒颁細璇濅俊鎭�-------------{}", sessionKey);
+                latch.countDown();
+                return;
+            }
+
+            long l = RandomUtils.nextInt(1000, 9999);
+            Thread.sleep(l);
+
+            BaseRequest request = new BaseRequest();
+            request.setIp(session.getAddress());
+            request.setPort(session.getPort());
+            request.setCompanyId(ServerUtils.DEFAULT_COMPANY);
+            
+            // Step1 鐢熸垚鍦ㄧ嚎娴嬭瘯鍛戒护
+            Message message = OnLineCommandBuilder.getInstance().buildMessage(request);
+            // 鍙戦�佸懡浠�
+            InvokeResult result = session.invoke(message.getByteMsg());
+
+            //濡傛灉鍛戒护鍙戦�佸け璐ワ紝鐩存帴韪㈡帀杩炴帴
+            if (!InvokeResult.SUCCESS.getCode().equals(result.getCode())) {
+                session.destroy();
+            }
+        } catch (Exception e) {
+            latch.countDown();
+            log.error("[姝f潵鐢靛瓙--鐧诲綍娑堟伅闃熷垪鏁版嵁澶辫触锛屽け璐ヤ俊鎭�:{}]", e.getMessage());
+        }
+        latch.countDown();
+    }
+
+
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/mq/RedisSubConfig.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/mq/RedisSubConfig.java
new file mode 100644
index 0000000..f71aedd
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/mq/RedisSubConfig.java
@@ -0,0 +1,75 @@
+package com.ld.igds.protocol.zldz.mq;
+
+import com.ld.igds.io.constant.ProtocolEnum;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.listener.PatternTopic;
+import org.springframework.data.redis.listener.RedisMessageListenerContainer;
+import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
+
+import java.util.concurrent.CountDownLatch;
+
+/**
+ * 娑堟伅璁㈤槄閰嶇疆
+ */
+@Configuration
+public class RedisSubConfig {
+
+    /**
+     * 鍒涘缓杩炴帴宸ュ巶
+     *
+     * @param connectionFactory
+     * @return
+     */
+    @Bean
+    public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
+                                                   MessageListenerAdapter adapter1,
+                                                   MessageListenerAdapter adapter2) {
+        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
+        container.setConnectionFactory(connectionFactory);
+
+        //鐩戝惉瀵瑰簲鐨刢hannel
+        container.addMessageListener(adapter1, new PatternTopic(ProtocolEnum.TCP_ZLDZ_GRAIN_V1.getCode()));
+
+        //鐩戝惉瀵瑰簲鐨刢hannel
+        container.addMessageListener(adapter2, new PatternTopic(ProtocolEnum.TCP_ZLDZ_GRAIN_V1.getCode() + "_LOGIN"));
+
+        return container;
+    }
+
+    /**
+     * 缁戝畾娑堟伅鐩戝惉鑰呭拰鎺ユ敹鐩戝惉鐨勬柟娉�
+     *
+     * @param receiver
+     * @return
+     */
+    @Bean
+    public MessageListenerAdapter adapter1(ReceiverServer receiver) {
+        return new MessageListenerAdapter(receiver, "onMessage");
+    }
+
+    /**
+     * 缁戝畾娑堟伅鐩戝惉鑰呭拰鎺ユ敹鐩戝惉鐨勬柟娉�
+     *
+     * @param receiver
+     * @return
+     */
+    @Bean
+    public MessageListenerAdapter adapter2(ReceiverServer receiver) {
+        return new MessageListenerAdapter(receiver, "onLoginMessage");
+    }
+
+
+    @Bean
+    ReceiverServer receiver(CountDownLatch latch) {
+        return new ReceiverServer(latch);
+    }
+
+
+    @Bean
+    public CountDownLatch latch() {
+        return new CountDownLatch(1);//鎸囧畾浜嗚鏁扮殑娆℃暟 1
+    }
+
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/package-info.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/package-info.java
new file mode 100644
index 0000000..071fa0f
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/package-info.java
@@ -0,0 +1,6 @@
+
+/**
+ * 姝f潵鐢靛瓙-绮儏鍗忚V1
+ *
+ */
+package com.ld.igds.protocol.zldz;
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/server/HeartbeatProviderImpl.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/server/HeartbeatProviderImpl.java
new file mode 100644
index 0000000..4a6e458
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/server/HeartbeatProviderImpl.java
@@ -0,0 +1,45 @@
+package com.ld.igds.protocol.zldz.server;
+
+import com.ld.igds.common.CoreSerService;
+import com.ld.igds.models.DeviceSer;
+import com.ld.igds.util.SpringUtil;
+import com.ld.io.api.HeartbeatProvider;
+import com.ld.io.api.IoSession;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+
+/**
+ * 蹇冭烦缁存寔锛岄獙璇佸綋鍓嶈繛鎺ヤ腑鐨処P鍦ㄦ湇鍔″櫒涓婇厤缃殑鏈夋病鏈夛紝濡傛灉鏈夊垯琛ㄧず姝e父杩炴帴锛屽鏋滄病鏈夊垯韪㈤櫎杩炴帴銆�
+ * <p>
+ * 濡傛灉鏈夋甯稿績璺筹紝鍒欏彂閫佹甯稿績璺冲懡浠わ紝濡傛灉娌℃湁鍒欏彂閫佽澶囩姸鎬佹煡璇紝
+ */
+@Slf4j
+public class HeartbeatProviderImpl implements HeartbeatProvider {
+
+    private CoreSerService serService;
+
+    @Override
+    public byte[] provide(IoSession session) {
+
+        log.debug("========绯荤粺寮�濮嬫墽琛屽績璺�=========={}---{}", session.getCompanyId(), session.getBusinessKey());
+
+        if (null == serService) {
+            serService = SpringUtil.getBean(CoreSerService.class);
+        }
+
+        DeviceSer ser = null;
+        String companyId = session.getCompanyId();
+        if (StringUtils.isNotEmpty(companyId)) {
+            ser = serService.getCacheSerByIp(companyId, session.getAddress(), session.getPort());
+        }
+
+        if (null == ser) {
+            log.error("========蹇冭烦鎵ц娌℃湁鑾峰彇鍒板垎鏈轰俊鎭�======IP={}-{}锛屽彇娑堣涪鍑猴紝鍙仛鏃ュ織鎻愰啋銆�", session.getAddress(), session.getPort());
+            session.destroy();
+            return null;
+        }
+        return null;
+    }
+
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/server/MsgConsumer.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/server/MsgConsumer.java
new file mode 100644
index 0000000..d6d6480
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/server/MsgConsumer.java
@@ -0,0 +1,46 @@
+package com.ld.igds.protocol.zldz.server;
+
+import com.ld.igds.protocol.zldz.mq.PublisherControl;
+import com.ld.igds.protocol.zldz.util.ServerUtils;
+import com.ld.igds.util.BytesUtil;
+import com.ld.igds.util.SpringUtil;
+import com.ld.io.api.IoMsgConsumer;
+import com.ld.io.api.IoSession;
+
+/**
+ * 鎺ユ敹缁堢杩斿洖鍥炴潵鐨勪俊鎭��
+ *
+ * @author Andy
+ */
+public class MsgConsumer implements IoMsgConsumer {
+
+	// private AnalysisService analysisService;
+
+	private PublisherControl publisherControl;
+
+	@Override
+	public void consume(IoSession session, byte[] bytes) {
+
+		// 璋冪敤瑙f瀽鎺ュ彛寮�濮嬭В鏋�
+		// if(null == analysisService){
+		// analysisService = (AnalysisService)
+		// SpringUtil.getBean(AnalysisService.BEAN_ID);
+		// }
+		// analysisService.analysis(session.getAddress(),session.getPort(),bytes);
+
+		// 2021骞�6鏈�9鏃� 璋冩暣涓烘秷鎭槦鍒楀鐞�
+		if (null == publisherControl) {
+			publisherControl = SpringUtil.getBean(PublisherControl.class);
+		}
+
+		String strMsg = BytesUtil.bytesToString(bytes) + ServerUtils.MSG_END;
+
+		// 浜屾璋冩暣鎶ユ枃
+		if (!strMsg.startsWith(ServerUtils.MSG_START)) {
+			strMsg = strMsg.substring(strMsg.indexOf(ServerUtils.MSG_START));
+		}
+
+		publisherControl.publishMessage(session.getBusinessKey() + "_" + strMsg);
+	}
+
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/server/SessionListener.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/server/SessionListener.java
new file mode 100644
index 0000000..c09ec88
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/server/SessionListener.java
@@ -0,0 +1,40 @@
+package com.ld.igds.protocol.zldz.server;
+
+import com.ld.igds.io.notify.ServerNotifyInvoker;
+import com.ld.igds.protocol.zldz.command.BaseRemoteImpl;
+import com.ld.igds.protocol.zldz.mq.PublisherControl;
+import com.ld.igds.protocol.zldz.util.ServerUtils;
+import com.ld.igds.util.SpringUtil;
+import com.ld.io.api.IoSession;
+import com.ld.io.api.IoSessionListener;
+
+public class SessionListener extends BaseRemoteImpl implements IoSessionListener {
+
+    public static final String BEAN_ID = "zldz.sessionListener";
+
+    private ServerNotifyInvoker serverNotifyInvoker;
+
+    private PublisherControl publisherControl;
+
+    @Override
+    public void onCreate(IoSession session) {
+
+        // 娣诲姞鑷畾涔変笟鍔D
+        session.setBusinessKey(ServerUtils.getServerKey(session.getAddress(), session.getPort()));
+
+        //2021骞�6鏈�9鏃� 璋冩暣浣跨敤涓洪槦鍒�
+        if (null == publisherControl) {
+            publisherControl = SpringUtil.getBean(PublisherControl.class);
+        }
+        publisherControl.publishLoginMessage(session.getBusinessKey());
+    }
+
+    @Override
+    public void onDestroy(IoSession session) {
+        if (null == serverNotifyInvoker) {
+            serverNotifyInvoker = SpringUtil.getBean(ServerNotifyInvoker.class);
+        }
+        serverNotifyInvoker.connectDestory(session.getBusinessKey(),
+                session.getAddress(), session.getPort());
+    }
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/server/ZldzServerEngine.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/server/ZldzServerEngine.java
new file mode 100644
index 0000000..0c54762
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/server/ZldzServerEngine.java
@@ -0,0 +1,113 @@
+package com.ld.igds.protocol.zldz.server;
+
+import com.ld.igds.protocol.zldz.util.ServerUtils;
+import com.ld.igds.util.BytesUtil;
+import com.ld.io.api.*;
+import com.ld.io.netty.NettyServer;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+
+/**
+ * 閰嶇疆涓绘湇鍔′俊鎭�
+ *
+ * @author Andy 2019骞�10鏈�4鏃� 鏂板
+ */
+@Slf4j
+public class ZldzServerEngine {
+
+    public static final int PORT = 8000;
+
+    public static NettyServer ioServer = null;
+    // 閰嶇疆娑堟伅鎺ユ敹绫�
+    private static MsgConsumer messageConsume = new MsgConsumer();
+    // 鐩戝惉浼氳瘽鐨勫垱寤轰笌閿�姣�
+    private static SessionListener ioSessionListener = new SessionListener();
+
+    // 蹇冭烦鎻愪緵 锛岃鏈嶅姟涓嶉渶瑕佸績璺崇淮鎸�
+    private static HeartbeatProvider heartbeatProvider = new HeartbeatProviderImpl();
+
+
+    public static void start() {
+        start(PORT);
+    }
+
+    public static void start(int port) {
+        // 閰嶇疆Server鐨勯厤缃�
+        IoServerOption ioServerOption = new IoServerOption(port);
+
+        ioServerOption.setSplitDecoderType(SplitByteDecoderType.DELIMITER_SYMBOL);
+        ioServerOption.setDelimiter(BytesUtil.hexStrToBytes(ServerUtils.MSG_END));
+
+        // 閰嶇疆蹇冭烦鎵ц鏃堕棿
+        ioServerOption.setReaderIdleTime(60 * 60);
+
+        ioServer = new NettyServer(ioServerOption, messageConsume, ioSessionListener, heartbeatProvider);
+
+        ioServer.startup();
+
+        log.info("* ========================");
+        log.info("* ");
+        log.info("* 绾伯鎯呭崗璁紝绔彛鍙�={}", port);
+        log.info("* ");
+        log.info("* ========================");
+
+
+        System.out.println("* ========================");
+        System.out.println("* ");
+        System.out.println("* 绾伯鎯呭崗璁紝绔彛鍙�=" + port);
+        System.out.println("* ");
+        System.out.println("* ========================");
+    }
+
+    /**
+     * 鍙戦�佷俊鎭�
+     *
+     * @param ip
+     * @param port
+     * @param msg
+     * @return
+     */
+    public static InvokeResult push(String ip, int port, byte[] msg) {
+        IoSession session = getSession(ip, port);
+        if (null == session) {
+            return InvokeResult.CHANNEL_CLOSED;
+        }
+        return session.invoke(msg);
+    }
+
+    /**
+     * 涓诲姩閿�姣佸綋鍓嶈繛鎺�
+     *
+     * @param ip
+     * @param port
+     * @return
+     */
+    public static InvokeResult destory(String ip, int port) {
+        IoSession session = getSession(ip, port);
+
+        if (null == session) {
+            return InvokeResult.SUCCESS;
+        }
+        // 鎵ц杩炴帴閿�姣�
+        session.destroy();
+        return InvokeResult.SUCCESS;
+    }
+
+    /**
+     * 鏍规嵁SessionKey鑾峰彇Session淇℃伅
+     *
+     * @param ip
+     * @return
+     */
+    public static IoSession getSession(String ip, int port) {
+        IoSessionQuery sessionFactory = ioServer.getSessionQuery();
+        List<IoSession> sessions = sessionFactory.getAllSession();
+        for (IoSession ioSession : sessions) {
+            if (ip.equals(ioSession.getAddress()) && port == ioSession.getPort()) {
+                return ioSession;
+            }
+        }
+        return null;
+    }
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/task/CommandReSendService.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/task/CommandReSendService.java
new file mode 100644
index 0000000..018f342
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/task/CommandReSendService.java
@@ -0,0 +1,145 @@
+package com.ld.igds.protocol.zldz.task;
+
+import com.ld.igds.io.request.CheckGrainRequest;
+import com.ld.igds.io.request.CheckThRequest;
+import com.ld.igds.protocol.zldz.command.BaseRemoteImpl;
+import com.ld.igds.protocol.zldz.util.ServerUtils;
+import com.ld.igds.util.RedisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.FutureTask;
+
+/**
+ * 鍛戒护閲嶅彂
+ */
+@Slf4j
+@Component(CommandReSendService.BEAN_ID)
+public class CommandReSendService extends BaseRemoteImpl {
+
+	public static final String BEAN_ID = "zldz.commandReSendService";
+
+	public static final String REDIS_KEY_RESEND_COMMAND = "REDIS_KEY_RESEND_COMMAND";
+
+	public static final String REDIS_KEY_TH_QUEEN = "REDIS_KEY_TH_QUEEN";
+
+	public static final int REDIS_KEY_TIME = 4 * 60;
+
+	@Autowired
+	private RedisUtil redisUtil;
+
+	public String buildKey(CommandTask data) {
+		return buildKey(data.getCompanyId(), data.getIp(), data.getPort(),
+				data.getResultType());
+	}
+
+	public String buildKey(String companyId, String ip, int port,
+			String resultType) {
+		String key = ip + "." + port + ":" + resultType;
+		return companyId + ":" + REDIS_KEY_RESEND_COMMAND + ":" + key;
+	}
+
+	public void reSendTask(CommandTask data) {
+		// 缂撳瓨
+		redisUtil.set(buildKey(data), data, REDIS_KEY_TIME);
+
+		// 鍒涘缓瀛愪换鍔�
+		FutureTask<String> futureTask = new FutureTask<>(new ReSendCommonTask(data, redisUtil, buildKey(data)));
+		ExecutorService executorService = Executors.newCachedThreadPool();
+		executorService.submit(futureTask);
+		executorService.shutdown();
+	}
+
+	// 娓╂箍搴﹀懡浠や笉浣跨敤瀛愪换鍔�
+	public void reSendThTask(CommandTask data) {
+		// 缂撳瓨
+		redisUtil.set(buildKey(data), data, REDIS_KEY_TIME);
+	}
+
+	public void reSendGrainTask(CommandTask data) {
+		// 缂撳瓨
+		redisUtil.set(buildKey(data), data, REDIS_KEY_TIME);
+
+		// 鍒涘缓瀛愪换鍔�
+		FutureTask<String> futureTask = new FutureTask<>(new ReSendGrainTask(
+				data, redisUtil, buildKey(data)));
+		ExecutorService executorService = Executors.newCachedThreadPool();
+		executorService.submit(futureTask);
+		executorService.shutdown();
+	}
+
+	public void cleanKey(String companyId, String ip, int port,
+			String resultType) {
+
+		String key = buildKey(companyId, ip, port, resultType);
+		redisUtil.del(key);
+	}
+
+	public void destoryAndDelCache(String companyId, String ip, Integer port,
+			String messageType) {
+		try {
+			// 绮儏鐩存帴浣跨敤鏈�鎬荤殑鐘舵�佽繑鍥�
+			if (messageType.equals(ServerUtils.MSG_TYPE_1115)) {
+				messageType = ServerUtils.MSG_TYPE_8817;
+			}
+			this.cleanKey(companyId, ip, port, messageType);
+
+			//闂撮殧5S韪㈠嚭锛岄伩鍏嶅揩閫熺洿鎺ヨ繛鎺�
+			Thread.sleep(5 * 1000);
+			
+			super.destory(ip, port);
+
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void reSend(String companyId, String ip, int port, String resultType) {
+		String key = buildKey(companyId, ip, port, resultType);
+		CommandTask commandData = (CommandTask) redisUtil.get(key);
+		if (null != commandData) {
+			super.send(ip, port, commandData.getByteCommand());
+		} else {
+			log.error("鍛戒护閲嶅彂澶辫触锛歿}-{}-{}娌℃湁鑾峰彇鍒板懡浠ゃ��", ip, port, resultType);
+		}
+	}
+
+	public CommandTask getRedisCommand(String companyId, String ip,
+			Integer port, String resultType) {
+		String key = this.buildKey(companyId, ip, port, resultType);
+		return (CommandTask) redisUtil.get(key);
+	}
+
+	/**
+	 * 褰撳墠鍒嗘満鐩稿悓绮儏鍒嗘満鐨勭瓑寰呴槦鍒�
+	 *
+	 * @param thRequest
+	 * @param request
+	 */
+	public void addToThQueen(CheckThRequest thRequest, CheckGrainRequest request) {
+		String key = thRequest.getCompanyId() + ":" + REDIS_KEY_TH_QUEEN + ":"
+				+ thRequest.getSerId();
+
+		List<CheckGrainRequest> list = this.getThQueen(
+				thRequest.getCompanyId(), thRequest.getSerId());
+		if (null == list) {
+			list = new ArrayList<>();
+		}
+
+		list.add(request);
+
+		redisUtil.set(key, list, 60);
+	}
+
+	@SuppressWarnings("unchecked")
+	public List<CheckGrainRequest> getThQueen(String companyId, String serId) {
+		String key = companyId + ":" + REDIS_KEY_TH_QUEEN + ":" + serId;
+		return (List<CheckGrainRequest>) redisUtil.get(key);
+	}
+
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/task/CommandTask.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/task/CommandTask.java
new file mode 100644
index 0000000..b2545e5
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/task/CommandTask.java
@@ -0,0 +1,31 @@
+package com.ld.igds.protocol.zldz.task;
+
+import lombok.Data;
+
+/**
+ * 鐢ㄤ簬瀛樻斁鍙戦�佺殑鍛戒护淇℃伅锛屽瓨鏀惧埌缂撳瓨涓�
+ */
+@Data
+public class CommandTask {
+
+    private String companyId;
+
+    private String depotId;//鎵ц浠撳簱
+
+    private String serName;
+
+    private String ip = "";
+
+    private int port = 0;
+
+    private String command; //鍙戦�佺殑鍛戒护
+
+    private byte[] byteCommand; //鍙戦�佺殑鍛戒护
+
+    private String resultType;//绛夊緟杩斿洖鐨勫懡浠ょ被鍨�
+
+    private int sendNum = 1;//鍙戦�佹鏁�
+    
+    private String cableRule;
+
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/task/ReSendCommonTask.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/task/ReSendCommonTask.java
new file mode 100644
index 0000000..974e882
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/task/ReSendCommonTask.java
@@ -0,0 +1,95 @@
+package com.ld.igds.protocol.zldz.task;
+
+import com.ld.igds.protocol.zldz.command.BaseRemoteImpl;
+import com.ld.igds.util.RedisUtil;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.concurrent.Callable;
+
+/**
+ * 瀛愪换鍔★紝鐢ㄤ簬鍒ゆ柇閲嶅彂鍜屽紓甯稿鐞嗭紝鍛戒护鍙戦�佸悗灏嗗懡浠や俊鎭瓨鏀剧紦瀛橈紝褰撳墠
+ *
+ * @author andy.jia
+ */
+@Slf4j
+public class ReSendCommonTask extends BaseRemoteImpl implements Callable<String> {
+
+    private CommandTask commandData;
+
+    private RedisUtil redisUtil;
+
+    private String redisKey;
+
+    public RedisUtil getRedisUtil() {
+        return redisUtil;
+    }
+
+    public void setRedisUtil(RedisUtil redisUtil) {
+        this.redisUtil = redisUtil;
+    }
+
+    public String getRedisKey() {
+        return redisKey;
+    }
+
+    public void setRedisKey(String redisKey) {
+        this.redisKey = redisKey;
+    }
+
+    public void setCommandData(CommandTask commandData) {
+        this.commandData = commandData;
+    }
+
+    public CommandTask getCommandData() {
+        return commandData;
+    }
+
+    public ReSendCommonTask() {
+        super();
+    }
+
+    public ReSendCommonTask(CommandTask commandData, RedisUtil redisUtil, String redisKey) {
+        super();
+        this.commandData = commandData;
+        this.redisUtil = redisUtil;
+        this.redisKey = redisKey;
+    }
+
+    @Override
+    public String call() throws Exception {
+
+        //1,鑾峰彇缂撳瓨涓俊鎭�
+        Thread.sleep(15 * 1000);
+
+        CommandTask redisData = (CommandTask) redisUtil.get(redisKey);
+        if (null == redisData) {
+            return "鍛戒护绗�1娆$瓑寰咃紝缁堢宸茬粡姝e父杩斿洖";
+        } else {
+            log.info("{}-绗�1娆″懡浠よˉ鍙戝懡浠�={}", commandData.getIp(), commandData.getCommand());
+            super.send(commandData.getIp(), commandData.getPort(), commandData.getByteCommand());
+        }
+
+        //2锛岀瓑寰�20S
+        Thread.sleep(15 * 1000);
+        redisData = (CommandTask) redisUtil.get(redisKey);
+        if (null == redisData) {
+            return "鍛戒护绗�2娆$瓑绛夛紝缁堢宸茬粡姝e父杩斿洖";
+        } else {
+            log.info("{}-绗�2娆″懡浠よˉ鍛戒护={}", commandData.getIp(), commandData.getCommand());
+            super.send(commandData.getIp(), commandData.getPort(), commandData.getByteCommand());
+        }
+
+        //2锛岀瓑寰�20S
+        Thread.sleep(15 * 1000);
+        redisData = (CommandTask) redisUtil.get(redisKey);
+        if (null == redisData) {
+            return "鍛戒护绗�3娆$瓑绛夛紝缁堢宸茬粡姝e父杩斿洖";
+        } else {
+            log.info("{}-绗�3娆″懡浠よˉ鍙戝悗锛屼粛鐒舵病鏈夎繑鍥烇紝鍙栨秷绛夊緟銆�", commandData.getIp());
+            //super.destory(commandData.getIp(), commandData.getPort());
+        }
+
+        return "瀛愪换鍔℃墽琛屽畬鎴�";
+    }
+
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/task/ReSendGrainTask.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/task/ReSendGrainTask.java
new file mode 100644
index 0000000..accb15f
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/task/ReSendGrainTask.java
@@ -0,0 +1,99 @@
+package com.ld.igds.protocol.zldz.task;
+
+import com.ld.igds.protocol.zldz.command.BaseRemoteImpl;
+import com.ld.igds.util.RedisUtil;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.concurrent.Callable;
+
+/**
+ * 绮儏瀛愪换鍔★紝绮儏瀛愪换鍔★紝蹇界暐8815鐨勫洖澶嶅拰8817鐨勫洖澶嶏紝鐩存帴绛夌粨鏋滃寘鐨勫埌杈撅紝濡傛灉缁撴灉鍖呮病鏈夊埌杈撅紝灏遍噸澶嶅彂閫佺伯鎯呰姹�
+ *
+ * @author andy.jia
+ */
+@Slf4j
+public class ReSendGrainTask extends BaseRemoteImpl implements Callable<String> {
+
+    private CommandTask commandData;
+
+    private RedisUtil redisUtil;
+
+    private String redisKey;
+
+    public RedisUtil getRedisUtil() {
+        return redisUtil;
+    }
+
+    public void setRedisUtil(RedisUtil redisUtil) {
+        this.redisUtil = redisUtil;
+    }
+
+    public String getRedisKey() {
+        return redisKey;
+    }
+
+    public void setRedisKey(String redisKey) {
+        this.redisKey = redisKey;
+    }
+
+    public void setCommandData(CommandTask commandData) {
+        this.commandData = commandData;
+    }
+
+    public CommandTask getCommandData() {
+        return commandData;
+    }
+
+    public ReSendGrainTask() {
+        super();
+    }
+
+    public ReSendGrainTask(CommandTask commandData, RedisUtil redisUtil, String redisKey) {
+        super();
+        this.commandData = commandData;
+        this.redisUtil = redisUtil;
+        this.redisKey = redisKey;
+    }
+
+    @Override
+    public String call() throws Exception {
+    	
+    	String[] attCable = commandData.getCableRule().split("-");
+        int cableZ = Integer.valueOf(attCable[0]);
+        int cableY = Integer.valueOf(attCable[1]);
+        int cableX = Integer.valueOf(attCable[2]);
+
+        int point = cableX * cableY * cableZ;
+        long time = point * 100 + (point / 100) * 500;
+
+        //1,绮儏绗�1娆$瓑寰呮椂闂翠负閲囬泦鐐逛釜鏁�* 0.1 绉� + 20绉掞紝濡傛灉娌℃湁姝e父杩斿洖鍒欏彂閫佺浜屾鍛戒护銆�
+        Thread.sleep(time);
+        CommandTask redisData = (CommandTask) redisUtil.get(redisKey);
+        if (null == redisData) {
+            return "鍛戒护绗�1娆$瓑寰咃紝缁堢宸茬粡姝e父杩斿洖";
+        } else {
+            String msg = commandData.getSerName() + " 绗�1娆¤ˉ鍙戝懡浠�=" + commandData.getCommand();
+            log.info(msg);
+
+            super.send(commandData.getIp(), commandData.getPort(), commandData.getByteCommand());
+        }
+
+        //2
+        Thread.sleep(time);
+        redisData = (CommandTask) redisUtil.get(redisKey);
+        if (null == redisData) {
+            return "鍛戒护绗�2娆$瓑绛夛紝缁堢宸茬粡姝e父杩斿洖";
+        } else {
+            String msg = commandData.getSerName() + " 绗�2娆¤ˉ鍙戠伯鎯呭懡浠わ紝娌℃湁杩斿洖锛岀郴缁熸柇寮�褰撳墠杩炴帴銆�";
+            log.info(msg);
+
+//            ExeOrderService orderService = SpringUtil.getBean(ExeOrderService.class);
+//            orderService.progressError(commandData.getCompanyId(), BizType.GRAIN, commandData.getDepotId(), msg);
+
+            //2021骞�6鏈�5鏃� 07:30:22 鍙栨秷瓒呮椂韪㈠嚭杩炴帴
+           // super.destory(commandData.getIp(), commandData.getPort());
+        }
+        return "瀛愪换鍔℃墽琛屽畬鎴�";
+    }
+
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/util/CRC16.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/util/CRC16.java
new file mode 100644
index 0000000..3492e68
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/util/CRC16.java
@@ -0,0 +1,135 @@
+package com.ld.igds.protocol.zldz.util;
+
+/***
+ * 
+ * @author Andy
+ *
+ */
+public class CRC16 {
+	
+	static byte[] crc16_tab_h = { (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
+			(byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
+			(byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
+			(byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
+			(byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
+			(byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
+			(byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
+			(byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
+			(byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
+			(byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
+			(byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
+			(byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
+			(byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
+			(byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
+			(byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
+			(byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
+			(byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
+			(byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
+			(byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
+			(byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
+			(byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
+			(byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
+			(byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
+			(byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
+			(byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
+			(byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
+			(byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
+			(byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
+			(byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
+			(byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
+			(byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
+			(byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
+			(byte) 0x81, (byte) 0x40 };
+
+	static byte[] crc16_tab_l = { (byte) 0x00, (byte) 0xC0, (byte) 0xC1, (byte) 0x01, (byte) 0xC3, (byte) 0x03,
+			(byte) 0x02, (byte) 0xC2, (byte) 0xC6, (byte) 0x06, (byte) 0x07, (byte) 0xC7, (byte) 0x05, (byte) 0xC5,
+			(byte) 0xC4, (byte) 0x04, (byte) 0xCC, (byte) 0x0C, (byte) 0x0D, (byte) 0xCD, (byte) 0x0F, (byte) 0xCF,
+			(byte) 0xCE, (byte) 0x0E, (byte) 0x0A, (byte) 0xCA, (byte) 0xCB, (byte) 0x0B, (byte) 0xC9, (byte) 0x09,
+			(byte) 0x08, (byte) 0xC8, (byte) 0xD8, (byte) 0x18, (byte) 0x19, (byte) 0xD9, (byte) 0x1B, (byte) 0xDB,
+			(byte) 0xDA, (byte) 0x1A, (byte) 0x1E, (byte) 0xDE, (byte) 0xDF, (byte) 0x1F, (byte) 0xDD, (byte) 0x1D,
+			(byte) 0x1C, (byte) 0xDC, (byte) 0x14, (byte) 0xD4, (byte) 0xD5, (byte) 0x15, (byte) 0xD7, (byte) 0x17,
+			(byte) 0x16, (byte) 0xD6, (byte) 0xD2, (byte) 0x12, (byte) 0x13, (byte) 0xD3, (byte) 0x11, (byte) 0xD1,
+			(byte) 0xD0, (byte) 0x10, (byte) 0xF0, (byte) 0x30, (byte) 0x31, (byte) 0xF1, (byte) 0x33, (byte) 0xF3,
+			(byte) 0xF2, (byte) 0x32, (byte) 0x36, (byte) 0xF6, (byte) 0xF7, (byte) 0x37, (byte) 0xF5, (byte) 0x35,
+			(byte) 0x34, (byte) 0xF4, (byte) 0x3C, (byte) 0xFC, (byte) 0xFD, (byte) 0x3D, (byte) 0xFF, (byte) 0x3F,
+			(byte) 0x3E, (byte) 0xFE, (byte) 0xFA, (byte) 0x3A, (byte) 0x3B, (byte) 0xFB, (byte) 0x39, (byte) 0xF9,
+			(byte) 0xF8, (byte) 0x38, (byte) 0x28, (byte) 0xE8, (byte) 0xE9, (byte) 0x29, (byte) 0xEB, (byte) 0x2B,
+			(byte) 0x2A, (byte) 0xEA, (byte) 0xEE, (byte) 0x2E, (byte) 0x2F, (byte) 0xEF, (byte) 0x2D, (byte) 0xED,
+			(byte) 0xEC, (byte) 0x2C, (byte) 0xE4, (byte) 0x24, (byte) 0x25, (byte) 0xE5, (byte) 0x27, (byte) 0xE7,
+			(byte) 0xE6, (byte) 0x26, (byte) 0x22, (byte) 0xE2, (byte) 0xE3, (byte) 0x23, (byte) 0xE1, (byte) 0x21,
+			(byte) 0x20, (byte) 0xE0, (byte) 0xA0, (byte) 0x60, (byte) 0x61, (byte) 0xA1, (byte) 0x63, (byte) 0xA3,
+			(byte) 0xA2, (byte) 0x62, (byte) 0x66, (byte) 0xA6, (byte) 0xA7, (byte) 0x67, (byte) 0xA5, (byte) 0x65,
+			(byte) 0x64, (byte) 0xA4, (byte) 0x6C, (byte) 0xAC, (byte) 0xAD, (byte) 0x6D, (byte) 0xAF, (byte) 0x6F,
+			(byte) 0x6E, (byte) 0xAE, (byte) 0xAA, (byte) 0x6A, (byte) 0x6B, (byte) 0xAB, (byte) 0x69, (byte) 0xA9,
+			(byte) 0xA8, (byte) 0x68, (byte) 0x78, (byte) 0xB8, (byte) 0xB9, (byte) 0x79, (byte) 0xBB, (byte) 0x7B,
+			(byte) 0x7A, (byte) 0xBA, (byte) 0xBE, (byte) 0x7E, (byte) 0x7F, (byte) 0xBF, (byte) 0x7D, (byte) 0xBD,
+			(byte) 0xBC, (byte) 0x7C, (byte) 0xB4, (byte) 0x74, (byte) 0x75, (byte) 0xB5, (byte) 0x77, (byte) 0xB7,
+			(byte) 0xB6, (byte) 0x76, (byte) 0x72, (byte) 0xB2, (byte) 0xB3, (byte) 0x73, (byte) 0xB1, (byte) 0x71,
+			(byte) 0x70, (byte) 0xB0, (byte) 0x50, (byte) 0x90, (byte) 0x91, (byte) 0x51, (byte) 0x93, (byte) 0x53,
+			(byte) 0x52, (byte) 0x92, (byte) 0x96, (byte) 0x56, (byte) 0x57, (byte) 0x97, (byte) 0x55, (byte) 0x95,
+			(byte) 0x94, (byte) 0x54, (byte) 0x9C, (byte) 0x5C, (byte) 0x5D, (byte) 0x9D, (byte) 0x5F, (byte) 0x9F,
+			(byte) 0x9E, (byte) 0x5E, (byte) 0x5A, (byte) 0x9A, (byte) 0x9B, (byte) 0x5B, (byte) 0x99, (byte) 0x59,
+			(byte) 0x58, (byte) 0x98, (byte) 0x88, (byte) 0x48, (byte) 0x49, (byte) 0x89, (byte) 0x4B, (byte) 0x8B,
+			(byte) 0x8A, (byte) 0x4A, (byte) 0x4E, (byte) 0x8E, (byte) 0x8F, (byte) 0x4F, (byte) 0x8D, (byte) 0x4D,
+			(byte) 0x4C, (byte) 0x8C, (byte) 0x44, (byte) 0x84, (byte) 0x85, (byte) 0x45, (byte) 0x87, (byte) 0x47,
+			(byte) 0x46, (byte) 0x86, (byte) 0x82, (byte) 0x42, (byte) 0x43, (byte) 0x83, (byte) 0x41, (byte) 0x81,
+			(byte) 0x80, (byte) 0x40 };
+
+	/**
+	 * 璁$畻CRC16鏍¢獙
+	 * 
+	 * @param data
+	 *            闇�瑕佽绠楃殑鏁扮粍
+	 * @return CRC16鏍¢獙鍊�
+	 */
+	public static int calcCrc16(byte[] data) {
+		return calcCrc16(data, 0, data.length);
+	}
+
+	/**
+	 * 璁$畻CRC16鏍¢獙
+	 * 
+	 * @param data
+	 *            闇�瑕佽绠楃殑鏁扮粍
+	 * @param offset
+	 *            璧峰浣嶇疆
+	 * @param len
+	 *            闀垮害
+	 * @return CRC16鏍¢獙鍊�
+	 */
+	public static int calcCrc16(byte[] data, int offset, int len) {
+		return calcCrc16(data, offset, len, 0xffff);
+	}
+
+	/**
+	 * 璁$畻CRC16鏍¢獙
+	 * 
+	 * @param data
+	 *            闇�瑕佽绠楃殑鏁扮粍
+	 * @param offset
+	 *            璧峰浣嶇疆
+	 * @param len
+	 *            闀垮害
+	 * @param preval
+	 *            涔嬪墠鐨勬牎楠屽��
+	 * @return CRC16鏍¢獙鍊�
+	 */
+	public static int calcCrc16(byte[] data, int offset, int len, int preval) {
+		int ucCRCHi = (preval & 0xff00) >> 8;
+		int ucCRCLo = preval & 0x00ff;
+		int iIndex;
+		for (int i = 0; i < len; ++i) {
+			iIndex = (ucCRCLo ^ data[offset + i]) & 0x00ff;
+			ucCRCLo = ucCRCHi ^ crc16_tab_h[iIndex];
+			ucCRCHi = crc16_tab_l[iIndex];
+		}
+		return ((ucCRCHi & 0x00ff) << 8) | (ucCRCLo & 0x00ff) & 0xffff;
+	}
+
+	// 娴嬭瘯
+	public static void main(String[] args) {
+		// 0x02 05 00 03 FF 00 , crc16=7C 09
+		int crc = CRC16.calcCrc16(new byte[] { 0x02, 0x05, 0x00, 0x03, (byte) 0xff, 0x00 });
+		System.out.println(String.format("0x%04x", crc));
+	}
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/util/CRC8.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/util/CRC8.java
new file mode 100644
index 0000000..e0bcc25
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/util/CRC8.java
@@ -0,0 +1,186 @@
+package com.ld.igds.protocol.zldz.util;
+
+/**
+ *璁$畻CRC8鏍¢獙鍊�
+ */
+public class CRC8 {
+
+	public static void main(String[] args) {
+
+	}
+
+	static short[] gCrc16Table = { (short) 0x0000, (short) 0x1021, (short) 0x2042, (short) 0x3063, (short) 0x4084,
+			(short) 0x50a5, (short) 0x60c6, (short) 0x70e7, (short) 0xd94c, (short) 0xc96d, (short) 0xf90e,
+			(short) 0xe92f, (short) 0x99c8, (short) 0x89e9, (short) 0xb98a, (short) 0xa9ab, (short) 0x5844,
+			(short) 0x4865, (short) 0x7806, (short) 0x6827, (short) 0x18c0, (short) 0x08e1, (short) 0x3882,
+			(short) 0x28a3, (short) 0xcb7d, (short) 0xdb5c, (short) 0xeb3f, (short) 0xfb1e, (short) 0x8bf9,
+			(short) 0x9bd8, (short) 0xabbb, (short) 0xbb9a, (short) 0x4a75, (short) 0x5a54, (short) 0x6a37,
+			(short) 0x7a16, (short) 0x0af1, (short) 0x1ad0, (short) 0x2ab3, (short) 0x3a92, (short) 0xfd2e,
+			(short) 0xed0f, (short) 0xdd6c, (short) 0xcd4d, (short) 0xbdaa, (short) 0xad8b, (short) 0x9de8,
+			(short) 0x8dc9, (short) 0xc9cc, (short) 0xd9ed, (short) 0xe98e, (short) 0xf9af, (short) 0x8948,
+			(short) 0x9969, (short) 0xa90a, (short) 0xb92b, (short) 0x5af5, (short) 0x4ad4, (short) 0x7ab7,
+			(short) 0x6a96, (short) 0x1a71, (short) 0x0a50, (short) 0x3a33, (short) 0x2a12, (short) 0xdbfd,
+			(short) 0xcbdc, (short) 0xfbbf, (short) 0xeb9e, (short) 0x9b79, (short) 0x8b58, (short) 0xbb3b,
+			(short) 0xab1a, (short) 0x6ca6, (short) 0x7c87, (short) 0x4ce4, (short) 0x5cc5, (short) 0x2c22,
+			(short) 0x3c03, (short) 0x0c60, (short) 0x1c41, (short) 0x8108, (short) 0x9129, (short) 0xa14a,
+			(short) 0xb16b, (short) 0xc18c, (short) 0xd1ad, (short) 0xe1ce, (short) 0xf1ef, (short) 0x1231,
+			(short) 0x0210, (short) 0x3273, (short) 0x2252, (short) 0x52b5, (short) 0x4294, (short) 0x72f7,
+			(short) 0x62d6, (short) 0x9339, (short) 0x8318, (short) 0xb37b, (short) 0xa35a, (short) 0xd3bd,
+			(short) 0xc39c, (short) 0xf3ff, (short) 0xe3de, (short) 0x2462, (short) 0x3443, (short) 0x0420,
+			(short) 0x1401, (short) 0x64e6, (short) 0x74c7, (short) 0x44a4, (short) 0x5485, (short) 0xa56a,
+			(short) 0xb54b, (short) 0x8528, (short) 0x9509, (short) 0xe5ee, (short) 0xf5cf, (short) 0xc5ac,
+			(short) 0xd58d, (short) 0x3653, (short) 0x2672, (short) 0x1611, (short) 0x0630, (short) 0x76d7,
+			(short) 0x66f6, (short) 0x5695, (short) 0x46b4, (short) 0xb75b, (short) 0xa77a, (short) 0x9719,
+			(short) 0x8738, (short) 0xf7df, (short) 0xe7fe, (short) 0xd79d, (short) 0xc7bc, (short) 0x48c4,
+			(short) 0x58e5, (short) 0x6886, (short) 0x78a7, (short) 0x0840, (short) 0x1861, (short) 0x2802,
+			(short) 0x3823, (short) 0x83b9, (short) 0x9398, (short) 0xa3fb, (short) 0xb3da, (short) 0xc33d,
+			(short) 0xd31c, (short) 0xe37f, (short) 0xf35e, (short) 0x02b1, (short) 0x1290, (short) 0x22f3,
+			(short) 0x32d2, (short) 0x4235, (short) 0x5214, (short) 0x6277, (short) 0x7256, (short) 0xb5ea,
+			(short) 0xa5cb, (short) 0x95a8, (short) 0x8589, (short) 0xf56e, (short) 0xe54f, (short) 0xd52c,
+			(short) 0xc50d, (short) 0x34e2, (short) 0x24c3, (short) 0x14a0, (short) 0x0481, (short) 0x7466,
+			(short) 0x6447, (short) 0x5424, (short) 0x4405, (short) 0xa7db, (short) 0xb7fa, (short) 0x8799,
+			(short) 0x97b8, (short) 0xe75f, (short) 0xf77e, (short) 0xc71d, (short) 0xd73c, (short) 0x26d3,
+			(short) 0x36f2, (short) 0x0691, (short) 0x16b0, (short) 0x6657, (short) 0x7676, (short) 0x4615,
+			(short) 0x5634, (short) 0xedae, (short) 0xfd8f, (short) 0xcdec, (short) 0xddcd, (short) 0xad2a,
+			(short) 0xbd0b, (short) 0x8d68, (short) 0x9d49, (short) 0x7e97, (short) 0x6eb6, (short) 0x5ed5,
+			(short) 0x4ef4, (short) 0x3e13, (short) 0x2e32, (short) 0x1e51, (short) 0x0e70, (short) 0xff9f,
+			(short) 0xefbe, (short) 0xdfdd, (short) 0xcffc, (short) 0xbf1b, (short) 0xaf3a, (short) 0x9f59,
+			(short) 0x8f78, (short) 0x9188, (short) 0x81a9, (short) 0xb1ca, (short) 0xa1eb, (short) 0xd10c,
+			(short) 0xc12d, (short) 0xf14e, (short) 0xe16f, (short) 0x1080, (short) 0x00a1, (short) 0x30c2,
+			(short) 0x20e3, (short) 0x5004, (short) 0x4025, (short) 0x7046, (short) 0x6067, (short) 0x7c26,
+			(short) 0x6c07, (short) 0x5c64, (short) 0x4c45, (short) 0x3ca2, (short) 0x2c83, (short) 0x1ce0,
+			(short) 0x0cc1, (short) 0xef1f, (short) 0xff3e, (short) 0xcf5d, (short) 0xdf7c, (short) 0xaf9b,
+			(short) 0xbfba, (short) 0x8fd9, (short) 0x9ff8, (short) 0x6e17, (short) 0x7e36, (short) 0x4e55,
+			(short) 0x5e74, (short) 0x2e93, (short) 0x3eb2, (short) 0x0ed1, (short) 0x1ef0 };
+
+	static short[] crc8_tab = { (short) 0x00, (short) 0x07, (short) 0x0E, (short) 0x09, (short) 0x1C, (short) 0x1B,
+			(short) 0x12, (short) 0x15, (short) 0x38, (short) 0x3F, (short) 0x36, (short) 0x31, (short) 0x24,
+			(short) 0x23, (short) 0x2A, (short) 0x2D, (short) 0x70, (short) 0x77, (short) 0x7E, (short) 0x79,
+			(short) 0x6C, (short) 0x6B, (short) 0x62, (short) 0x65, (short) 0x48, (short) 0x4F, (short) 0x46,
+			(short) 0x41, (short) 0x54, (short) 0x53, (short) 0x5A, (short) 0x5D, (short) 0xE0, (short) 0xE7,
+			(short) 0xEE, (short) 0xE9, (short) 0xFC, (short) 0xFB, (short) 0xF2, (short) 0xF5, (short) 0xD8,
+			(short) 0xDF, (short) 0xD6, (short) 0xD1, (short) 0xC4, (short) 0xC3, (short) 0xCA, (short) 0xCD,
+			(short) 0x90, (short) 0x97, (short) 0x9E, (short) 0x99, (short) 0x8C, (short) 0x8B, (short) 0x82,
+			(short) 0x85, (short) 0xA8, (short) 0xAF, (short) 0xA6, (short) 0xA1, (short) 0xB4, (short) 0xB3,
+			(short) 0xBA, (short) 0xBD, (short) 0xC7, (short) 0xC0, (short) 0xC9, (short) 0xCE, (short) 0xDB,
+			(short) 0xDC, (short) 0xD5, (short) 0xD2, (short) 0xFF, (short) 0xF8, (short) 0xF1, (short) 0xF6,
+			(short) 0xE3, (short) 0xE4, (short) 0xED, (short) 0xEA, (short) 0xB7, (short) 0xB0, (short) 0xB9,
+			(short) 0xBE, (short) 0xAB, (short) 0xAC, (short) 0xA5, (short) 0xA2, (short) 0x8F, (short) 0x88,
+			(short) 0x81, (short) 0x86, (short) 0x93, (short) 0x94, (short) 0x9D, (short) 0x9A, (short) 0x27,
+			(short) 0x20, (short) 0x29, (short) 0x2E, (short) 0x3B, (short) 0x3C, (short) 0x35, (short) 0x32,
+			(short) 0x1F, (short) 0x18, (short) 0x11, (short) 0x16, (short) 0x03, (short) 0x04, (short) 0x0D,
+			(short) 0x0A, (short) 0x57, (short) 0x50, (short) 0x59, (short) 0x5E, (short) 0x4B, (short) 0x4C,
+			(short) 0x45, (short) 0x42, (short) 0x6F, (short) 0x68, (short) 0x61, (short) 0x66, (short) 0x73,
+			(short) 0x74, (short) 0x7D, (short) 0x7A, (short) 0x89, (short) 0x8E, (short) 0x87, (short) 0x80,
+			(short) 0x95, (short) 0x92, (short) 0x9B, (short) 0x9C, (short) 0xB1, (short) 0xB6, (short) 0xBF,
+			(short) 0xB8, (short) 0xAD, (short) 0xAA, (short) 0xA3, (short) 0xA4, (short) 0xF9, (short) 0xFE,
+			(short) 0xF7, (short) 0xF0, (short) 0xE5, (short) 0xE2, (short) 0xEB, (short) 0xEC, (short) 0xC1,
+			(short) 0xC6, (short) 0xCF, (short) 0xC8, (short) 0xDD, (short) 0xDA, (short) 0xD3, (short) 0xD4,
+			(short) 0x69, (short) 0x6E, (short) 0x67, (short) 0x60, (short) 0x75, (short) 0x72, (short) 0x7B,
+			(short) 0x7C, (short) 0x51, (short) 0x56, (short) 0x5F, (short) 0x58, (short) 0x4D, (short) 0x4A,
+			(short) 0x43, (short) 0x44, (short) 0x19, (short) 0x1E, (short) 0x17, (short) 0x10, (short) 0x05,
+			(short) 0x02, (short) 0x0B, (short) 0x0C, (short) 0x21, (short) 0x26, (short) 0x2F, (short) 0x28,
+			(short) 0x3D, (short) 0x3A, (short) 0x33, (short) 0x34, (short) 0x4E, (short) 0x49, (short) 0x40,
+			(short) 0x47, (short) 0x52, (short) 0x55, (short) 0x5C, (short) 0x5B, (short) 0x76, (short) 0x71,
+			(short) 0x78, (short) 0x7F, (short) 0x6A, (short) 0x6D, (short) 0x64, (short) 0x63, (short) 0x3E,
+			(short) 0x39, (short) 0x30, (short) 0x37, (short) 0x22, (short) 0x25, (short) 0x2C, (short) 0x2B,
+			(short) 0x06, (short) 0x01, (short) 0x08, (short) 0x0F, (short) 0x1A, (short) 0x1D, (short) 0x14,
+			(short) 0x13, (short) 0xAE, (short) 0xA9, (short) 0xA0, (short) 0xA7, (short) 0xB2, (short) 0xB5,
+			(short) 0xBC, (short) 0xBB, (short) 0x96, (short) 0x91, (short) 0x98, (short) 0x9F, (short) 0x8A,
+			(short) 0x8D, (short) 0x84, (short) 0x83, (short) 0xDE, (short) 0xD9, (short) 0xD0, (short) 0xD7,
+			(short) 0xC2, (short) 0xC5, (short) 0xCC, (short) 0xCB, (short) 0xE6, (short) 0xE1, (short) 0xE8,
+			(short) 0xEF, (short) 0xFA, (short) 0xFD, (short) 0xF4, (short) 0xF3 };
+
+	static byte[] crc8_tab2 = { (byte) 0x00, (byte) 0x07, (byte) 0x0E, (byte) 0x09, (byte) 0x1C, (byte) 0x1B,
+			(byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3F, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23,
+			(byte) 0x2A, (byte) 0x2D, (byte) 0x70, (byte) 0x77, (byte) 0x7E, (byte) 0x79, (byte) 0x6C, (byte) 0x6B,
+			(byte) 0x62, (byte) 0x65, (byte) 0x48, (byte) 0x4F, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53,
+			(byte) 0x5A, (byte) 0x5D, (byte) 0xE0, (byte) 0xE7, (byte) 0xEE, (byte) 0xE9, (byte) 0xFC, (byte) 0xFB,
+			(byte) 0xF2, (byte) 0xF5, (byte) 0xD8, (byte) 0xDF, (byte) 0xD6, (byte) 0xD1, (byte) 0xC4, (byte) 0xC3,
+			(byte) 0xCA, (byte) 0xCD, (byte) 0x90, (byte) 0x97, (byte) 0x9E, (byte) 0x99, (byte) 0x8C, (byte) 0x8B,
+			(byte) 0x82, (byte) 0x85, (byte) 0xA8, (byte) 0xAF, (byte) 0xA6, (byte) 0xA1, (byte) 0xB4, (byte) 0xB3,
+			(byte) 0xBA, (byte) 0xBD, (byte) 0xC7, (byte) 0xC0, (byte) 0xC9, (byte) 0xCE, (byte) 0xDB, (byte) 0xDC,
+			(byte) 0xD5, (byte) 0xD2, (byte) 0xFF, (byte) 0xF8, (byte) 0xF1, (byte) 0xF6, (byte) 0xE3, (byte) 0xE4,
+			(byte) 0xED, (byte) 0xEA, (byte) 0xB7, (byte) 0xB0, (byte) 0xB9, (byte) 0xBE, (byte) 0xAB, (byte) 0xAC,
+			(byte) 0xA5, (byte) 0xA2, (byte) 0x8F, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94,
+			(byte) 0x9D, (byte) 0x9A, (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2E, (byte) 0x3B, (byte) 0x3C,
+			(byte) 0x35, (byte) 0x32, (byte) 0x1F, (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04,
+			(byte) 0x0D, (byte) 0x0A, (byte) 0x57, (byte) 0x50, (byte) 0x59, (byte) 0x5E, (byte) 0x4B, (byte) 0x4C,
+			(byte) 0x45, (byte) 0x42, (byte) 0x6F, (byte) 0x68, (byte) 0x61, (byte) 0x66, (byte) 0x73, (byte) 0x74,
+			(byte) 0x7D, (byte) 0x7A, (byte) 0x89, (byte) 0x8E, (byte) 0x87, (byte) 0x80, (byte) 0x95, (byte) 0x92,
+			(byte) 0x9B, (byte) 0x9C, (byte) 0xB1, (byte) 0xB6, (byte) 0xBF, (byte) 0xB8, (byte) 0xAD, (byte) 0xAA,
+			(byte) 0xA3, (byte) 0xA4, (byte) 0xF9, (byte) 0xFE, (byte) 0xF7, (byte) 0xF0, (byte) 0xE5, (byte) 0xE2,
+			(byte) 0xEB, (byte) 0xEC, (byte) 0xC1, (byte) 0xC6, (byte) 0xCF, (byte) 0xC8, (byte) 0xDD, (byte) 0xDA,
+			(byte) 0xD3, (byte) 0xD4, (byte) 0x69, (byte) 0x6E, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72,
+			(byte) 0x7B, (byte) 0x7C, (byte) 0x51, (byte) 0x56, (byte) 0x5F, (byte) 0x58, (byte) 0x4D, (byte) 0x4A,
+			(byte) 0x43, (byte) 0x44, (byte) 0x19, (byte) 0x1E, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02,
+			(byte) 0x0B, (byte) 0x0C, (byte) 0x21, (byte) 0x26, (byte) 0x2F, (byte) 0x28, (byte) 0x3D, (byte) 0x3A,
+			(byte) 0x33, (byte) 0x34, (byte) 0x4E, (byte) 0x49, (byte) 0x40, (byte) 0x47, (byte) 0x52, (byte) 0x55,
+			(byte) 0x5C, (byte) 0x5B, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7F, (byte) 0x6A, (byte) 0x6D,
+			(byte) 0x64, (byte) 0x63, (byte) 0x3E, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, (byte) 0x25,
+			(byte) 0x2C, (byte) 0x2B, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0F, (byte) 0x1A, (byte) 0x1D,
+			(byte) 0x14, (byte) 0x13, (byte) 0xAE, (byte) 0xA9, (byte) 0xA0, (byte) 0xA7, (byte) 0xB2, (byte) 0xB5,
+			(byte) 0xBC, (byte) 0xBB, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9F, (byte) 0x8A, (byte) 0x8D,
+			(byte) 0x84, (byte) 0x83, (byte) 0xDE, (byte) 0xD9, (byte) 0xD0, (byte) 0xD7, (byte) 0xC2, (byte) 0xC5,
+			(byte) 0xCC, (byte) 0xCB, (byte) 0xE6, (byte) 0xE1, (byte) 0xE8, (byte) 0xEF, (byte) 0xFA, (byte) 0xFD,
+			(byte) 0xF4, (byte) 0xF3 };
+
+	/**
+	 * 璁$畻鏁扮粍鐨凜RC8鏍¢獙鍊�
+	 * 
+	 * @param data
+	 *            闇�瑕佽绠楃殑鏁扮粍
+	 * @return CRC8鏍¢獙鍊�
+	 */
+	public static byte calcCrc8(byte[] data) {
+		return calcCrc8(data, (short) 2, (short) (data.length - 2), (byte) 0);
+	}
+
+	/**
+	 * 璁$畻CRC8鏍¢獙鍊�
+	 * 
+	 * @param data
+	 *            鏁版嵁
+	 * @param offset
+	 *            璧峰浣嶇疆
+	 * @param len
+	 *            闀垮害
+	 * @return 鏍¢獙鍊�
+	 */
+	public static byte calcCrc8(byte[] data, short offset, short len) {
+		return calcCrc8(data, offset, len, (byte) 0);
+	}
+
+	public static byte calcCrc8(byte[] ucPtr, short offset, short ucLen, byte preval) {
+		short ucIndex; // CRC8鏍¢獙琛ㄦ牸绱㈠紩
+		short ucCRC8 = 0; // CRC8瀛楄妭鍒濆鍖�
+		short i = 0;
+		// 杩涜CRC8浣嶆牎楠�
+		while ((ucLen--) > 0) {
+			short indexI = (short) (i + offset);
+			short data = ucPtr[indexI];
+			if (data < 0) {
+				int sd = Byte.toUnsignedInt(ucPtr[indexI]);
+				data = (short) sd;
+			}
+			ucIndex = (short) (ucCRC8 ^ data);
+			ucCRC8 = crc8_tab[(short) ucIndex];
+			i++;
+		}
+		// 杩斿洖CRC8鏍¢獙鏁版嵁
+		return (byte) (~ucCRC8);
+	}
+
+	public static short crc16Byte(short crc, byte data) {
+		return (short) ((crc << 8) ^ gCrc16Table[((crc >> 8) ^ data) & 0xff]);
+	}
+
+	public static short calculateCrc16(byte[] buf, short offset, short length) {
+		short crc = 0;
+		short i = 0;
+		while ((length--) > 0) {
+			crc = crc16Byte(crc, buf[offset + (i++)]);
+		}
+		return crc;
+	}
+}
diff --git a/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/util/ServerUtils.java b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/util/ServerUtils.java
new file mode 100644
index 0000000..bd5a3b1
--- /dev/null
+++ b/igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/util/ServerUtils.java
@@ -0,0 +1,68 @@
+package com.ld.igds.protocol.zldz.util;
+
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 宸ュ叿绫�
+ *
+ * @author Andy
+ */
+public class ServerUtils {
+
+    public static final Map<String, String> contextMap = new HashMap<>();
+
+    public static final String MSG_START = "AAAA";
+    public static final String MSG_END = "EEEE";
+
+    //榛樿缁勭粐缂栧彿
+    public static final String DEFAULT_COMPANY = "0000";
+
+
+    public static final String MSG_TYPE_1115 = "1115";// 鍚庡彴鑾峰彇绮儏鏁版嵁璇锋眰
+
+    public static final String MSG_TYPE_8815 = "8815";// 缁堢搴旂瓟绮儏鏁版嵁璇锋眰
+
+    public static final String MSG_TYPE_1116 = "1116";// 閰嶇疆璇诲彇鍒嗘満鍙傛暟
+
+    public static final String MSG_TYPE_8816 = "8816";// 閰嶇疆璇诲彇鍒嗘満鍙傛暟搴旂瓟
+
+    public static final String MSG_TYPE_1117 = "1117";// 缁堢鍙戦�佺伯鎯呮暟鎹粰鍚庡彴
+
+    public static final String MSG_TYPE_8817 = "8817";// 鍚庡彴鏀跺埌绮儏鏁版嵁搴旂瓟
+
+    public static final String MSG_TYPE_1122 = "1122";// 鍒濆鍖栫數缂嗙數缂�
+    
+    public static final String MSG_TYPE_1123 = "1123";// 鐢电紗姹囨��
+
+    public static final String MSG_TYPE_1125 = "1125";// 璇诲彇閫氶亾鐢电紗
+
+    public static final String MSG_TYPE_8825 = "8825";//璇诲彇閫氶亾鐢电紗搴旂瓟
+
+    public static final String MSG_TYPE_1126 = "1126";// 淇敼閫氶亾鐢电紗
+
+    public static final String MSG_TYPE_8826 = "8826";// 淇敼閫氶亾鐢电紗搴旂瓟
+
+
+    public static final String MSG_TYPE_1128 = "1128";// 璇诲彇鏈夌嚎娓╂箍搴�
+    
+    public static final String MSG_TYPE_8822 = "8822";// 搴旂瓟鍒濆鍖栫數缂嗙數缂�
+    
+    public static final String MSG_TYPE_8823 = "8823";// 搴旂瓟鐢电紗姹囨�荤粨鏋�
+
+    public static final String MSG_TYPE_8828 = "8828";// 璇诲彇鏈夌嚎娓╂箍搴﹀簲绛�
+
+    public static final String MSG_TYPE_1129 = "1129";// 缁堢鍙戦�侀�氶亾鐢电紗鏁版嵁缁欏悗鍙�
+
+    public static final String MSG_TYPE_8829 = "8829";// 鍚庡彴鏀跺埌鐢电紗鏁版嵁搴旂瓟
+
+    public static final String MSG_TYPE_112B = "112B";// 閲嶅惎鍒嗘満
+
+    public static final String MSG_TYPE_882B = "882B";// 閲嶅惎鍒嗘満搴旂瓟
+
+
+    public static String getServerKey(String ip, int port) {
+        return ip + ":" + port;
+    }
+}
diff --git a/igds-recir/src/main/java/com/ld/igds/temp/manager/TempControlManager.java b/igds-recir/src/main/java/com/ld/igds/temp/manager/TempControlManager.java
index 8bbc262..9e53777 100644
--- a/igds-recir/src/main/java/com/ld/igds/temp/manager/TempControlManager.java
+++ b/igds-recir/src/main/java/com/ld/igds/temp/manager/TempControlManager.java
@@ -161,7 +161,7 @@
                 return tempControl3(param);
             }
 
-// 濡傛灉澶氫釜璁惧锛岄渶瑕佸璁惧鎸夊垎鏈鸿繘琛屽垎缁�
+            // 濡傛灉澶氫釜璁惧锛岄渶瑕佸璁惧鎸夊垎鏈鸿繘琛屽垎缁�
             Map<String, List<ExeDevice>> deviceMap = deviceList.stream().collect(Collectors.groupingBy(ExeDevice::getSerId));
 
             String temp = "";
@@ -202,11 +202,11 @@
         // 鑾峰彇鍒嗘満淇℃伅
         DeviceSer deviceSer = coreSerService.getCacheSer(param.getCompanyId(), exeDevice.getSerId());
 
-        if (!Constant.YN_Y.equals(deviceSer.getStatus())) {
-            return new DeviceControlResponse(
-                    OrderRespEnum.ORDER_ERROR.getCode(),
-                    "褰撳墠璁惧鎵�鍦ㄦ帶鍒舵煖銆�" + deviceSer.getName() + "銆戜笉鍦ㄧ嚎锛屾棤娉曟墽琛�");
-        }
+//        if (!Constant.YN_Y.equals(deviceSer.getStatus())) {
+//            return new DeviceControlResponse(
+//                    OrderRespEnum.ORDER_ERROR.getCode(),
+//                    "褰撳墠璁惧鎵�鍦ㄦ帶鍒舵煖銆�" + deviceSer.getName() + "銆戜笉鍦ㄧ嚎锛屾棤娉曟墽琛�");
+//        }
 
         TempControlRequest request = new TempControlRequest();
         request.setDepotId(param.getDepotId());
diff --git a/igds-verb/src/main/java/com/ld/igds/models/MAreationData.java b/igds-verb/src/main/java/com/ld/igds/models/MAreationData.java
index 736cca0..b761e2c 100644
--- a/igds-verb/src/main/java/com/ld/igds/models/MAreationData.java
+++ b/igds-verb/src/main/java/com/ld/igds/models/MAreationData.java
@@ -47,7 +47,7 @@
 
 	@PropertyDef(label = "绮爢瀛旈殭搴�")
 	@Column(name = "ldkxd", precision = 10, scale = 3)
-	private double ldkxd;
+	private Double ldkxd;
 
 	/**
 	 * 1锛氳嚜鐒剁┖姘旈�氶
@@ -79,23 +79,23 @@
 
 	@PropertyDef(label = "涓婚閬撴埅闈㈢Н")
 	@Column(name = "zfdjmj", precision = 10, scale = 3)
-	private double zfdjmj;
+	private Double zfdjmj;
 
 	@PropertyDef(label = "鏀閬撴埅闈㈢Н")
 	@Column(name = "zhfdjmj", precision = 10, scale = 3)
-	private double zhfdjmj;
+	private Double zhfdjmj;
 
 	@PropertyDef(label = "鏀閬撴�婚暱搴�")
 	@Column(name = "zfdzcd", precision = 20, scale = 3)
-	private double zfdzcd;
+	private Double zfdzcd;
 
 	@PropertyDef(label = "椋庣綉寮�瀛旂巼")
 	@Column(name = "fwkkl", precision = 10, scale = 3)
-	private double fwkkl;
+	private Double fwkkl;
 
 	@PropertyDef(label = "绌烘皵閫斿緞姣�")
 	@Column(name = "kqtjb", precision = 10, scale = 3)
-	private double kqtjb;
+	private Double kqtjb;
 
 	@PropertyDef(label = "閫氶鍙h缃釜鏁�")
 	@Column(name = "tfkszgs")
@@ -111,15 +111,15 @@
 
 	@PropertyDef(label = "鍗曞彴椋庢満棰濆畾鍏ㄥ帇")
 	@Column(name = "dtfjedqy", precision = 10, scale = 3)
-	private double dtfjedqy;
+	private Double dtfjedqy;
 
 	@PropertyDef(label = "鍗曞彴椋庢満棰濆畾椋庨噺")
 	@Column(name = "dtfjedfl", precision = 10, scale = 3)
-	private double dtfjedfl;
+	private Double dtfjedfl;
 
 	@PropertyDef(label = "鍗曞彴椋庢満棰濆畾鍔熺巼")
 	@Column(name = "dtfjedgl", precision = 10, scale = 3)
-	private double dtfjedgl;
+	private Double dtfjedgl;
 
 	/**
 	 * 1锛氬帇鍏ュ紡閫氶
@@ -134,23 +134,23 @@
 
 	@PropertyDef(label = "鍗曞彴椋庢満瀹炴祴椋庨噺")
 	@Column(name = "dtfjscfl", precision = 10, scale = 3)
-	private double dtfjscfl;
+	private Double dtfjscfl;
 
 	@PropertyDef(label = "鍗曞彴椋庢満杞村姛鐜�")
 	@Column(name = "dtfjzgl", precision = 10, scale = 3)
-	private double dtfjzgl;
+	private Double dtfjzgl;
 
 	@PropertyDef(label = "鎬婚閲�")
 	@Column(name = "zfl", precision = 10, scale = 3)
-	private double zfl;
+	private Double zfl;
 
 	@PropertyDef(label = "鍗曚綅閫氶閲�")
 	@Column(name = "dwtfl", precision = 10, scale = 3)
-	private double dwtfl;
+	private Double dwtfl;
 
 	@PropertyDef(label = "瀹炴祴绯荤粺闃诲姏")
 	@Column(name = "scxtzl", precision = 10, scale = 3)
-	private double scxtzl;
+	private Double scxtzl;
 
 	/**
 	 * 鎬昏�楃數閲� 鍗冪摝
@@ -217,11 +217,11 @@
 
 	@PropertyDef(label = "闄嶆按骞呭害")
 	@Column(name = "jsfd", precision = 10, scale = 3)
-	private double jsfd;
+	private Double jsfd;
 
 	@PropertyDef(label = "鍚ㄧ伯闄嶆按鑳借��")
 	@Column(name = "dljsnh", precision = 10, scale = 3)
-	private double dljsnh;
+	private Double dljsnh;
 
 	@PropertyDef(label = "閫氶闄嶆按鍧囧寑鎬у垎鏋恄鏁翠粨")
 	@Column(name = "tfjsjyxfxzc", length = 128)
diff --git a/igds-verb/src/main/java/com/ld/igds/verb/manager/VerbManager.java b/igds-verb/src/main/java/com/ld/igds/verb/manager/VerbManager.java
index 4880842..fac6d43 100644
--- a/igds-verb/src/main/java/com/ld/igds/verb/manager/VerbManager.java
+++ b/igds-verb/src/main/java/com/ld/igds/verb/manager/VerbManager.java
@@ -29,10 +29,7 @@
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -301,16 +298,22 @@
             return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "娌℃湁闇�瑕佹洿鏂扮殑璁惧淇℃伅锛侊紒");
         }
 
+//        2023-08-31鏆傛椂绂佺敤锛屼娇鐢ㄤ粨搴撶紪鐮佽幏鍙栦粨搴撴墍鏈夎澶囩殑鍒嗘満淇℃伅
         //鏍规嵁璁惧鎵�灞炲垎鏈鸿繘琛屽垎缁�
-        Map<String, List<ExeDevice>> groupBy = param.getDeviceList().stream().collect(Collectors.groupingBy(ExeDevice::getSerId));
+//        Map<String, List<ExeDevice>> groupBy = param.getDeviceList().stream().collect(Collectors.groupingBy(ExeDevice::getSerId));
+//        DeviceControlResponse response = new DeviceControlResponse(OrderRespEnum.ORDER_SUCCESS.getCode(), "鍛戒护鍙戦�佹垚鍔燂紒");
+//        DeviceSer deviceSer;
+//        DeviceControlRequest request;
+//        try {
+//            for (String serId : groupBy.keySet()) {
 
+        Set<String> list = coreDeviceService.getCacheDeviceSerByDepotId(param.getCompanyId(), param.getDepotId());
         DeviceControlResponse response = new DeviceControlResponse(OrderRespEnum.ORDER_SUCCESS.getCode(), "鍛戒护鍙戦�佹垚鍔燂紒");
-
         DeviceSer deviceSer;
         DeviceControlRequest request;
 
         try {
-            for (String serId : groupBy.keySet()) {
+             for (String serId : list) {
                 deviceSer = coreSerService.getCacheSer(param.getCompanyId(), serId);
                 if (null == deviceSer) {
                     log.info("鏍规嵁浠撳簱{}鑾峰彇璁惧鐘舵�侊紝鍒嗘満缂栫爜{}鐨勫垎鏈轰笉瀛樺湪锛屽彇娑堟墽琛屻��", param.getDepotId(), serId);
diff --git a/igds-web/pom.xml b/igds-web/pom.xml
index e2ef9c4..ff463ac 100644
--- a/igds-web/pom.xml
+++ b/igds-web/pom.xml
@@ -125,6 +125,7 @@
             <artifactId>igds-api-phone</artifactId>
             <version>${igds.version}</version>
         </dependency>
+
         <!-- 鍏朵粬閫氱敤鍝佺墝鍗忚 -->
         <dependency>
             <groupId>com.ld.igds</groupId>
@@ -168,8 +169,25 @@
             </exclusions>
         </dependency>
 
+        <!-- MODBUS-TCP -->
+<!--        <dependency>-->
+<!--            <groupId>com.ld.igds</groupId>-->
+<!--            <artifactId>igds-protocol-modbus</artifactId>-->
+<!--            <version>${igds.version}</version>-->
+<!--            <exclusions>-->
+<!--                <exclusion>-->
+<!--                    <artifactId>slf4j-log4j12</artifactId>-->
+<!--                    <groupId>org.slf4j</groupId>-->
+<!--                </exclusion>-->
+<!--                <exclusion>-->
+<!--                    <artifactId>log4j</artifactId>-->
+<!--                    <groupId>log4j</groupId>-->
+<!--                </exclusion>-->
+<!--            </exclusions>-->
+<!--        </dependency>-->
 
-        <!-- 绉佹湁鍗忚-椋庢鑷磋繙IOT銆佸埗姘満-->
+
+        <!-- 绉佹湁鍗忚-椋庢鑷磋繙IOT銆佸埗姘満
         <dependency>
             <groupId>com.ld.igds</groupId>
             <artifactId>igds-protocol-iot</artifactId>
@@ -184,7 +202,7 @@
                     <groupId>log4j</groupId>
                 </exclusion>
             </exclusions>
-        </dependency>
+        </dependency>-->
 
         <!--  绉佹湁鍗忚-璐濆崥绮儏
         <dependency>
@@ -220,7 +238,24 @@
             </exclusions>
         </dependency>-->
 
-        <!--  娴峰悍杞︾墝璇嗗埆-SDK 
+        <!--  绉佹湁鍗忚-姝f潵鐢靛瓙 -->
+        <dependency>
+            <groupId>com.ld.igds</groupId>
+            <artifactId>igds-protocol-zldz</artifactId>
+            <version>${igds.version}</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>slf4j-log4j12</artifactId>
+                    <groupId>org.slf4j</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>log4j</artifactId>
+                    <groupId>log4j</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <!--  娴峰悍杞︾墝璇嗗埆-SDK -->
         <dependency>
             <groupId>com.ld.igds</groupId>
             <artifactId>igds-protocol-sdk</artifactId>
@@ -236,10 +271,7 @@
                 </exclusion>
             </exclusions>
         </dependency>
-        -->
-        
     </dependencies>
-    
 
     <dependencyManagement>
         <dependencies>
@@ -290,54 +322,54 @@
             </plugin>
 
             <!-- YUI Compressor Maven鍘嬬缉鎻掍欢 寮�鍙戝寘涓嶅疄鐢�-->
-<!--            <plugin>-->
-<!--                <groupId>net.alchim31.maven</groupId>-->
-<!--                <artifactId>yuicompressor-maven-plugin</artifactId>-->
-<!--                <version>1.5.1</version>-->
-<!--                <executions>-->
-<!--                    <execution>-->
-<!--                        <goals>-->
-<!--                            <goal>compress</goal>-->
-<!--                        </goals>-->
-<!--                    </execution>-->
-<!--                </executions>-->
-<!--                <configuration>-->
-<!--                    <encoding>UTF-8</encoding>-->
-<!--                    &lt;!&ndash;涓嶆樉绀簀s鍙兘鐨勯敊璇� &ndash;&gt;-->
-<!--                    <jswarn>false</jswarn>-->
-<!--                    &lt;!&ndash;鏄惁娣锋穯 &ndash;&gt;-->
-<!--                    <nomunge>true</nomunge>-->
-<!--                    &lt;!&ndash;鑻ュ瓨鍦ㄥ凡鍘嬬缉鐨勬枃浠讹紝浼氬厛瀵规瘮婧愭枃浠舵槸鍚︽湁鏀瑰姩 鏈夋敼鍔ㄤ究鍘嬬缉锛屾棤鏀瑰姩灏变笉鍘嬬缉 &ndash;&gt;-->
-<!--                    <force>false</force>-->
-<!--                    &lt;!&ndash;鍦ㄦ寚瀹氱殑鍒楀彿鍚庢彃鍏ユ柊琛� &ndash;&gt;-->
-<!--                    <linebreakpos>-1</linebreakpos>-->
-<!--                    &lt;!&ndash;鍘嬬缉涔嬪墠鍏堟墽琛岃仛鍚堟枃浠舵搷浣� &ndash;&gt;-->
-<!--                    <preProcessAggregates>true</preProcessAggregates>-->
-<!--                    &lt;!&ndash;鍘嬬缉鍚庝繚瀛樻枃浠跺悗缂� 鏃犲悗缂� &ndash;&gt;-->
-<!--                    <nosuffix>true</nosuffix>-->
-<!--                    &lt;!&ndash;婧愮洰褰曪紝鍗抽渶鍘嬬缉鐨勬牴鐩綍 &ndash;&gt;-->
-<!--                    <sourceDirectory>src/main/resources</sourceDirectory>-->
-<!--                    &lt;!&ndash;杈撳嚭鐩綍锛屽嵆鍘嬬缉鍚庣殑鐩綍 &ndash;&gt;-->
-<!--                    <outputDirectory>target/classes</outputDirectory>-->
-<!--                    <force>true</force>-->
-<!--                    &lt;!&ndash;鍘嬬缉js鍜宑ss鏂囦欢 &ndash;&gt;-->
-<!--                    <includes>-->
-<!--                        <include>**/*.js</include>-->
-<!--                        <include>**/*.css</include>-->
-<!--                    </includes>-->
-<!--                    &lt;!&ndash; 浠ヤ笅鐩綍鍜屾枃浠朵笉浼氳鍘嬬缉 &ndash;&gt;-->
-<!--                    <excludes>-->
-<!--                        <exclude>**/*.min.js</exclude>-->
-<!--                        <exclude>**/*.min.css</exclude>-->
-<!--                        <exclude>**/d7/**</exclude>-->
-<!--                        <exclude>**/dorado-home/**</exclude>-->
-<!--                        <exclude>**/bdf2/**</exclude>-->
-<!--                        <exclude>**/css/**</exclude>-->
-<!--                        <exclude>**/js/**</exclude>-->
-<!--                        <exclude>**/plugins/**</exclude>-->
-<!--                    </excludes>-->
-<!--                </configuration>-->
-<!--            </plugin>-->
+            <plugin>
+                <groupId>net.alchim31.maven</groupId>
+                <artifactId>yuicompressor-maven-plugin</artifactId>
+                <version>1.5.1</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>compress</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <encoding>UTF-8</encoding>
+                    <!--涓嶆樉绀簀s鍙兘鐨勯敊璇� -->
+                    <jswarn>false</jswarn>
+                    <!--鏄惁娣锋穯 -->
+                    <nomunge>true</nomunge>
+                    <!--鑻ュ瓨鍦ㄥ凡鍘嬬缉鐨勬枃浠讹紝浼氬厛瀵规瘮婧愭枃浠舵槸鍚︽湁鏀瑰姩 鏈夋敼鍔ㄤ究鍘嬬缉锛屾棤鏀瑰姩灏变笉鍘嬬缉 -->
+                    <force>false</force>
+                    <!--鍦ㄦ寚瀹氱殑鍒楀彿鍚庢彃鍏ユ柊琛� -->
+                    <linebreakpos>-1</linebreakpos>
+                    <!--鍘嬬缉涔嬪墠鍏堟墽琛岃仛鍚堟枃浠舵搷浣� -->
+                    <preProcessAggregates>true</preProcessAggregates>
+                    <!--鍘嬬缉鍚庝繚瀛樻枃浠跺悗缂� 鏃犲悗缂� -->
+                    <nosuffix>true</nosuffix>
+                    <!--婧愮洰褰曪紝鍗抽渶鍘嬬缉鐨勬牴鐩綍 -->
+                    <sourceDirectory>src/main/resources</sourceDirectory>
+                    <!--杈撳嚭鐩綍锛屽嵆鍘嬬缉鍚庣殑鐩綍 -->
+                    <outputDirectory>target/classes</outputDirectory>
+                    <force>true</force>
+                    <!--鍘嬬缉js鍜宑ss鏂囦欢 -->
+                    <includes>
+                        <include>**/*.js</include>
+                        <include>**/*.css</include>
+                    </includes>
+                    <!-- 浠ヤ笅鐩綍鍜屾枃浠朵笉浼氳鍘嬬缉 -->
+                    <excludes>
+                        <exclude>**/*.min.js</exclude>
+                        <exclude>**/*.min.css</exclude>
+                        <exclude>**/d7/**</exclude>
+                        <exclude>**/dorado-home/**</exclude>
+                        <exclude>**/bdf2/**</exclude>
+                        <exclude>**/css/**</exclude>
+                        <exclude>**/js/**</exclude>
+                        <exclude>**/plugins/**</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
 
         </plugins>
 
diff --git a/igds-web/src/main/resources/application-dev.yml b/igds-web/src/main/resources/application-dev.yml
index 8193ef5..b15c2a3 100644
--- a/igds-web/src/main/resources/application-dev.yml
+++ b/igds-web/src/main/resources/application-dev.yml
@@ -12,7 +12,7 @@
     db-base:
       name: db-base
       type: com.alibaba.druid.pool.DruidDataSource
-      url: jdbc:mysql://127.0.0.1:3306/igds_v40?useUnicode=true&characterEncoding=utf-8
+      url: jdbc:mysql://127.0.0.1:3306/igds_5325?useUnicode=true&characterEncoding=utf-8
       driver-class-name: com.mysql.jdbc.Driver
       username: root
       password: ukJp12Qf+elyBvGHkJ5MQMa95pfVm0oFBHefdEgDFKoFSjbgYa9PYfv5vlem5nvoXjQsP9tIIo53DvSbsl160Q==
diff --git a/igds-web/src/main/resources/application-pro1000.yml b/igds-web/src/main/resources/application-pro1000.yml
new file mode 100644
index 0000000..077e658
--- /dev/null
+++ b/igds-web/src/main/resources/application-pro1000.yml
@@ -0,0 +1,80 @@
+##########################  椋庢鑷磋繙-绮儏鏈嶅姟鍣�   ##########################
+server:
+  port: 8201
+  context-path: /
+  connection-timeout: 5000
+  tomcat:
+    uri-encoding: UTF-8
+
+##########################  datasourcec   ##########################
+spring:
+  datasource:
+    db-base:
+      name: db-base
+      type: com.alibaba.druid.pool.DruidDataSource
+      url: jdbc:mysql://127.0.0.1:3306/igds_master_v35?useUnicode=true&characterEncoding=utf-8
+      driver-class-name: com.mysql.jdbc.Driver
+      username: root
+      password: ukJp12Qf+elyBvGHkJ5MQMa95pfVm0oFBHefdEgDFKoFSjbgYa9PYfv5vlem5nvoXjQsP9tIIo53DvSbsl160Q==
+      public-key:
+      config-decrypt: true
+      initial-size:  5
+      min-idle:  5
+      max-active:  50
+      max-wait: 60000
+      time-between-eviction-runs-millis: 60000
+      min-evictable-idle-time-millis: 300000
+      validation-query: select 1 from dual
+      test-whileIdle: true
+      test-on-borrow: false
+      test-on-return: false
+      pool-prepared-statements: true
+      max-pool-prepared-statement-per-connection-size: 20
+      filters: stat
+      connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
+      use-global-data-source-stat: true
+      remove-abandoned: true
+      remove-abandoned-timeout: 1800
+      log-abandoned: true
+    db-sqlite:
+      name: db-sqlite
+      url: jdbc:sqlite:D:/app/igds/db/iot_cfg.db
+      driver-class-name: org.sqlite.JDBC
+      type: com.alibaba.druid.pool.DruidDataSource
+      username:
+      password:
+
+  # Redis鐩稿叧閰嶇疆
+  redis:
+    database: 0
+    host: 127.0.0.1
+    port: 6379
+    password: Abc123..
+    # 杩炴帴姹犳渶澶ц繛鎺ユ暟锛堜娇鐢ㄨ礋鍊艰〃绀烘病鏈夐檺鍒讹級
+    pool:
+      max-active: 200
+      max-wait: -1
+      max-idle: 10
+      min-idle: 0
+      timeout: 6000
+
+license:
+  subject: ld_license
+  publicAlias: publicCert
+  storePass: PUBLICFZZYXXJSGFYXGS888888
+  licensePath: C:/license/license.lic
+  publicKeysStorePath: C:/license/publicCerts.keystore
+
+##########################  IGDS   ##########################
+## 绯荤粺鎺ュ彛璺敱閰嶇疆 娉ㄦ剰鏁板瓧濡傛灉浠�0寮�澶寸殑璇濓紝鍚庡彴浼氬嚭鐜拌浆涔夛紝璇锋坊鍔�""
+igds:
+  default:
+    companyId: 1000
+    sys-name: 鏅烘収绮簱绠$悊绯荤粺
+    logo: logo-default.png
+    logo-title: logo-title-default.png
+    support: 鏅烘収绮儏绮儏浜戠鐞嗗钩鍙�
+    grian-add-point: N
+  media-ip: 124.71.162.207
+  media-port: 18000
+  file-path: C:/IGDS/FILE/
\ No newline at end of file
diff --git a/igds-web/src/main/resources/application-pro5303.yml b/igds-web/src/main/resources/application-pro5303.yml
new file mode 100644
index 0000000..9418919
--- /dev/null
+++ b/igds-web/src/main/resources/application-pro5303.yml
@@ -0,0 +1,81 @@
+##########################  涓婃捣鍢夊畾   ##########################
+server:
+  port: 8088
+  context-path: /
+  connection-timeout: 5000
+  tomcat:
+    uri-encoding: UTF-8
+
+##########################  datasourcec   ##########################
+spring:
+  datasource:
+    db-base:
+      name: db-base
+      type: com.alibaba.druid.pool.DruidDataSource
+      url: jdbc:mysql://127.0.0.1:3306/igds_master?useUnicode=true&characterEncoding=utf-8
+#      url: jdbc:mysql://192.168.200.3:3306/igds_master?useUnicode=true&characterEncoding=utf-8
+      driver-class-name: com.mysql.jdbc.Driver
+      username: igds
+      password: ukJp12Qf+elyBvGHkJ5MQMa95pfVm0oFBHefdEgDFKoFSjbgYa9PYfv5vlem5nvoXjQsP9tIIo53DvSbsl160Q==
+      public-key:
+      config-decrypt: true
+      initial-size:  5
+      min-idle:  5
+      max-active:  50
+      max-wait: 60000
+      time-between-eviction-runs-millis: 60000
+      min-evictable-idle-time-millis: 300000
+      validation-query: select 1 from dual
+      test-whileIdle: true
+      test-on-borrow: false
+      test-on-return: false
+      pool-prepared-statements: true
+      max-pool-prepared-statement-per-connection-size: 20
+      filters: stat
+      connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
+      use-global-data-source-stat: true
+      removeAbandoned: true
+      removeAbandonedTimeout: 90
+      logAbandoned: true
+      poolPreparedStatements: true
+      maxPoolPreparedStatementPerConnectionSize: 20
+    db-sqlite:
+      name: db-sqlite
+      url: jdbc:sqlite:D:/app/igds/db/iot_cfg.db
+      driver-class-name: org.sqlite.JDBC
+      type: com.alibaba.druid.pool.DruidDataSource
+      username:
+      password:
+
+  # Redis鐩稿叧閰嶇疆
+  redis:
+    database: 0
+    host: 127.0.0.1
+    port: 6379
+    password: Abc123..
+    # 杩炴帴姹犳渶澶ц繛鎺ユ暟锛堜娇鐢ㄨ礋鍊艰〃绀烘病鏈夐檺鍒讹級
+    pool:
+      max-active: 200
+      max-wait: -1
+      max-idle: 10
+      min-idle: 0
+      timeout: 6000
+
+license:
+  subject: ld_license
+  publicAlias: publicCert
+  storePass: PUBLICFZZYXXJSGFYXGS888888
+  licensePath: D:/IGDS/license/license.lic
+  publicKeysStorePath: D:/IGDS/license/publicCerts.keystore
+
+##########################  IGDS   ##########################
+## 绯荤粺鎺ュ彛璺敱閰嶇疆 娉ㄦ剰鏁板瓧濡傛灉浠�0寮�澶寸殑璇濓紝鍚庡彴浼氬嚭鐜拌浆涔夛紝璇锋坊鍔�""
+igds:
+  default:
+    companyId: 5303
+    sys-name: 鏅烘収绮簱绠$悊绯荤粺
+    logo: logo-default.png
+    logo-title: logo-title-default.png
+    support: 鏅烘収绮儏绮儏浜戠鐞嗗钩鍙�
+    grian-add-point: N
+  file-path: D:/IGDS/FILE/
\ No newline at end of file
diff --git a/igds-web/src/main/resources/application-pro5322.yml b/igds-web/src/main/resources/application-pro5322.yml
new file mode 100644
index 0000000..1d4f61d
--- /dev/null
+++ b/igds-web/src/main/resources/application-pro5322.yml
@@ -0,0 +1,80 @@
+##########################   骞夸笢寰愰椈椤圭洰   ##########################
+server:
+  port: 8888
+  context-path: /
+  connection-timeout: 5000
+  tomcat:
+    uri-encoding: UTF-8
+
+##########################  datasourcec   ##########################
+spring:
+  datasource:
+    db-base:
+      name: db-base
+      type: com.alibaba.druid.pool.DruidDataSource
+      url: jdbc:mysql://127.0.0.1:3306/igds_master?useUnicode=true&characterEncoding=utf-8
+      driver-class-name: com.mysql.jdbc.Driver
+      username: root
+      password: ukJp12Qf+elyBvGHkJ5MQMa95pfVm0oFBHefdEgDFKoFSjbgYa9PYfv5vlem5nvoXjQsP9tIIo53DvSbsl160Q==
+      public-key:
+      config-decrypt: true
+      initial-size:  5
+      min-idle:  5
+      max-active:  50
+      max-wait: 60000
+      time-between-eviction-runs-millis: 60000
+      min-evictable-idle-time-millis: 300000
+      validation-query: select 1 from dual
+      test-whileIdle: true
+      test-on-borrow: false
+      test-on-return: false
+      pool-prepared-statements: true
+      max-pool-prepared-statement-per-connection-size: 20
+      filters: stat
+      connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
+      use-global-data-source-stat: true
+      removeAbandoned: true
+      removeAbandonedTimeout: 90
+      logAbandoned: true
+      poolPreparedStatements: true
+      maxPoolPreparedStatementPerConnectionSize: 20
+    db-sqlite:
+      name: db-sqlite
+      url: jdbc:sqlite:D:/app/igds/db/iot_cfg.db
+      driver-class-name: org.sqlite.JDBC
+      type: com.alibaba.druid.pool.DruidDataSource
+      username:
+      password:
+
+  # Redis鐩稿叧閰嶇疆
+  redis:
+    database: 0
+    host: 127.0.0.1
+    port: 6379
+    password: Abc123..
+    # 杩炴帴姹犳渶澶ц繛鎺ユ暟锛堜娇鐢ㄨ礋鍊艰〃绀烘病鏈夐檺鍒讹級
+    pool:
+      max-active: 200
+      max-wait: -1
+      max-idle: 10
+      min-idle: 0
+      timeout: 6000
+
+license:
+  subject: ld_license
+  publicAlias: publicCert
+  storePass: PUBLICFZZYXXJSGFYXGS888888
+  licensePath: D:/IGDS/license/license.lic
+  publicKeysStorePath: D:/IGDS/license/publicCerts.keystore
+
+##########################  IGDS   ##########################
+## 绯荤粺鎺ュ彛璺敱閰嶇疆 娉ㄦ剰鏁板瓧濡傛灉浠�0寮�澶寸殑璇濓紝鍚庡彴浼氬嚭鐜拌浆涔夛紝璇锋坊鍔�""
+igds:
+  default:
+    companyId: 5322
+    sys-name: 鏅烘収绮簱绠$悊绯荤粺
+    logo: logo-default.png
+    logo-title: logo-title-default.png
+    support: 鏅烘収绮簱缁煎悎绠$悊骞冲彴
+    grian-add-point: N
+  file-path: D:/IGDS/FILE/
\ No newline at end of file
diff --git a/igds-web/src/main/resources/application-pro5325.yml b/igds-web/src/main/resources/application-pro5325.yml
index 701c756..d2d11bf 100644
--- a/igds-web/src/main/resources/application-pro5325.yml
+++ b/igds-web/src/main/resources/application-pro5325.yml
@@ -1,4 +1,4 @@
-##########################  姹熻タ璧e窞椤圭洰   ##########################
+##########################  姹熻タ璧e窞-澶у叕椤圭洰   ##########################
 server:
   port: 8888
   context-path: /
@@ -15,7 +15,7 @@
       url: jdbc:mysql://127.0.0.1:3306/igds_master?useUnicode=true&characterEncoding=utf-8
       driver-class-name: com.mysql.jdbc.Driver
       username: root
-      password: ukJp12Qf+elyBvGHkJ5MQMa95pfVm0oFBHefdEgDFKoFSjbgYa9PYfv5vlem5nvoXjQsP9tIIo53DvSbsl160Q==
+      password: cCB/meZWF3TckLO5t3oIETehaLqFAgDisogg8yqrdEIClsZxu8lwFAkgtilJRYnLgQPHlJV4eamhE9IGPN+kKw==
       public-key:
       config-decrypt: true
       initial-size:  5
@@ -64,17 +64,17 @@
   subject: ld_license
   publicAlias: publicCert
   storePass: PUBLICFZZYXXJSGFYXGS888888
-  licensePath: D:/IGDS/license/license.lic
-  publicKeysStorePath: D:/IGDS/license/publicCerts.keystore
+  licensePath: F:/IGDS/license/license.lic
+  publicKeysStorePath: F:/IGDS/license/publicCerts.keystore
 
 ##########################  IGDS   ##########################
 ## 绯荤粺鎺ュ彛璺敱閰嶇疆 娉ㄦ剰鏁板瓧濡傛灉浠�0寮�澶寸殑璇濓紝鍚庡彴浼氬嚭鐜拌浆涔夛紝璇锋坊鍔�""
 igds:
   default:
-    companyId: 5328
+    companyId: 5325
     sys-name: 鏅烘収绮簱绠$悊绯荤粺
     logo: logo-default.png
     logo-title: logo-title-default.png
     support: 椋庢鑷磋繙淇℃伅鎶�鏈偂浠芥湁闄愬叕鍙�
     grian-add-point: N
-  file-path: D:/IGDS/FILE/
\ No newline at end of file
+  file-path: F:/IGDS/FILE/
\ No newline at end of file
diff --git a/igds-web/src/main/resources/application-pro5327.yml b/igds-web/src/main/resources/application-pro5327.yml
index 3a22b99..03d0465 100644
--- a/igds-web/src/main/resources/application-pro5327.yml
+++ b/igds-web/src/main/resources/application-pro5327.yml
@@ -1,4 +1,4 @@
-##########################  姝︽眽榛勯檪鍐涚伯   ##########################
+##########################  姝︽眽榛勯檪鍐涚伯-Linux   ##########################
 server:
   port: 8888
   context-path: /
diff --git a/igds-web/src/main/resources/application.yml b/igds-web/src/main/resources/application.yml
index 3cfe1d9..6fb08da 100644
--- a/igds-web/src/main/resources/application.yml
+++ b/igds-web/src/main/resources/application.yml
@@ -47,7 +47,7 @@
     phone: 400-627-1116
     website: http://www.fzzygf.com
     address: 閮戝窞甯傞珮鏂板尯闀挎た璺�11鍙锋渤鍗楃渷鍥藉澶у绉戞妧鍥鍖�1鍙锋ゼ
-  file-path: D:/IGDS/
+  file-path: D:/IGDS/FILE/
   ## 鎺ㄩ�佸井淇″钩鍙扮殑鍦板潃
   warn-path: http://124.71.162.207:8299/igds-wx/gateway
   api-path-jg: http://124.71.187.17:8207/supervise/v1/gateway
diff --git a/igds-web/src/main/resources/gas-conf.properties b/igds-web/src/main/resources/gas-conf.properties
index 71d39ba..0f75746 100644
--- a/igds-web/src/main/resources/gas-conf.properties
+++ b/igds-web/src/main/resources/gas-conf.properties
@@ -4,20 +4,36 @@
 gas.mapImg.5000_001.img=5000_001.png
 
 ## 5016-\u5927\u6E7E\u533A\u6C14\u4F53\uFF0C\u53EA\u670910\u4E2A\u5E73\u65B9\u4ED3\u6709\u6C14\u4F53
-gas.mapImg.3P01.img=5016_001.png
-gas.mapImg.3P02.img=5016_001.png
-gas.mapImg.3P03.img=5016_001.png
-gas.mapImg.3P04.img=5016_001.png
-gas.mapImg.3P05.img=5016_001.png
-gas.mapImg.3P06.img=5016_001.png
-gas.mapImg.3P07.img=5016_001.png
-gas.mapImg.3P08.img=5016_001.png
-gas.mapImg.3P09.img=5016_001.png
-gas.mapImg.3P10.img=5016_001.png
+gas.mapImg.5016_3P01.img=5016_001.png
+gas.mapImg.5016_3P02.img=5016_001.png
+gas.mapImg.5016_3P03.img=5016_001.png
+gas.mapImg.5016_3P04.img=5016_001.png
+gas.mapImg.5016_3P05.img=5016_001.png
+gas.mapImg.5016_3P06.img=5016_001.png
+gas.mapImg.5016_3P07.img=5016_001.png
+gas.mapImg.5016_3P08.img=5016_001.png
+gas.mapImg.5016_3P09.img=5016_001.png
+gas.mapImg.5016_3P10.img=5016_001.png
 
-## 5303-\u4E0A\u6D77\u5609\u5B9A\uFF0C\u53EA\u67092\u4E2A\u4ED3\u6709\u6C14\u4F53
-gas.mapImg.91310114703439394M0010009001.img=009001.png
-gas.mapImg.91310114703439394M0010009002.img=009002.png
+## 5303-上海嘉定主库区
+gas.mapImg.5303_91310114703439394M0010001001.img=001.png
+gas.mapImg.5303_91310114703439394M0010001002.img=003.png
+gas.mapImg.5303_91310114703439394M0010002001.img=001.png
+gas.mapImg.5303_91310114703439394M0010002002.img=003.png
+gas.mapImg.5303_91310114703439394M0010003001.img=001.png
+gas.mapImg.5303_91310114703439394M0010003002.img=003.png
+gas.mapImg.5303_91310114703439394M0010004001.img=001.png
+gas.mapImg.5303_91310114703439394M0010004002.img=003.png
+gas.mapImg.5303_91310114703439394M0010005001.img=001.png
+gas.mapImg.5303_91310114703439394M0010005002.img=003.png
+gas.mapImg.5303_91310114703439394M0010006001.img=001.png
+gas.mapImg.5303_91310114703439394M0010006002.img=003.png
+gas.mapImg.5303_91310114703439394M0010007001.img=001.png
+gas.mapImg.5303_91310114703439394M0010007002.img=003.png
+gas.mapImg.5303_91310114703439394M0010008001.img=001.png
+gas.mapImg.5303_91310114703439394M0010008002.img=003.png
+gas.mapImg.5303_91310114703439394M0010009001.img=001.png
+gas.mapImg.5303_91310114703439394M0010009002.img=002.png
 
 ## 5317-\u6F6E\u9633
 gas.mapImg.5317_001.img=5317_001.png
@@ -29,4 +45,38 @@
 gas.mapImg.5013_001.img=5013_001.png
 
 ## 5318-\u6F6E\u9633
-gas.mapImg.5318_001.img=5318_001.png
\ No newline at end of file
+gas.mapImg.5318_001.img=5318_001.
+
+## 5325 江西赣州-大公
+gas.mapImg.5325_1.img=5325_001.png
+gas.mapImg.5325_2.img=5325_001.png
+gas.mapImg.5325_3.img=5325_001.png
+gas.mapImg.5325_4.img=5325_001.png
+gas.mapImg.5325_5.img=5325_001.png
+gas.mapImg.5325_6.img=5325_001.png
+gas.mapImg.5325_7.img=5325_001.png
+gas.mapImg.5325_8.img=5325_001.png
+gas.mapImg.5325_9.img=5325_001.png
+gas.mapImg.5325_10.img=5325_001.png
+gas.mapImg.5325_11.img=5325_001.png
+gas.mapImg.5325_12.img=5325_001.png
+gas.mapImg.5325_13.img=5325_001.png
+gas.mapImg.5325_14.img=5325_001.png
+gas.mapImg.5325_15.img=5325_001.png
+gas.mapImg.5325_16.img=5325_001.png
+
+## 5328  广西来宾
+gas.mapImg.5328_0P18.img=5328_001_7.png
+gas.mapImg.5328_0P19.img=5328_001_7.png
+gas.mapImg.5328_0P20.img=5328_001_7.png
+gas.mapImg.5328_0P21.img=5328_001_5.png
+gas.mapImg.5328_0P22.img=5328_001_4.png
+gas.mapImg.5328_0P23.img=5328_001_10.png
+gas.mapImg.5328_0P24.img=5328_001_10.png
+gas.mapImg.5328_0P25.img=5328_001_7.png
+gas.mapImg.5328_0P26.img=5328_001_7.png
+gas.mapImg.5328_0P27.img=5328_001_7.png
+gas.mapImg.5328_0P28.img=5328_001_5.png
+gas.mapImg.5328_0P29.img=5328_001_5.png
+gas.mapImg.5328_0P30.img=5328_001_10.png
+gas.mapImg.5328_0P31.img=5328_001_10.png
\ No newline at end of file
diff --git a/igds-web/src/main/resources/lib/modbus4j-3.1.0.jar b/igds-web/src/main/resources/lib/modbus4j-3.1.0.jar
new file mode 100644
index 0000000..ab89c85
--- /dev/null
+++ b/igds-web/src/main/resources/lib/modbus4j-3.1.0.jar
Binary files differ
diff --git a/igds-web/src/main/resources/n2-conf.properties b/igds-web/src/main/resources/n2-conf.properties
index 639d665..9e6b4d0 100644
--- a/igds-web/src/main/resources/n2-conf.properties
+++ b/igds-web/src/main/resources/n2-conf.properties
@@ -110,6 +110,10 @@
 n2.mapImg.5000_0138.a=default_qyc_a.png
 n2.mapImg.5000_0138.b=default_qyc_b.png
 
+## 5325_001
+n2.mapImg.5325_001.a=pfc2_a.png
+n2.mapImg.5325_001.b=pfc2_b.png
+
 ## 5329_001
 n2.mapImg.5329_001.a=default_qyc_a.png
 n2.mapImg.5329_001.b=default_qyc_b.png
\ No newline at end of file
diff --git a/igds-web/src/main/resources/static/admin/n2/n2-hand-5013.js b/igds-web/src/main/resources/static/admin/n2/n2-hand-5013.js
index e90375d..5f6dc99 100644
--- a/igds-web/src/main/resources/static/admin/n2/n2-hand-5013.js
+++ b/igds-web/src/main/resources/static/admin/n2/n2-hand-5013.js
@@ -298,7 +298,7 @@
         layer.open({
             type: 1,
             title: '璁惧鎿嶄綔-' + domSelectDevice.attr("name"),
-            area: ['450px', '200px'],
+            area: ['450px', '150px'],
             shade: 0,
             content: $('#control-HL2'),
             btn: 0,
diff --git a/igds-web/src/main/resources/static/img/aerial-5317_001.png b/igds-web/src/main/resources/static/img/aerial-5317_001.png
index 05d7536..2ae77e3 100644
--- a/igds-web/src/main/resources/static/img/aerial-5317_001.png
+++ b/igds-web/src/main/resources/static/img/aerial-5317_001.png
Binary files differ
diff --git a/igds-web/src/main/resources/static/img/aerial-5317_001_1.png b/igds-web/src/main/resources/static/img/aerial-5317_001_1.png
new file mode 100644
index 0000000..05d7536
--- /dev/null
+++ b/igds-web/src/main/resources/static/img/aerial-5317_001_1.png
Binary files differ
diff --git a/igds-web/src/main/resources/static/img/aerial-5325_001.png b/igds-web/src/main/resources/static/img/aerial-5325_001.png
new file mode 100644
index 0000000..6929eb8
--- /dev/null
+++ b/igds-web/src/main/resources/static/img/aerial-5325_001.png
Binary files differ
diff --git a/igds-web/src/main/resources/static/img/aerial-5328_001.png b/igds-web/src/main/resources/static/img/aerial-5328_001.png
new file mode 100644
index 0000000..6f396b5
--- /dev/null
+++ b/igds-web/src/main/resources/static/img/aerial-5328_001.png
Binary files differ
diff --git a/igds-web/src/main/resources/static/img/gas/5303/009001.png b/igds-web/src/main/resources/static/img/gas/5303/001.png
similarity index 100%
rename from igds-web/src/main/resources/static/img/gas/5303/009001.png
rename to igds-web/src/main/resources/static/img/gas/5303/001.png
Binary files differ
diff --git a/igds-web/src/main/resources/static/img/gas/5303/009002.png b/igds-web/src/main/resources/static/img/gas/5303/002.png
similarity index 100%
rename from igds-web/src/main/resources/static/img/gas/5303/009002.png
rename to igds-web/src/main/resources/static/img/gas/5303/002.png
Binary files differ
diff --git a/igds-web/src/main/resources/static/img/gas/5303/003.png b/igds-web/src/main/resources/static/img/gas/5303/003.png
new file mode 100644
index 0000000..7db4de1
--- /dev/null
+++ b/igds-web/src/main/resources/static/img/gas/5303/003.png
Binary files differ
diff --git a/igds-web/src/main/resources/static/img/gas/5325/5325_001.png b/igds-web/src/main/resources/static/img/gas/5325/5325_001.png
new file mode 100644
index 0000000..25c971d
--- /dev/null
+++ b/igds-web/src/main/resources/static/img/gas/5325/5325_001.png
Binary files differ
diff --git a/igds-web/src/main/resources/static/img/gas/5328/5328_001_10.png b/igds-web/src/main/resources/static/img/gas/5328/5328_001_10.png
new file mode 100644
index 0000000..4a14d6d
--- /dev/null
+++ b/igds-web/src/main/resources/static/img/gas/5328/5328_001_10.png
Binary files differ
diff --git a/igds-web/src/main/resources/static/img/gas/5328/5328_001_4.png b/igds-web/src/main/resources/static/img/gas/5328/5328_001_4.png
new file mode 100644
index 0000000..c5fc467
--- /dev/null
+++ b/igds-web/src/main/resources/static/img/gas/5328/5328_001_4.png
Binary files differ
diff --git a/igds-web/src/main/resources/static/img/gas/5328/5328_001_5.png b/igds-web/src/main/resources/static/img/gas/5328/5328_001_5.png
new file mode 100644
index 0000000..67bab46
--- /dev/null
+++ b/igds-web/src/main/resources/static/img/gas/5328/5328_001_5.png
Binary files differ
diff --git a/igds-web/src/main/resources/static/img/gas/5328/5328_001_7.png b/igds-web/src/main/resources/static/img/gas/5328/5328_001_7.png
new file mode 100644
index 0000000..8f00ab1
--- /dev/null
+++ b/igds-web/src/main/resources/static/img/gas/5328/5328_001_7.png
Binary files differ
diff --git a/igds-web/src/main/resources/static/img/logo-5325.png b/igds-web/src/main/resources/static/img/logo-5325.png
new file mode 100644
index 0000000..d2c753c
--- /dev/null
+++ b/igds-web/src/main/resources/static/img/logo-5325.png
Binary files differ
diff --git a/igds-web/src/main/resources/static/img/n2/5325/pfc2_a.png b/igds-web/src/main/resources/static/img/n2/5325/pfc2_a.png
new file mode 100644
index 0000000..aa7f80c
--- /dev/null
+++ b/igds-web/src/main/resources/static/img/n2/5325/pfc2_a.png
Binary files differ
diff --git a/igds-web/src/main/resources/static/img/n2/5325/pfc2_b.png b/igds-web/src/main/resources/static/img/n2/5325/pfc2_b.png
new file mode 100644
index 0000000..8fa743b
--- /dev/null
+++ b/igds-web/src/main/resources/static/img/n2/5325/pfc2_b.png
Binary files differ
diff --git a/igds-web/src/main/resources/templates/admin/n2/n2-hand-5013.html b/igds-web/src/main/resources/templates/admin/n2/n2-hand-5013.html
index cf58456..2d56e19 100644
--- a/igds-web/src/main/resources/templates/admin/n2/n2-hand-5013.html
+++ b/igds-web/src/main/resources/templates/admin/n2/n2-hand-5013.html
@@ -323,16 +323,16 @@
 	<div class="layui-btn-container m10">
 		<button class="rkbk-quick-btn btn-fj layui-btn btn-blue"
 			onClick="toExecute('F_OPEN')">
-			<i><img th:src="@{../../static/images/icon-sm-fj.png}" /></i>寮洪
+			<i><img th:src="@{../../static/images/icon-sm-fj.png}" /></i>寮�椋庢満
 		</button>
 		<button class="rkbk-quick-btn btn-fj layui-btn btn-red"
 			onClick="toExecute('F_CLOSE')">
 			<i><img th:src="@{../../static/images/icon-sm-fj.png}" /></i>鍏抽鏈�
 		</button>
-		<button class="rkbk-quick-btn btn-fj layui-btn btn-blue"
-			onClick="toExecute('F_OPEN_F')">
-			<i><img th:src="@{../../static/images/icon-sm-fj.png}" /></i>寮遍
-		</button>
+<!--		<button class="rkbk-quick-btn btn-fj layui-btn btn-blue"-->
+<!--			onClick="toExecute('F_OPEN_F')">-->
+<!--			<i><img th:src="@{../../static/images/icon-sm-fj.png}" /></i>寮遍-->
+<!--		</button>-->
 	</div>
 </div>
 
diff --git a/igds-web/src/main/resources/templates/admin/verb/verb-hand1.html b/igds-web/src/main/resources/templates/admin/verb/verb-hand1.html
index 522efc1..9c73ca1 100644
--- a/igds-web/src/main/resources/templates/admin/verb/verb-hand1.html
+++ b/igds-web/src/main/resources/templates/admin/verb/verb-hand1.html
@@ -404,16 +404,16 @@
 	<div class="layui-btn-container m10">
 		<button class="rkbk-quick-btn btn-fj layui-btn btn-blue"
 				onClick="toExecute('F_OPEN')">
-			<i><img th:src="@{../../static/images/icon-sm-fj.png}" /></i>寮洪
+			<i><img th:src="@{../../static/images/icon-sm-fj.png}" /></i>寮�椋庢満
 		</button>
 		<button class="rkbk-quick-btn btn-fj layui-btn btn-red"
 				onClick="toExecute('F_CLOSE')">
 			<i><img th:src="@{../../static/images/icon-sm-fj.png}" /></i>鍏抽鏈�
 		</button>
-		<button class="rkbk-quick-btn btn-fj layui-btn btn-blue"
-				onClick="toExecute('F_OPEN_F')">
-			<i><img th:src="@{../../static/images/icon-sm-fj.png}" /></i>寮遍
-		</button>
+<!--		<button class="rkbk-quick-btn btn-fj layui-btn btn-blue"-->
+<!--				onClick="toExecute('F_OPEN_F')">-->
+<!--			<i><img th:src="@{../../static/images/icon-sm-fj.png}" /></i>寮遍-->
+<!--		</button>-->
 	</div>
 </div>
 
diff --git a/igds-web/src/main/resources/verb-conf.properties b/igds-web/src/main/resources/verb-conf.properties
index fae8818..ec28a0f 100644
--- a/igds-web/src/main/resources/verb-conf.properties
+++ b/igds-web/src/main/resources/verb-conf.properties
@@ -1,7 +1,7 @@
 ##----\u901A\u98CE\u53C2\u6570\u914D\u7F6E----verb.mapImg.deptId.a--##
 ## 5000_001
-verb.mapImg.5000_001.a=default_pfc2_a.png
-verb.mapImg.5000_001.b=default_pfc2_b.png
+verb.mapImg.5000_001.a=default_pfc_a.png
+verb.mapImg.5000_001.b=default_pfc_b.png
 
 verb.mapImg.5000_0137.a=default_qyc_a.png
 verb.mapImg.5000_0137.b=default_qyc_b.png
@@ -176,9 +176,21 @@
 verb.mapImg.5324_11.b=pfc_b.png
 
 
-## 5325_001
-verb.mapImg.5325_001.a=default_pfc_a.png
-verb.mapImg.5325_001.b=default_pfc_b.png
+## 5325_001 江西赣州-大公
+verb.mapImg.5325_001.a=default_pfc2_a.png
+verb.mapImg.5325_001.b=default_pfc2_b.png
+verb.mapImg.5325_Q010101.a=default_qyc_a.png
+verb.mapImg.5325_Q010101.b=default_qyc_b.png
+verb.mapImg.5325_Q010201.a=default_qyc_a.png
+verb.mapImg.5325_Q010201.b=default_qyc_b.png
+verb.mapImg.5325_Q010301.a=default_qyc_a.png
+verb.mapImg.5325_Q010301.b=default_qyc_b.png
+verb.mapImg.5325_Q010401.a=default_qyc_a.png
+verb.mapImg.5325_Q010401.b=default_qyc_b.png
+verb.mapImg.5325_Q010501.a=default_qyc_a.png
+verb.mapImg.5325_Q010501.b=default_qyc_b.png
+verb.mapImg.5325_Q010601.a=default_qyc_a.png
+verb.mapImg.5325_Q010601.b=default_qyc_b.png
 
 ## 5328_001
 verb.mapImg.5328_001.a=default_pfc_a.png
diff --git a/pom.xml b/pom.xml
index 6dfaab5..f500421 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,6 +39,8 @@
         <module>igds-protocol-fzzy3</module>
         <!--閭︽捣鏅鸿兘-->
         <module>igds-protocol-bhzn</module>
+        <!--閭︽捣鏅鸿兘-->
+        <module>igds-protocol-zldz</module>
         <!--璐濆崥绮儏鍗忚-->
         <module>igds-protocol-beibo</module>
         <!--鐗╄仈缃戞嫇灞曡澶囧寘-->
@@ -54,7 +56,7 @@
         <module>igds-api-phone</module>
         <!--	鎺ュ彛鍖咃紝鍖呮嫭涓夌淮鎺ュ彛	-->
         <module>igds-api-inte</module>
-
+<!--        <module>igds-api-three</module>-->
 
         <!-- 鍙鍖�-->
         <module>igds-databoard</module>

--
Gitblit v1.9.3