From 1af77ab5f7c11a4b3d59c1989b51b9fca29679ce Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期二, 18 十月 2022 22:18:49 +0800
Subject: [PATCH] Merge pull request #645 from IKangXu/wvp-28181-2.0

---
 src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java |  221 ++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 153 insertions(+), 68 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java
index 2caab0f..1198c26 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java
@@ -2,7 +2,11 @@
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.genersoft.iot.vmp.gb28181.bean.Device;
 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
+import com.genersoft.iot.vmp.gb28181.bean.TreeType;
+import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent;
+import com.genersoft.iot.vmp.utils.DateUtil;
 import org.dom4j.Attribute;
 import org.dom4j.Document;
 import org.dom4j.DocumentException;
@@ -10,6 +14,7 @@
 import org.dom4j.io.SAXReader;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.util.ObjectUtils;
 import org.springframework.util.StringUtils;
 
 import javax.sip.RequestEvent;
@@ -27,7 +32,7 @@
     /**
      * 鏃ュ織鏈嶅姟
      */
-    private static Logger LOG = LoggerFactory.getLogger(XmlUtil.class);
+    private static Logger logger = LoggerFactory.getLogger(XmlUtil.class);
 
     /**
      * 瑙f瀽XML涓篋ocument瀵硅薄
@@ -44,7 +49,7 @@
         try {
             document = saxReader.read(sr);
         } catch (DocumentException e) {
-            LOG.error("瑙f瀽澶辫触", e);
+            logger.error("瑙f瀽澶辫触", e);
         }
         return null == document ? null : document.getRootElement();
     }
@@ -114,12 +119,12 @@
         // 濡傛灉鏄睘鎬�
         for (Object o : element.attributes()) {
             Attribute attr = (Attribute) o;
-            if (!StringUtils.isEmpty(attr.getValue())) {
+            if (!ObjectUtils.isEmpty(attr.getValue())) {
                 json.put("@" + attr.getName(), attr.getValue());
             }
         }
         List<Element> chdEl = element.elements();
-        if (chdEl.isEmpty() && !StringUtils.isEmpty(element.getText())) {// 濡傛灉娌℃湁瀛愬厓绱�,鍙湁涓�涓��
+        if (chdEl.isEmpty() && !ObjectUtils.isEmpty(element.getText())) {// 濡傛灉娌℃湁瀛愬厓绱�,鍙湁涓�涓��
             json.put(element.getName(), element.getText());
         }
 
@@ -150,7 +155,7 @@
             } else { // 瀛愬厓绱犳病鏈夊瓙鍏冪礌
                 for (Object o : element.attributes()) {
                     Attribute attr = (Attribute) o;
-                    if (!StringUtils.isEmpty(attr.getValue())) {
+                    if (!ObjectUtils.isEmpty(attr.getValue())) {
                         json.put("@" + attr.getName(), attr.getValue());
                     }
                 }
@@ -180,47 +185,78 @@
         return xml.getRootElement();
     }
 
-    public static DeviceChannel channelContentHander(Element itemDevice){
-        Element channdelNameElement = itemDevice.element("Name");
-        String channelName = channdelNameElement != null ? channdelNameElement.getTextTrim().toString() : "";
-        Element statusElement = itemDevice.element("Status");
-        String status = statusElement != null ? statusElement.getTextTrim().toString() : "ON";
+    private enum ChannelType{
+        CivilCode, BusinessGroup,VirtualOrganization,Other
+    }
+
+    public static DeviceChannel channelContentHander(Element itemDevice, Device device, String event){
         DeviceChannel deviceChannel = new DeviceChannel();
-        deviceChannel.setName(channelName);
+        deviceChannel.setDeviceId(device.getDeviceId());
         Element channdelIdElement = itemDevice.element("DeviceID");
-        String channelId = channdelIdElement != null ? channdelIdElement.getTextTrim().toString() : "";
-        deviceChannel.setChannelId(channelId);
-        // ONLINE OFFLINE HIKVISION DS-7716N-E4 NVR鐨勫吋瀹规�у鐞�
-        if (status.equals("ON") || status.equals("On") || status.equals("ONLINE") || status.equals("OK")) {
-            deviceChannel.setStatus(1);
+        if (channdelIdElement == null) {
+            logger.warn("瑙f瀽Catalog娑堟伅鏃跺彂鐜扮己灏� DeviceID");
+            return null;
         }
-        if (status.equals("OFF") || status.equals("Off") || status.equals("OFFLINE")) {
-            deviceChannel.setStatus(0);
+        String channelId = channdelIdElement.getTextTrim();
+        if (ObjectUtils.isEmpty(channelId)) {
+            logger.warn("瑙f瀽Catalog娑堟伅鏃跺彂鐜扮己灏� DeviceID");
+            return null;
+        }
+        deviceChannel.setChannelId(channelId);
+        if (event != null && !event.equals(CatalogEvent.ADD) && !event.equals(CatalogEvent.UPDATE)) {
+            // 闄や簡ADD鍜寀pdate鎯呭喌涓嬮渶瑕佽瘑鍒叏閮ㄥ唴瀹癸紝
+            return deviceChannel;
         }
 
-        deviceChannel.setManufacture(XmlUtil.getText(itemDevice, "Manufacturer"));
-        deviceChannel.setModel(XmlUtil.getText(itemDevice, "Model"));
-        deviceChannel.setOwner(XmlUtil.getText(itemDevice, "Owner"));
-        deviceChannel.setCivilCode(XmlUtil.getText(itemDevice, "CivilCode"));
-        deviceChannel.setBlock(XmlUtil.getText(itemDevice, "Block"));
-        deviceChannel.setAddress(XmlUtil.getText(itemDevice, "Address"));
-        String businessGroupID = XmlUtil.getText(itemDevice, "BusinessGroupID");
-        if (XmlUtil.getText(itemDevice, "Parental") == null
-                || XmlUtil.getText(itemDevice, "Parental").equals("")) {
-            if (deviceChannel.getChannelId().length() <= 10
-                    || (deviceChannel.getChannelId().length() == 20 && (
-                            Integer.parseInt(deviceChannel.getChannelId().substring(10, 13)) == 215
-                                    || Integer.parseInt(deviceChannel.getChannelId().substring(10, 13)) == 216
-                            )
-                        )
-            ) {
-                deviceChannel.setParental(1);
-            }else {
-                deviceChannel.setParental(0);
+        ChannelType channelType = ChannelType.Other;
+        if (channelId.length() <= 8) {
+            channelType = ChannelType.CivilCode;
+            deviceChannel.setHasAudio(false);
+        }else {
+            if (channelId.length() == 20) {
+                int code = Integer.parseInt(channelId.substring(10, 13));
+                switch (code){
+                    case 215:
+                        channelType = ChannelType.BusinessGroup;
+                        deviceChannel.setHasAudio(false);
+                        break;
+                    case 216:
+                        channelType = ChannelType.VirtualOrganization;
+                        deviceChannel.setHasAudio(false);
+                        break;
+                    case 136:
+                    case 137:
+                    case 138:
+                        deviceChannel.setHasAudio(true);
+                        break;
+                    default:
+                        deviceChannel.setHasAudio(false);
+                        break;
+
+                }
             }
-        } else {
-            // 鐢变簬娴峰悍浼氶敊璇殑鍙戦��65535浣滀负杩欓噷鐨勫彇鍊�,鎵�浠ヨ繖閲岄櫎闈炴槸0鍚﹀垯璁や负鏄�1
-            deviceChannel.setParental(Integer.parseInt(XmlUtil.getText(itemDevice, "Parental")) == 1?1:0);
+        }
+
+        Element channdelNameElement = itemDevice.element("Name");
+        String channelName = channdelNameElement != null ? channdelNameElement.getTextTrim() : "";
+        deviceChannel.setName(channelName);
+
+        String civilCode = XmlUtil.getText(itemDevice, "CivilCode");
+        deviceChannel.setCivilCode(civilCode);
+        if (channelType == ChannelType.CivilCode && civilCode == null) {
+            deviceChannel.setParental(1);
+            // 琛屾斂鍖哄垝濡傛灉娌℃湁浼犻�掑叿浣撳�硷紝鍒欐帹娴嬩竴涓�
+            if (channelId.length() > 2) {
+                deviceChannel.setCivilCode(channelId.substring(0, channelId.length() - 2));
+            }
+        }
+        if (channelType.equals(ChannelType.CivilCode)) {
+            // 琛屾斂鍖哄垝鍏朵粬瀛楁娌″繀瑕佽瘑鍒簡锛岄粯璁ゅ湪绾垮嵆鍙�
+            deviceChannel.setStatus(1);
+            deviceChannel.setParental(1);
+            deviceChannel.setCreateTime(DateUtil.getNow());
+            deviceChannel.setUpdateTime(DateUtil.getNow());
+            return deviceChannel;
         }
         /**
          * 琛屾斂鍖哄垝灞曠ず璁惧鏍戜笌涓氬姟鍒嗙粍灞曠ず璁惧鏍戞槸涓ょ涓嶅悓鐨勬ā寮�
@@ -228,7 +264,17 @@
          * 娌冲寳鐪�
          *    --> 鐭冲搴勫競
          *          --> 鎽勫儚澶�
-         *          --> 姝e畾鍘�
+         *String parentId = XmlUtil.getText(itemDevice, "ParentID");
+         if (parentId != null) {
+         if (parentId.contains("/")) {
+         String lastParentId = parentId.substring(parentId.lastIndexOf("/") + 1);
+         String businessGroup = parentId.substring(0, parentId.indexOf("/"));
+         deviceChannel.setParentId(lastParentId);
+         }else {
+         deviceChannel.setParentId(parentId);
+         }
+         }
+         deviceCh          --> 姝e畾鍘�
          *                  --> 鎽勫儚澶�
          *                  --> 鎽勫儚澶�
          *
@@ -241,54 +287,88 @@
          *             --> 鎽勫儚澶�
          */
         String parentId = XmlUtil.getText(itemDevice, "ParentID");
+        String businessGroupID = XmlUtil.getText(itemDevice, "BusinessGroupID");
         if (parentId != null) {
             if (parentId.contains("/")) {
                 String lastParentId = parentId.substring(parentId.lastIndexOf("/") + 1);
+                if (businessGroupID == null) {
+                    businessGroupID = parentId.substring(0, parentId.indexOf("/"));
+                }
                 deviceChannel.setParentId(lastParentId);
             }else {
                 deviceChannel.setParentId(parentId);
             }
-        }else {
-            if (deviceChannel.getChannelId().length() <= 10) { // 姝ゆ椂涓鸿鏀垮尯鍒�, 涓婁笅绾ц鏀垮尯鍒掍娇鐢―eviceId鍏宠仈
-                deviceChannel.setParentId(deviceChannel.getChannelId().substring(0, deviceChannel.getChannelId().length() - 2));
-            }else if (deviceChannel.getChannelId().length() == 20) {
-                if (Integer.parseInt(deviceChannel.getChannelId().substring(10, 13)) == 216) { // 铏氭嫙缁勭粐
-                    deviceChannel.setParentId(businessGroupID);
-                }else if (deviceChannel.getCivilCode() != null) {
-                    // 璁惧锛� 鏃爌arentId鐨�20浣嶆槸浣跨敤CivilCode琛ㄧず涓婄骇鐨勮澶囷紝
-                    // 娉細215 涓氬姟鍒嗙粍鏄渶瑕佹湁parentId鐨�
-                    deviceChannel.setParentId(deviceChannel.getCivilCode());
-                }
-            }else {
-                deviceChannel.setParentId(deviceChannel.getDeviceId());
-            }
+        }
+        deviceChannel.setBusinessGroupId(businessGroupID);
+        if (channelType.equals(ChannelType.BusinessGroup) || channelType.equals(ChannelType.VirtualOrganization)) {
+            // 涓氬姟鍒嗙粍鍜岃櫄鎷熺粍缁� 鍏朵粬瀛楁娌″繀瑕佽瘑鍒簡锛岄粯璁ゅ湪绾垮嵆鍙�
+            deviceChannel.setStatus(1);
+            deviceChannel.setParental(1);
+            deviceChannel.setCreateTime(DateUtil.getNow());
+            deviceChannel.setUpdateTime(DateUtil.getNow());
+            return deviceChannel;
         }
 
-        if (XmlUtil.getText(itemDevice, "SafetyWay") == null
-                || XmlUtil.getText(itemDevice, "SafetyWay") == "") {
+        Element statusElement = itemDevice.element("Status");
+
+        if (statusElement != null) {
+            String status = statusElement.getTextTrim().trim();
+            // ONLINE OFFLINE HIKVISION DS-7716N-E4 NVR鐨勫吋瀹规�у鐞�
+            if (status.equals("ON") || status.equals("On") || status.equals("ONLINE") || status.equals("OK")) {
+                deviceChannel.setStatus(1);
+            }
+            if (status.equals("OFF") || status.equals("Off") || status.equals("OFFLINE")) {
+                deviceChannel.setStatus(0);
+            }
+        }else {
+            deviceChannel.setStatus(1);
+        }
+        // 璇嗗埆鑷甫鐨勭洰褰曟爣璇�
+        String parental = XmlUtil.getText(itemDevice, "Parental");
+        // 鐢变簬娴峰悍浼氶敊璇殑鍙戦��65535浣滀负杩欓噷鐨勫彇鍊�,鎵�浠ヨ繖閲岄櫎闈炴槸0鍚﹀垯璁や负鏄�1
+        if (!ObjectUtils.isEmpty(parental) && parental.length() == 1 && Integer.parseInt(parental) == 0) {
+            deviceChannel.setParental(0);
+        }else {
+            deviceChannel.setParental(1);
+        }
+
+
+        deviceChannel.setManufacture(XmlUtil.getText(itemDevice, "Manufacturer"));
+        deviceChannel.setModel(XmlUtil.getText(itemDevice, "Model"));
+        deviceChannel.setOwner(XmlUtil.getText(itemDevice, "Owner"));
+        deviceChannel.setCertNum(XmlUtil.getText(itemDevice, "CertNum"));
+        deviceChannel.setBlock(XmlUtil.getText(itemDevice, "Block"));
+        deviceChannel.setAddress(XmlUtil.getText(itemDevice, "Address"));
+        deviceChannel.setPassword(XmlUtil.getText(itemDevice, "Password"));
+
+        String safetyWay = XmlUtil.getText(itemDevice, "SafetyWay");
+        if (ObjectUtils.isEmpty(safetyWay)) {
             deviceChannel.setSafetyWay(0);
         } else {
-            deviceChannel.setSafetyWay(Integer.parseInt(XmlUtil.getText(itemDevice, "SafetyWay")));
+            deviceChannel.setSafetyWay(Integer.parseInt(safetyWay));
         }
-        if (XmlUtil.getText(itemDevice, "RegisterWay") == null
-                || XmlUtil.getText(itemDevice, "RegisterWay") == "") {
+
+        String registerWay = XmlUtil.getText(itemDevice, "RegisterWay");
+        if (ObjectUtils.isEmpty(registerWay)) {
             deviceChannel.setRegisterWay(1);
         } else {
-            deviceChannel.setRegisterWay(Integer.parseInt(XmlUtil.getText(itemDevice, "RegisterWay")));
+            deviceChannel.setRegisterWay(Integer.parseInt(registerWay));
         }
-        deviceChannel.setCertNum(XmlUtil.getText(itemDevice, "CertNum"));
+
         if (XmlUtil.getText(itemDevice, "Certifiable") == null
                 || XmlUtil.getText(itemDevice, "Certifiable") == "") {
             deviceChannel.setCertifiable(0);
         } else {
             deviceChannel.setCertifiable(Integer.parseInt(XmlUtil.getText(itemDevice, "Certifiable")));
         }
+
         if (XmlUtil.getText(itemDevice, "ErrCode") == null
                 || XmlUtil.getText(itemDevice, "ErrCode") == "") {
             deviceChannel.setErrCode(0);
         } else {
             deviceChannel.setErrCode(Integer.parseInt(XmlUtil.getText(itemDevice, "ErrCode")));
         }
+
         deviceChannel.setEndTime(XmlUtil.getText(itemDevice, "EndTime"));
         deviceChannel.setSecrecy(XmlUtil.getText(itemDevice, "Secrecy"));
         deviceChannel.setIpAddress(XmlUtil.getText(itemDevice, "IPAddress"));
@@ -297,17 +377,23 @@
         } else {
             deviceChannel.setPort(Integer.parseInt(XmlUtil.getText(itemDevice, "Port")));
         }
-        deviceChannel.setPassword(XmlUtil.getText(itemDevice, "Password"));
-        if (NumericUtil.isDouble(XmlUtil.getText(itemDevice, "Longitude"))) {
-            deviceChannel.setLongitude(Double.parseDouble(XmlUtil.getText(itemDevice, "Longitude")));
+
+
+        String longitude = XmlUtil.getText(itemDevice, "Longitude");
+        if (NumericUtil.isDouble(longitude)) {
+            deviceChannel.setLongitude(Double.parseDouble(longitude));
         } else {
             deviceChannel.setLongitude(0.00);
         }
-        if (NumericUtil.isDouble(XmlUtil.getText(itemDevice, "Latitude"))) {
-            deviceChannel.setLatitude(Double.parseDouble(XmlUtil.getText(itemDevice, "Latitude")));
+        String latitude = XmlUtil.getText(itemDevice, "Latitude");
+        if (NumericUtil.isDouble(latitude)) {
+            deviceChannel.setLatitude(Double.parseDouble(latitude));
         } else {
             deviceChannel.setLatitude(0.00);
         }
+        deviceChannel.setGpsTime(DateUtil.getNow());
+
+
         if (XmlUtil.getText(itemDevice, "PTZType") == null || "".equals(XmlUtil.getText(itemDevice, "PTZType"))) {
             //鍏煎INFO涓殑淇℃伅
             Element info = itemDevice.element("Info");
@@ -319,7 +405,6 @@
         } else {
             deviceChannel.setPTZType(Integer.parseInt(XmlUtil.getText(itemDevice, "PTZType")));
         }
-        deviceChannel.setHasAudio(true); // 榛樿鍚湁闊抽锛屾挱鏀炬椂鍐嶆鏌ユ槸鍚︽湁闊抽鍙婃槸鍚AC
         return deviceChannel;
     }
 }
\ No newline at end of file

--
Gitblit v1.8.0