From a767f8b7e2aabf9bb3bb98344e8c559c71c1d442 Mon Sep 17 00:00:00 2001 From: ‘liusuyi’ <1951119284@qq.com> Date: 星期五, 11 八月 2023 14:40:28 +0800 Subject: [PATCH] 过滤通用光电报警只保留移动侦测、周界入侵报警、越界侦测报警 增加报警主机、门禁主机、通用光电数据同步 --- src/main/java/com/ard/utils/hiksdk/service/impl/HikClientUtil.java | 124 +++++++++-- src/main/java/com/ard/utils/tcp/ClientHandler.java | 4 src/main/java/com/ard/alarm/external/service/impl/ArdEquipExternalServiceImpl.java | 156 +++++++++++++ src/main/java/com/ard/utils/hiksdk/service/impl/LoginResultCallBack.java | 5 src/main/java/com/ard/utils/hiksdk/common/GlobalVariable.java | 4 src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java | 206 +++++++++--------- src/main/resources/logback-spring.xml | 26 ++ src/main/resources/mapper/ArdCamerasMapper.xml | 4 src/main/resources/mapper/ArdEquipExternalMapper.xml | 4 src/main/java/com/ard/alarm/camera/domain/ArdCameras.java | 9 src/main/java/com/ard/alarm/camera/service/impl/ArdCamerasServiceImpl.java | 101 +++++++- src/main/java/com/ard/alarm/external/domain/ArdEquipExternal.java | 4 12 files changed, 483 insertions(+), 164 deletions(-) diff --git a/src/main/java/com/ard/alarm/camera/domain/ArdCameras.java b/src/main/java/com/ard/alarm/camera/domain/ArdCameras.java index f10e0f7..5fa12ca 100644 --- a/src/main/java/com/ard/alarm/camera/domain/ArdCameras.java +++ b/src/main/java/com/ard/alarm/camera/domain/ArdCameras.java @@ -17,10 +17,7 @@ @NoArgsConstructor public class ArdCameras { private static final long serialVersionUID = 1L; - public ArdCameras(String gdtype) - { - this.gdtype=gdtype; - } + /** * id */ @@ -172,4 +169,8 @@ private Integer loginId; private String operatorId; private Date operatorExpired; + /** + * 鏇存柊鏃堕棿 + */ + private Date updateTime; } diff --git a/src/main/java/com/ard/alarm/camera/service/impl/ArdCamerasServiceImpl.java b/src/main/java/com/ard/alarm/camera/service/impl/ArdCamerasServiceImpl.java index 7a52bec..7b0f9ab 100644 --- a/src/main/java/com/ard/alarm/camera/service/impl/ArdCamerasServiceImpl.java +++ b/src/main/java/com/ard/alarm/camera/service/impl/ArdCamerasServiceImpl.java @@ -1,6 +1,10 @@ package com.ard.alarm.camera.service.impl; import java.util.*; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import com.ard.alarm.camera.domain.ArdCameras; import com.ard.alarm.camera.mapper.ArdCamerasMapper; @@ -27,30 +31,62 @@ @Slf4j(topic = "camera") @Order(4) public class ArdCamerasServiceImpl implements IArdCamerasService, ApplicationRunner { + private final static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + + public static List<ArdCameras> ardCameraList = new ArrayList<>(); + @Resource private ArdCamerasMapper ardCamerasMapper; - @Resource - private ArdEquipExternalMapper ardEquipExternalMapper; @Override - public void run(ApplicationArguments args) { + public void run(ApplicationArguments args) { //鍔犺浇sdk搴� HikClientUtil.loadHCNetSDKLib(); //鑾峰彇鍏ㄩ儴娴峰悍鍏夌數灏濊瘯鐧诲綍 - List<ArdCameras> ardCameras = ardCamerasMapper.selectArdCamerasList(new ArdCameras()); - HikClientUtil.loginAllCamera(ardCameras); - //鑾峰彇鍏ㄩ儴娴峰悍鎶ヨ涓绘満灏濊瘯鐧诲綍 - ArdEquipExternal alarmHost = new ArdEquipExternal(); - alarmHost.setFactory("1"); - alarmHost.setType("1"); - List<ArdEquipExternal> alarmHosts = ardEquipExternalMapper.selectArdEquipExternalList(alarmHost); - HikClientUtil.loginAllAlarmHost(alarmHosts); - //鑾峰彇鍏ㄩ儴闂ㄧ涓绘満灏濊瘯鐧诲綍 - ArdEquipExternal accessControlHost = new ArdEquipExternal(); - accessControlHost.setFactory("1"); - accessControlHost.setType("6"); - List<ArdEquipExternal>accessControlHosts = ardEquipExternalMapper.selectArdEquipExternalList(accessControlHost); - HikClientUtil.loginAllAccessControlHost(accessControlHosts); + ardCameraList = ardCamerasMapper.selectArdCamerasList(new ArdCameras()); + HikClientUtil.loginAllCamera(ardCameraList); + syncTask(); + } + + /** + * 鍚屾浠诲姟 + * 鍒樿嫃涔� + * 2023/8/11 9:09:27 + */ + private void syncTask() { + scheduler.scheduleAtFixedRate(() -> { + try { + //region 瀹氭椂鍚屾鐩告満 + List<ArdCameras> newArdCameraList = ardCamerasMapper.selectArdCamerasList(new ArdCameras()); + //闇�瑕佹洿鏂扮殑鏁版嵁 + List<ArdCameras> updateList = sameListWithDifferent(ardCameraList, newArdCameraList); + if (updateList.size() > 0) { + HikClientUtil.logoutAllCamera(updateList); + HikClientUtil.loginAllCamera(updateList); + ardCameraList.clear(); + ardCameraList.addAll(newArdCameraList); + } + //闇�瑕佸垹闄ょ殑鏁版嵁 + List<ArdCameras> delList = diffList(ardCameraList, newArdCameraList); + if (delList.size() > 0) { + HikClientUtil.logoutAllCamera(delList); + for (ArdCameras ardCameras : delList) { + ardCameraList.remove(ardCameras); + } + } + //闇�瑕佹柊澧炵殑鏁版嵁 + List<ArdCameras> inserList = diffList(newArdCameraList, ardCameraList); + if (inserList.size() > 0) { + HikClientUtil.loginAllCamera(inserList); + for (ArdCameras ardCameras : inserList) { + ardCameraList.add(ardCameras); + } + } + //endregion + } catch (Exception e) { + log.error("鍚屾鐩告満浠诲姟鎵ц鍑洪敊" + e.getMessage()); + } + }, 10, 10, TimeUnit.SECONDS); } /** @@ -74,4 +110,35 @@ public List<ArdCameras> selectArdCamerasList(ArdCameras ardCameras) { return ardCamerasMapper.selectArdCamerasList(ardCameras); } + + + // 姹備袱涓璞ist鐨勫樊闆� + private List<ArdCameras> diffList(List<ArdCameras> oldArrayList, List<ArdCameras> newArrayList) { + List<ArdCameras> resultList = oldArrayList.stream() + .filter(item -> !newArrayList.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())) + .collect(Collectors.toList()); + return resultList; + } + + //姹備袱涓璞ist鐨勪氦闆嗗瓧娈典笉鍚孖d鐩稿悓 + private List<ArdCameras> sameListWithDifferent(List<ArdCameras> oldList, List<ArdCameras> newList) { + List<ArdCameras> differentFieldsList = newList.stream() + .filter(newItem -> { + ArdCameras oldItem = oldList.stream() + .filter(item -> item.getId().equals(newItem.getId())) + .findFirst() + .orElse(null); + + return oldItem == null || + !Objects.equals(oldItem.getUpdateTime(), newItem.getUpdateTime()) || + !Objects.equals(oldItem.getIp(), newItem.getIp()) || + !Objects.equals(oldItem.getPort(), newItem.getPort()) || + !Objects.equals(oldItem.getUsername(), newItem.getUsername()) || + !Objects.equals(oldItem.getPassword(), newItem.getPassword()); + + }) + .collect(Collectors.toList()); + + return differentFieldsList; + } } diff --git a/src/main/java/com/ard/alarm/external/domain/ArdEquipExternal.java b/src/main/java/com/ard/alarm/external/domain/ArdEquipExternal.java index 9d517e0..1ef1ae9 100644 --- a/src/main/java/com/ard/alarm/external/domain/ArdEquipExternal.java +++ b/src/main/java/com/ard/alarm/external/domain/ArdEquipExternal.java @@ -2,6 +2,8 @@ import lombok.Data; +import java.util.Date; + /** * 澶栬仈璁惧绠$悊瀵硅薄 ard_equip_external * @@ -52,4 +54,6 @@ /** 鐢ㄦ埛id */ private String userId; + private Date updateTime; + } diff --git a/src/main/java/com/ard/alarm/external/service/impl/ArdEquipExternalServiceImpl.java b/src/main/java/com/ard/alarm/external/service/impl/ArdEquipExternalServiceImpl.java index 2753ea4..9d77347 100644 --- a/src/main/java/com/ard/alarm/external/service/impl/ArdEquipExternalServiceImpl.java +++ b/src/main/java/com/ard/alarm/external/service/impl/ArdEquipExternalServiceImpl.java @@ -1,35 +1,171 @@ package com.ard.alarm.external.service.impl; -import java.util.List; +import java.util.*; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import com.ard.alarm.camera.domain.ArdCameras; import com.ard.alarm.external.domain.ArdEquipExternal; import com.ard.alarm.external.mapper.ArdEquipExternalMapper; import com.ard.alarm.external.service.IArdEquipExternalService; +import com.ard.utils.hiksdk.service.impl.HikClientUtil; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.core.annotation.Order; import org.springframework.stereotype.Service; /** * externalService涓氬姟灞傚鐞� - * + * * @author zj * @date 2023-03-13 */ @Service -public class ArdEquipExternalServiceImpl implements IArdEquipExternalService -{ +@Slf4j(topic = "external") +@Order(5) +public class ArdEquipExternalServiceImpl implements IArdEquipExternalService, ApplicationRunner { + private final static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + public static List<ArdEquipExternal> ardAlarmHostList = new ArrayList<>(); + public static List<ArdEquipExternal> ardAccessHostList = new ArrayList<>(); @Autowired private ArdEquipExternalMapper ardEquipExternalMapper; + @Override + public void run(ApplicationArguments args) throws Exception { + //鑾峰彇鍏ㄩ儴娴峰悍鎶ヨ涓绘満灏濊瘯鐧诲綍 + ArdEquipExternal alarmHost = new ArdEquipExternal(); + alarmHost.setFactory("1"); + alarmHost.setType("1"); + ardAlarmHostList = ardEquipExternalMapper.selectArdEquipExternalList(alarmHost); + HikClientUtil.loginAllAlarmHost(ardAlarmHostList); + //鑾峰彇鍏ㄩ儴闂ㄧ涓绘満灏濊瘯鐧诲綍 + ArdEquipExternal accessControlHost = new ArdEquipExternal(); + accessControlHost.setFactory("1"); + accessControlHost.setType("6"); + ardAccessHostList = ardEquipExternalMapper.selectArdEquipExternalList(accessControlHost); + HikClientUtil.loginAllAccessControlHost(ardAccessHostList); + syncTask(); + } + + /** + * 鍚屾浠诲姟 + * 鍒樿嫃涔� + * 2023/8/11 9:09:27 + */ + private void syncTask() { + scheduler.scheduleAtFixedRate(() -> { + try { + //region 瀹氭椂鍚屾鎶ヨ涓绘満 + ArdEquipExternal alarmHost = new ArdEquipExternal(); + alarmHost.setFactory("1"); + alarmHost.setType("1"); + List<ArdEquipExternal> newAlarmHostList = ardEquipExternalMapper.selectArdEquipExternalList(alarmHost); + //闇�瑕佹洿鏂扮殑鏁版嵁 + List<ArdEquipExternal> updateList = sameListWithDifferent(ardAlarmHostList, newAlarmHostList); + if (updateList.size() > 0) { + HikClientUtil.logoutAllAlarmHost(updateList); + HikClientUtil.loginAllAlarmHost(updateList); + ardAlarmHostList.clear(); + ardAlarmHostList.addAll(newAlarmHostList); + } + //闇�瑕佸垹闄ょ殑鏁版嵁 + List<ArdEquipExternal> delList = diffList(ardAlarmHostList, newAlarmHostList); + if (delList.size() > 0) { + HikClientUtil.logoutAllAlarmHost(delList); + for (ArdEquipExternal ardEquipExternal : delList) { + ardAlarmHostList.remove(ardEquipExternal); + } + } + //闇�瑕佹柊澧炵殑鏁版嵁 + List<ArdEquipExternal> inserList = diffList(newAlarmHostList, ardAlarmHostList); + if (inserList.size() > 0) { + HikClientUtil.loginAllAlarmHost(inserList); + for (ArdEquipExternal ardEquipExternal : inserList) { + ardAlarmHostList.add(ardEquipExternal); + } + } + + //endregion + //region 瀹氭椂鍚屾闂ㄧ涓绘満 + alarmHost = new ArdEquipExternal(); + alarmHost.setFactory("1"); + alarmHost.setType("6"); + List<ArdEquipExternal> newAccessHostList = ardEquipExternalMapper.selectArdEquipExternalList(alarmHost); + //闇�瑕佹洿鏂扮殑鏁版嵁 + updateList = sameListWithDifferent(ardAccessHostList, newAccessHostList); + if (updateList.size() > 0) { + HikClientUtil.logoutAllAlarmHost(updateList); + HikClientUtil.loginAllAlarmHost(updateList); + ardAccessHostList.clear(); + ardAccessHostList.addAll(newAccessHostList); + } + //闇�瑕佸垹闄ょ殑鏁版嵁 + delList = diffList(ardAccessHostList, newAccessHostList); + if (delList.size() > 0) { + HikClientUtil.logoutAllAccessControlHost(delList); + for (ArdEquipExternal ardEquipExternal : delList) { + ardAccessHostList.remove(ardEquipExternal); + } + } + //闇�瑕佹柊澧炵殑鏁版嵁 + inserList = diffList(newAccessHostList, ardAccessHostList); + if (inserList.size() > 0) { + HikClientUtil.loginAllAccessControlHost(inserList); + for (ArdEquipExternal ardEquipExternal : inserList) { + ardAccessHostList.add(ardEquipExternal); + } + } + //endregion + } catch (Exception e) { + log.error("鍚屾澶栬仈浠诲姟鎵ц鍑洪敊" + e.getMessage()); + } + }, 10, 10, TimeUnit.SECONDS); + } + + + //姹備袱涓璞ist鐨勪氦闆嗗瓧娈典笉鍚孖d鐩稿悓 + private List<ArdEquipExternal> sameListWithDifferent(List<ArdEquipExternal> oldList, List<ArdEquipExternal> newList) { + List<ArdEquipExternal> differentFieldsList = newList.stream() + .filter(newItem -> { + ArdEquipExternal oldItem = oldList.stream() + .filter(item -> item.getId().equals(newItem.getId())) + .findFirst() + .orElse(null); + + return oldItem == null || + !Objects.equals(oldItem.getUpdateTime(), newItem.getUpdateTime()) || + !Objects.equals(oldItem.getIp(), newItem.getIp()) || + !Objects.equals(oldItem.getPort(), newItem.getPort()) || + !Objects.equals(oldItem.getUsername(), newItem.getUsername()) || + !Objects.equals(oldItem.getPassword(), newItem.getPassword()); + }) + .collect(Collectors.toList()); + + return differentFieldsList; + } + + + // 姹備袱涓璞ist鐨勫樊闆� + private List<ArdEquipExternal> diffList(List<ArdEquipExternal> oldArrayList, List<ArdEquipExternal> newArrayList) { + List<ArdEquipExternal> resultList = oldArrayList.stream() + .filter(item -> !newArrayList.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())) + .collect(Collectors.toList()); + return resultList; + } + /** * 鏌ヨexternal - * + * * @param id external涓婚敭 * @return external */ @Override - public ArdEquipExternal selectArdEquipExternalById(String id) - { + public ArdEquipExternal selectArdEquipExternalById(String id) { return ardEquipExternalMapper.selectArdEquipExternalById(id); } @@ -40,14 +176,14 @@ /** * 鏌ヨexternal鍒楄〃 - * + * * @param ardEquipExternal external * @return external */ @Override - public List<ArdEquipExternal> selectArdEquipExternalList(ArdEquipExternal ardEquipExternal) - { + public List<ArdEquipExternal> selectArdEquipExternalList(ArdEquipExternal ardEquipExternal) { return ardEquipExternalMapper.selectArdEquipExternalList(ardEquipExternal); } + } diff --git a/src/main/java/com/ard/utils/hiksdk/common/GlobalVariable.java b/src/main/java/com/ard/utils/hiksdk/common/GlobalVariable.java index 6eee57f..5e79fef 100644 --- a/src/main/java/com/ard/utils/hiksdk/common/GlobalVariable.java +++ b/src/main/java/com/ard/utils/hiksdk/common/GlobalVariable.java @@ -19,6 +19,10 @@ public static Map<String, ArdCameras> cameraMap = new HashMap<>(); //淇濆瓨鐩告満淇℃伅key:ip value:鎶ヨ涓绘満瀵硅薄 public static Map<String, ArdEquipExternal> alarmHostMap = new HashMap<>(); + //淇濆瓨鐩告満淇℃伅key:ip value:闂ㄧ涓绘満瀵硅薄 + public static Map<String, ArdEquipExternal> accessHostMap = new HashMap<>(); //淇濆瓨鐩告満鐧诲綍淇℃伅key:cameraId value:loginId public static Map<String, Integer> loginMap = new HashMap<>(); + //淇濆瓨鐩告満鐨勫竷闃蹭俊鎭痥ey:cameraId value:lAlarmHandle + public static Map<String, Integer> alarmMap = new HashMap<>(); } diff --git a/src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java b/src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java index 898dc85..9314aa7 100644 --- a/src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java +++ b/src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java @@ -46,26 +46,56 @@ */ @Override public boolean invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) { - - String sDeviceIP = ByteUtils.bytesToStringZh(pAlarmer.sDeviceIP); - Integer wLinkPort = Integer.valueOf(pAlarmer.wLinkPort); + SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String sDeviceIP = ByteUtils.bytesToStringZh(pAlarmer.sDeviceIP);//璁惧IP鍦板潃 + Integer wLinkPort = Integer.valueOf(pAlarmer.wLinkPort);//璁惧閫氳绔彛 CameraEventInfo info; String sTime;//浜嬩欢鏃堕棿 String url = "";//浜嬩欢鍥剧墖 - Boolean isSnapPic=true; //lCommand鏄紶鐨勬姤璀︾被鍨� - log.debug("鎶ヨ浜嬩欢绫诲瀷:lCommand:" + Integer.toHexString(lCommand)); + //log.debug("鎶ヨ浜嬩欢绫诲瀷:lCommand:" + Integer.toHexString(lCommand)); switch (lCommand) { case HCNetSDK.COMM_ALARM_V30: - log.debug("绉诲姩渚︽祴銆佽棰戜涪澶便�侀伄鎸°�両O淇″彿閲忕瓑鎶ヨ淇℃伅(鏆備笉瑙f瀽)"); - case HCNetSDK.COMM_ALARM_RULE: - log.debug("琛屼负鍒嗘瀽淇℃伅鎶ヨ淇℃伅涓婃姤"); - //region 琛屼负鍒嗘瀽淇℃伅 + log.debug("绉诲姩渚︽祴"); ArdCameras ardCameras = new ArdCameras(); ardCameras.setIp(sDeviceIP); ardCameras.setPort(wLinkPort); IArdCamerasService ardCamerasService = SpringTool.getApplicationContext().getBean(IArdCamerasService.class); - ArdCameras ardcamere = ardCamerasService.selectArdCamerasList(ardCameras).get(0); + ArdCameras camera = ardCamerasService.selectArdCamerasList(ardCameras).get(0); + HCNetSDK.NET_DVR_ALARMINFO_V30 netDvrAlarminfoV30 = new HCNetSDK.NET_DVR_ALARMINFO_V30(); + netDvrAlarminfoV30.write(); + Pointer pNDAInfo = netDvrAlarminfoV30.getPointer(); + pNDAInfo.write(0, pAlarmInfo.getByteArray(0, netDvrAlarminfoV30.size()), 0, netDvrAlarminfoV30.size()); + netDvrAlarminfoV30.read(); + switch (netDvrAlarminfoV30.dwAlarmType) { + case 3: + info = new CameraEventInfo(); + info.setAlarmName("绉诲姩渚︽祴"); + info.setAlarmTime(fmt.format(new Date())); + info.setCameraName(camera.getName()); + info.setCameraId(camera.getId()); + info.setCameraIp(camera.getIp()); + info.setCameraType(camera.getGdtype()); + info.setCameraChannel(Integer.valueOf(netDvrAlarminfoV30.byChannel[0])); + info.setLongitude(camera.getLongitude()); + info.setLatitude(camera.getLatitude()); + info.setAlarmType("绉诲姩渚︽祴"); + printLog(info); + //鍥剧墖瀛樺叆minio + url = savePicture(info); + info.setPicUrl(url); + publishMqtt(info); + break; + } + + case HCNetSDK.COMM_ALARM_RULE: + log.debug("琛屼负鍒嗘瀽淇℃伅鎶ヨ淇℃伅涓婃姤"); + //region 琛屼负鍒嗘瀽淇℃伅 + ardCameras = new ArdCameras(); + ardCameras.setIp(sDeviceIP); + ardCameras.setPort(wLinkPort); + ardCamerasService = SpringTool.getApplicationContext().getBean(IArdCamerasService.class); + ArdCameras ardCamera = ardCamerasService.selectArdCamerasList(ardCameras).get(0); HCNetSDK.NET_VCA_RULE_ALARM strVcaAlarm = new HCNetSDK.NET_VCA_RULE_ALARM(); strVcaAlarm.write(); @@ -79,80 +109,81 @@ info = new CameraEventInfo(); info.setAlarmName("浜哄憳琛屼负鍒嗘瀽"); info.setAlarmTime(sTime); - info.setCameraName(ardcamere.getName()); - info.setCameraId(ardcamere.getId()); + info.setCameraName(ardCamera.getName()); + info.setCameraId(ardCamera.getId()); info.setCameraIp(ipaddr); - info.setCameraType(ardcamere.getGdtype()); + info.setCameraType(ardCamera.getGdtype()); info.setCameraChannel(channel); - info.setLongitude(ardcamere.getLongitude()); - info.setLatitude(ardcamere.getLatitude()); - info.setAlarmType(ardcamere.getGdtype()); + info.setLongitude(ardCamera.getLongitude()); + info.setLatitude(ardCamera.getLatitude()); info.setRuleId(ruleID); switch (strVcaAlarm.struRuleInfo.wEventTypeEx) { case 1: //region绌胯秺璀︽垝闈� (瓒婄晫渚︽祴) info.setAlarmType("瓒婄晫渚︽祴鎶ヨ"); strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_TRAVERSE_PLANE.class); + printLog(info); + //鍥剧墖瀛樺叆minio + url = savePicture(info); + info.setPicUrl(url); + publishMqtt(info); //endregion break; - case 2: //region 鐩爣杩涘叆鍖哄煙 - info.setAlarmType("鐩爣杩涘叆鍖哄煙鎶ヨ"); - strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_AREA.class); - //endregion - break; - case 3: //region 鐩爣绂诲紑鍖哄煙 - info.setAlarmType("鐩爣绂诲紑鍖哄煙鎶ヨ"); - strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_AREA.class); - //endregion - break; +// case 2: //region 鐩爣杩涘叆鍖哄煙 +// info.setAlarmType("鐩爣杩涘叆鍖哄煙鎶ヨ"); +// strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_AREA.class); +// //endregion +// break; +// case 3: //region 鐩爣绂诲紑鍖哄煙 +// info.setAlarmType("鐩爣绂诲紑鍖哄煙鎶ヨ"); +// strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_AREA.class); +// //endregion +// break; case 4: //region 鍛ㄧ晫鍏ヤ镜 info.setAlarmType("鍛ㄧ晫鍏ヤ镜鎶ヨ"); strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_INTRUSION.class); + printLog(info); + //鍥剧墖瀛樺叆minio + url = savePicture(info); + info.setPicUrl(url); + publishMqtt(info); //endregion break; - case 5: //region 寰樺緤 - info.setAlarmType("寰樺緤浜嬩欢鎶ヨ"); - //endregion - break; - case 8: //region 蹇�熺Щ鍔�(濂旇窇) - info.setAlarmType("蹇�熺Щ鍔�(濂旇窇)浜嬩欢鎶ヨ"); - //endregion - break; - case 13: //region 鐗╁搧閬楃暀浜嬩欢 - info.setAlarmType("鐗╁搧閬楃暀浜嬩欢鎶ヨ"); - //endregion - break; - case 14: //region 鐗╁搧鎷垮彇浜嬩欢 - info.setAlarmType("鐗╁搧鎷垮彇浜嬩欢浜嬩欢鎶ヨ"); - //endregion - break; - case 20: //region 鍊掑湴妫�娴� - info.setAlarmType("鍊掑湴浜嬩欢瑙﹀彂"); - //endregion - break; - case 44: //region 鐜╂墜鏈� - info.setAlarmType("鐜╂墜鏈烘姤璀︿簨浠�"); - //endregion - break; +// case 5: //region 寰樺緤 +// info.setAlarmType("寰樺緤浜嬩欢鎶ヨ"); +// //endregion +// break; +// case 8: //region 蹇�熺Щ鍔�(濂旇窇) +// info.setAlarmType("蹇�熺Щ鍔�(濂旇窇)浜嬩欢鎶ヨ"); +// //endregion +// break; +// case 13: //region 鐗╁搧閬楃暀浜嬩欢 +// info.setAlarmType("鐗╁搧閬楃暀浜嬩欢鎶ヨ"); +// //endregion +// break; +// case 14: //region 鐗╁搧鎷垮彇浜嬩欢 +// info.setAlarmType("鐗╁搧鎷垮彇浜嬩欢浜嬩欢鎶ヨ"); +// //endregion +// break; +// case 20: //region 鍊掑湴妫�娴� +// info.setAlarmType("鍊掑湴浜嬩欢瑙﹀彂"); +// //endregion +// break; +// case 44: //region 鐜╂墜鏈� +// info.setAlarmType("鐜╂墜鏈烘姤璀︿簨浠�"); +// //endregion +// break; default: - // log.debug("鏈煡琛屼负浜嬩欢绫诲瀷:" + strVcaAlarm.struRuleInfo.wEventTypeEx); - isSnapPic=false; + // log.debug("鏈煡琛屼负浜嬩欢绫诲瀷:" + strVcaAlarm.struRuleInfo.wEventTypeEx); break; } //endregion - //鍥剧墖瀛樺叆minio - if(isSnapPic) { - url = savePicture(info); - info.setPicUrl(url); - publishMqtt(info); - } - break; - case HCNetSDK.COMM_UPLOAD_FACESNAP_RESULT: - log.debug("浜鸿劯妫�娴嬩簨浠朵笂鎶�(鏆備笉瑙f瀽)"); - break; - case HCNetSDK.COMM_GISINFO_UPLOAD: - log.debug("GPS鎶ヨ淇℃伅涓婃姤(鏆備笉瑙f瀽)"); - break; +// case HCNetSDK.COMM_UPLOAD_FACESNAP_RESULT: +// log.debug("浜鸿劯妫�娴嬩簨浠朵笂鎶�(鏆備笉瑙f瀽)"); +// break; +// case HCNetSDK.COMM_GISINFO_UPLOAD: +// log.debug("GPS鎶ヨ淇℃伅涓婃姤(鏆備笉瑙f瀽)"); +// break; case HCNetSDK.COMM_ALARMHOST_CID_ALARM: log.debug("鎶ヨ涓绘満CID鎶ュ憡鎶ヨ涓婃姤"); //region 鎶ヨ涓绘満鎶ヨ澶勭悊 @@ -256,7 +287,7 @@ if (dwMajor != 5) { //鍙幏鍙栦簨浠� - log.debug("闈炰簨浠舵姤璀︽暟鎹笂鎶�(鏆備笉瑙f瀽)"); + // log.debug("闈炰簨浠舵姤璀︽暟鎹笂鎶�(鏆備笉瑙f瀽)"); break; } int dwMinor = strACSInfo.dwMinor; @@ -357,47 +388,13 @@ //endregion break; default: - log.debug("鏈煡鎶ヨ浜嬩欢绫诲瀷:lCommand:" + Integer.toHexString(lCommand)); + // log.debug("鏈煡鎶ヨ浜嬩欢绫诲瀷:lCommand:" + Integer.toHexString(lCommand)); break; } return true; } - /** - * @鎻忚堪 淇濆瓨鍥剧墖灏佽鏂规硶 - * @鍙傛暟 [strVcaAlarm, eventName, eventNameEng] - * @杩斿洖鍊� java.lang.String - * @鍒涘缓浜� 鍒樿嫃涔� - * @鍒涘缓鏃堕棿 2023/2/17 15:05 - * @淇敼浜哄拰鍏跺畠淇℃伅 - */ - private String savePicture(HCNetSDK.NET_VCA_RULE_ALARM strVcaAlarm, String eventName, String eventNameEng) { - String url = ""; - if ((strVcaAlarm.dwPicDataLen > 0) && (strVcaAlarm.byPicTransType == 0)) { - String currentTime = new SimpleDateFormat("yyyyMMdd").format(new Date()); - try { - //瀛樺叆minio - long offset = 0; - ByteBuffer buffers = strVcaAlarm.pImage.getByteBuffer(offset, strVcaAlarm.dwPicDataLen); - byte[] bytes = new byte[strVcaAlarm.dwPicDataLen]; - buffers.rewind(); - buffers.get(bytes); - InputStream inputStream = new ByteArrayInputStream(bytes); - String ipaddr = new String(strVcaAlarm.struDevInfo.struDevIP.sIpV4).trim();//璁惧ip - String UUID = java.util.UUID.randomUUID().toString().replace("-", ""); - String filename = ipaddr + "/" + currentTime + "/" + eventNameEng + "/" + UUID + ".jpg"; - boolean uploadRes = MinioUtils.uploadObject("pic", filename, inputStream, "image/jpeg"); - if (uploadRes) { - url = MinioClientSingleton.domainUrl + filename; - log.info("鍐欏叆minio鍥剧墖鍦板潃锛�" + url); - } - } catch (Exception ex) { - log.error(eventName + "澶勭悊鍥剧墖寮傚父锛�" + ex.getMessage()); - } - } - return url; - } /** * 鐩告満鎴浘 @@ -405,8 +402,7 @@ private String savePicture(CameraEventInfo info) { CameraCmd cmd = new CameraCmd(); ArdCameras Cameras = GlobalVariable.cameraMap.get(info.getCameraIp()); - if(Cameras==null) - { + if (Cameras == null) { return ""; } cmd.setCameraId(Cameras.getId()); @@ -442,9 +438,9 @@ * 鎵撳嵃闂ㄧ浜嬩欢鏃ュ織 */ private void printLog(AccessControlHostEventInfo info) { - log.debug("銆愭姤璀D銆�" + info.getSerialNo() + "銆愯澶囩紪鍙枫��"+ + log.debug("銆愭姤璀D銆�" + info.getSerialNo() + "銆愯澶囩紪鍙枫��" + "銆愰棬缂栧彿銆�" + info.getDoorNo() + "銆愪簨浠剁被鍨嬨��" + info.getAlarmType() + - "銆愰槻鍖虹被鍨嬨��" + info.getDefenseType()+"銆愭椂闂淬��" + info.getAlarmTime() + + "銆愰槻鍖虹被鍨嬨��" + info.getDefenseType() + "銆愭椂闂淬��" + info.getAlarmTime() + "銆愰棬绂佷富鏈篒D銆�" + info.getAcsId()); } diff --git a/src/main/java/com/ard/utils/hiksdk/service/impl/HikClientUtil.java b/src/main/java/com/ard/utils/hiksdk/service/impl/HikClientUtil.java index 428c3fe..1faeb54 100644 --- a/src/main/java/com/ard/utils/hiksdk/service/impl/HikClientUtil.java +++ b/src/main/java/com/ard/utils/hiksdk/service/impl/HikClientUtil.java @@ -121,11 +121,8 @@ /** * @鎻忚堪 娉ㄥ唽鐧诲綍 闆嗘垚浜嶯ET_DVR_Login_V30锛屾敮鎸佸悓姝ュ拰寮傛鐧诲綍 - * @鍙傛暟 [dvrLogin] - * @杩斿洖鍊� java.lang.Integer * @鍒涘缓浜� 鍒樿嫃涔� * @鍒涘缓鏃堕棿 2023/1/17 16:12 - * @淇敼浜哄拰鍏跺畠淇℃伅 */ public static void login(DeviceInfo deviceInfo) { // 鍒濆鍖� @@ -173,12 +170,34 @@ } /** + * @鎻忚堪 鐢ㄦ埛娉ㄩ攢 + * @鍒涘缓浜� 鍒樿嫃涔� + * @鍒涘缓鏃堕棿 2023/1/17 16:12 + */ + public static void logout(DeviceInfo deviceInfo) { + String deviceIpPort = deviceInfo.getIp() + ":" + deviceInfo.getPort(); + //鎾ら槻 + if (GlobalVariable.alarmMap.containsKey(deviceInfo.getDeviceId())) { + Integer lAlarmHandle = GlobalVariable.alarmMap.get(deviceInfo.getDeviceId()); + boolean b = hCNetSDK.NET_DVR_CloseAlarmChan_V30(lAlarmHandle); + if (b) { + log.debug("璁惧銆�" + deviceIpPort + "銆戞挙闃叉垚鍔�"); + } + } + //鐧诲嚭 + if (GlobalVariable.loginMap.containsKey(deviceInfo.getDeviceId())) { + Integer lUserID = GlobalVariable.loginMap.get(deviceInfo.getDeviceId()); + boolean b = hCNetSDK.NET_DVR_Logout(lUserID); + if (b) { + log.debug("璁惧銆�" + deviceIpPort + "銆戞敞閿�鎴愬姛"); + } + } + } + + /** * @鎻忚堪 鐧诲綍鎵�鏈夌浉鏈� - * @鍙傛暟 [] - * @杩斿洖鍊� void * @鍒涘缓浜� 鍒樿嫃涔� * @鍒涘缓鏃堕棿 2023/2/3 10:10 - * @淇敼浜哄拰鍏跺畠淇℃伅 */ public static void loginAllCamera(List<ArdCameras> ardCameras) { try { @@ -191,8 +210,30 @@ info.setUsername(camera.getUsername()); info.setPassword(camera.getPassword()); login(info); - String ip = camera.getIp(); - GlobalVariable.cameraMap.put(ip, camera); + GlobalVariable.cameraMap.put(camera.getIp(), camera); + } + } catch (Exception ex) { + log.error("鍒濆鍖栫櫥褰曠浉鏈哄紓甯革細" + ex.getMessage()); + } + } + + /** + * @鎻忚堪 鐧诲嚭鎵�鏈夌浉鏈� + * @鍒涘缓浜� 鍒樿嫃涔� + * @鍒涘缓鏃堕棿 2023/2/3 10:10 + */ + public static void logoutAllCamera(List<ArdCameras> ardCameras) { + try { + for (ArdCameras camera : ardCameras) { + Thread.sleep(100); + DeviceInfo info = new DeviceInfo(); + info.setDeviceId(camera.getId()); + info.setIp(camera.getIp()); + info.setPort(camera.getPort()); + info.setUsername(camera.getUsername()); + info.setPassword(camera.getPassword()); + logout(info); + GlobalVariable.cameraMap.remove(camera.getIp()); } } catch (Exception ex) { log.error("鍒濆鍖栫櫥褰曠浉鏈哄紓甯革細" + ex.getMessage()); @@ -201,11 +242,8 @@ /** * @鎻忚堪 鐧诲綍鎵�鏈夋姤璀︿富鏈� - * @鍙傛暟 [] - * @杩斿洖鍊� void * @鍒涘缓浜� 鍒樿嫃涔� * @鍒涘缓鏃堕棿 2023/2/3 10:10 - * @淇敼浜哄拰鍏跺畠淇℃伅 */ public static void loginAllAlarmHost(List<ArdEquipExternal> ardEquipExternals) { try { @@ -225,14 +263,34 @@ log.error("鍒濆鍖栨姤璀︿富鏈哄紓甯革細" + ex.getMessage()); } } - /** - * @鎻忚堪 鐧诲綍鎵�鏈夐棬绂佷富鏈� - * @鍙傛暟 [] - * @杩斿洖鍊� void + * @鎻忚堪 鐧诲嚭鎵�鏈夋姤璀︿富鏈� * @鍒涘缓浜� 鍒樿嫃涔� * @鍒涘缓鏃堕棿 2023/2/3 10:10 - * @淇敼浜哄拰鍏跺畠淇℃伅 + */ + public static void logoutAllAlarmHost(List<ArdEquipExternal> ardEquipExternals) + { + try { + for (ArdEquipExternal alarmHost : ardEquipExternals) { + Thread.sleep(100); + DeviceInfo info = new DeviceInfo(); + info.setDeviceId(alarmHost.getId()); + info.setIp(alarmHost.getIp()); + info.setPort(alarmHost.getPort()); + info.setUsername(alarmHost.getUsername()); + info.setPassword(alarmHost.getPassword()); + logout(info); + String ip = alarmHost.getIp(); + GlobalVariable.alarmHostMap.remove(ip); + } + } catch (Exception ex) { + log.error("鍒濆鍖栫櫥褰曠浉鏈哄紓甯革細" + ex.getMessage()); + } + } + /** + * @鎻忚堪 鐧诲綍鎵�鏈夐棬绂佷富鏈� + * @鍒涘缓浜� 鍒樿嫃涔� + * @鍒涘缓鏃堕棿 2023/2/3 10:10 */ public static void loginAllAccessControlHost(List<ArdEquipExternal> ardEquipExternals) { try { @@ -246,13 +304,35 @@ info.setPassword(accessControlHost.getPassword()); login(info); String ip = accessControlHost.getIp(); - GlobalVariable.alarmHostMap.put(ip, accessControlHost); + GlobalVariable.accessHostMap.put(ip, accessControlHost); } } catch (Exception ex) { log.error("鍒濆鍖栨姤璀︿富鏈哄紓甯革細" + ex.getMessage()); } } - + /** + * @鎻忚堪 鐧诲嚭鎵�鏈夐棬绂佷富鏈� + * @鍒涘缓浜� 鍒樿嫃涔� + * @鍒涘缓鏃堕棿 2023/2/3 10:10 + */ + public static void logoutAllAccessControlHost(List<ArdEquipExternal> ardEquipExternals) { + try { + for (ArdEquipExternal accessControlHost : ardEquipExternals) { + Thread.sleep(100); + DeviceInfo info = new DeviceInfo(); + info.setDeviceId(accessControlHost.getId()); + info.setIp(accessControlHost.getIp()); + info.setPort(accessControlHost.getPort()); + info.setUsername(accessControlHost.getUsername()); + info.setPassword(accessControlHost.getPassword()); + logout(info); + String ip = accessControlHost.getIp(); + GlobalVariable.accessHostMap.remove(ip); + } + } catch (Exception ex) { + log.error("鍒濆鍖栨姤璀︿富鏈哄紓甯革細" + ex.getMessage()); + } + } /** * @鎻忚堪 娉ㄩ攢鐧诲綍 * @鍙傛暟 [dvrLogin] @@ -324,10 +404,8 @@ log.error("璁惧銆�" + deviceIpPort + "銆戝竷闃插け璐ワ紝閿欒鐮�==========銆�" + hCNetSDK.NET_DVR_GetLastError()); // 娉ㄩ攢 閲婃斁sdk璧勬簮 logout(lUserID); - return lAlarmHandle; } else { log.debug("璁惧銆�" + deviceIpPort + "銆戝竷闃叉垚鍔�"); - return lAlarmHandle; } } return lAlarmHandle; @@ -374,11 +452,11 @@ //璁剧疆鍥剧墖澶у皬 ByteBuffer jpegBuffer = ByteBuffer.allocate(1024 * 1024); // 鎶撳浘鍒板唴瀛橈紝鍗曞抚鏁版嵁鎹曡幏骞朵繚瀛樻垚JPEG瀛樻斁鍦ㄦ寚瀹氱殑鍐呭瓨绌洪棿涓� - log.debug("-----------杩欓噷寮�濮嬪皝瑁� NET_DVR_CaptureJPEGPicture_NEW---------"); + // log.debug("-----------杩欓噷寮�濮嬪皝瑁� NET_DVR_CaptureJPEGPicture_NEW---------"); boolean is = hCNetSDK.NET_DVR_CaptureJPEGPicture_NEW(userId, channelNum, jpeg, jpegBuffer, 1024 * 1024, a); - log.debug("-----------杩欓噷寮�濮嬪浘鐗囧瓨鍏ュ唴瀛�----------" + is); + //log.debug("-----------杩欓噷寮�濮嬪浘鐗囧瓨鍏ュ唴瀛�----------" + is); if (is) { - log.debug("hksdk(鎶撳浘)-缁撴灉鐘舵�佸��(0琛ㄧず鎴愬姛):" + hCNetSDK.NET_DVR_GetLastError()); + // log.debug("hksdk(鎶撳浘)-缁撴灉鐘舵�佸��(0琛ㄧず鎴愬姛):" + hCNetSDK.NET_DVR_GetLastError()); byte[] array = jpegBuffer.array(); //瀛樺偍鍒癿inio diff --git a/src/main/java/com/ard/utils/hiksdk/service/impl/LoginResultCallBack.java b/src/main/java/com/ard/utils/hiksdk/service/impl/LoginResultCallBack.java index 2c12155..244e9af 100644 --- a/src/main/java/com/ard/utils/hiksdk/service/impl/LoginResultCallBack.java +++ b/src/main/java/com/ard/utils/hiksdk/service/impl/LoginResultCallBack.java @@ -29,7 +29,10 @@ GlobalVariable.loginMap.put(deviceInfo.getDeviceId(), lUserID); log.debug("璁惧銆�" + deviceIpPort + "銆戠櫥褰曟垚鍔�"); // 璁剧疆鎶ヨ鍥炶皟鍑芥暟锛屽缓绔嬫姤璀︿笂浼犻�氶亾锛堝惎鐢ㄥ竷闃诧級 - HikClientUtil.setupAlarmChan(deviceIpPort, lUserID, -1); + int lAlarmHandle = HikClientUtil.setupAlarmChan(deviceIpPort, lUserID, -1); + if (lAlarmHandle != -1) { + GlobalVariable.alarmMap.put(deviceInfo.getDeviceId(), lAlarmHandle); + } } else { log.debug("璁惧銆�" + deviceIpPort + "銆戠櫥褰曞け璐�"); } diff --git a/src/main/java/com/ard/utils/tcp/ClientHandler.java b/src/main/java/com/ard/utils/tcp/ClientHandler.java index 3937fdb..b7ebb4d 100644 --- a/src/main/java/com/ard/utils/tcp/ClientHandler.java +++ b/src/main/java/com/ard/utils/tcp/ClientHandler.java @@ -208,7 +208,7 @@ if (targetNum == 0) { return; } - log.info("鐩爣鎬荤偣鏁�(杞暣鍨�):" + targetNum); + log.debug("鐩爣鎬荤偣鏁�(杞暣鍨�):" + targetNum); //瑙f瀽NET_TARGET_UNIT(64鏄疦ET_TARGET_HEAD鐨勫瓧鑺傛暟) int uintSize = (payloadSizeToDecimal - 64) / targetNum; @@ -327,7 +327,7 @@ byte[] wTargetNum = Arrays.copyOfRange(data, 8, 10); wTargetNum = ByteUtils.toLittleEndian(wTargetNum); targetNum = ByteUtils.bytesToDecimal(wTargetNum); - log.info("鐩爣鎬荤偣鏁�(杞暣鍨�):" + targetNum); + log.debug("鐩爣鎬荤偣鏁�(杞暣鍨�):" + targetNum); if (targetNum == 0) { return; } diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index f65b886..a68ba92 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -76,6 +76,28 @@ <onMismatch>DENY</onMismatch> </filter> </appender> + <!--澶栬仈璁惧鎶ヨ鏃ュ織杈撳嚭--> + <appender name="external" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${log.path}/external.log</file> + <!--寰幆鏀跨瓥锛氬熀浜庢椂闂村垱寤烘棩蹇楁枃浠�--> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <!--鏃ュ織鏂囦欢鍚嶆牸寮�--> + <fileNamePattern>${log.path}/external.%d{yyyy-MM-dd}.log</fileNamePattern> + <!--鏃ュ織鏈�澶х殑鍘嗗彶60澶�--> + <maxHistory>60</maxHistory> + </rollingPolicy> + <encoder> + <pattern>${log.pattern}</pattern> + </encoder> + <filter class="ch.qos.logback.classic.filter.LevelFilter"> + <!--杩囨护鐨勭骇鍒�--> + <level>INFO</level> + <!--鍖归厤鏃剁殑鎿嶄綔锛氭帴鏀讹紙璁板綍锛�--> + <onMatch>ACCEPT</onMatch> + <!--涓嶅尮閰嶆椂鐨勬搷浣滐細鎷掔粷锛堜笉璁板綍锛�--> + <onMismatch>DENY</onMismatch> + </filter> + </appender> <!--Netty鏃ュ織杈撳嚭--> <appender name="netty" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/netty.log</file> @@ -148,6 +170,10 @@ <logger name="camera" level="INFO"> <appender-ref ref="camera"/> </logger> + <!--澶栬仈璁惧鎶ヨ鎿嶄綔鏃ュ織--> + <logger name="external" level="INFO"> + <appender-ref ref="external"/> + </logger> <!--Netty鏃ュ織--> <logger name="netty" level="INFO"> <appender-ref ref="netty"/> diff --git a/src/main/resources/mapper/ArdCamerasMapper.xml b/src/main/resources/mapper/ArdCamerasMapper.xml index 5f5e419..2ecf053 100644 --- a/src/main/resources/mapper/ArdCamerasMapper.xml +++ b/src/main/resources/mapper/ArdCamerasMapper.xml @@ -32,6 +32,7 @@ <result property="operatorExpired" column="operator_expired"/> <result property="camMaxVisibleDistance" column="cam_max_visible_distance"/> <result property="camAlarmGuideEnable" column="cam_alarm_guide_enable"/> + <result property="updateTime" column="update_time"/> </resultMap> <sql id="selectArdCamerasVo"> @@ -60,7 +61,8 @@ c.operator_id, c.operator_expired, c.cam_max_visible_distance, - c.cam_alarm_guide_enable + c.cam_alarm_guide_enable, + c.update_time from ard_cameras c </sql> diff --git a/src/main/resources/mapper/ArdEquipExternalMapper.xml b/src/main/resources/mapper/ArdEquipExternalMapper.xml index a7550e1..0cd93bf 100644 --- a/src/main/resources/mapper/ArdEquipExternalMapper.xml +++ b/src/main/resources/mapper/ArdEquipExternalMapper.xml @@ -18,6 +18,7 @@ <result property="altitude" column="altitude"/> <result property="deptId" column="dept_id"/> <result property="userId" column="user_id"/> + <result property="updateTime" column="update_time"/> </resultMap> <sql id="selectArdEquipExternalVo"> @@ -31,7 +32,8 @@ c.password, c.longitude, c.latitude, - c.altitude + c.altitude, + c.update_time from ard_equip_external c </sql> <select id="selectArdEquipExternal" parameterType="ArdEquipExternal" resultMap="ArdEquipExternalResult"> -- Gitblit v1.9.3