YYC
2023-09-07 7243e0b4bd9a267a633d2e481e17646509b6868d
Merge remote-tracking branch 'origin/master'
已重命名2个文件
已删除2个文件
已修改51个文件
已添加71个文件
9942 ■■■■■ 文件已修改
igds-basic/src/main/java/com/ld/igds/gas/manager/GasManager.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-core/src/main/java/com/ld/igds/common/CoreDeviceService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-core/src/main/java/com/ld/igds/common/impl/CoreDeviceServiceImpl.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-core/src/main/java/com/ld/igds/constant/Constant.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-core/src/main/java/com/ld/igds/data/ConfigGasImg.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-core/src/main/java/com/ld/igds/data/SimpleDepot.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-core/src/main/java/com/ld/igds/grain/GrainUtil.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-core/src/main/java/com/ld/igds/io/constant/ProtocolEnum.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-core/src/main/java/com/ld/igds/models/DepotConf.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-core/src/main/java/com/ld/igds/models/Device.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-core/src/main/java/com/ld/igds/models/MQuality.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-core/src/main/java/com/ld/igds/view/DepotConf.view.xml 74 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-core/src/main/java/com/ld/igds/view/DepotPR.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-core/src/main/java/com/ld/igds/view/Device.view.xml 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-core/src/main/java/com/ld/igds/view/service/DeviceService.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-core/src/main/java/models/igds.model.xml 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-core/src/main/resources/mapper/CommonMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-core/src/main/resources/mapper/DeviceMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-es/src/main/java/com/ld/igds/es/manager/EsManager.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-inout/src/main/java/com/ld/igds/inout/manager/InoutReportManager.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-n2/src/main/java/com/ld/igds/n2/controller/N2Controller.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/ServerRunner.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/grainv1/RemoteGrainV1ServiceImpl.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/grainv1/msg/AnalysisService.java 82 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/grainv1/server/BhznGrainV1SessionListener.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-bhzn/src/main/java/com/ld/igds/protocol/bhzn/inout/BHZNWeightServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-block/src/main/java/com/ld/igds/protocol/quantity/shuhan/server/ShuhanServerEngine.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-fzzy3/src/main/java/com/ld/igds/protocol/fzzy/analysis/AnalysisGas.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/.rules 1178 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/pom.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/modbus/DeviceModbus.view.xml 313 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/modbus/DeviceModbusPR.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/modbus/GasModbus.view.xml 378 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/modbus/GasModbusPR.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/modbus/ModbusConstant.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/modbus/service/HModbusService.java 240 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/models/DeviceModbus.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/models/GasModbus.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusConfig.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusTest.java 234 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil.java 208 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil2.java 203 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ServerUtil.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/AnalysisService.java 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java 333 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteEsServiceImpl.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteGasServiceImpl.java 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/data/ModbusGasResult.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/data/ModbusTcp.java 83 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/pom.xml 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/ServerRunner.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/AnalysisConf.java 381 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/AnalysisGrain.java 763 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/AnalysisService.java 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/AnalysisTH.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/builder/ReMessageBuilder.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/message/Metadata.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/message/ReMessage.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/analysis/message/ReMessageBody.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/BaseRemoteImpl.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/RemoteCommonImpl.java 426 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/RemoteGrainServiceImpl.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder.java 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1115.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1116_0.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1116_1.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1122.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1123.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1125.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1126.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder1128.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder8815.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder8817.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/CommandBuilder8829.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/builder/OnLineCommandBuilder.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/message/Message.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/command/message/MessageBody.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/mq/PublisherControl.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/mq/ReceiverServer.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/mq/RedisSubConfig.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/package-info.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/server/HeartbeatProviderImpl.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/server/MsgConsumer.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/server/SessionListener.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/server/ZldzServerEngine.java 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/task/CommandReSendService.java 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/task/CommandTask.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/task/ReSendCommonTask.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/task/ReSendGrainTask.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/util/CRC16.java 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/util/CRC8.java 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/util/ServerUtils.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-recir/src/main/java/com/ld/igds/temp/manager/TempControlManager.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-verb/src/main/java/com/ld/igds/models/MAreationData.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-verb/src/main/java/com/ld/igds/verb/manager/VerbManager.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/pom.xml 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/application-dev.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/application-pro1000.yml 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/application-pro5303.yml 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/application-pro5322.yml 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/application-pro5325.yml 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/application-pro5327.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/gas-conf.properties 78 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/lib/modbus4j-3.1.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/n2-conf.properties 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/static/admin/n2/n2-hand-5013.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/static/img/aerial-5317_001.png 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/static/img/aerial-5317_001_1.png 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/static/img/aerial-5325_001.png 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/static/img/aerial-5328_001.png 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/static/img/gas/5303/001.png 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/static/img/gas/5303/002.png 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/static/img/gas/5303/003.png 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/static/img/gas/5325/5325_001.png 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/static/img/gas/5328/5328_001_10.png 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/static/img/gas/5328/5328_001_4.png 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/static/img/gas/5328/5328_001_5.png 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/static/img/gas/5328/5328_001_7.png 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/static/img/logo-5325.png 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/static/img/n2/5325/pfc2_a.png 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/static/img/n2/5325/pfc2_b.png 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/templates/admin/n2/n2-hand-5013.html 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/templates/admin/verb/verb-hand1.html 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-web/src/main/resources/verb-conf.properties 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
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());
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);
    /**
     * æ ¹æ®åˆ†æœºä¿¡æ¯èŽ·å–è®¾å¤‡
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);
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";
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;
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
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;
    }
}
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;
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
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 = "针对双通道配置设备,如混流风口的风机、轴流风口的风机")
    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 = "根据业务需要自定义存储值")
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 = "代表数量")
    @Column(name = "dbsl", precision = 20, scale = 6)
    private double dbsl;
    private Double dbsl;
    @PropertyDef(label = "样品等级")
    @Column(name = "ypdj", length = 2)
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,38 +205,31 @@
              <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>
@@ -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>
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()}
     *
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规则:开地址-关地址-停地址-开到位-关到位-开故障-关故障,无地址用N代替</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>
igds-core/src/main/java/com/ld/igds/view/service/DeviceService.java
@@ -1,30 +1,27 @@
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
    @Resource
    private CoreDeviceService coreDeviceService;
    /**
@@ -35,7 +32,6 @@
     * <p>
     * Description:
     * </p>
     *
     */
    public List<Device> loadDevice(Map<String, Object> parameter) {
        if (parameter == null || parameter.size() <= 0)
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">
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>
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,
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());
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);
    }
}
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;
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);
        }
    }
}
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);
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 = "粮情解析失败:分机=" + 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 = "粮情解析失败:分机=" + 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 = "粮情解析失败:分机=" + 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);
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;
    /**
     * è®¾å¤‡åˆ›å»ºåœ¨çº¿ï¼Œéœ€è¦æ³¨æ„å½“前使用主机模式,主机上线默认所有相同SN配置的分机全部上线
     *
@@ -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());
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);
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("* æ•°é‡ç›‘测服务启动,端口号={}", port);
        log.info("* èœ€æ±‰æ•°é‡ç›‘测服务启动,端口号={}", port);
        log.info("* ");
        log.info("* ========================");
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;
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>
igds-protocol-modbus/pom.xml
@@ -13,8 +13,6 @@
    </properties>
    <dependencies>
        <!-- å¼•å…¥IO包 -->
@@ -72,14 +70,25 @@
                 <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>
                    <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>
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>
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-读离散量输入"));
        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;
    }
}
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>
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);
    }
}
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-读离散量输入
    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";
}
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;
    }
}
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;
/**
 * æ ¹æ®è®¾å¤‡é…ç½®çš„Modbus-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";
    //轴流风机和轴流窗可能不在一个分机上,IP不同
    @Column(name = "SER_ID_", length = 10)
    @PropertyDef(label = "所属分机")
    private String serId;
    @Transient
    private List<GasModbus> listGas;
}
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-TCP配置信息
 */
@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";
}
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusConfig.java
ÎļþÒÑɾ³ý
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;
    }
    /**
     * è¯»ç¦»æ•£è¾“入寄存器状态数据  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});
    }
}
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil.java
ÎļþÒÑɾ³ý
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;
    }
    /**
     * è¯»ç¦»æ•£è¾“入寄存器状态数据  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();
    }
}
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 {
    /**
     * ç”¨æ¥ç¼“存,TCP设备执行时间记录key = TCP唯一标志,value = å½“前执行时间
     */
    public static Map<String, Long> contextExeModbusTcp = new HashMap<>();
    public static  final String RUN_TAG = "RUN_TAG";
    /**
@@ -31,6 +33,35 @@
     * @param status     ä¸è€ƒè™‘设备类型,只在通道上标记是OPEN或者CLOSE即可
     */
    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;
    }
}
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;
/**
 * è§£æž
@@ -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, "设备状态查询成功并完成解析!");
@@ -46,4 +64,159 @@
            log.error("---MODBUS-TCP-状态解析异常{}", e);
        }
    }
    /**
     * è§£æžæ°”体检测结果
     *
     * @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));
            //磷化氢,单位:PPM,直接使用
            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());
    }
    /**
     * è§£æžèƒ½è€—数据
     *
     * @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);
    }
    /**
     * è§£æžç©ºè°ƒçŠ¶æ€
     *
     * @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);
    }
}
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("当前设备---{}{},为获取到配置的MODBUS信息", exeDevice.getSerId(), exeDevice.getName());
                    continue;
                }
                modbusTcp = new ModbusTcp(deviceModbus);
                modbusTcp.setIp(request.getIp());
                modbusTcp.setPort(request.getPort());
                //若Modbus设备配置分机,则使用所配置分机的IP、端口
                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());
                //若Modbus设备配置分机,则使用所配置分机的IP、端口
                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("当前设备---{}{},为获取到配置的MODBUS信息", 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("---------读风窗风口开到位状态(或其他设备运行状态)------{}-{}-{}", 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("---------读风窗风口关到位状态------{}-{}-{}", 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(), "未获取到配置的MODBUS信息");
            }
            modbusTcp = new ModbusTcp(deviceModbus);
            modbusTcp.setIp(request.getIp());
            modbusTcp.setPort(request.getPort());
            //若Modbus设备配置分机,则使用所配置分机的IP、端口
            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
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());
                //若Modbus设备配置分机,则使用所配置分机的IP、端口
                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());
                //解析能耗数据
                analysisService.analysisEs(request, check);
            }
        } catch (Exception e) {
            return new GasResponse(OrderRespEnum.ORDER_ERROR.getCode(), "后台执行异常:" + e.getLocalizedMessage());
        }
        return new GasResponse(OrderRespEnum.ORDER_SUCCESS);
    }
}
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(), "提醒:当前仓正在执行检测");
    }
        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("----通道{},Co2={},O2={},Ph3={}", gasModbus.getPasscode(), gasResult.getCo2(), gasResult.getO2(), gasResult.getPh3());
                results.add(gasResult);
            }
            //删除运行标记
            delRun(request);
            log.debug("----获取的气体检测结果---{}--{}", request.getDepotId(), results.toString());
            //通知解析
            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);
    }
}
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 +
                '}';
    }
}
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;
/**
@@ -14,7 +14,8 @@
    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规则:开地址-关地址-停地址-开到位-关到位-开故障-关故障,无地址用N代替
        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规则:开地址-关地址-停地址-开到位-关到位-开故障-关故障,无地址用N代替
//        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;
    }
}
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>
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;
        }
        //请注意,正来电子本事服务器部署用的端口是:8000
        if (configData.getActive().equals("zldz")) {
            ZldzServerEngine.start(ZldzServerEngine.PORT);
            return;
        }
    }
}
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;
    /**
     * è§£æžåˆ†æœºé…ç½®ä¿¡æ¯
     *
     * @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);
        // æ¸…楚初始化登陆的解析
        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());
    }
}
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;
/**
 * ç²®æƒ…解析
 *
 * @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 = "粮情解析失败:分机=" + 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 = "粮情解析失败:分机=" + 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);
            }
        }
    }
    /**
     * åœ†ç­’仓的粮情解析
     *
     * @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("分机------>>>平台:当前仓库:{}-{},没有没有配置布线规则,无法解析粮情信息……",
                    ser.getCompanyId(), depotConf.getDepotName());
            return;
        }
        String[] cableRuleAtt = depotConf.getCableRule().split("-");
        String[] cableCirAtt = depotConf.getCableCir().split("-");
        if (cableRuleAtt.length != cableCirAtt.length) {
            log.error("分机------>>>平台:当前仓库:{}-{},布线规则不正确,无法解析粮情信息……", 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 å…±å¤šå°‘根电缆;cableZ å±‚的最大值,锥形仓补齐最大层
        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;
    }
    /**
     * å¹³æ–¹ä»“的解析,解析需要考虑当前是否启用的一分机多仓
     *
     * @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;
            // è¯´æ˜Žè§£æžçš„æ•°æ®æœ‰é—®é¢˜
            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;
    }
    /**
     * å¹³æˆ¿ä»“,解析第二步,解析到坐标数据
     *
     * @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("粮情解析中获取到的温湿度信息={}", thDto.toString());
            grain.setHumidityIn(thDto.getHumidityIn());
            grain.setTempIn(thDto.getTempIn());
        }
        grain.setReceiveDate(msg.getReceiveDate());
        grain.setRemark("粮温正常");
        // èŽ·å–ç¼“å­˜ä¸­çš„å‘½ä»¤ä¿¡æ¯
        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("粮情解析中获取到的温湿度信息={}", thDto.toString());
            grain.setHumidityIn(thDto.getHumidityIn());
            grain.setTempIn(thDto.getTempIn());
        }
        grain.setReceiveDate(msg.getReceiveDate());
        grain.setRemark("粮温正常");
        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;
    }
}
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;
/**
 * åè®®è§£æžå…¥å£
 *
 * @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("分机----->>>平台:返回信息没有获取组织编码信息,无法继续解析----{}", 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:// è§£æžé…ç½®
                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;
        }
    }
    /**
     * æ ¡éªŒï¼Œæ­£å¸¸è¿”回NULL,异常返回异常原因,正常异常原因返回不踢掉重新连接
     *
     * @param message
     * @param ser
     * @return
     * @throws Exception
     */
    private String checkMsg(ReMessage message, DeviceSer ser) {
        String result;
        if (message.getResult() == 1) {
            result = "分机=" + ser.getName() + " åè®®è§£æžå¤±è´¥ï¼ŒåŽŸå› ï¼šæŽ¥æ”¶çš„åº”ç­”æ ¡éªŒå¼‚å¸¸";
            return result;
        }
        if (message.getResult() == 2) {
            result = "分机=" + ser.getName() + " åè®®è§£æžå¤±è´¥ï¼ŒåŽŸå› ï¼šå‘é€çš„æ•°æ®æ ¡éªŒå¼‚å¸¸";
            return result;
        }
        if (message.getResult() == 3) {
            result = "分机=" + ser.getName() + " åè®®è§£æžå¤±è´¥ï¼ŒåŽŸå› ï¼šæŽ’é˜Ÿä¸­";
            return result;
        }
        if (message.getResult() == 4) {
            result = "分机=" + ser.getName() + " åè®®è§£æžå¤±è´¥ï¼ŒåŽŸå› ï¼šå‘é€è¶…æ—¶é”™è¯¯";
            return result;
        }
        if (message.getResult() == 9) {
            result = "分机=" + ser.getName() + " åè®®è§£æžå¤±è´¥ï¼ŒåŽŸå› ï¼šIo模块不在线";
            return result;
        }
        if (message.getResult() == 10) {
            result = "分机=" + ser.getName() + " åè®®è§£æžå¤±è´¥ï¼ŒåŽŸå› ï¼šå‘é€ä¸­";
            return result;
        }
        if (message.getResult() == 11) {
            result = "分机=" + ser.getName() + " åè®®è§£æžå¤±è´¥ï¼ŒåŽŸå› ï¼šæ— çº¿æ¨¡å—æ•…éšœ";
            return result;
        }
        if (message.getResult() == 12) {
            result = "分机=" + ser.getName()
                    + " åè®®è§£æžå¤±è´¥ï¼ŒåŽŸå› ï¼šä¸»è¦æ˜¯åé¦ˆåæ ‡ç‚¹äº¤æ¢å‘½ä»¤æˆ–è€…æ˜¯ç”µç¼†ä¿®æ”¹å‘½ä»¤çš„é”™è¯¯ï¼Œæˆ–è€…ç²®æƒ…é‡‡é›†çš„å‚æ•°ä¸å¯¹";
            return result;
        }
        if (message.getResult() == 13) {
            result = "分机=" + ser.getName() + " åè®®è§£æžå¤±è´¥ï¼ŒåŽŸå› ï¼šç½‘å…³æœªæ³¨å†Œ";
            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() + " åè®®è§£æžå¤±è´¥ï¼ŒåŽŸå› ï¼šCRC16校验异常";
            return result;
        }
    }
}
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;
/**
 * è§£æžæ¸©æ¹¿åº¦ä¿¡æ¯
 *
 * @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;
    /**
     * è§£æžä»“库温湿度信息,将信息放在缓存中,以便粮情使用
     *
     * @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("仓温仓湿解析完成={}", 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);
    }
}
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;
    }
    /**
     * ä½¿ç”¨ä¸­å‘现CRC16可能以EE结尾,NETTY误以为是结尾导致截取少了一个EE,当前方法必须从头向后截取,保证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);
        // æºID,分机唯一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)) + "");
        // å‘送ID
        start = 6;
        len = 2;
        temp = strMsg.substring(start * 2, start * 2 + len * 2);
        message.setSendId(BytesUtil.hexToInt(BytesUtil.tran_LH(temp)) + "");
        // è·¯ç”±ä¿¡æ¯ï¼Œä¸è§£æž
        // æ¶ˆæ¯ç±»åž‹
        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;
    }
}
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;
}
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;//发送者ID
    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 + '\'' +
                '}';
    }
}
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;
}
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;
    }
}
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());
        }
    }
}
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());
        }
    }
}
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);
        // ç”Ÿæˆæ•´ä½“命令信息和BYte信息
        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()));
    }
}
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);
        // ç”Ÿæˆæ•´ä½“命令信息和BYte信息
        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);
    }
}
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);
        // ç”Ÿæˆæ•´ä½“命令信息和BYte信息
        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);
    }
}
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);
        // ç”Ÿæˆæ•´ä½“命令信息和BYte信息
        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);
    }
}
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);
    }
}
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);
        // ç”Ÿæˆæ•´ä½“命令信息和BYte信息
        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));
    }
}
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);
        // ç”Ÿæˆæ•´ä½“命令信息和BYte信息
        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);
    }
}
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);
        // ç”Ÿæˆæ•´ä½“命令信息和BYte信息
        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);
    }
}
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);
        // ç”Ÿæˆæ•´ä½“命令信息和BYte信息
        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);
    }
}
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));
    }
}
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);
    }
}
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);
        // ç”Ÿæˆæ•´ä½“命令信息和BYte信息
        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);
    }
}
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);
    }
}
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;//发送者ID
    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 + "]";
    }
}
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 = "";
}
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;
    /**
     * æ­£å¸¸è¿”回信息获取
     *
     * @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);
    }
}
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("[正来电子--消息队列数据失败,失败信息:{}]", 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("[正来电子--登录消息队列数据失败,失败信息:{}]", e.getMessage());
        }
        latch.countDown();
    }
}
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);
        //监听对应的channel
        container.addMessageListener(adapter1, new PatternTopic(ProtocolEnum.TCP_ZLDZ_GRAIN_V1.getCode()));
        //监听对应的channel
        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
    }
}
igds-protocol-zldz/src/main/java/com/ld/igds/protocol/zldz/package-info.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
/**
 * æ­£æ¥ç”µå­-粮情协议V1
 *
 */
package com.ld.igds.protocol.zldz;
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;
/**
 * å¿ƒè·³ç»´æŒï¼ŒéªŒè¯å½“前连接中的IP在服务器上配置的有没有,如果有则表示正常连接,如果没有则踢除连接。
 * <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;
    }
}
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) {
        // è°ƒç”¨è§£æžæŽ¥å£å¼€å§‹è§£æž
        // 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);
    }
}
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) {
        // æ·»åŠ è‡ªå®šä¹‰ä¸šåŠ¡ID
        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());
    }
}
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;
    }
}
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);
    }
}
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;
}
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次等待,终端已经正常返回";
        } 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次等等,终端已经正常返回";
        } 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次等等,终端已经正常返回";
        } else {
            log.info("{}-第3次命令补发后,仍然没有返回,取消等待。", commandData.getIp());
            //super.destory(commandData.getIp(), commandData.getPort());
        }
        return "子任务执行完成";
    }
}
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秒,如果没有正常返回则发送第二次命令。
        Thread.sleep(time);
        CommandTask redisData = (CommandTask) redisUtil.get(redisKey);
        if (null == redisData) {
            return "命令第1次等待,终端已经正常返回";
        } 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次等等,终端已经正常返回";
        } 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 "子任务执行完成";
    }
}
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));
    }
}
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 };
    /**
     * è®¡ç®—数组的CRC8校验值
     *
     * @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;
    }
}
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;
    }
}
igds-recir/src/main/java/com/ld/igds/temp/manager/TempControlManager.java
@@ -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());
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 = "通风口设置个数")
    @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)
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);
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
        <!--  ç§æœ‰åè®®-正来电子 -->
        <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;不显示js可能的错误 &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和css文件 &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>
                    <!--不显示js可能的错误 -->
                    <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和css文件 -->
                    <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>
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==
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/
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/
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/
igds-web/src/main/resources/application-pro5325.yml
@@ -1,4 +1,4 @@
##########################  æ±Ÿè¥¿èµ£å·žé¡¹ç›®   ##########################
##########################  æ±Ÿè¥¿èµ£å·ž-大公项目   ##########################
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/
  file-path: F:/IGDS/FILE/
igds-web/src/main/resources/application-pro5327.yml
@@ -1,4 +1,4 @@
##########################  æ­¦æ±‰é»„陂军粮   ##########################
##########################  æ­¦æ±‰é»„陂军粮-Linux   ##########################
server:
  port: 8888
  context-path: /
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
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
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
igds-web/src/main/resources/lib/modbus4j-3.1.0.jar
Binary files differ
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
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,
igds-web/src/main/resources/static/img/aerial-5317_001.png

igds-web/src/main/resources/static/img/aerial-5317_001_1.png
igds-web/src/main/resources/static/img/aerial-5325_001.png
igds-web/src/main/resources/static/img/aerial-5328_001.png
igds-web/src/main/resources/static/img/gas/5303/001.png

igds-web/src/main/resources/static/img/gas/5303/002.png

igds-web/src/main/resources/static/img/gas/5303/003.png
igds-web/src/main/resources/static/img/gas/5325/5325_001.png
igds-web/src/main/resources/static/img/gas/5328/5328_001_10.png
igds-web/src/main/resources/static/img/gas/5328/5328_001_4.png
igds-web/src/main/resources/static/img/gas/5328/5328_001_5.png
igds-web/src/main/resources/static/img/gas/5328/5328_001_7.png
igds-web/src/main/resources/static/img/logo-5325.png
igds-web/src/main/resources/static/img/n2/5325/pfc2_a.png
igds-web/src/main/resources/static/img/n2/5325/pfc2_b.png
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>
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>
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
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>