Selaa lähdekoodia

上传海康表计识别

tjf 1 viikko sitten
vanhempi
commit
6a1ca9f996
92 muutettua tiedostoa jossa 1401 lisäystä ja 134 poistoa
  1. 0 0
      lib/HCCore.dll
  2. 0 0
      lib/HCCore.lib
  3. 0 0
      lib/HCNetSDK.dll
  4. 0 0
      lib/HCNetSDK.lib
  5. 0 0
      lib/HCNetSDKCom/AnalyzeData.dll
  6. 0 0
      lib/HCNetSDKCom/AudioIntercom.dll
  7. 0 0
      lib/HCNetSDKCom/AudioRender.dll
  8. 0 0
      lib/HCNetSDKCom/HCAlarm.dll
  9. 0 0
      lib/HCNetSDKCom/HCAlarm.lib
  10. 0 0
      lib/HCNetSDKCom/HCCoreDevCfg.dll
  11. 0 0
      lib/HCNetSDKCom/HCDisplay.dll
  12. 0 0
      lib/HCNetSDKCom/HCGeneralCfgMgr.dll
  13. 0 0
      lib/HCNetSDKCom/HCGeneralCfgMgr.lib
  14. 0 0
      lib/HCNetSDKCom/HCIndustry.dll
  15. 0 0
      lib/HCNetSDKCom/HCPlayBack.dll
  16. 0 0
      lib/HCNetSDKCom/HCPreview.dll
  17. 0 0
      lib/HCNetSDKCom/HCPreview.lib
  18. 0 0
      lib/HCNetSDKCom/HCVoiceTalk.dll
  19. 0 0
      lib/HCNetSDKCom/OpenAL32.dll
  20. 0 0
      lib/HCNetSDKCom/StreamTransClient.dll
  21. 0 0
      lib/HCNetSDKCom/SystemTransform.dll
  22. 0 0
      lib/HCNetSDKCom/libiconv2.dll
  23. 0 0
      lib/hlog.dll
  24. 0 0
      lib/hpr.dll
  25. 0 0
      lib/libcrypto-1_1-x64.dll
  26. 0 0
      lib/libssl-1_1-x64.dll
  27. 0 0
      lib/zlib1.dll
  28. 0 0
      libOne/HCNetSDKCom/libAudioIntercom.so
  29. 0 0
      libOne/HCNetSDKCom/libHCAlarm.so
  30. 0 0
      libOne/HCNetSDKCom/libHCCoreDevCfg.so
  31. 0 0
      libOne/HCNetSDKCom/libHCDisplay.so
  32. 0 0
      libOne/HCNetSDKCom/libHCGeneralCfgMgr.so
  33. 0 0
      libOne/HCNetSDKCom/libHCIndustry.so
  34. 0 0
      libOne/HCNetSDKCom/libHCPlayBack.so
  35. 0 0
      libOne/HCNetSDKCom/libHCPreview.so
  36. 0 0
      libOne/HCNetSDKCom/libHCVoiceTalk.so
  37. 0 0
      libOne/HCNetSDKCom/libStreamTransClient.so
  38. 0 0
      libOne/HCNetSDKCom/libSystemTransform.so
  39. 0 0
      libOne/HCNetSDKCom/libanalyzedata.so
  40. 0 0
      libOne/HCNetSDKCom/libiconv2.so
  41. 0 0
      libOne/HCNetSDK_Log_Switch.xml
  42. 0 0
      libOne/libAudioRender.so
  43. 0 0
      libOne/libHCCore.so
  44. 0 0
      libOne/libNPQos.so
  45. 0 0
      libOne/libPlayCtrl.so
  46. 0 0
      libOne/libSuperRender.so
  47. 0 0
      libOne/libcrypto.so.1.1
  48. 0 0
      libOne/libhcnetsdk.so
  49. 0 0
      libOne/libhpr.so
  50. 0 0
      libOne/libopenal.so.1
  51. 0 0
      libOne/libssl.so.1.1
  52. 0 0
      libOne/libz.so
  53. BIN
      ruoyi-admin/lib/ClientDemo.exe
  54. 0 1
      ruoyi-admin/lib/ClientDemoDll/ReadMe.txt
  55. BIN
      ruoyi-admin/lib/ClientDemoDll/calib.dll
  56. BIN
      ruoyi-admin/lib/ClientDemoDll/iconv.dll
  57. BIN
      ruoyi-admin/lib/ClientDemoDll/libcrypto-1_1-x64.dll
  58. BIN
      ruoyi-admin/lib/ClientDemoDll/libssl-1_1-x64.dll
  59. BIN
      ruoyi-admin/lib/ClientDemoDll/libxml2.dll
  60. BIN
      ruoyi-admin/lib/ClientDemoDll/zlib1.dll
  61. BIN
      ruoyi-admin/lib/GdiPlus.dll
  62. BIN
      ruoyi-admin/lib/GdiPlus.lib
  63. BIN
      ruoyi-admin/lib/HCNetSDKCom/AudioRender.dll
  64. BIN
      ruoyi-admin/lib/HXVA.dll
  65. BIN
      ruoyi-admin/lib/HmMerge.dll
  66. 0 0
      ruoyi-admin/lib/LocalSensorAdd.dat
  67. BIN
      ruoyi-admin/lib/LocalXml.zip
  68. BIN
      ruoyi-admin/lib/MP_Render.dll
  69. BIN
      ruoyi-admin/lib/NPQos.dll
  70. BIN
      ruoyi-admin/lib/OpenAL32.dll
  71. BIN
      ruoyi-admin/lib/PlayCtrl.dll
  72. BIN
      ruoyi-admin/lib/PlayCtrl.lib
  73. BIN
      ruoyi-admin/lib/SuperRender.dll
  74. BIN
      ruoyi-admin/lib/YUVProcess.dll
  75. BIN
      ruoyi-admin/lib/examples.jar
  76. BIN
      ruoyi-admin/lib/libmmd.dll
  77. 24 8
      ruoyi-admin/pom.xml
  78. 337 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/hk/AlarmDataParse.java
  79. 28 62
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/hk/BjsbController.java
  80. 2 2
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/hk/CommonMethod/osSelect.java
  81. 20 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/hk/FMSGCallBack_V31.java
  82. 54 59
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/hk/HCNetSDK.java
  83. 10 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/manage/ChannelNumberController.java
  84. 91 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/manage/DialIndicatorLogController.java
  85. 1 1
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java
  86. 1 1
      ruoyi-admin/src/main/resources/application-druid.yml
  87. 1 0
      ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
  88. 416 0
      ruoyi-system/src/main/java/com/ruoyi/manage/domain/DialIndicatorLog.java
  89. 62 0
      ruoyi-system/src/main/java/com/ruoyi/manage/mapper/DialIndicatorLogMapper.java
  90. 62 0
      ruoyi-system/src/main/java/com/ruoyi/manage/service/IDialIndicatorLogService.java
  91. 97 0
      ruoyi-system/src/main/java/com/ruoyi/manage/service/impl/DialIndicatorLogServiceImpl.java
  92. 195 0
      ruoyi-system/src/main/resources/mapper/manage/DialIndicatorLogMapper.xml

+ 0 - 0
ruoyi-admin/lib/HCCore.dll → lib/HCCore.dll


+ 0 - 0
ruoyi-admin/lib/HCCore.lib → lib/HCCore.lib


+ 0 - 0
ruoyi-admin/lib/HCNetSDK.dll → lib/HCNetSDK.dll


+ 0 - 0
ruoyi-admin/lib/HCNetSDK.lib → lib/HCNetSDK.lib


+ 0 - 0
ruoyi-admin/lib/HCNetSDKCom/AnalyzeData.dll → lib/HCNetSDKCom/AnalyzeData.dll


+ 0 - 0
ruoyi-admin/lib/HCNetSDKCom/AudioIntercom.dll → lib/HCNetSDKCom/AudioIntercom.dll


+ 0 - 0
ruoyi-admin/lib/AudioRender.dll → lib/HCNetSDKCom/AudioRender.dll


+ 0 - 0
ruoyi-admin/lib/HCNetSDKCom/HCAlarm.dll → lib/HCNetSDKCom/HCAlarm.dll


+ 0 - 0
ruoyi-admin/lib/HCNetSDKCom/HCAlarm.lib → lib/HCNetSDKCom/HCAlarm.lib


+ 0 - 0
ruoyi-admin/lib/HCNetSDKCom/HCCoreDevCfg.dll → lib/HCNetSDKCom/HCCoreDevCfg.dll


+ 0 - 0
ruoyi-admin/lib/HCNetSDKCom/HCDisplay.dll → lib/HCNetSDKCom/HCDisplay.dll


+ 0 - 0
ruoyi-admin/lib/HCNetSDKCom/HCGeneralCfgMgr.dll → lib/HCNetSDKCom/HCGeneralCfgMgr.dll


+ 0 - 0
ruoyi-admin/lib/HCNetSDKCom/HCGeneralCfgMgr.lib → lib/HCNetSDKCom/HCGeneralCfgMgr.lib


+ 0 - 0
ruoyi-admin/lib/HCNetSDKCom/HCIndustry.dll → lib/HCNetSDKCom/HCIndustry.dll


+ 0 - 0
ruoyi-admin/lib/HCNetSDKCom/HCPlayBack.dll → lib/HCNetSDKCom/HCPlayBack.dll


+ 0 - 0
ruoyi-admin/lib/HCNetSDKCom/HCPreview.dll → lib/HCNetSDKCom/HCPreview.dll


+ 0 - 0
ruoyi-admin/lib/HCNetSDKCom/HCPreview.lib → lib/HCNetSDKCom/HCPreview.lib


+ 0 - 0
ruoyi-admin/lib/HCNetSDKCom/HCVoiceTalk.dll → lib/HCNetSDKCom/HCVoiceTalk.dll


+ 0 - 0
ruoyi-admin/lib/HCNetSDKCom/OpenAL32.dll → lib/HCNetSDKCom/OpenAL32.dll


+ 0 - 0
ruoyi-admin/lib/HCNetSDKCom/StreamTransClient.dll → lib/HCNetSDKCom/StreamTransClient.dll


+ 0 - 0
ruoyi-admin/lib/HCNetSDKCom/SystemTransform.dll → lib/HCNetSDKCom/SystemTransform.dll


+ 0 - 0
ruoyi-admin/lib/HCNetSDKCom/libiconv2.dll → lib/HCNetSDKCom/libiconv2.dll


+ 0 - 0
ruoyi-admin/lib/hlog.dll → lib/hlog.dll


+ 0 - 0
ruoyi-admin/lib/hpr.dll → lib/hpr.dll


+ 0 - 0
ruoyi-admin/lib/libcrypto-1_1-x64.dll → lib/libcrypto-1_1-x64.dll


+ 0 - 0
ruoyi-admin/lib/libssl-1_1-x64.dll → lib/libssl-1_1-x64.dll


+ 0 - 0
ruoyi-admin/lib/zlib1.dll → lib/zlib1.dll


+ 0 - 0
ruoyi-admin/libOne/HCNetSDKCom/libAudioIntercom.so → libOne/HCNetSDKCom/libAudioIntercom.so


+ 0 - 0
ruoyi-admin/libOne/HCNetSDKCom/libHCAlarm.so → libOne/HCNetSDKCom/libHCAlarm.so


+ 0 - 0
ruoyi-admin/libOne/HCNetSDKCom/libHCCoreDevCfg.so → libOne/HCNetSDKCom/libHCCoreDevCfg.so


+ 0 - 0
ruoyi-admin/libOne/HCNetSDKCom/libHCDisplay.so → libOne/HCNetSDKCom/libHCDisplay.so


+ 0 - 0
ruoyi-admin/libOne/HCNetSDKCom/libHCGeneralCfgMgr.so → libOne/HCNetSDKCom/libHCGeneralCfgMgr.so


+ 0 - 0
ruoyi-admin/libOne/HCNetSDKCom/libHCIndustry.so → libOne/HCNetSDKCom/libHCIndustry.so


+ 0 - 0
ruoyi-admin/libOne/HCNetSDKCom/libHCPlayBack.so → libOne/HCNetSDKCom/libHCPlayBack.so


+ 0 - 0
ruoyi-admin/libOne/HCNetSDKCom/libHCPreview.so → libOne/HCNetSDKCom/libHCPreview.so


+ 0 - 0
ruoyi-admin/libOne/HCNetSDKCom/libHCVoiceTalk.so → libOne/HCNetSDKCom/libHCVoiceTalk.so


+ 0 - 0
ruoyi-admin/libOne/HCNetSDKCom/libStreamTransClient.so → libOne/HCNetSDKCom/libStreamTransClient.so


+ 0 - 0
ruoyi-admin/libOne/HCNetSDKCom/libSystemTransform.so → libOne/HCNetSDKCom/libSystemTransform.so


+ 0 - 0
ruoyi-admin/libOne/HCNetSDKCom/libanalyzedata.so → libOne/HCNetSDKCom/libanalyzedata.so


+ 0 - 0
ruoyi-admin/libOne/HCNetSDKCom/libiconv2.so → libOne/HCNetSDKCom/libiconv2.so


+ 0 - 0
ruoyi-admin/libOne/HCNetSDK_Log_Switch.xml → libOne/HCNetSDK_Log_Switch.xml


+ 0 - 0
ruoyi-admin/libOne/libAudioRender.so → libOne/libAudioRender.so


+ 0 - 0
ruoyi-admin/libOne/libHCCore.so → libOne/libHCCore.so


+ 0 - 0
ruoyi-admin/libOne/libNPQos.so → libOne/libNPQos.so


+ 0 - 0
ruoyi-admin/libOne/libPlayCtrl.so → libOne/libPlayCtrl.so


+ 0 - 0
ruoyi-admin/libOne/libSuperRender.so → libOne/libSuperRender.so


+ 0 - 0
ruoyi-admin/libOne/libcrypto.so.1.1 → libOne/libcrypto.so.1.1


+ 0 - 0
ruoyi-admin/libOne/libhcnetsdk.so → libOne/libhcnetsdk.so


+ 0 - 0
ruoyi-admin/libOne/libhpr.so → libOne/libhpr.so


+ 0 - 0
ruoyi-admin/libOne/libopenal.so.1 → libOne/libopenal.so.1


+ 0 - 0
ruoyi-admin/libOne/libssl.so.1.1 → libOne/libssl.so.1.1


+ 0 - 0
ruoyi-admin/libOne/libz.so → libOne/libz.so


BIN
ruoyi-admin/lib/ClientDemo.exe


+ 0 - 1
ruoyi-admin/lib/ClientDemoDll/ReadMe.txt

@@ -1 +0,0 @@
-The dll in this directory��iconv.dll,libxml2.dll,zlib1.dll,calib.dll��only used in ClientDemo.

BIN
ruoyi-admin/lib/ClientDemoDll/calib.dll


BIN
ruoyi-admin/lib/ClientDemoDll/iconv.dll


BIN
ruoyi-admin/lib/ClientDemoDll/libcrypto-1_1-x64.dll


BIN
ruoyi-admin/lib/ClientDemoDll/libssl-1_1-x64.dll


BIN
ruoyi-admin/lib/ClientDemoDll/libxml2.dll


BIN
ruoyi-admin/lib/ClientDemoDll/zlib1.dll


BIN
ruoyi-admin/lib/GdiPlus.dll


BIN
ruoyi-admin/lib/GdiPlus.lib


BIN
ruoyi-admin/lib/HCNetSDKCom/AudioRender.dll


BIN
ruoyi-admin/lib/HXVA.dll


BIN
ruoyi-admin/lib/HmMerge.dll


+ 0 - 0
ruoyi-admin/lib/LocalSensorAdd.dat


BIN
ruoyi-admin/lib/LocalXml.zip


BIN
ruoyi-admin/lib/MP_Render.dll


BIN
ruoyi-admin/lib/NPQos.dll


BIN
ruoyi-admin/lib/OpenAL32.dll


BIN
ruoyi-admin/lib/PlayCtrl.dll


BIN
ruoyi-admin/lib/PlayCtrl.lib


BIN
ruoyi-admin/lib/SuperRender.dll


BIN
ruoyi-admin/lib/YUVProcess.dll


BIN
ruoyi-admin/lib/examples.jar


BIN
ruoyi-admin/lib/libmmd.dll


+ 24 - 8
ruoyi-admin/pom.xml

@@ -16,7 +16,23 @@
     </description>
 
     <dependencies>
-
+        <!--海康威视-->
+        <dependency>
+            <groupId>net.java.jna</groupId>
+            <artifactId>jna</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>net.java.examples</groupId>
+            <artifactId>examples</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+        <!--转图片用-->
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+            <version>1.4</version>
+        </dependency>
         <!-- spring-boot-devtools -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -37,7 +53,7 @@
             <version>1.6.2</version>
         </dependency>
 
-         <!-- Mysql驱动包 -->
+        <!-- Mysql驱动包 -->
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
@@ -80,15 +96,15 @@
                     </execution>
                 </executions>
             </plugin>
-            <plugin>   
-                <groupId>org.apache.maven.plugins</groupId>   
-                <artifactId>maven-war-plugin</artifactId>   
-                <version>3.1.0</version>   
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>3.1.0</version>
                 <configuration>
                     <failOnMissingWebXml>false</failOnMissingWebXml>
                     <warName>${project.artifactId}</warName>
-                </configuration>   
-           </plugin>   
+                </configuration>
+            </plugin>
         </plugins>
         <finalName>${project.artifactId}</finalName>
     </build>

+ 337 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/hk/AlarmDataParse.java

@@ -0,0 +1,337 @@
+package com.ruoyi.web.controller.hk;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import com.ruoyi.common.config.RuoYiConfig;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.file.FileUploadUtils;
+import com.ruoyi.system.service.ISysNoticeService;
+import com.sun.jna.Pointer;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@Component
+public class AlarmDataParse {
+
+    @Autowired
+    private ISysNoticeService sysNoticeService;
+
+    public static AlarmDataParse alarmDataParse;
+
+    @PostConstruct
+    public void init() {
+        alarmDataParse = this;
+        alarmDataParse.sysNoticeService = this.sysNoticeService;
+    }
+
+    public static void alarmDataHandle(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {
+/*        SysNotice sysNotice = new SysNotice();
+        sysNotice.setNoticeTitle("1");
+        sysNotice.setNoticeContent("1");
+        sysNotice.setNoticeType("1");
+        alarmDataParse.sysNoticeService.insertNotice(sysNotice);*/
+        System.out.println("报警事件类型: lCommand:" + Integer.toHexString(lCommand));
+        String sAlarmInfo = new String(pAlarmer.sDeviceIP).trim();
+        //lCommand是传的报警类型
+        switch (lCommand) {
+            case HCNetSDK.COMM_ISAPI_ALARM: //ISAPI协议报警信息
+                HCNetSDK.NET_DVR_ALARM_ISAPI_INFO struEventISAPI = new HCNetSDK.NET_DVR_ALARM_ISAPI_INFO();
+                struEventISAPI.write();
+                Pointer pEventISAPI = struEventISAPI.getPointer();
+                pEventISAPI.write(0, pAlarmInfo.getByteArray(0, struEventISAPI.size()), 0, struEventISAPI.size());
+                struEventISAPI.read();
+                //报警数据类型:0- invalid,1- xml,2- json
+                sAlarmInfo = "报警设备IP:" + sAlarmInfo + ":ISAPI协议报警信息, 数据格式:" + struEventISAPI.byDataType +
+                        ", 图片个数:" + struEventISAPI.byPicturesNumber;
+                System.out.println(sAlarmInfo);
+                SimpleDateFormat sf1 = new SimpleDateFormat("yyyyMMddHHmmss");
+                String curTime = sf1.format(new Date());
+                //报警数据打印
+                HCNetSDK.BYTE_ARRAY m_strISAPIData = new HCNetSDK.BYTE_ARRAY(struEventISAPI.dwAlarmDataLen);
+                m_strISAPIData.write();
+                Pointer pPlateInfo = m_strISAPIData.getPointer();
+                pPlateInfo.write(0, struEventISAPI.pAlarmData.getByteArray(0, m_strISAPIData.size()), 0, m_strISAPIData.size());
+                m_strISAPIData.read();
+                //报警结果
+                /*    {
+                 *//*req, object, 事件内容, range:[,], desc:*//*
+                "ipAddress": "172.6.64.7",
+                    *//*req, string, 报警设备IPv4地址, const:, range:[,], enum:[], format:ipv4, mediaType:, pattern:, unit:, RAP:, desc:*//*
+                    "ipv6Address": "null",
+                    *//*opt, string, 报警设备IPv6地址, const:, range:[,], enum:[], format:ipv6, mediaType:, pattern:, unit:, RAP:, desc:*//*
+                    "portNo": 80,
+                    *//*opt, integer, 报警设备端口号, const:, enum:[], range:[1,65535], multipleOf:, step:, unit:, desc:*//*
+                    "protocol": "HTTP",
+                    *//*opt, string, 协议类型, const:, range:[0,64], enum:[], format:, mediaType:, pattern:, unit:, RAP:, desc:[HTTP#HTTP,HTTPS#HTTPS,EHome#EHome,OTAP#OTAP], 该字段无实际意义*//*
+                    "macAddress": "01:17:24:45:D9:F4",
+                    *//*opt, string, MAC地址, const:, range:[1,32], enum:[], format:, mediaType:, pattern:, unit:, RAP:, desc:*//*
+                    "channelID": 1,
+                    *//*req, integer, 触发报警的设备通道号, const:, enum:[], range:[1,65535], multipleOf:, step:, unit:, desc:触发的视频通道号(1、    在SDK透传ISAPI协议的时候,上传的是 私有协议对应的视频通道号;(2、    在萤石透传ISAPI协议的时候,上传的是 萤石协议对应的视频通道号;(3、    在ISUP透传ISAPI协议的时候,上传的是 ISUP协议对应的视频通道号;*//*
+                    "channelName": "ABC",
+                    *//*opt, string, 通道名称(监控点名称), const:, range:[0,64], enum:[], format:, mediaType:, pattern:, unit:, RAP:, desc:与/ISAPI/Streaming/channels/<channelID>的<channelName>一致*//*
+                    "dateTime": "2004-05-03T17:30:08+08:00",
+                    *//*req, string, 报警触发时间, const:, range:[,], enum:[], format:date-time, mediaType:, pattern:, unit:, RAP:, desc:*//*
+                    "activePostCount": 1,
+                    *//*opt, integer, 同一个报警已经上传的次数, const:, enum:[], range:[1,2147483647], multipleOf:, step:, unit:, desc:事件触发频次脉冲事件 定义:事件持续触发(按照设备的检测频率),例如:移动侦测。瞬时事件 定义:区分目标,一个目标触发一次,例如:目标抓拍activePostCount  在脉冲事件 类型触发的时候,用于区分是否是同一触发源触发的事件。例如:移动侦测,按照设备检测频率会一直上传;如果触发源发生了变化,这个时候计数就可以重新开始了。这个可以作为事件触发频次的方式来集成;*//*
+                    "eventType": "DialIndicatorReading",
+                    *//*req, string, 事件类型, const:, range:[1,64], enum:[], format:, mediaType:, pattern:, unit:, RAP:, desc:表计识别*//*
+                    "eventState": "active",
+                    *//*req, string, 事件状态, const:, range:[,], enum:[active#有效事件, inactive#无效事件], format:, mediaType:, pattern:, unit:, RAP:, desc:针对持续性事件active – 表示有效事件(开始 或者 无过程状态也使用该字段);inactive – 表示无效事件(结束);remark:在心跳类型下,该字段赋值(表示心跳数据,10s上传一次);*//*
+                    "eventDescription": "DialIndicatorReading",
+                    *//*req, string, 事件描述, const:, range:[1,128], enum:[], format:, mediaType:, pattern:, unit:, RAP:, desc:表计识别*//*
+                    "deviceID": "test0123",
+                    *//*opt, string, 设备ID, const:, range:[1,64], enum:[], format:, mediaType:, pattern:, unit:, RAP:, desc:ISUP协议接入时,deviceID为设备注册的ISUP设备ID;OTAP协议本地接入时,deviceID为设备注册的OTAP设备ID;OTAP萤石接入时,deviceID为设备注册萤石云的9位短序列号。*//*
+                    "deviceUUID": "12345",
+                    *//*opt, string, 设备编号,, const:, range:[1,128], enum:[], format:, mediaType:, pattern:, unit:, RAP:, desc:设备唯一标识,可通过协议/ISAPI/System/deviceInfo中的<deviceID>字段进行获取(部分设备支持配置deviceID参数)*//*
+                    "isDataRetransmission": true,
+                    *//*opt, boolean, 重传数据标记, const:, desc:由于网络异常等因素;导致的实时检测的数据上传失败;后设备异常因素恢复后重新上传当时的采集分析数据*//*
+                    "UUID": "079f23cd-0988-459f-96f5-fa1c507dd07c",
+                    *//*opt, string, 上传事件唯一标识, const:, range:[0,64], enum:[], format:, mediaType:, pattern:, unit:, RAP:, desc:*//*
+                    "DialIndicatorReading":{
+                *//*opt, object, 事件内容, range:[,], desc:*//*
+                "sceneID": 1,
+                        *//*ro, opt, integer, 场景ID, const:, enum:[], range:[1,16], multipleOf:, step:, unit:, desc:*//*
+                        "ruleID": 1,
+                        *//*ro, opt, integer, 规则ID, const:, enum:[], range:[1,16], multipleOf:, step:, unit:, desc:*//*
+                        "tagSetID": "test",
+                        *//*ro, opt, string, 标定集ID, const:, range:[1,64], enum:[], format:, mediaType:, pattern:, unit:, RAP:, desc:由平台维护,唯一表示一个标定集,desc:非标定分析任务不会返回*//*
+                        "presetID": 1,
+                        *//*ro, opt, integer, 预置点ID, const:, enum:[], range:[1,256], multipleOf:, step:, unit:, desc:*//*
+                        "pictureID": "test",
+                        *//*opt, string, 图片ID, const:, range:[1,32], enum:[], format:, mediaType:, pattern:, unit:, RAP:, desc:和提交通用图片分析任务时下发图片时附加的图片id对应,用于标识下发通用图片任务的图片*//*
+                        "resultType": "dialIndicatorReading",
+                        *//*ro, req, string, 分析结果类型, const:, range:[,], enum:[dialIndicatorReading#读表(正常状态), dialIndicatorDefect#缺陷表(异常)], format:, mediaType:, pattern:, unit:, RAP:, desc:*//*
+                        "alarmLevel": "general",
+                        *//*opt, string, 告警等级, const:, range:[,], enum:[normal#正常, general#一般告警, serious#严重告警, emergency#危急告警], format:, mediaType:, pattern:, unit:, RAP:, desc:*//*
+                        "dialIndicatorReading":{
+                    *//*ro, opt, object, 读表类事件信息, range:[,], desc:*//*
+                    "dialIndicatorAnalysisType": "tagged",
+                            *//*opt, string, 表计读数分析类型, const:, range:[,], enum:[tagged#标定模式, unTagged#非标定模式], format:, mediaType:, pattern:, unit:, RAP:, desc:*//*
+                            "dialIndicatorStatus": "success",
+                            *//*opt, string, 读数状态, const:, range:[,], enum:[success#成功, failed#整张图失败], format:, mediaType:, pattern:, unit:, RAP:, desc:成功可能部分成功也可能全部成功,会返回读数信息。失败是整张图失败,不会返回读数信息(dialIndicatorNums,dialIndicatorParams),没有该字段默认成功*//*
+                            "readingFailedReason": 1,
+                            *//*opt, integer, 读数失败原因, const:, enum:[0#未知, 1#标定异常, 2#相机偏转, 3#图像质量不佳, 5#未标定, 6#标定参数异常, 7#算法处理超时, 8#算法处理异常], range:[,], multipleOf:, step:, unit:, dependency:(dialIndicatorStatus,eq,failed), desc:当读数失败的时候返回*//*
+                            "dialIndicatorNums": 1,
+                            *//*ro, opt, integer, 表个数, const:, enum:[], range:[0,16], multipleOf:, step:, unit:, desc:*//*
+                            "dialIndicatorParams":[
+                    *//*ro, opt, array, 表信息列表, range:[0,16], uniqueItems:, desc:*//*
+                    {
+                        *//*opt, object, 表信息, range:[,], desc:*//*
+                        "dialIndicatorID": 1,
+                            *//*ro, opt, integer, 表ID, const:, enum:[], range:[1,120], multipleOf:, step:, unit:, desc:由于老设备这个参数的生成逻辑是按1,2,3递增的顺序生成的标识,而且考虑到删除表计后添加新的表计会覆盖被删除的标识,而且范围受限,所以不能作为表的标识,用32位UUID的meterID代替*//*
+                            "meterID": "test",
+                            *//*ro, opt, string, 表计ID, const:, range:[1,64], enum:[], format:, mediaType:, pattern:, unit:, RAP:, desc:表的标识,当手动下发添加表计的时候,由web生成(非用户填写),当自动标定的时候,由设备生成,最终算法库进行解析,作为表计的标识,建议使用UUID作为标识防止重复。平台可以通过查询表计识别事件中的meterID进行表计校验(是否为标定的表计,并且是否被删除)*//*
+                            "meterName": "test",
+                            *//*ro, opt, string, 表计名称, const:, range:[1,64], enum:[], format:, mediaType:, pattern:, unit:, RAP:, desc:*//*
+                            "readingParams":{
+                        *//*ro, opt, object, 读数表参数, range:[,], desc:*//*
+                        "readingNums": 2,
+                                *//*ro, opt, integer, 读数个数, const:, enum:[], range:[0,16], multipleOf:, step:, unit:, desc:*//*
+                                "readingInfo":[
+                        *//*ro, opt, array, 读数信息列表, range:[0,16], uniqueItems:, desc:*//*
+                        {
+                            *//*opt, object, 读数信息, range:[,], desc:*//*
+                            "readingType": "pointer",
+                                *//*ro, opt, string, 表类型, const:, range:[,], enum:[pointer#指针类, number#数字类, status#状态类, level#液位类], format:, mediaType:, pattern:, unit:, RAP:, desc:*//*
+                                "targetRegion":[
+                            *//*ro, opt, array, 目标区域, range:[4,10], uniqueItems:, desc:4~10边形,左下角坐标原点*//*
+                            {
+                                *//*req, object, 目标区域, range:[,], desc:*//*
+                                "x": 0.12,
+                                    *//*ro, req, number, x坐标, const:, enum:[], range:[0,1], multipleOf:, step:, unit:, desc:*//*
+                                    "y": 0.12
+                                *//*ro, req, number, y坐标, const:, enum:[], range:[0,1], multipleOf:, step:, unit:, desc:*//*
+                            }
+                                ],
+                            "ROIRegion":[
+                            *//*ro, opt, array, 感兴趣区域, range:[4,10], uniqueItems:, desc:4~10边形,左下角坐标原点*//*
+                            {
+                                *//*req, object, 感兴趣区域坐标, range:[,], desc:*//*
+                                "x": 0.12,
+                                    *//*ro, req, number, x坐标, const:, enum:[], range:[0,1], multipleOf:, step:, unit:, desc:*//*
+                                    "y": 0.12
+                                *//*ro, req, number, y坐标, const:, enum:[], range:[0,1], multipleOf:, step:, unit:, desc:*//*
+                            }
+                                ],
+                            "readingResult": "test",
+                                *//*ro, opt, string, 当前读数值, const:, range:[0,16], enum:[], format:, mediaType:, pattern:, unit:, RAP:, desc:readingType为指针类,数字类,液位类时该字段有效*//*
+                                "readingConfidence": 80,
+                                *//*ro, opt, integer, 读数置信度, const:, enum:[], range:[1,100], multipleOf:, step:, unit:, desc:*//*
+                                "regionConfidence": 80,
+                                *//*ro, opt, integer, 区域置信度, const:, enum:[], range:[1,100], multipleOf:, step:, unit:, desc:*//*
+                                "statusResult": 1,
+                                *//*ro, opt, integer, 状态表状态, const:, enum:[0#红灯亮, 1#红灯灭, 2#黄灯亮, 3#黄灯灭, 4#蓝灯亮, 5#蓝灯灭, 6#绿灯亮, 7#绿灯灭, 8#白灯亮, 9#白灯灭, 10#旋钮向左, 11#旋钮向左上, 12#旋钮向上, 13#旋钮向右上, 14#旋钮向右, 15#旋钮向右下, 16#旋钮向下, 17#旋钮向左下, 18#空开向上, 19#空开向下, 20#压板开, 21#压板合, 22#硅胶筒变色, 23#硅胶筒未变色, 24#字符分, 25#字符合, 26#字符0, 27#字符1, 28#字符ON, 29#字符OFF, 30#字符已储能, 31#字符未储能, 32#断路器分, 33#断路器合, 34#断路器0, 35#断路器1, 36#断路器ON, 37#断路器OFF, 38#断路器已储能, 39#断路器未储能, 40#刀闸开, 41#刀闸关, 42#开集类型关, 43#开集类别开, -1#需要解析classifiedStatusResult状态], range:[,], multipleOf:, step:, unit:, desc:状态表的情况下,为了兼容老平台,设备必须返回该字段,如果枚举中没有对应的状态,需将其置为-1。平台为了兼容老设备,平台也需要先解析这个字段,这个字段为-1,则应该解析下面拆分的状态(pilotLampState,eightPositionSelectorKnobState等)。readingType为状态类时有效*//*
+                                "classifiedStatusResult":{
+                            *//*opt, object, 分类后的状态结果, range:[,], dependency:(statusResult,eq,44), desc:*//*
+                            "pilotLampState": "0",
+                                    *//*ro, opt, string, 指示灯当前读数值, const:, range:[,], enum:[0#亮, 1#灭, 2#红灯亮, 3#红灯灭, 4#黄灯亮, 5#黄灯灭, 6#蓝灯亮, 7#蓝灯灭, 8#绿灯亮, 9#绿灯灭, 10#白灯亮, 11#白灯灭, 100#亮横向, 101#亮竖向, 102#红灯亮横向, 103#红灯亮竖向, 104#黄灯亮横向, 105#黄灯亮竖向, 106#蓝灯亮横向, 107#蓝灯亮竖向, 108#绿灯亮横向, 109#绿灯亮竖向, 110#白灯亮横向, 111#白灯亮竖向], format:, mediaType:, pattern:, unit:, RAP:, desc:*//*
+                                    "eightPositionSelectorKnobState": "0",
+                                    *//*ro, opt, string, 8朝向旋钮当前读数值, const:, range:[,], enum:[0#旋钮向左, 1#旋钮向左上, 2#旋钮向上, 3#旋钮向右上, 4#旋钮向右, 5#旋钮向右下, 6#旋钮向下, 7#旋钮向左下], format:, mediaType:, pattern:, unit:, RAP:, desc:*//*
+                                    "airSwitchCircuitBreakerState": "0",
+                                    *//*ro, opt, string, 空开当前读数值, const:, range:[,], enum:[0#空开向下, 1#空开向上], format:, mediaType:, pattern:, unit:, RAP:, desc:*//*
+                                    "relayProtectionControllerState": "0",
+                                    *//*ro, opt, string, 压板当前读数值, const:, range:[,], enum:[0#压板开, 1#压板合], format:, mediaType:, pattern:, unit:, RAP:, desc:*//*
+                                    "silicaGelBreatherState": "0",
+                                    *//*ro, opt, string, 硅胶筒当前读数值, const:, range:[,], enum:[0#硅胶筒未变色, 1#硅胶筒变色], format:, mediaType:, pattern:, unit:, RAP:, desc:*//*
+                                    "charactersState": "0",
+                                    *//*ro, opt, string, 字符当前读数值, const:, range:[,], enum:[0#字符分, 1#字符合, 2#字符0, 3#字符1, 4#字符OFF, 5#字符ON, 6#字符未储能, 7#字符已储能], format:, mediaType:, pattern:, unit:, RAP:, desc:*//*
+                                    "circuitBreakerState": "0",
+                                    *//*ro, opt, string, 断路器当前读数值, const:, range:[,], enum:[0#断路器分, 1#断路器合, 2#断路器0, 3#断路器1, 4#断路器OFF, 5#断路器ON, 6#断路器未储能, 7#断路器已储能], format:, mediaType:, pattern:, unit:, RAP:, desc:*//*
+                                    "knifeSwitchState": "0",
+                                    *//*ro, opt, string, 刀闸当前读数值, const:, range:[,], enum:[0#刀闸开(分), 1#刀闸关(合)], format:, mediaType:, pattern:, unit:, RAP:, desc:*//*
+                                    "openSetTypeState": "0"
+                            *//*ro, opt, string, 开集类型当前读数值, const:, range:[,], enum:[0#开集类型开, 1#开集类别关], format:, mediaType:, pattern:, unit:, RAP:, desc:*//*
+                        },
+                            "mapName": "undefined",
+                                *//*opt, string, 映射名称, const:, range:[1,128], enum:[], format:, mediaType:, pattern:, unit:, RAP:, desc:由报警结果全局映射或部分映射配置,设备上报时按映射规则将状态转为对应的映射名称*//*
+                                "readingFailedReason": 1,
+                                *//*opt, integer, 读数失败原因, const:, enum:[0#未知, 1#标定异常, 2#相机偏转, 3#图像质量不佳], range:[,], multipleOf:, step:, unit:, desc:当读数失败的时候返回,不能输出读数*//*
+                                "readingWarningInfo": 1
+                            *//*opt, integer, 读数警告提示, const:, enum:[0#未知, 1#标定异常, 2#相机偏转, 3#图像质量不佳], range:[,], multipleOf:, step:, unit:, desc:算法针对角度变化会有一定的修正,能输出读数,希望通过该信息提示用户相机发生偏转等信息*//*
+                        }
+                        ]
+                    }
+                    }
+            ]
+                },
+                "dialIndicatorDefect":{
+                    *//*ro, opt, object, 缺陷表事件信息, range:[,], desc:*//*
+                    "dialIndicatorNums": 0,
+                            *//*ro, opt, integer, 缺陷表个数, const:, enum:[], range:[0,32], multipleOf:, step:, unit:, desc:*//*
+                            "dialIndicatorParams":[
+                    *//*ro, opt, array, 缺陷表信息列表, range:[0,16], uniqueItems:, desc:*//*
+                    {
+                        *//*opt, object, 缺陷表信息, range:[,], desc:*//*
+                        "defectMainType": 1,
+                            *//*ro, opt, integer, 实体类型, const:, enum:[1#表盘, 2#表计外壳, 3#硅胶筒, 4#呼吸器, 5#绝缘子, 6#变电箱体, 7#盖板, 8#压板, 9#人体, 10#头部, 11#鸟巢, 12#烟体, 13#挂空悬浮物, 14#地面油污], range:[,], multipleOf:, step:, unit:, desc:*//*
+                            "targetRegion":[
+                        *//*ro, opt, array, 目标区域, range:[4,10], uniqueItems:, desc:4~10边形,左下角坐标原点*//*
+                        {
+                            *//*req, object, 目标区域, range:[,], desc:*//*
+                            "x": 0.12,
+                                *//*ro, req, number, x坐标, const:, enum:[], range:[0,1], multipleOf:, step:, unit:, desc:*//*
+                                "y": 0.12
+                            *//*ro, req, number, y坐标, const:, enum:[], range:[0,1], multipleOf:, step:, unit:, desc:*//*
+                        }
+                    ],
+                        "defectNums": 2,
+                            *//*ro, opt, integer, 缺陷个数, const:, enum:[], range:[0,16], multipleOf:, step:, unit:, desc:*//*
+                            "defectInfo":[
+                        *//*ro, opt, array, 缺陷信息列表, range:[0,16], uniqueItems:, desc:*//*
+                        {
+                            *//*opt, object, 缺陷信息, range:[,], desc:*//*
+                            "defectType": 1,
+                                *//*ro, opt, integer, int, const:, enum:[0#默认值, 1#表盘正常, 2#表盘模糊, 3#表盘破损, 4#表盘读数异常, 5#表计外壳正常, 6#表计外壳破损, 7#硅胶缺陷类型:硅胶筒正常, 8#表计外壳正常(和5重复)以5为标准, 9#硅胶变色, 10#呼吸器缺陷类型:呼吸器油封油位正常, 11#呼吸器油封油位异常, 12#绝缘子缺陷类型:绝缘子正常, 13#绝缘子异常, 14#变电箱体缺陷类型:变电箱体闭合正常, 15#变电箱体闭合异常, 16#盖板正常, 17#盖板破损, 18#压板缺陷类型:压板开, 19#压板合, 20#人体缺陷类型:穿工装, 21#未穿工装, 22#头部缺陷类型:戴安全帽, 23#未戴安全帽, 24#硅胶筒破损, 25#鸟巢, 26#烟体, 27#挂空悬浮物, 28#地面油污, 29#呼吸器油封破损, 30#导线断股, 31#电容器本体鼓肚, 32#膨胀器冲顶, 33#设备烟火, 34#部件表面油污], range:[,], multipleOf:, step:, unit:, desc:*//*
+                                "confidence": 80
+                            *//*ro, opt, integer, 检测置信度, const:, enum:[], range:[1,100], multipleOf:, step:, unit:, desc:*//*
+                        }
+                    ]
+                    }
+            ]
+                },
+                "dialIndicatorPicPath":{
+                    *//*opt, object, 表计检测图片文件存储信息, range:[,], desc:*//*
+                    "resourcesContentType": "binary",
+                            *//*req, string, 资源传输类型, const:, range:[,], enum:[url#url方式传输, binary#二进制方式传输, base64#base64编码的图片], format:, mediaType:, pattern:, unit:, RAP:, desc:资源传输类型,当设备返回的报警报文中带有额外资源(比如图片)时,该节点必须返回。使用URI从设备下载文件的时候,需要进行认证,认证方式和登录设备的方式保持一致。如果该URI的参数中有token(?token=)可以直接请求,除token以外的其他方式,认证方式为登录设备的方式。设备返回URI中的IP和Port,仅代表设备直连网络下可以被访问,建议集成方基于设备网络部署,替换URI中的IP和Port。如果返回的URI的前缀为“/pic”,代表为武汉云存储的URI,设备自定义的URI不使用该前缀。*//*
+                            "resourcesContent": "",
+                            *//*req, string, 资源标识ID, const:, range:[0,262000], enum:[], format:, mediaType:, pattern:, unit:, RAP:, desc:当设备返回的报警报文中带有额外资源(比如图片)时,该节点必须返回;当resourcesContentType为binary时,该节点与图片的Content-ID严格对应;当resourcesContentType为url时,该节点填写具体的url; 当resourcesContentType 为base64时,表示经过base64编码后的数据*//*
+                            "pictureResolution":{
+                        *//*opt, object, 图片资源的分辨率, range:[,], desc:归一化坐标转换成实际分辨率时依赖此节点。*//*
+                        "height": 1,
+                                *//*req, integer, 分辨率高, const:, enum:[], range:[1,65535], multipleOf:, step:, unit:px, desc:*//*
+                                "width": 1
+                        *//*req, integer, 分辨率框, const:, enum:[], range:[1,65535], multipleOf:, step:, unit:px, desc:*//*
+                    }
+                },
+                "isResultOverlay": false
+                *//*ro, opt, boolean, 是否叠加信息已显示在图片上, const:, desc:对应/ISAPI/Intelligent/dialIndicatorReading/DialIndicatorReadingResultOverlay?format=json,开启表计识别结果叠加后并不会直接显示在图片上,还需要平台自己处理或算法库处理后才能显示在图片上,有该字段表示字体信息已叠加在图片上,不需要进一步处理*//*
+            }
+            }*/
+                String result = new String(m_strISAPIData.byValue).trim() + "\n";
+
+                JSONObject jsonObject = JSON.parseObject(result);
+                Object ipAddress = jsonObject.get("ipAddress");
+
+                //打印报警数据
+                System.out.println(new String(m_strISAPIData.byValue).trim() + "\n");
+                //图片数据保存
+                for (int i = 0; i < struEventISAPI.byPicturesNumber; i++) {
+                    HCNetSDK.NET_DVR_ALARM_ISAPI_PICDATA struPicData = new HCNetSDK.NET_DVR_ALARM_ISAPI_PICDATA();
+                    struPicData.write();
+                    Pointer pPicData = struPicData.getPointer();
+                    pPicData.write(0, struEventISAPI.pPicPackData.getByteArray(i * struPicData.size(), struPicData.size()), 0, struPicData.size());
+                    struPicData.read();
+                    FileOutputStream fout;
+                    try {
+                        // 上传文件路径
+                        String filePath = RuoYiConfig.getUploadPath();
+                        //图片名称
+                        String filename = new String(pAlarmer.sDeviceIP).trim() + "_" + curTime +
+                                "_ISAPIPic_" + i + "_" + new String(struPicData.szFilename).trim();
+                        //图片名称进行编码
+                        filename = StringUtils.format("{}/{}.{}", DateUtils.datePath(),
+                                filename, "jpg");
+                        //路径不存在则生成
+                        FileUploadUtils.getAbsoluteFile(filePath, filename);
+                        //最终生成的文件名称
+                        String fileName = filePath + File.separator + filename;
+                        fout = new FileOutputStream(fileName);
+                        System.out.println("图片路径" + filename);
+                        //将字节写入文件
+                        long offset = 0;
+                        ByteBuffer buffers = struPicData.pPicData.getByteBuffer(offset, struPicData.dwPicLen);
+                        byte[] bytes = new byte[struPicData.dwPicLen];
+                        buffers.rewind();
+                        buffers.get(bytes);
+                        fout.write(bytes);
+                        fout.close();
+                    } catch (FileNotFoundException e) {
+                        // TODO Auto-generated catch block
+                        e.printStackTrace();
+                    } catch (IOException e) {
+                        // TODO Auto-generated catch block
+                        e.printStackTrace();
+                    }
+                }
+                break;
+            case HCNetSDK.COMM_VCA_ALARM:  // 智能检测通用报警(Json或者XML数据结构)
+                sAlarmInfo = new String(pAlarmer.sDeviceIP);
+                //报警数据类型:0- invalid,1- xml,2- json
+                sAlarmInfo = "报警设备IP:" + sAlarmInfo;
+                System.out.println(sAlarmInfo);
+
+                SimpleDateFormat sf0 = new SimpleDateFormat("yyyyMMddHHmmss");
+                String curTime0 = sf0.format(new Date());
+                FileOutputStream Data;
+                String jsonfile = "../pic" + new String(pAlarmer.sDeviceIP).trim() + curTime0 + "_VCA_ALARM_" + ".json";
+                try {
+                    Data = new FileOutputStream(jsonfile);
+                    //将字节写入文件
+                    ByteBuffer dataBuffer = pAlarmInfo.getByteBuffer(0, dwBufLen);
+                    byte[] dataByte = new byte[dwBufLen];
+                    dataBuffer.rewind();
+                    dataBuffer.get(dataByte);
+                    Data.write(dataByte);
+                    Data.close();
+                } catch (FileNotFoundException e) {
+                    e.printStackTrace();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+                break;
+            default:
+                System.out.println("报警类型" + Integer.toHexString(lCommand));
+                break;
+        }
+    }
+}

+ 28 - 62
ruoyi-admin/src/main/java/com/ruoyi/web/controller/hk/BjsbController.java

@@ -1,26 +1,25 @@
 package com.ruoyi.web.controller.hk;
 
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.web.controller.hk.CommonMethod.osSelect;
 import com.sun.jna.Native;
 import com.sun.jna.Pointer;
-import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.io.UnsupportedEncodingException;
-
 /**
  * @Author: tjf
  * @Date: 2025/6/6 星期五 16:03
  * @Describe:
  */
 @RestController
-@RequestMapping("/system/user")
+@RequestMapping("/hk")
 public class BjsbController {
     static HCNetSDK hCNetSDK = null;
     static int lUserID = -1;//用户句柄
     static int lAlarmHandle = -1;
-
+    static FMSGCallBack_V31 fMSFCallBack_V31 = null; //报警布防回调函数
     /**
      * 根据不同操作系统选择不同的库文件和库路径
      *
@@ -51,7 +50,7 @@ public class BjsbController {
     /**
      * 获取表计数据
      */
-    @GetMapping("/getBj")
+    @PostMapping("/getBj")
     public AjaxResult getBj() {
         if (hCNetSDK == null) {
             if (!createSDKInstance()) {
@@ -64,15 +63,15 @@ public class BjsbController {
             HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256);
             HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256);
             //这里是库的绝对路径,请根据实际情况修改,注意改路径必须有访问权限
-            String strPath1 = System.getProperty("user.dir") + "/lib/libcrypto.so.1.1";
-            String strPath2 = System.getProperty("user.dir") + "/lib/libssl.so.1.1";
+            String strPath1 = System.getProperty("user.dir") + "/libOne/libcrypto.so.1.1";
+            String strPath2 = System.getProperty("user.dir") + "/libOne/libssl.so.1.1";
             System.arraycopy(strPath1.getBytes(), 0, ptrByteArray1.byValue, 0, strPath1.length());
             ptrByteArray1.write();
             hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_LIBEAY_PATH, ptrByteArray1.getPointer());
             System.arraycopy(strPath2.getBytes(), 0, ptrByteArray2.byValue, 0, strPath2.length());
             ptrByteArray2.write();
             hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_SSLEAY_PATH, ptrByteArray2.getPointer());
-            String strPathCom = System.getProperty("user.dir") + "/lib/";
+            String strPathCom = System.getProperty("user.dir") + "/libOne/";
             HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();
             System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());
             struComPath.write();
@@ -84,10 +83,22 @@ public class BjsbController {
         /*加载日志*/
         //hCNetSDK.NET_DVR_SetLogToFile(3, "./sdklog", false);
 
+        //设置报警回调函数
+        if (fMSFCallBack_V31 == null) {
+            fMSFCallBack_V31 = new FMSGCallBack_V31();
+            Pointer pUser = null;
+            if (!hCNetSDK.NET_DVR_SetDVRMessageCallBack_V50(0,fMSFCallBack_V31, pUser)) {
+                System.out.println("设置回调函数失败!");
+                return AjaxResult.error("设置回调函数失败!");
+            } else {
+                System.out.println("设置回调函数成功!");
+            }
+        }
+
         //分离模式(建议):对应报警信息类型COMM_ISAPI_ALARM,pAlarmInfo对应结构体NET_DVR_ALARM_ISAPI_INFO,将报警事件信息数据(XML或者JSON格式的字符串)和二进制图片数据分离,分别在结构体的pAlarmData、pPicPackData指针指向的内存里面返回。设备上传的报警信息包含图片数据,图片数据有二进制传输方式和URL传输方式两种,如果URL方式则对应pPicPackData为空,报警事件信息数据(XML或者JSON格式的字符串)里面包含HTTP协议的URL字段。
-        HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG struNET_DVR_LOCAL_GENERAL_CFG = new HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG();
         //控制JSON透传报警数据和图片是否分离,0-不分离,1-分离(分离后走COMM_ISAPI_ALARM回调返回)
-        struNET_DVR_LOCAL_GENERAL_CFG.byAlarmJsonPictureSeparate = 1;
+        HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG struNET_DVR_LOCAL_GENERAL_CFG = new HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG();
+        struNET_DVR_LOCAL_GENERAL_CFG.byAlarmJsonPictureSeparate = 1;   //设置JSON透传报警数据和图片分离
         struNET_DVR_LOCAL_GENERAL_CFG.write();
         Pointer pStrNET_DVR_LOCAL_GENERAL_CFG = struNET_DVR_LOCAL_GENERAL_CFG.getPointer();
         if (!hCNetSDK.NET_DVR_SetSDKLocalCfg(17, pStrNET_DVR_LOCAL_GENERAL_CFG)) {
@@ -97,20 +108,17 @@ public class BjsbController {
         hCNetSDK.NET_DVR_SetConnectTime(2000, 1);
         hCNetSDK.NET_DVR_SetReconnect(10000, true);
 
-        //设备登录
-        lUserID = loginDevice("10.9.137.190", (short) 8000, "admin", "hik12345"); //登录设备
+        //设备登录 端口号默认8000不能修改
+        lUserID = loginDevice("183.167.244.65", (short) 18000, "admin", "pw666888"); //登录设备
         if (lUserID == -1) {
             return AjaxResult.error("请先注册报警主机");
         }
-        //设置报警回调函数
-        HCNetSDK.FMSGCallBack_V31 fMSFCallBack_v31 = new FMSGCallBack_V31();
-        boolean flag = hCNetSDK.NET_DVR_SetDVRMessageCallBack_V50(0, fMSFCallBack_v31, null);
-        if (!flag) {
-            AjaxResult.error("报警主机设置回调函数失败!");
-        }
         //启用布防
         HCNetSDK.NET_DVR_SETUPALARM_PARAM_V50 struAlarmParam = new HCNetSDK.NET_DVR_SETUPALARM_PARAM_V50();
-        struAlarmParam.byAlarmTypeURL = 1;
+        struAlarmParam.dwSize = struAlarmParam.size();
+        struAlarmParam.byLevel = 0;  //布防等级
+        struAlarmParam.byAlarmInfoType = 1;   // 智能交通报警信息上传类型:0- 老报警信息(NET_DVR_PLATE_RESULT),1- 新报警信息(NET_ITS_PLATE_RESULT)
+        struAlarmParam.byDeployType = 0;   //布防类型:0-客户端布防,1-实时布防,客户端布防仅支持一路
         struAlarmParam.write();
         lAlarmHandle = hCNetSDK.NET_DVR_SetupAlarmChan_V50(lUserID, struAlarmParam, null, 0);
         if (lAlarmHandle == -1) {
@@ -120,48 +128,6 @@ public class BjsbController {
         }
     }
 
-    /**
-     * @description: 报警信息回调函数
-     **/
-    public class FMSGCallBack_V31 implements HCNetSDK.FMSGCallBack_V31 {
-
-        /**
-         * @param lCommand   上传消息类型
-         * @param pAlarmer   报警设备信息
-         * @param pAlarmInfo 报警信息
-         * @param dwBufLen   报警信息缓存大小
-         * @param pUser      用户数据
-         * @return
-         */
-        @Override
-        public boolean invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) throws UnsupportedEncodingException {
-            alarmDataHandle(lCommand, pAlarmer, pAlarmInfo, dwBufLen, pUser);
-            return true;
-        }
-
-        //报警信息回调函数
-        public void alarmDataHandle(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) throws UnsupportedEncodingException {
-            //报警时间
-            String sAlarmType = "lCommand=0x" + Integer.toHexString(lCommand);
-            System.out.println(pAlarmInfo);
-            //退出程序时调用NET_DVR_Logout注销设备
-            Logout();
-            //lCommand是传的报警类型
-/*            switch (lCommand) {
-                case HCNetSDK.COMM_ISAPI_ALARM:
-                    HCNetSDK.NET_DVR_ALARM_ISAPI_INFO struISAPIAlarm = new HCNetSDK.NET_DVR_ALARM_ISAPI_INFO();
-                    //解析JSON数据
-                    if (struISAPIAlarm.dwAlarmDataLen > 0)
-                    {
-                        printf("COMM_ISAPI_ALARM报警事件信息数据: \n%s\n", UTF8ToAnsi(struISAPIAlarm.pAlarmData));
-                    }
-                    break;
-                default:
-                    break;
-            }*/
-        }
-    }
-
 
     /**
      * 登录设备,支持 V40 和 V30 版本,功能一致。

+ 2 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/hk/osSelect.java → ruoyi-admin/src/main/java/com/ruoyi/web/controller/hk/CommonMethod/osSelect.java

@@ -1,7 +1,7 @@
-package com.ruoyi.web.controller.hk;
+package com.ruoyi.web.controller.hk.CommonMethod;
 
 /**
- * @author jiangxin
+ * @author
  * @create 2022-01-19-16:40
  */
 public class osSelect {

+ 20 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/hk/FMSGCallBack_V31.java

@@ -0,0 +1,20 @@
+
+package com.ruoyi.web.controller.hk;
+
+import com.sun.jna.Pointer;
+
+public class FMSGCallBack_V31 implements HCNetSDK.FMSGCallBack_V31 {
+
+    //报警信息回调函数
+    public boolean invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {
+        AlarmDataParse.alarmDataHandle(lCommand, pAlarmer, pAlarmInfo, dwBufLen, pUser);
+        return true;
+    }
+}
+
+
+
+
+
+
+

+ 54 - 59
ruoyi-admin/src/main/java/com/ruoyi/web/controller/hk/HCNetSDK.java

@@ -1,6 +1,5 @@
 package com.ruoyi.web.controller.hk;
 
-
 import com.sun.jna.*;
 import com.sun.jna.examples.win32.W32API;
 import com.sun.jna.examples.win32.W32API.HWND;
@@ -8,7 +7,6 @@ import com.sun.jna.ptr.ByteByReference;
 import com.sun.jna.ptr.IntByReference;
 import com.sun.jna.ptr.ShortByReference;
 
-import java.io.UnsupportedEncodingException;
 import java.util.Arrays;
 import java.util.List;
 
@@ -69,10 +67,10 @@ public interface HCNetSDK extends Library {
     public static final int MAX_VIDEOOUT_V30 = 4;      //9000设备的视频输出数
     public static final int MAX_VIDEOOUT = 2;      //8000设备的视频输出数
     public static final int MAX_PRESET_V30 = 256;    /* 9000设备支持的云台预置点数 */
-    public static final int MAX_TRACK_V30 = 256;    /* 9000设备支持的云台轨迹数 */
+    public static final int MAX_TRACK_V30 = 256;    /* 9000设备支持的云台数 */
     public static final int MAX_CRUISE_V30 = 256;    /* 9000设备支持的云台巡航数 */
     public static final int MAX_PRESET = 128;    /* 8000设备支持的云台预置点数 */
-    public static final int MAX_TRACK = 128;    /* 8000设备支持的云台轨迹数 */
+    public static final int MAX_TRACK = 128;    /* 8000设备支持的云台数 */
     public static final int MAX_CRUISE = 128;    /* 8000设备支持的云台巡航数 */
     public static final int CRUISE_MAX_PRESET_NUMS = 32;    /* 一条巡航最多的巡航点 */
     public static final int MAX_SERIAL_PORT = 8;    //9000设备支持232串口数
@@ -372,9 +370,9 @@ public interface HCNetSDK extends Library {
     public static final int SET_SEQ_DWELL = 31;    /* 设置巡航点停顿时间 */
     public static final int SET_SEQ_SPEED = 32;    /* 设置巡航速度 */
     public static final int CLE_PRE_SEQ = 33;/* 将预置点从巡航序列中删除 */
-    public static final int STA_MEM_CRUISE = 34;/* 开始记录轨迹 */
-    public static final int STO_MEM_CRUISE = 35;/* 停止记录轨迹 */
-    public static final int RUN_CRUISE = 36;    /* 开始轨迹 */
+    public static final int STA_MEM_CRUISE = 34;/* 开始记录 */
+    public static final int STO_MEM_CRUISE = 35;/* 停止记录 */
+    public static final int RUN_CRUISE = 36;    /* 开始 */
     public static final int RUN_SEQ = 37;    /* 开始巡航 */
     public static final int STOP_SEQ = 38;    /* 停止巡航 */
     public static final int GOTO_PRESET = 39;    /* 快球转到预置点 */
@@ -737,7 +735,7 @@ public interface HCNetSDK extends Library {
     /***************************DS9000新增命令(_V30) end *****************************/
 
     /*************************参数配置命令 end*******************************/
-    /*************************************人脸识别门禁一体机1.0 begin**************************************/
+    /*************************************特征识别门禁一体机1.0 begin**************************************/
     public static final int NET_DVR_GET_CARD_CFG = 2116; //获取卡参数
     public static final int NET_DVR_SET_CARD_CFG = 2117; //设置卡参数
     public static final int NET_DVR_GET_CARD_CFG_V50 = 2178;    //获取新卡参数(V50)
@@ -800,7 +798,7 @@ public interface HCNetSDK extends Library {
     public static final int NET_DVR_SET_ACS_CFG = 2160; //设置门禁主机参数
     public static final int NET_DVR_BULK_UPLOAD_ID_BLOCKLIST = 2521;        //批量上传身份证禁止名单
 
-    /*************************************人脸识别门禁一体机1.0 end**************************************/
+    /*************************************特征识别门禁一体机1.0 end**************************************/
     public static final int NET_DVR_SET_SENSOR_CFG = 1180;//设置模拟量参数
     public static final int NET_DVR_GET_SENSOR_CFG = 1181;//获取模拟量参数
     public static final int NET_DVR_SET_ALARMIN_PARAM = 1182;//设置报警输入参数
@@ -915,7 +913,7 @@ public interface HCNetSDK extends Library {
     public static final int COMM_ALARM_TFS = 0x1113; //交通取证报警信息
     public static final int COMM_ALARM_TPS_V41 = 0x1114; //交通事件报警信息扩展
     public static final int COMM_ALARM_AID_V41 = 0x1115; //交通事件报警信息扩展
-    public static final int COMM_UPLOAD_FACESNAP_RESULT = 0x1112;  //人脸识别结果上传
+    public static final int COMM_UPLOAD_FACESNAP_RESULT = 0x1112;  //特征识别结果上传
     public static final int COMM_SNAP_MATCH_ALARM = 0x2902;  //人脸比对结果上传
     public static final int COMM_ALARM_ACS = 0x5002; //门禁主机报警信息
     public static final int COMM_ID_INFO_ALARM = 0x5200; //门禁身份证刷卡信息
@@ -2003,7 +2001,7 @@ public interface HCNetSDK extends Library {
         public short wDecoderAddress;    /*解码器地址:0 - 255*/
         public byte[] bySetPreset = new byte[MAX_PRESET_V30];        /* 预置点是否设置,0-没有设置,1-设置*/
         public byte[] bySetCruise = new byte[MAX_CRUISE_V30];        /* 巡航是否设置: 0-没有设置,1-设置 */
-        public byte[] bySetTrack = new byte[MAX_TRACK_V30];            /* 轨迹是否设置,0-没有设置,1-设置*/
+        public byte[] bySetTrack = new byte[MAX_TRACK_V30];            /* 是否设置,0-没有设置,1-设置*/
 
 
     }
@@ -2019,7 +2017,7 @@ public interface HCNetSDK extends Library {
         public short wDecoderAddress;    /*解码器地址:0 - 255*/
         public byte[] bySetPreset = new byte[MAX_PRESET];        /* 预置点是否设置,0-没有设置,1-设置*/
         public byte[] bySetCruise = new byte[MAX_CRUISE];        /* 巡航是否设置: 0-没有设置,1-设置 */
-        public byte[] bySetTrack = new byte[MAX_TRACK];            /* 轨迹是否设置,0-没有设置,1-设置*/
+        public byte[] bySetTrack = new byte[MAX_TRACK];            /* 是否设置,0-没有设置,1-设置*/
 
 
     }
@@ -2105,8 +2103,8 @@ public interface HCNetSDK extends Library {
         public short[] wPresetRevertDelay = new short[MAX_CHANNUM_V30];    /* 恢复预置点延时(保留) */
         public byte[] byEnableCruise = new byte[MAX_CHANNUM_V30];        /* 是否调用巡航 0-否,1-是*/
         public byte[] byCruiseNo = new byte[MAX_CHANNUM_V30];            /* 巡航 */
-        public byte[] byEnablePtzTrack = new byte[MAX_CHANNUM_V30];        /* 是否调用轨迹 0-否,1-是*/
-        public byte[] byPTZTrack = new byte[MAX_CHANNUM_V30];            /* 调用的云台的轨迹序号 */
+        public byte[] byEnablePtzTrack = new byte[MAX_CHANNUM_V30];        /* 是否调用 0-否,1-是*/
+        public byte[] byPTZTrack = new byte[MAX_CHANNUM_V30];            /* 调用的云台的序号 */
         public byte[] byRes = new byte[16];
 
 
@@ -2124,8 +2122,8 @@ public interface HCNetSDK extends Library {
         public byte[] byPresetNo = new byte[MAX_CHANNUM];            /* 调用的云台预置点序号,一个报警输入可以调用多个通道的云台预置点, 0xff表示不调用预置点。*/
         public byte[] byEnableCruise = new byte[MAX_CHANNUM];        /* 是否调用巡航 0-否,1-是*/
         public byte[] byCruiseNo = new byte[MAX_CHANNUM];            /* 巡航 */
-        public byte[] byEnablePtzTrack = new byte[MAX_CHANNUM];        /* 是否调用轨迹 0-否,1-是*/
-        public byte[] byPTZTrack = new byte[MAX_CHANNUM];            /* 调用的云台的轨迹序号 */
+        public byte[] byEnablePtzTrack = new byte[MAX_CHANNUM];        /* 是否调用 0-否,1-是*/
+        public byte[] byPTZTrack = new byte[MAX_CHANNUM];            /* 调用的云台的序号 */
 
 
     }
@@ -2914,7 +2912,7 @@ public interface HCNetSDK extends Library {
         public byte[] sFtpCode = new byte[8];      /*客户定义的操作类型的对应的码*/
     }
 
-    public static class NET_DVR_FRAMEFORMAT_EX extends Structure {//ATM参数添加FTP上传参数, 俄罗斯银行定制, 2006-11-17
+    public static class NET_DVR_FRAMEFORMAT_EX extends Structure {//ATM参数添加FTP上传参数, 银行定制, 2006-11-17
         public int dwSize;
         public byte[] sATMIP = new byte[16];                        /* ATM IP地址 */
         public int dwATMType;                        /* ATM类型 */
@@ -4287,7 +4285,7 @@ DVR实现巡航数据结构
         public byte bySubHvtType;//0-保留,1-机动车(机动车子类型中支持车牌检索,省份检索),2-非机动车,3-行人
         public byte[] byRes2 = new byte[2];
         public byte[] sLicense = new byte[MAX_LICENSE_LEN/*16*/];    //车牌号码
-        public byte byRegion;     // 区域索引值 0-保留,1-欧洲(Europe Region),2-俄语区域(Russian Region),3-欧洲&俄罗斯(EU&CIS), 4-中东(Middle East),0xff-所有
+        public byte byRegion;     // 区域索引值 0-保留,1-欧洲(Europe Region),3-欧洲&(EU&CIS), 4-中东(Middle East),0xff-所有
         public byte byCountry;     // 国家索引值,参照:COUNTRY_INDEX
         public byte byArea;  //地区
         public byte byISO8601;  //是否是8601的时间格式,即时差字段是否有效0-时差无效,年月日时分秒为设备本地时间 1-时差有效
@@ -4460,7 +4458,7 @@ DVR实现巡航数据结构
         public short wTaskNo;    //任务处理号 和 (上传数据NET_DVR_VEHICLE_RECOG_RESULT中的字段dwTaskNo对应 同时 下发任务结构 NET_DVR_VEHICLE_RECOG_COND中的字段dwTaskNo对应)
         public byte byDeployType;    //布防类型:0-客户端布防,1-实时布防
         public byte[] byRes1 = new byte[3];
-        public byte byAlarmTypeURL;//bit0-表示人脸抓拍报警上传(INTER_FACESNAP_RESULT);0-表示二进制传输,1-表示URL传输(设备支持的情况下,设备支持能力根据具体报警能力集判断,同时设备需要支持URL的相关服务,当前是”云存储“)
+        public byte byAlarmTypeURL;//bit0-表示特征抓拍报警上传(INTER_FACESNAP_RESULT);0-表示二进制传输,1-表示URL传输(设备支持的情况下,设备支持能力根据具体报警能力集判断,同时设备需要支持URL的相关服务,当前是”云存储“)
         public byte byCustomCtrl;//Bit0- 表示支持副驾驶人脸子图上传: 0-不上传,1-上传,(注:只在公司内部8600/8200等平台开放)
 
 
@@ -4477,13 +4475,13 @@ DVR实现巡航数据结构
         public byte byFaceAlarmDetection;
         //Bit0- 表示二级布防是否上传图片: 0-上传,1-不上传
         //Bit1- 表示开启数据上传确认机制;0-不开启,1-开启
-        //Bit6- 表示雷达检测报警(eventType:radarDetection)是否开启实时上传;0-不开启,1-开启(用于web插件实时显示雷达目标轨迹
+        //Bit6- 表示雷达检测报警(eventType:radarDetection)是否开启实时上传;0-不开启,1-开启(用于web插件实时显示雷达目标)
         public byte bySupport;
         //断网续传类型
         //bit0-车牌检测(IPC) (0-不续传,1-续传)
         //bit1-客流统计(IPC)  (0-不续传,1-续传)
         //bit2-热度图统计(IPC) (0-不续传,1-续传)
-        //bit3-人脸抓拍(IPC) (0-不续传,1-续传)
+        //bit3-特征抓拍(IPC) (0-不续传,1-续传)
         //bit4-人脸对比(IPC) (0-不续传,1-续传)
         //bit5-JSON报警透传(IPC) (0-不续传,1-续传)
         //bit6-热度图按人员停留时间统计数据上传事件(0-不续传,1-续传)
@@ -4494,7 +4492,7 @@ DVR实现巡航数据结构
         public byte bySubScription;    //订阅,按位表示,未开启订阅不上报  //占位
         //Bit7-移动侦测人车分类是否传图;0-不传图(V30上报),1-传图(V40上报)
         public byte[] byRes1 = new byte[2];
-        public byte byAlarmTypeURL;//bit0-表示人脸抓拍报警上传(INTER_FACESNAP_RESULT);0-表示二进制传输,1-表示URL传输(设备支持的情况下,设备支持能力根据具体报警能力集判断,同时设备需要支持URL的相关服务,当前是”云存储“)
+        public byte byAlarmTypeURL;//bit0-表示特征抓拍报警上传(INTER_FACESNAP_RESULT);0-表示二进制传输,1-表示URL传输(设备支持的情况下,设备支持能力根据具体报警能力集判断,同时设备需要支持URL的相关服务,当前是”云存储“)
         //bit1-表示EVENT_JSON中图片数据长传类型;0-表示二进制传输,1-表示URL传输(设备支持的情况下,设备支持能力根据具体报警能力集判断)
         //bit2 - 人脸比对(报警类型为COMM_SNAP_MATCH_ALARM)中图片数据上传类型:0 - 二进制传输,1 - URL传输
         //bit3 - 异常行为检测(报警类型为COMM_ALARM_RULE)中图片数据上传类型:0 - 二进制传输,1 - URL传输,本字段设备是否支持,对应软硬件能力集中<isSupportBehaviorUploadByCloudStorageURL>节点是否返回且为true
@@ -4572,7 +4570,7 @@ DVR实现巡航数据结构
         public NET_VCA_TRAVERSE_PLANE struTraversePlane;  //警戒参数
         public NET_VCA_AREA struArea; //进入/离开区域参数
         public NET_VCA_INTRUSION struIntrusion; //区域入侵参数
-        public NET_VCA_LEAVE_POSITION   struLeavePos;        //离岗参数
+        public NET_VCA_LEAVE_POSITION   struLeavePos;        //参数
 
     }
 
@@ -4613,7 +4611,7 @@ DVR实现巡航数据结构
         public NET_VCA_POLYGON struRegion; //区域范围
         public short wLeaveDelay;  //无人报警时间,单位:s
         public short wStaticDelay; //睡觉报警时间,单位:s
-        public byte byMode;       //模式,0-离岗事件,1-睡岗事件,2-离岗睡岗事件,3-在岗(当离岗人员回到岗位)
+        public byte byMode;       //模式,0-事件,,3-在岗(当人员回到岗位)
         public byte byPersonType; //值岗人数类型,0-单人值岗,1-双人值岗
         public byte byOnPosition; //在岗人数,1-10,默认1
         public byte bySensitivity;     //灵敏度参数,范围[1,5]
@@ -4879,8 +4877,8 @@ DVR实现巡航数据结构
 
     //规则触发参数
     public static class NET_VCA_RULE_TRIGGER_PARAM extends Structure {
-        public byte byTriggerMode;   //规则的触发方式,0- 不启用,1- 轨迹点 2- 目标面积
-        public byte byTriggerPoint;  //触发点,触发方式为轨迹点时有效 0- 中,1-上,2-下
+        public byte byTriggerMode;   //规则的触发方式,0- 不启用,1- 点 2- 目标面积
+        public byte byTriggerPoint;  //触发点,触发方式为点时有效 0- 中,1-上,2-下
         public byte[] byRes1 = new byte[2];       //保留
         public float fTriggerArea;    //触发目标面积百分比 [0,100],触发方式为目标面积时有效
         public byte[] byRes2 = new byte[4];       //保留
@@ -5034,7 +5032,7 @@ DVR实现巡航数据结构
         public byte byBright;                        //车牌亮度
         public byte byLicenseLen;                    //车牌字符个数
         public byte byEntireBelieve;                //整个车牌的置信度,-100
-        public byte byRegion;                       // 区域索引值 0-保留,1-欧洲(EU),2-俄语区域(ER),3-欧洲&俄罗斯(EU&CIS) ,4-中东(ME),0xff-所有
+        public byte byRegion;                       // 区域索引值 0-保留,1-欧洲(EU),2-俄语区域(ER),3-欧洲&(EU&CIS) ,4-中东(ME),0xff-所有
         public byte byCountry;                      // 国家索引值,参照枚举COUNTRY_INDEX(不支持"COUNTRY_ALL = 0xff, //ALL  全部")
         public byte byArea;                         //区域(省份),各国家内部区域枚举,阿联酋参照 EMI_AREA
         public byte byPlateSize;                    //车牌尺寸,0~未知,1~long, 2~short(中东车牌使用)
@@ -5318,7 +5316,7 @@ DVR实现巡航数据结构
        Bit0-未知(其他)
        Bit1-标准民用车与特种车
        Bit2-02式民用车牌
-       Bit3-武警车
+       Bit3-
        Bit4-警车
        Bit5-民用车双行尾牌
        Bit6-使馆车牌
@@ -5436,7 +5434,6 @@ DVR实现巡航数据结构
     Bit0-未知(其他)
     Bit1-标准民用车与特种车
     Bit2-02式民用车牌
-    Bit3-武警车
     Bit4-警车
     Bit5-民用车双行尾牌
     Bit6-使馆车牌
@@ -5657,7 +5654,7 @@ DVR实现巡航数据结构
         public byte byMagneticType; //门磁类型,0-常闭,1-常开
         public byte byOpenButtonType; //开门按钮类型,0-常闭,1-常开
         public byte byOpenDuration; //开门持续时间,1-255s(楼层继电器动作时间)
-        public byte byDisabledOpenDuration; //残障人士卡开门持续时间,1-255s
+        public byte byDisabledOpenDuration; //卡开门持续时间,1-255s
         public byte byMagneticAlarmTimeout; //门磁检测超时报警时间,0-255s,0表示不报警
         public byte byEnableDoorLock; //是否启用闭门回锁,0-否,1-是
         public byte byEnableLeaderCard; //是否启用首卡常开功能,0-否,1-是
@@ -5791,7 +5788,7 @@ DVR实现巡航数据结构
         public int dwModifyParamType;//需要修改的卡参数,设置卡参数时有效,按位表示,每位代表一种参数,1为需要修改,0为不修改
         public byte[] byCardNo = new byte[ACS_CARD_NO_LEN]; //卡号
         public byte byCardValid; //卡是否有效,0-无效,1-有效(用于删除卡,设置时置为0进行删除,获取时此字段始终为1)
-        public byte byCardType; //卡类型,1-普通卡,2-残障人士卡,3-禁止名单卡,4-巡更卡,5-胁迫卡,6-超级卡,7-来宾卡,8-解除卡,9-员工卡,10-应急卡,11-应急管理卡,默认普通卡
+        public byte byCardType; //卡类型,1-普通卡,3-禁止名单卡,4-巡更卡,5-胁迫卡,6-超级卡,7-来宾卡,8-解除卡,9-员工卡,10-应急卡,11-应急管理卡,默认普通卡
         public byte byLeaderCard; //是否为首卡,1-是,0-否
         public byte byRes1;
         public byte[] byDoorRight = new byte[MAX_DOOR_NUM_256]; //门权限(楼层权限),按位表示,1为有权限,0为无权限,从低位到高位表示对门1-N是否有权限
@@ -5816,10 +5813,9 @@ DVR实现巡航数据结构
         public int dwCardRight;      //卡权限
         public int dwPlanTemplate;   //计划模板(每天)各时间段是否启用,按位表示,0--不启用,1-启用
         public int dwCardUserId;    //持卡人ID
-        public byte byCardModelType;  //0-空,1- MIFARE S50,2- MIFARE S70,3- FM1208 CPU卡,4- FM1216 CPU卡,5-国密CPU卡,6-身份证,7- NFC
+        public byte byCardModelType;  //0-空,1-  S50,2-  S70,3- FM1208 CPU卡,4- FM1216 CPU卡,5-国密CPU卡,6-身份证,7- NFC
         public byte[] byRes3 = new byte[83];
     }
-
     //有效期参数结构体
     public static class NET_DVR_VALID_PERIOD_CFG extends Structure {
         public byte byEnable;
@@ -5834,7 +5830,7 @@ DVR实现巡航数据结构
     public static class NET_DVR_ID_CARD_INFO_EXTEND extends Structure {
         public byte byRemoteCheck; //是否需要远程核验(0-无效,1-不需要(默认),2-需要)
         public byte byThermometryUnit; //测温单位(0-摄氏度(默认),1-华氏度,2-开尔文)
-        public byte byIsAbnomalTemperature; //人脸抓拍测温是否温度异常:1-是,0-否
+        public byte byIsAbnomalTemperature; //特征抓拍测温是否温度异常:1-是,0-否
         public byte byRes2;
         public float fCurrTemperature; //人脸温度(精确到小数点后一位)
         public NET_VCA_POINT struRegionCoordinates = new NET_VCA_POINT(); //人脸温度坐标
@@ -5860,7 +5856,7 @@ DVR实现巡航数据结构
         public int dwDoorNo; //门编号,为0无效
         public int dwPicDataLen;   //图片数据大小,不为0是表示后面带数据
         public Pointer pPicData;
-        public byte byCardType; //卡类型,1-普通卡,2-残障人士卡,3-禁止名单卡,4-巡更卡,5-胁迫卡,6-超级卡,7-来宾卡,8-解除卡,为0无效
+        public byte byCardType; //卡类型,1-普通卡,3-禁止名单卡,4-巡更卡,5-胁迫卡,6-超级卡,7-来宾卡,8-解除卡,为0无效
         public byte byDeviceNo;                             // 设备编号,为0时无效(有效范围1-255)
         public byte byMask; //是否带口罩:0-保留,1-未知,2-不戴口罩,3-戴口罩
         public byte byCurrentEvent; //是否为实时事件:0-无效,1-是(实时事件),2-否(离线事件)
@@ -5907,7 +5903,7 @@ DVR实现巡航数据结构
         public byte byFingerPrintModuleLightCondition; //指纹模组光线条件,0-无效,1-室外,2-室内
         public byte byFaceMatchThresholdN; //人脸比对阀值,范围0-100
         public byte byFaceQuality; //人脸质量,范围0-100
-        public byte byFaceRecogizeTimeOut; //人脸识别超时时间,范围1-20代表:1s-20s,0xff-无限大
+        public byte byFaceRecogizeTimeOut; //特征识别超时时间,范围1-20代表:1s-20s,0xff-无限大
         public byte byFaceRecogizeInterval; //人脸连续识别间隔,0-无效,范围1-10代表:1s-10s,0xff-无延迟
         public short wCardReaderFunction; //只读,读卡器种类,按位表示:第1位-指纹,第二位-人脸,第三位-指静脉
         public byte[] byCardReaderDescription = new byte[CARD_READER_DESCRIPTION]; //读卡器描述
@@ -5917,7 +5913,7 @@ DVR实现巡航数据结构
         public short wBuzzerTime; //蜂鸣时间,范围0s-5999s(0-代表长鸣)
         public byte byFaceMatch1SecurityLevel; //人脸1:1识别安全等级,0-无效,1-一般,2-较强,3-极强
         public byte byFaceMatchNSecurityLevel; //人脸1:N识别安全等级,0-无效,1-一般,2-较强,3-极强
-        public byte byEnvirMode;//人脸识别环境模式,0-无效,1-室内,2-其他;
+        public byte byEnvirMode;//特征识别环境模式,0-无效,1-室内,2-其他;
         public byte byLiveDetLevelSet;//活体检测阈值等级设置,0-无效,1-低,2-中,3-高;
         public byte byLiveDetAntiAttackCntLimit;//活体检测防攻击次数, 0-无效,1-255次(客户端、设备统一次数限制,根据能力级限制);
         public byte byEnableLiveDetAntiAttack;//活体检测防攻击使能,0-无效,1-不启用,2-启用
@@ -5925,7 +5921,7 @@ DVR实现巡航数据结构
         public byte byFaceContrastMotionDetLevel;//人脸比对时移动侦测级别,0-无效,1-低,2-中,3-高,0xff-禁用
         public byte byDayFaceMatchThresholdN; //白天人脸1:N匹配阀值,范围0-100
         public byte byNightFaceMatchThresholdN; //夜晚人脸1:N匹配阀值,范围0-100
-        public byte byFaceRecogizeEnable; //人脸识别使能:0-无效,1-开启,2-关闭
+        public byte byFaceRecogizeEnable; //特征识别使能:0-无效,1-开启,2-关闭
         public byte byBlockListMatchThreshold; //禁止名单匹配阀值,范围0-100
         public byte byRes3;
         public byte byDefaultVerifyMode; //只读,读卡器默认验证方式(出厂默认),1-休眠,2-刷卡+密码,3-刷卡,4-刷卡或密码,5-指纹,6-指纹+密码,7-指纹或刷卡,8-指纹+刷卡,9-指纹+刷卡+密码,10-人脸或指纹或刷卡或密码,11-人脸+指纹,12-人脸+密码,13-人脸+刷卡,14-人脸,15-工号+密码,16-指纹或密码,17-工号+指纹,18-工号+指纹+密码,19-人脸+指纹+刷卡,20-人脸+密码+指纹,21-工号+人脸,22-人脸或人脸+刷卡,23-指纹或人脸,24-刷卡或人脸或密码,25-刷卡或人脸,26-刷卡或人脸或指纹,27-刷卡或指纹或密码
@@ -6387,7 +6383,7 @@ DVR实现巡航数据结构
     public static class NET_DVR_ACS_EVENT_INFO_EXTEND_V20 extends Structure {
         public byte byRemoteCheck; //是否需要远程核验(0-无效,1-不需要(默认),2-需要)
         public byte byThermometryUnit; //测温单位(0-摄氏度(默认),1-华氏度,2-开尔文)
-        public byte byIsAbnomalTemperature; //人脸抓拍测温是否温度异常:1-是,0-否
+        public byte byIsAbnomalTemperature; //特征抓拍测温是否温度异常:1-是,0-否
         public byte byRes2;
         public float fCurrTemperature; //人脸温度(精确到小数点后一位)
         public NET_VCA_POINT struRegionCoordinates = new NET_VCA_POINT(); //人脸温度坐标
@@ -6485,7 +6481,7 @@ DVR实现巡航数据结构
     public static class NET_DVR_ACS_EVENT_DETAIL extends Structure {
         public int dwSize;
         public byte[] byCardNo = new byte[ACS_CARD_NO_LEN]; //卡号(mac地址),为0无效
-        public byte byCardType; //卡类型,1-普通卡,2-残障人士卡,3-禁止名单卡,4-巡更卡,5-胁迫卡,6-超级卡,7-来宾卡,8-解除卡,为0无效
+        public byte byCardType; //卡类型,1-普通卡,3-禁止名单卡,4-巡更卡,5-胁迫卡,6-超级卡,7-来宾卡,8-解除卡,为0无效
         public byte byAllowListNo; //允许名单单号,1-8,为0无效
         public byte byReportChannel; //报告上传通道,1-布防上传,2-中心组1上传,3-中心组2上传,为0无效
         public byte byCardReaderKind; //读卡器属于哪一类,0-无效,1-IC读卡器,2-身份证读卡器,3-二维码读卡器,4-指纹头
@@ -6523,7 +6519,7 @@ DVR实现巡航数据结构
         public byte byRes1; //保留
         public byte byMask; //是否带口罩:0-保留,1-未知,2-不戴口罩,3-戴口罩
         public byte byThermometryUnit; //测温单位(0-摄氏度(默认),1-华氏度,2-开尔文)
-        public byte byIsAbnomalTemperature; //人脸抓拍测温是否温度异常:1-是,0-否
+        public byte byIsAbnomalTemperature; //特征抓拍测温是否温度异常:1-是,0-否
         public float fCurrTemperature; //人脸温度(精确到小数点后一位)
         public NET_VCA_POINT struRegionCoordinates; //人脸温度坐标
         public byte[] byRes = new byte[48];
@@ -6987,7 +6983,7 @@ DVR实现巡航数据结构
         public byte[] byRes2 = new byte[2]; //保留
         public byte[] byIllegalCode = new byte[ILLEGAL_LEN/*32*/];//违法代码扩展,当dwIllegalType值为0xffffffff;使用这个值
         public short wCountry; // 国家索引值,参照枚举COUNTRY_INDEX
-        public byte byRegion; //区域索引值,0-保留,1-欧洲(Europe Region),2-俄语区域(Russian Region),3-欧洲&俄罗斯(EU&CIS) , 4-中东(Middle East),0xff-所有
+        public byte byRegion; //区域索引值,0-保留,1-欧洲(Europe Region),,3-欧洲&(EU&CIS) , 4-中东(Middle East),0xff-所有
         public byte byCrossLine;//是否压线停车(侧方停车),0-表示未知,1-不压线,2-压线
         public byte[] byParkingSerialNO = new byte[16];//泊车位编号
         public byte byCrossSpaces;//是否跨泊车位停车(侧方停车),0-表示未知,1-未跨泊车位停车,2-跨泊车位停车
@@ -7101,7 +7097,7 @@ DVR实现巡航数据结构
         public byte[] byRes = new byte[4];    //保留
     }
 
-    //人脸抓拍附加信息结构体
+    //特征抓拍附加信息结构体
     public static class NET_VCA_FACESNAP_ADDINFO extends Structure {
         //人脸矩形框,该坐标为人脸小图(头肩照)中人脸的坐标
         public NET_VCA_RECT struFacePicRect = new NET_VCA_RECT();
@@ -7109,8 +7105,8 @@ DVR实现巡航数据结构
         public int iTiltAngle;//俯仰角, -90~90度
         public int dwPupilDistance;//瞳距,范围为:最小值为10像素,最大值为当前分辨率宽度/1.6
         public byte byBlockingState;//目标遮挡状态, 0-表示“未知”(算法不支持),1~无遮挡,2~瞬时轻度遮挡,3~持续轻度遮挡,4~严重遮挡
-        public byte byFaceSnapThermometryEnabled;//人脸抓拍测温使能 1-开启 0-关闭
-        public byte byIsAbnomalTemperature;//人脸抓拍测温是否温度异常 1-是 0-否
+        public byte byFaceSnapThermometryEnabled;//特征抓拍测温使能 1-开启 0-关闭
+        public byte byIsAbnomalTemperature;//特征抓拍测温是否温度异常 1-是 0-否
         public byte byThermometryUnit;//测温单位: 0-摄氏度(℃),1-华氏度(℉),2-开尔文(K)
         public NET_DVR_TIME_EX struEnterTime = new NET_DVR_TIME_EX();   // 最佳抓拍下进入时间
         public NET_DVR_TIME_EX struExitTime = new NET_DVR_TIME_EX();    // 最佳抓拍下离开时间
@@ -7119,7 +7115,7 @@ DVR实现巡航数据结构
         public byte[] byRes = new byte[472];// 保留字节
     }
 
-    //人脸抓拍结果
+    //特征抓拍结果
     public static class NET_VCA_FACESNAP_RESULT extends Structure {
         public int dwSize;             // 结构大小
         public int dwRelativeTime;     // 相对时标
@@ -7156,7 +7152,7 @@ DVR实现巡航数据结构
         public Pointer pBuffer2;  //背景图的图片数据(保留,通过查找背景图接口可以获取背景图)
     }
 
-    //人脸抓拍信息
+    //特征抓拍信息
     public static class NET_VCA_FACESNAP_INFO_ALARM extends Structure {
         public int dwRelativeTime;     // 相对时标
         public int dwAbsTime;            // 绝对时标
@@ -7745,7 +7741,7 @@ DVR实现巡航数据结构
         /*
   	报警命令,该字段值与报警布防类型相同,目前支持:
   	COMM_VCA_ALARM 	0x4993  智能检测报警
-  	COMM_UPLOAD_FACESNAP_RESULT    0x1112  人脸识别结果上传
+  	COMM_UPLOAD_FACESNAP_RESULT    0x1112  特征识别结果上传
   	COMM_SNAP_MATCH_ALAR    0x2902  人脸比对结果上传
 	 */
         public int dwAlarmComm;   //若该命令为空这代表不进行报警命令过滤。
@@ -7759,7 +7755,7 @@ DVR实现巡航数据结构
         /*
   	报警命令,该字段值与报警布防类型相同,目前支持:
   	COMM_VCA_ALARM 	0x4993    智能检测报警
-  	COMM_UPLOAD_FACESNAP_RESULT    0x1112  人脸识别结果上传
+  	COMM_UPLOAD_FACESNAP_RESULT    0x1112  特征识别结果上传
   	COMM_SNAP_MATCH_ALARM   0x2902 人脸比对结果上传
 	 */
         public int dwAlarmComm;
@@ -7965,8 +7961,8 @@ DVR实现巡航数据结构
     }
 
     public static class NET_DVR_PTZTRACKCHAN_INFO extends Structure {
-        public int dwEnablePtzTrackChan;    /*启用云台轨迹的通道*/
-        public int dwPtzTrackNo;        /*云台轨迹通道对应的编号, 0xfffffff表示无效*/
+        public int dwEnablePtzTrackChan;    /*启用云台的通道*/
+        public int dwPtzTrackNo;        /*云台通道对应的编号, 0xfffffff表示无效*/
     }
 
     public static class NET_DVR_EVENT_TRIGGER extends Structure {
@@ -7975,7 +7971,7 @@ DVR实现巡航数据结构
         public int[] dwRelRecordChan = new int[MAX_CHANNUM_V40]; //实际触发录像通道,按值表示,采用紧凑型排列,从下标0开始顺序读取,中间遇到0xffffffff则后续无效。
         public NET_DVR_PRESETCHAN_INFO[] struPresetChanInfo = new NET_DVR_PRESETCHAN_INFO[MAX_CHANNUM_V40]; //启用的预置点信息
         public NET_DVR_CRUISECHAN_INFO[] struCruiseChanInfo = new NET_DVR_CRUISECHAN_INFO[MAX_CHANNUM_V40]; //启用巡航功能通道的信息
-        public NET_DVR_PTZTRACKCHAN_INFO[] struPtzTrackInfo = new NET_DVR_PTZTRACKCHAN_INFO[MAX_CHANNUM_V40]; //调用云台轨迹的通道信息
+        public NET_DVR_PTZTRACKCHAN_INFO[] struPtzTrackInfo = new NET_DVR_PTZTRACKCHAN_INFO[MAX_CHANNUM_V40]; //调用云台的通道信息
         public byte byDirection;//触发方向:0-保留;1-全部;2-正向;3-反向
         public byte[] byRes2 = new byte[255];
     }
@@ -8433,7 +8429,7 @@ DVR实现巡航数据结构
      34-皖,0xff-全部
      */
         public byte byProvince;//省份索引值
-        public byte byRegion;// 区域索引值 0-保留,1-欧洲,2-俄语区域, 3-欧洲&俄罗斯(EU&CIS),4-中东(Middle East)
+        public byte byRegion;// 区域索引值 0-保留,1-欧洲,2-俄语区域, 3-欧洲&(EU&CIS),4-中东(Middle East)
         public byte byCountry;//国家索引,参照枚举COUNTRY_INDEX(不支持“COUNTRY_ALL = 0xff,//ALL 全部”)
         public short wPlatePixelWidthMin;//车牌像素识别宽度最小值(单位是像素)当前推荐范围[130,500]
         public short wPlatePixelWidthMax;//车牌像素识别宽度最大值(单位是像素)当前推荐范围[130,500]
@@ -9505,7 +9501,7 @@ DVR实现巡航数据结构
     }
 
     public static interface FMSGCallBack_V31 extends Callback {
-        public boolean invoke(int lCommand, NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) throws UnsupportedEncodingException;
+        public boolean invoke(int lCommand, NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser);
     }
 
     public static interface FMessCallBack extends Callback {
@@ -9548,14 +9544,14 @@ DVR实现巡航数据结构
     }
 
     public static interface FVoiceDataCallBack_V30 extends Callback {
-        public void invoke(int lVoiceComHandle, Pointer pRecvDataBuffer, int dwBufSize, byte byAudioFlag, int pUser);
+        public void invoke(int lVoiceComHandle, Pointer pRecvDataBuffer, int dwBufSize, byte byAudioFlag, Pointer pUser);
     }
 
     public static interface FVoiceDataCallBack_MR extends Callback {
         public void invoke(int lVoiceComHandle, Pointer pRecvDataBuffer, int dwBufSize, byte byAudioFlag, int dwUser);
     }
 
-    public static interface FVoiceDataCallback_MR_V30 extends Callback {
+    public static interface FVoiceDataCallBack_MR_V30 extends Callback {
         public void invoke(int lVoiceComHandle, Pointer pRecvDataBuffer, int dwBufSize, byte byAudioFlag, Pointer pUser);
     }
 
@@ -9883,8 +9879,7 @@ DVR实现巡航数据结构
     //语音转发
     int NET_DVR_StartVoiceCom_MR(int lUserID, FVoiceDataCallBack_MR fVoiceDataCallBack, int dwUser);
 
-
-    int NET_DVR_StartVoiceCom_MR_V30(int lUserID, int dwVoiceChan, FVoiceDataCallback_MR_V30 fVoiceDataCallBack, Pointer pUser);
+    int NET_DVR_StartVoiceCom_MR_V30(int lUserID, int dwVoiceChan, FVoiceDataCallBack_MR_V30 fVoiceDataCallBack, Pointer pUser);
 
     boolean NET_DVR_VoiceComSendData(int lVoiceComHandle, byte[] pSendBuf, int dwBufSize);
 
@@ -9936,7 +9931,7 @@ DVR实现巡航数据结构
     void NET_DVR_ReleaseG722Decoder(Pointer pDecHandle);
 
     //G711: Win64、Linux32、Linux64
-    Pointer NET_DVR_InitG711Encoder(NET_DVR_AUDIOENC_INFO enc_info);//NET_DVR_AUDIOENC_INFO
+    Pointer NET_DVR_InitG711Encoder(Pointer enc_info); //NET_DVR_AUDIOENC_INFO
 
     boolean NET_DVR_EncodeG711Frame(Pointer handle, NET_DVR_AUDIOENC_PROCESS_PARAM p_enc_proc_param);
 

+ 10 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/manage/ChannelNumberController.java

@@ -38,6 +38,16 @@ public class ChannelNumberController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 查询通道管理列表
+     */
+    @PreAuthorize("@ss.hasPermi('manage:channelNumber:listNoPage')")
+    @GetMapping("/listNoPage")
+    public TableDataInfo listNoPage(ChannelNumber channelNumber) {
+        List<ChannelNumber> list = channelNumberService.selectChannelNumberList(channelNumber);
+        return getDataTable(list);
+    }
+
     /**
      * 导出通道管理列表
      */

+ 91 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/manage/DialIndicatorLogController.java

@@ -0,0 +1,91 @@
+package com.ruoyi.web.controller.manage;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.manage.domain.DialIndicatorLog;
+import com.ruoyi.manage.service.IDialIndicatorLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 计报警记录Controller
+ *
+ * @author boman
+ * @date 2025-06-17
+ */
+@RestController
+@RequestMapping("/manage/dialIndicator")
+public class DialIndicatorLogController extends BaseController {
+    @Autowired
+    private IDialIndicatorLogService dialIndicatorLogService;
+
+    /**
+     * 查询计报警记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('manage:dialIndicator:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(DialIndicatorLog dialIndicatorLog) {
+        startPage();
+        List<DialIndicatorLog> list = dialIndicatorLogService.selectDialIndicatorLogList(dialIndicatorLog);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出计报警记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('manage:dialIndicator:export')")
+    @Log(title = "计报警记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, DialIndicatorLog dialIndicatorLog) {
+        List<DialIndicatorLog> list = dialIndicatorLogService.selectDialIndicatorLogList(dialIndicatorLog);
+        ExcelUtil<DialIndicatorLog> util = new ExcelUtil<DialIndicatorLog>(DialIndicatorLog.class);
+        util.exportExcel(response, list, "计报警记录数据");
+    }
+
+    /**
+     * 获取计报警记录详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('manage:dialIndicator:query')")
+    @GetMapping(value = "/{logId}")
+    public AjaxResult getInfo(@PathVariable("logId") Long logId) {
+        return success(dialIndicatorLogService.selectDialIndicatorLogByLogId(logId));
+    }
+
+    /**
+     * 新增计报警记录
+     */
+    @PreAuthorize("@ss.hasPermi('manage:dialIndicator:add')")
+    @Log(title = "计报警记录", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody DialIndicatorLog dialIndicatorLog) {
+        return toAjax(dialIndicatorLogService.insertDialIndicatorLog(dialIndicatorLog));
+    }
+
+    /**
+     * 修改计报警记录
+     */
+    @PreAuthorize("@ss.hasPermi('manage:dialIndicator:edit')")
+    @Log(title = "计报警记录", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody DialIndicatorLog dialIndicatorLog) {
+        return toAjax(dialIndicatorLogService.updateDialIndicatorLog(dialIndicatorLog));
+    }
+
+    /**
+     * 删除计报警记录
+     */
+    @PreAuthorize("@ss.hasPermi('manage:dialIndicator:remove')")
+    @Log(title = "计报警记录", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{logIds}")
+    public AjaxResult remove(@PathVariable Long[] logIds) {
+        return toAjax(dialIndicatorLogService.deleteDialIndicatorLogByLogIds(logIds));
+    }
+}

+ 1 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java

@@ -56,7 +56,7 @@ public class SysNoticeController extends BaseController
     @PostMapping
     public AjaxResult add(@Validated @RequestBody SysNotice notice)
     {
-        notice.setCreateBy(getUsername());
+        //notice.setCreateBy(getUsername());
         return toAjax(noticeService.insertNotice(notice));
     }
 

+ 1 - 1
ruoyi-admin/src/main/resources/application-druid.yml

@@ -9,7 +9,7 @@ ruoyi:
     # 实例演示开关
     demoEnabled: true
     # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
-    profile: D:/ruoyi/uploadPath
+    profile: D:/ruoyi/uploadPath/pw
     # 获取ip地址开关
     addressEnabled: false
     # 验证码类型 math 数组计算 char 字符验证

+ 1 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java

@@ -115,6 +115,7 @@ public class SecurityConfig
                     // 静态资源,可匿名访问
                     .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                     .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
+                    .antMatchers("/hk/**").permitAll()
                     // 除上面外的所有请求全部需要鉴权认证
                     .anyRequest().authenticated();
             })

+ 416 - 0
ruoyi-system/src/main/java/com/ruoyi/manage/domain/DialIndicatorLog.java

@@ -0,0 +1,416 @@
+package com.ruoyi.manage.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 计报警记录对象 dial_indicator_log
+ * 
+ * @author boman
+ * @date 2025-06-17
+ */
+public class DialIndicatorLog extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 记录ID */
+    private Long logId;
+
+    /** 报警设备IPv4地址 */
+    @Excel(name = "报警设备IPv4地址")
+    private String ipAddress;
+
+    /** 报警设备端口号 */
+    @Excel(name = "报警设备端口号")
+    private String portNo;
+
+    /** 协议类型 */
+    @Excel(name = "协议类型")
+    private String protocol;
+
+    /** 触发报警的设备通道号 */
+    @Excel(name = "触发报警的设备通道号")
+    private String channelId;
+
+    /** 通道名称(监控点名称) */
+    @Excel(name = "通道名称", readConverterExp = "监=控点名称")
+    private String channelName;
+
+    /** 事件类型 */
+    @Excel(name = "事件类型")
+    private String eventType;
+
+    /** 设备ID */
+    @Excel(name = "设备ID")
+    private String deviceId;
+
+    /** 设备编号 */
+    @Excel(name = "设备编号")
+    private String deviceUuid;
+
+    /** 场景ID */
+    @Excel(name = "场景ID")
+    private String sceneId;
+
+    /** 规则ID */
+    @Excel(name = "规则ID")
+    private String ruleId;
+
+    /** 标定集ID */
+    @Excel(name = "标定集ID")
+    private String tagsetId;
+
+    /** 报警图片 */
+    @Excel(name = "报警图片")
+    private String photo;
+
+    /** 表类型 pointer#指针类, number#数字类, status#状态类, level#液位类 */
+    @Excel(name = "表类型 pointer#指针类, number#数字类, status#状态类, level#液位类")
+    private String readingType;
+
+    /** 当前读数值 */
+    @Excel(name = "当前读数值")
+    private String readingResult;
+
+    /** 状态表状态 0#红灯亮, 1#红灯灭, 2#黄灯亮, 3#黄灯灭, 4#蓝灯亮, 5#蓝灯灭, 6#绿灯亮, 7#绿灯灭, 8#白灯亮, 9#白灯灭, 10#旋钮向左, 11#旋钮向左上, 12#旋钮向上, 13#旋钮向右上, 14#旋钮向右, 15#旋钮向右下, 16#旋钮向下, 17#旋钮向左下, 18#空开向上, 19#空开向下, 20#压板开, 21#压板合, 22#硅胶筒变色, 23#硅胶筒未变色, 24#字符分, 25#字符合, 26#字符0, 27#字符1, 28#字符ON, 29#字符OFF, 30#字符已储能, 31#字符未储能, 32#断路器分, 33#断路器合, 34#断路器0, 35#断路器1, 36#断路器ON, 37#断路器OFF, 38#断路器已储能, 39#断路器未储能, 40#刀闸开, 41#刀闸关, 42#开集类型关, 43#开集类别开 */
+    @Excel(name = "状态表状态 0#红灯亮, 1#红灯灭, 2#黄灯亮, 3#黄灯灭, 4#蓝灯亮, 5#蓝灯灭, 6#绿灯亮, 7#绿灯灭, 8#白灯亮, 9#白灯灭, 10#旋钮向左, 11#旋钮向左上, 12#旋钮向上, 13#旋钮向右上, 14#旋钮向右, 15#旋钮向右下, 16#旋钮向下, 17#旋钮向左下, 18#空开向上, 19#空开向下, 20#压板开, 21#压板合, 22#硅胶筒变色, 23#硅胶筒未变色, 24#字符分, 25#字符合, 26#字符0, 27#字符1, 28#字符ON, 29#字符OFF, 30#字符已储能, 31#字符未储能, 32#断路器分, 33#断路器合, 34#断路器0, 35#断路器1, 36#断路器ON, 37#断路器OFF, 38#断路器已储能, 39#断路器未储能, 40#刀闸开, 41#刀闸关, 42#开集类型关, 43#开集类别开")
+    private String statusResult;
+
+    /** 指示灯当前读数值 0#亮, 1#灭, 2#红灯亮, 3#红灯灭, 4#黄灯亮, 5#黄灯灭, 6#蓝灯亮, 7#蓝灯灭, 8#绿灯亮, 9#绿灯灭, 10#白灯亮, 11#白灯灭, 100#亮横向, 101#亮竖向, 102#红灯亮横向, 103#红灯亮竖向, 104#黄灯亮横向, 105#黄灯亮竖向, 106#蓝灯亮横向, 107#蓝灯亮竖向, 108#绿灯亮横向, 109#绿灯亮竖向, 110#白灯亮横向, 111#白灯亮竖向 */
+    @Excel(name = "指示灯当前读数值 0#亮, 1#灭, 2#红灯亮, 3#红灯灭, 4#黄灯亮, 5#黄灯灭, 6#蓝灯亮, 7#蓝灯灭, 8#绿灯亮, 9#绿灯灭, 10#白灯亮, 11#白灯灭, 100#亮横向, 101#亮竖向, 102#红灯亮横向, 103#红灯亮竖向, 104#黄灯亮横向, 105#黄灯亮竖向, 106#蓝灯亮横向, 107#蓝灯亮竖向, 108#绿灯亮横向, 109#绿灯亮竖向, 110#白灯亮横向, 111#白灯亮竖向")
+    private String pilotLampstate;
+
+    /** 8朝向旋钮当前读数值 0#旋钮向左, 1#旋钮向左上, 2#旋钮向上, 3#旋钮向右上, 4#旋钮向右, 5#旋钮向右下, 6#旋钮向下, 7#旋钮向左下 */
+    @Excel(name = "8朝向旋钮当前读数值 0#旋钮向左, 1#旋钮向左上, 2#旋钮向上, 3#旋钮向右上, 4#旋钮向右, 5#旋钮向右下, 6#旋钮向下, 7#旋钮向左下")
+    private String eightPositionSelectorKnobTate;
+
+    /** 空开当前读数值 0#空开向下, 1#空开向上 */
+    @Excel(name = "空开当前读数值 0#空开向下, 1#空开向上")
+    private String airSwitchCircuitBreakerState;
+
+    /** 压板当前读数值 0#压板开, 1#压板合 */
+    @Excel(name = "压板当前读数值 0#压板开, 1#压板合")
+    private String relayProtectionControllerState;
+
+    /** 硅胶筒当前读数值 0#硅胶筒未变色, 1#硅胶筒变色 */
+    @Excel(name = "硅胶筒当前读数值 0#硅胶筒未变色, 1#硅胶筒变色")
+    private String silicaGelBreatherState;
+
+    /** 字符当前读数值 0#字符分, 1#字符合, 2#字符0, 3#字符1, 4#字符OFF, 5#字符ON, 6#字符未储能, 7#字符已储能 */
+    @Excel(name = "字符当前读数值 0#字符分, 1#字符合, 2#字符0, 3#字符1, 4#字符OFF, 5#字符ON, 6#字符未储能, 7#字符已储能")
+    private String charactersState;
+
+    /** 断路器当前读数值 0#断路器分, 1#断路器合, 2#断路器0, 3#断路器1, 4#断路器OFF, 5#断路器ON, 6#断路器未储能, 7#断路器已储能 */
+    @Excel(name = "断路器当前读数值 0#断路器分, 1#断路器合, 2#断路器0, 3#断路器1, 4#断路器OFF, 5#断路器ON, 6#断路器未储能, 7#断路器已储能")
+    private String circuitBreakerState;
+
+    /** 刀闸当前读数值 0#刀闸开(分), 1#刀闸关(合) */
+    @Excel(name = "刀闸当前读数值 0#刀闸开", readConverterExp = "分=")
+    private String knifeSwitchState;
+
+    /** 开集类型当前读数值 0#开集类型开, 1#开集类别关 */
+    @Excel(name = "开集类型当前读数值 0#开集类型开, 1#开集类别关")
+    private String openSetTypeState;
+
+    /** 删除标志(0代表存在 1代表删除) */
+    private String delFlag;
+
+    public void setLogId(Long logId) 
+    {
+        this.logId = logId;
+    }
+
+    public Long getLogId() 
+    {
+        return logId;
+    }
+
+    public void setIpAddress(String ipAddress) 
+    {
+        this.ipAddress = ipAddress;
+    }
+
+    public String getIpAddress() 
+    {
+        return ipAddress;
+    }
+
+    public void setPortNo(String portNo) 
+    {
+        this.portNo = portNo;
+    }
+
+    public String getPortNo() 
+    {
+        return portNo;
+    }
+
+    public void setProtocol(String protocol) 
+    {
+        this.protocol = protocol;
+    }
+
+    public String getProtocol() 
+    {
+        return protocol;
+    }
+
+    public void setChannelId(String channelId) 
+    {
+        this.channelId = channelId;
+    }
+
+    public String getChannelId() 
+    {
+        return channelId;
+    }
+
+    public void setChannelName(String channelName) 
+    {
+        this.channelName = channelName;
+    }
+
+    public String getChannelName() 
+    {
+        return channelName;
+    }
+
+    public void setEventType(String eventType) 
+    {
+        this.eventType = eventType;
+    }
+
+    public String getEventType() 
+    {
+        return eventType;
+    }
+
+    public void setDeviceId(String deviceId) 
+    {
+        this.deviceId = deviceId;
+    }
+
+    public String getDeviceId() 
+    {
+        return deviceId;
+    }
+
+    public void setDeviceUuid(String deviceUuid) 
+    {
+        this.deviceUuid = deviceUuid;
+    }
+
+    public String getDeviceUuid() 
+    {
+        return deviceUuid;
+    }
+
+    public void setSceneId(String sceneId) 
+    {
+        this.sceneId = sceneId;
+    }
+
+    public String getSceneId() 
+    {
+        return sceneId;
+    }
+
+    public void setRuleId(String ruleId) 
+    {
+        this.ruleId = ruleId;
+    }
+
+    public String getRuleId() 
+    {
+        return ruleId;
+    }
+
+    public void setTagsetId(String tagsetId) 
+    {
+        this.tagsetId = tagsetId;
+    }
+
+    public String getTagsetId() 
+    {
+        return tagsetId;
+    }
+
+    public void setPhoto(String photo) 
+    {
+        this.photo = photo;
+    }
+
+    public String getPhoto() 
+    {
+        return photo;
+    }
+
+    public void setReadingType(String readingType) 
+    {
+        this.readingType = readingType;
+    }
+
+    public String getReadingType() 
+    {
+        return readingType;
+    }
+
+    public void setReadingResult(String readingResult) 
+    {
+        this.readingResult = readingResult;
+    }
+
+    public String getReadingResult() 
+    {
+        return readingResult;
+    }
+
+    public void setStatusResult(String statusResult) 
+    {
+        this.statusResult = statusResult;
+    }
+
+    public String getStatusResult() 
+    {
+        return statusResult;
+    }
+
+    public void setPilotLampstate(String pilotLampstate) 
+    {
+        this.pilotLampstate = pilotLampstate;
+    }
+
+    public String getPilotLampstate() 
+    {
+        return pilotLampstate;
+    }
+
+    public void setEightPositionSelectorKnobTate(String eightPositionSelectorKnobTate) 
+    {
+        this.eightPositionSelectorKnobTate = eightPositionSelectorKnobTate;
+    }
+
+    public String getEightPositionSelectorKnobTate() 
+    {
+        return eightPositionSelectorKnobTate;
+    }
+
+    public void setAirSwitchCircuitBreakerState(String airSwitchCircuitBreakerState) 
+    {
+        this.airSwitchCircuitBreakerState = airSwitchCircuitBreakerState;
+    }
+
+    public String getAirSwitchCircuitBreakerState() 
+    {
+        return airSwitchCircuitBreakerState;
+    }
+
+    public void setRelayProtectionControllerState(String relayProtectionControllerState) 
+    {
+        this.relayProtectionControllerState = relayProtectionControllerState;
+    }
+
+    public String getRelayProtectionControllerState() 
+    {
+        return relayProtectionControllerState;
+    }
+
+    public void setSilicaGelBreatherState(String silicaGelBreatherState) 
+    {
+        this.silicaGelBreatherState = silicaGelBreatherState;
+    }
+
+    public String getSilicaGelBreatherState() 
+    {
+        return silicaGelBreatherState;
+    }
+
+    public void setCharactersState(String charactersState) 
+    {
+        this.charactersState = charactersState;
+    }
+
+    public String getCharactersState() 
+    {
+        return charactersState;
+    }
+
+    public void setCircuitBreakerState(String circuitBreakerState) 
+    {
+        this.circuitBreakerState = circuitBreakerState;
+    }
+
+    public String getCircuitBreakerState() 
+    {
+        return circuitBreakerState;
+    }
+
+    public void setKnifeSwitchState(String knifeSwitchState) 
+    {
+        this.knifeSwitchState = knifeSwitchState;
+    }
+
+    public String getKnifeSwitchState() 
+    {
+        return knifeSwitchState;
+    }
+
+    public void setOpenSetTypeState(String openSetTypeState) 
+    {
+        this.openSetTypeState = openSetTypeState;
+    }
+
+    public String getOpenSetTypeState() 
+    {
+        return openSetTypeState;
+    }
+
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("logId", getLogId())
+            .append("ipAddress", getIpAddress())
+            .append("portNo", getPortNo())
+            .append("protocol", getProtocol())
+            .append("channelId", getChannelId())
+            .append("channelName", getChannelName())
+            .append("eventType", getEventType())
+            .append("deviceId", getDeviceId())
+            .append("deviceUuid", getDeviceUuid())
+            .append("sceneId", getSceneId())
+            .append("ruleId", getRuleId())
+            .append("tagsetId", getTagsetId())
+            .append("photo", getPhoto())
+            .append("readingType", getReadingType())
+            .append("readingResult", getReadingResult())
+            .append("statusResult", getStatusResult())
+            .append("pilotLampstate", getPilotLampstate())
+            .append("eightPositionSelectorKnobTate", getEightPositionSelectorKnobTate())
+            .append("airSwitchCircuitBreakerState", getAirSwitchCircuitBreakerState())
+            .append("relayProtectionControllerState", getRelayProtectionControllerState())
+            .append("silicaGelBreatherState", getSilicaGelBreatherState())
+            .append("charactersState", getCharactersState())
+            .append("circuitBreakerState", getCircuitBreakerState())
+            .append("knifeSwitchState", getKnifeSwitchState())
+            .append("openSetTypeState", getOpenSetTypeState())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 62 - 0
ruoyi-system/src/main/java/com/ruoyi/manage/mapper/DialIndicatorLogMapper.java

@@ -0,0 +1,62 @@
+package com.ruoyi.manage.mapper;
+
+import com.ruoyi.manage.domain.DialIndicatorLog;
+
+import java.util.List;
+
+/**
+ * 计报警记录Mapper接口
+ * 
+ * @author boman
+ * @date 2025-06-17
+ */
+public interface DialIndicatorLogMapper 
+{
+    /**
+     * 查询计报警记录
+     * 
+     * @param logId 计报警记录主键
+     * @return 计报警记录
+     */
+    public DialIndicatorLog selectDialIndicatorLogByLogId(Long logId);
+
+    /**
+     * 查询计报警记录列表
+     * 
+     * @param dialIndicatorLog 计报警记录
+     * @return 计报警记录集合
+     */
+    public List<DialIndicatorLog> selectDialIndicatorLogList(DialIndicatorLog dialIndicatorLog);
+
+    /**
+     * 新增计报警记录
+     * 
+     * @param dialIndicatorLog 计报警记录
+     * @return 结果
+     */
+    public int insertDialIndicatorLog(DialIndicatorLog dialIndicatorLog);
+
+    /**
+     * 修改计报警记录
+     * 
+     * @param dialIndicatorLog 计报警记录
+     * @return 结果
+     */
+    public int updateDialIndicatorLog(DialIndicatorLog dialIndicatorLog);
+
+    /**
+     * 删除计报警记录
+     * 
+     * @param logId 计报警记录主键
+     * @return 结果
+     */
+    public int deleteDialIndicatorLogByLogId(Long logId);
+
+    /**
+     * 批量删除计报警记录
+     * 
+     * @param logIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteDialIndicatorLogByLogIds(Long[] logIds);
+}

+ 62 - 0
ruoyi-system/src/main/java/com/ruoyi/manage/service/IDialIndicatorLogService.java

@@ -0,0 +1,62 @@
+package com.ruoyi.manage.service;
+
+import com.ruoyi.manage.domain.DialIndicatorLog;
+
+import java.util.List;
+
+/**
+ * 计报警记录Service接口
+ * 
+ * @author boman
+ * @date 2025-06-17
+ */
+public interface IDialIndicatorLogService 
+{
+    /**
+     * 查询计报警记录
+     * 
+     * @param logId 计报警记录主键
+     * @return 计报警记录
+     */
+    public DialIndicatorLog selectDialIndicatorLogByLogId(Long logId);
+
+    /**
+     * 查询计报警记录列表
+     * 
+     * @param dialIndicatorLog 计报警记录
+     * @return 计报警记录集合
+     */
+    public List<DialIndicatorLog> selectDialIndicatorLogList(DialIndicatorLog dialIndicatorLog);
+
+    /**
+     * 新增计报警记录
+     * 
+     * @param dialIndicatorLog 计报警记录
+     * @return 结果
+     */
+    public int insertDialIndicatorLog(DialIndicatorLog dialIndicatorLog);
+
+    /**
+     * 修改计报警记录
+     * 
+     * @param dialIndicatorLog 计报警记录
+     * @return 结果
+     */
+    public int updateDialIndicatorLog(DialIndicatorLog dialIndicatorLog);
+
+    /**
+     * 批量删除计报警记录
+     * 
+     * @param logIds 需要删除的计报警记录主键集合
+     * @return 结果
+     */
+    public int deleteDialIndicatorLogByLogIds(Long[] logIds);
+
+    /**
+     * 删除计报警记录信息
+     * 
+     * @param logId 计报警记录主键
+     * @return 结果
+     */
+    public int deleteDialIndicatorLogByLogId(Long logId);
+}

+ 97 - 0
ruoyi-system/src/main/java/com/ruoyi/manage/service/impl/DialIndicatorLogServiceImpl.java

@@ -0,0 +1,97 @@
+package com.ruoyi.manage.service.impl;
+
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.manage.domain.DialIndicatorLog;
+import com.ruoyi.manage.mapper.DialIndicatorLogMapper;
+import com.ruoyi.manage.service.IDialIndicatorLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 计报警记录Service业务层处理
+ * 
+ * @author boman
+ * @date 2025-06-17
+ */
+@Service
+public class DialIndicatorLogServiceImpl implements IDialIndicatorLogService
+{
+    @Autowired
+    private DialIndicatorLogMapper dialIndicatorLogMapper;
+
+    /**
+     * 查询计报警记录
+     * 
+     * @param logId 计报警记录主键
+     * @return 计报警记录
+     */
+    @Override
+    public DialIndicatorLog selectDialIndicatorLogByLogId(Long logId)
+    {
+        return dialIndicatorLogMapper.selectDialIndicatorLogByLogId(logId);
+    }
+
+    /**
+     * 查询计报警记录列表
+     * 
+     * @param dialIndicatorLog 计报警记录
+     * @return 计报警记录
+     */
+    @Override
+    public List<DialIndicatorLog> selectDialIndicatorLogList(DialIndicatorLog dialIndicatorLog)
+    {
+        return dialIndicatorLogMapper.selectDialIndicatorLogList(dialIndicatorLog);
+    }
+
+    /**
+     * 新增计报警记录
+     * 
+     * @param dialIndicatorLog 计报警记录
+     * @return 结果
+     */
+    @Override
+    public int insertDialIndicatorLog(DialIndicatorLog dialIndicatorLog)
+    {
+        dialIndicatorLog.setCreateTime(DateUtils.getNowDate());
+        return dialIndicatorLogMapper.insertDialIndicatorLog(dialIndicatorLog);
+    }
+
+    /**
+     * 修改计报警记录
+     * 
+     * @param dialIndicatorLog 计报警记录
+     * @return 结果
+     */
+    @Override
+    public int updateDialIndicatorLog(DialIndicatorLog dialIndicatorLog)
+    {
+        dialIndicatorLog.setUpdateTime(DateUtils.getNowDate());
+        return dialIndicatorLogMapper.updateDialIndicatorLog(dialIndicatorLog);
+    }
+
+    /**
+     * 批量删除计报警记录
+     * 
+     * @param logIds 需要删除的计报警记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteDialIndicatorLogByLogIds(Long[] logIds)
+    {
+        return dialIndicatorLogMapper.deleteDialIndicatorLogByLogIds(logIds);
+    }
+
+    /**
+     * 删除计报警记录信息
+     * 
+     * @param logId 计报警记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteDialIndicatorLogByLogId(Long logId)
+    {
+        return dialIndicatorLogMapper.deleteDialIndicatorLogByLogId(logId);
+    }
+}

+ 195 - 0
ruoyi-system/src/main/resources/mapper/manage/DialIndicatorLogMapper.xml

@@ -0,0 +1,195 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.manage.mapper.DialIndicatorLogMapper">
+    
+    <resultMap type="DialIndicatorLog" id="DialIndicatorLogResult">
+        <result property="logId"    column="log_id"    />
+        <result property="ipAddress"    column="ip_address"    />
+        <result property="portNo"    column="port_no"    />
+        <result property="protocol"    column="protocol"    />
+        <result property="channelId"    column="channel_id"    />
+        <result property="channelName"    column="channel_name"    />
+        <result property="eventType"    column="event_type"    />
+        <result property="deviceId"    column="device_id"    />
+        <result property="deviceUuid"    column="device_uuid"    />
+        <result property="sceneId"    column="scene_id"    />
+        <result property="ruleId"    column="rule_id"    />
+        <result property="tagsetId"    column="tagset_id"    />
+        <result property="photo"    column="photo"    />
+        <result property="readingType"    column="reading_type"    />
+        <result property="readingResult"    column="reading_result"    />
+        <result property="statusResult"    column="status_result"    />
+        <result property="pilotLampstate"    column="pilot_lampState"    />
+        <result property="eightPositionSelectorKnobTate"    column="eight_position_selector_knob_tate"    />
+        <result property="airSwitchCircuitBreakerState"    column="air_switch_circuit_breaker_state"    />
+        <result property="relayProtectionControllerState"    column="relay_protection_controller_state"    />
+        <result property="silicaGelBreatherState"    column="silica_gel_breather_state"    />
+        <result property="charactersState"    column="characters_state"    />
+        <result property="circuitBreakerState"    column="circuit_breaker_state"    />
+        <result property="knifeSwitchState"    column="knife_switch_state"    />
+        <result property="openSetTypeState"    column="open_set_type_state"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectDialIndicatorLogVo">
+        select log_id, ip_address, port_no, protocol, channel_id, channel_name, event_type, device_id, device_uuid, scene_id, rule_id, tagset_id, photo, reading_type, reading_result, status_result, pilot_lampState, eight_position_selector_knob_tate, air_switch_circuit_breaker_state, relay_protection_controller_state, silica_gel_breather_state, characters_state, circuit_breaker_state, knife_switch_state, open_set_type_state, del_flag, create_by, create_time, update_by, update_time, remark from dial_indicator_log
+    </sql>
+
+    <select id="selectDialIndicatorLogList" parameterType="DialIndicatorLog" resultMap="DialIndicatorLogResult">
+        <include refid="selectDialIndicatorLogVo"/>
+        <where>  
+            <if test="ipAddress != null  and ipAddress != ''"> and ip_address = #{ipAddress}</if>
+            <if test="portNo != null  and portNo != ''"> and port_no = #{portNo}</if>
+            <if test="protocol != null  and protocol != ''"> and protocol = #{protocol}</if>
+            <if test="channelId != null  and channelId != ''"> and channel_id = #{channelId}</if>
+            <if test="channelName != null  and channelName != ''"> and channel_name like concat('%', #{channelName}, '%')</if>
+            <if test="eventType != null  and eventType != ''"> and event_type = #{eventType}</if>
+            <if test="deviceId != null  and deviceId != ''"> and device_id = #{deviceId}</if>
+            <if test="deviceUuid != null  and deviceUuid != ''"> and device_uuid = #{deviceUuid}</if>
+            <if test="sceneId != null  and sceneId != ''"> and scene_id = #{sceneId}</if>
+            <if test="ruleId != null  and ruleId != ''"> and rule_id = #{ruleId}</if>
+            <if test="tagsetId != null  and tagsetId != ''"> and tagset_id = #{tagsetId}</if>
+            <if test="photo != null  and photo != ''"> and photo = #{photo}</if>
+            <if test="readingType != null  and readingType != ''"> and reading_type = #{readingType}</if>
+            <if test="readingResult != null  and readingResult != ''"> and reading_result = #{readingResult}</if>
+            <if test="statusResult != null  and statusResult != ''"> and status_result = #{statusResult}</if>
+            <if test="pilotLampstate != null  and pilotLampstate != ''"> and pilot_lampState = #{pilotLampstate}</if>
+            <if test="eightPositionSelectorKnobTate != null  and eightPositionSelectorKnobTate != ''"> and eight_position_selector_knob_tate = #{eightPositionSelectorKnobTate}</if>
+            <if test="airSwitchCircuitBreakerState != null  and airSwitchCircuitBreakerState != ''"> and air_switch_circuit_breaker_state = #{airSwitchCircuitBreakerState}</if>
+            <if test="relayProtectionControllerState != null  and relayProtectionControllerState != ''"> and relay_protection_controller_state = #{relayProtectionControllerState}</if>
+            <if test="silicaGelBreatherState != null  and silicaGelBreatherState != ''"> and silica_gel_breather_state = #{silicaGelBreatherState}</if>
+            <if test="charactersState != null  and charactersState != ''"> and characters_state = #{charactersState}</if>
+            <if test="circuitBreakerState != null  and circuitBreakerState != ''"> and circuit_breaker_state = #{circuitBreakerState}</if>
+            <if test="knifeSwitchState != null  and knifeSwitchState != ''"> and knife_switch_state = #{knifeSwitchState}</if>
+            <if test="openSetTypeState != null  and openSetTypeState != ''"> and open_set_type_state = #{openSetTypeState}</if>
+        </where>
+    </select>
+    
+    <select id="selectDialIndicatorLogByLogId" parameterType="Long" resultMap="DialIndicatorLogResult">
+        <include refid="selectDialIndicatorLogVo"/>
+        where log_id = #{logId}
+    </select>
+
+    <insert id="insertDialIndicatorLog" parameterType="DialIndicatorLog" useGeneratedKeys="true" keyProperty="logId">
+        insert into dial_indicator_log
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="ipAddress != null">ip_address,</if>
+            <if test="portNo != null">port_no,</if>
+            <if test="protocol != null">protocol,</if>
+            <if test="channelId != null">channel_id,</if>
+            <if test="channelName != null">channel_name,</if>
+            <if test="eventType != null">event_type,</if>
+            <if test="deviceId != null">device_id,</if>
+            <if test="deviceUuid != null">device_uuid,</if>
+            <if test="sceneId != null">scene_id,</if>
+            <if test="ruleId != null">rule_id,</if>
+            <if test="tagsetId != null">tagset_id,</if>
+            <if test="photo != null">photo,</if>
+            <if test="readingType != null">reading_type,</if>
+            <if test="readingResult != null">reading_result,</if>
+            <if test="statusResult != null">status_result,</if>
+            <if test="pilotLampstate != null">pilot_lampState,</if>
+            <if test="eightPositionSelectorKnobTate != null">eight_position_selector_knob_tate,</if>
+            <if test="airSwitchCircuitBreakerState != null">air_switch_circuit_breaker_state,</if>
+            <if test="relayProtectionControllerState != null">relay_protection_controller_state,</if>
+            <if test="silicaGelBreatherState != null">silica_gel_breather_state,</if>
+            <if test="charactersState != null">characters_state,</if>
+            <if test="circuitBreakerState != null">circuit_breaker_state,</if>
+            <if test="knifeSwitchState != null">knife_switch_state,</if>
+            <if test="openSetTypeState != null">open_set_type_state,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="ipAddress != null">#{ipAddress},</if>
+            <if test="portNo != null">#{portNo},</if>
+            <if test="protocol != null">#{protocol},</if>
+            <if test="channelId != null">#{channelId},</if>
+            <if test="channelName != null">#{channelName},</if>
+            <if test="eventType != null">#{eventType},</if>
+            <if test="deviceId != null">#{deviceId},</if>
+            <if test="deviceUuid != null">#{deviceUuid},</if>
+            <if test="sceneId != null">#{sceneId},</if>
+            <if test="ruleId != null">#{ruleId},</if>
+            <if test="tagsetId != null">#{tagsetId},</if>
+            <if test="photo != null">#{photo},</if>
+            <if test="readingType != null">#{readingType},</if>
+            <if test="readingResult != null">#{readingResult},</if>
+            <if test="statusResult != null">#{statusResult},</if>
+            <if test="pilotLampstate != null">#{pilotLampstate},</if>
+            <if test="eightPositionSelectorKnobTate != null">#{eightPositionSelectorKnobTate},</if>
+            <if test="airSwitchCircuitBreakerState != null">#{airSwitchCircuitBreakerState},</if>
+            <if test="relayProtectionControllerState != null">#{relayProtectionControllerState},</if>
+            <if test="silicaGelBreatherState != null">#{silicaGelBreatherState},</if>
+            <if test="charactersState != null">#{charactersState},</if>
+            <if test="circuitBreakerState != null">#{circuitBreakerState},</if>
+            <if test="knifeSwitchState != null">#{knifeSwitchState},</if>
+            <if test="openSetTypeState != null">#{openSetTypeState},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateDialIndicatorLog" parameterType="DialIndicatorLog">
+        update dial_indicator_log
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="ipAddress != null">ip_address = #{ipAddress},</if>
+            <if test="portNo != null">port_no = #{portNo},</if>
+            <if test="protocol != null">protocol = #{protocol},</if>
+            <if test="channelId != null">channel_id = #{channelId},</if>
+            <if test="channelName != null">channel_name = #{channelName},</if>
+            <if test="eventType != null">event_type = #{eventType},</if>
+            <if test="deviceId != null">device_id = #{deviceId},</if>
+            <if test="deviceUuid != null">device_uuid = #{deviceUuid},</if>
+            <if test="sceneId != null">scene_id = #{sceneId},</if>
+            <if test="ruleId != null">rule_id = #{ruleId},</if>
+            <if test="tagsetId != null">tagset_id = #{tagsetId},</if>
+            <if test="photo != null">photo = #{photo},</if>
+            <if test="readingType != null">reading_type = #{readingType},</if>
+            <if test="readingResult != null">reading_result = #{readingResult},</if>
+            <if test="statusResult != null">status_result = #{statusResult},</if>
+            <if test="pilotLampstate != null">pilot_lampState = #{pilotLampstate},</if>
+            <if test="eightPositionSelectorKnobTate != null">eight_position_selector_knob_tate = #{eightPositionSelectorKnobTate},</if>
+            <if test="airSwitchCircuitBreakerState != null">air_switch_circuit_breaker_state = #{airSwitchCircuitBreakerState},</if>
+            <if test="relayProtectionControllerState != null">relay_protection_controller_state = #{relayProtectionControllerState},</if>
+            <if test="silicaGelBreatherState != null">silica_gel_breather_state = #{silicaGelBreatherState},</if>
+            <if test="charactersState != null">characters_state = #{charactersState},</if>
+            <if test="circuitBreakerState != null">circuit_breaker_state = #{circuitBreakerState},</if>
+            <if test="knifeSwitchState != null">knife_switch_state = #{knifeSwitchState},</if>
+            <if test="openSetTypeState != null">open_set_type_state = #{openSetTypeState},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where log_id = #{logId}
+    </update>
+
+    <delete id="deleteDialIndicatorLogByLogId" parameterType="Long">
+        delete from dial_indicator_log where log_id = #{logId}
+    </delete>
+
+    <delete id="deleteDialIndicatorLogByLogIds" parameterType="String">
+        delete from dial_indicator_log where log_id in 
+        <foreach item="logId" collection="array" open="(" separator="," close=")">
+            #{logId}
+        </foreach>
+    </delete>
+</mapper>