Jelajahi Sumber

北向代码提交

jingyuanchao 1 tahun lalu
induk
melakukan
760bbc2775
21 mengubah file dengan 387 tambahan dan 20 penghapusan
  1. 13 3
      project_data/sql/0.0.6-iot/soc/soc.sql
  2. 4 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/RemoteDeviceService.java
  3. 10 2
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/RemoteMediatorService.java
  4. 3 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/domain/SysDevice.java
  5. 6 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/factory/RemoteDeviceFallbackFactory.java
  6. 12 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/factory/RemoteMediatorFallbackFactory.java
  7. 26 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/constant/CacheConstants.java
  8. 2 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/constant/Constants.java
  9. 43 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/mediator/vo/EquipmentOrgVo.java
  10. 39 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/controller/DataController.java
  11. 24 7
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/controller/MediatorController.java
  12. 2 1
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/MediatorAlarmCodeServiceImpl.java
  13. 2 1
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/MediatorCategoryServiceImpl.java
  14. 2 1
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/VideoDaysCheckServiceImpl.java
  15. 2 1
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/VideoDiagnosisRecordServiceImpl.java
  16. 3 2
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/VideoIntegrityCheckServiceImpl.java
  17. 6 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/domain/dto/redis/RedisKey.java
  18. 7 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysDeviceController.java
  19. 6 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/ISysDeviceService.java
  20. 174 1
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysDeviceServiceImpl.java
  21. 1 1
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysOrgServiceImpl.java

+ 13 - 3
project_data/sql/0.0.6-iot/soc/soc.sql

@@ -29,7 +29,7 @@ CREATE PROCEDURE schema_change () BEGIN
                     AND table_name = 'sys_device'
                     AND column_name = 'type') THEN
         ALTER TABLE sys_device
-            ADD COLUMN `type`  varchar(25) NULL COMMENT '主机code' AFTER `host_code`;
+            ADD COLUMN `type`  varchar(25) NULL COMMENT '设备型号' AFTER `host_code`;
     END IF;
 
     IF NOT EXISTS(SELECT *
@@ -38,7 +38,7 @@ CREATE PROCEDURE schema_change () BEGIN
                     AND table_name = 'sys_device'
                     AND column_name = 'ip') THEN
         ALTER TABLE sys_device
-            ADD COLUMN `ip`  varchar(225) NULL COMMENT '主机code' AFTER `type`;
+            ADD COLUMN `ip`  varchar(225) NULL COMMENT '设备ip' AFTER `type`;
     END IF;
 
     IF NOT EXISTS(SELECT *
@@ -47,10 +47,20 @@ CREATE PROCEDURE schema_change () BEGIN
                     AND table_name = 'sys_device'
                     AND column_name = 'org_path') THEN
         ALTER TABLE sys_device
-            ADD COLUMN `org_path`  varchar(225) NULL COMMENT '主机code' AFTER `org_name`;
+            ADD COLUMN `org_path`  varchar(225) NULL COMMENT '机构path' AFTER `org_name`;
     END IF;
 
 
+
+    IF NOT EXISTS(SELECT *
+                  FROM information_schema.columns
+                  WHERE table_schema = DATABASE()
+                    AND table_name = 'sys_device'
+                    AND column_name = 'channel_id') THEN
+        ALTER TABLE sys_device
+            ADD COLUMN `channel_id`  varchar(225) NULL COMMENT '通道号' AFTER `host_code`;
+    END IF;
+
 END ??
 DELIMITER ;
 CALL schema_change ();

+ 4 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/RemoteDeviceService.java

@@ -5,6 +5,7 @@ import com.xunmei.common.core.constant.ServiceNameConstants;
 import com.xunmei.common.core.domain.R;
 import com.xunmei.system.api.domain.SysDevice;
 import com.xunmei.system.api.dto.SysDeviceInnerListDto;
+import com.xunmei.system.api.dto.device.DeviceDto;
 import com.xunmei.system.api.dto.device.DeviceReceivePageDto;
 import com.xunmei.system.api.dto.protection.ReceiveErrorDto;
 import com.xunmei.system.api.factory.RemoteConfigFallbackFactory;
@@ -32,4 +33,7 @@ public interface RemoteDeviceService {
     @PostMapping("/device/north/save")
     ReceiveErrorDto save(@RequestBody DeviceReceivePageDto deviceReceivePageDto, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
 
+
+    @PostMapping("/device/north/saveChannel")
+    ReceiveErrorDto saveChannel(List<DeviceDto> deviceDtoList, String branchId, String msgId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
 }

+ 10 - 2
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/RemoteMediatorService.java

@@ -2,7 +2,9 @@ package com.xunmei.system.api;
 
 import com.xunmei.common.core.constant.SecurityConstants;
 import com.xunmei.common.core.constant.ServiceNameConstants;
+import com.xunmei.common.core.domain.mediator.domain.MediatorCategory;
 import com.xunmei.system.api.domain.SysDictData;
+import com.xunmei.system.api.domain.north.NorthError;
 import com.xunmei.system.api.dto.device.DeviceReceivePageDto;
 import com.xunmei.system.api.enums.DataType;
 import com.xunmei.system.api.factory.RemoteDictDataFallbackFactory;
@@ -17,18 +19,24 @@ import java.util.List;
  *
  * @author xunmei
  */
-@FeignClient(contextId = "remoteMediatorService",path = "/mediator",value = ServiceNameConstants.MEDIATOR_SERVICE, fallbackFactory = RemoteMediatorFallbackFactory.class)
+@FeignClient(contextId = "remoteMediatorService", path = "/mediator", value = ServiceNameConstants.MEDIATOR_SERVICE, fallbackFactory = RemoteMediatorFallbackFactory.class)
 public interface RemoteMediatorService {
 
     @PostMapping("/isCompleted")
     List<DeviceReceivePageDto> isCompleted(@RequestBody DeviceReceivePageDto pageData, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
 
     @PostMapping("/saveDeviceData")
-    void saveDeviceData(@RequestBody  List<DeviceReceivePageDto> pageData, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+    void saveDeviceData(@RequestBody List<DeviceReceivePageDto> pageData, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
 
     @GetMapping("/saveOrUpdateBaseCountByDataType")
     void saveOrUpdateBaseCountByDataType(@RequestParam("dataType") Integer dataType,
                                          @RequestParam("size") int size,
                                          @RequestParam("boo") boolean boo,
                                          @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+    @PostMapping("/saveErrorData")
+    void saveErrorData(@RequestBody List<NorthError> errors, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+    @GetMapping("/findCategoryByCodeAndParentId")
+    MediatorCategory findCategoryByCodeAndParentId(@RequestParam String code,@RequestParam long parentId , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
 }

+ 3 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/domain/SysDevice.java

@@ -138,4 +138,7 @@ public class SysDevice extends BaseEntity {
      */
     @ApiModelProperty(value = "在线状态")
     private Integer status;
+
+    private String ChannelId;
+
 }

+ 6 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/factory/RemoteDeviceFallbackFactory.java

@@ -4,6 +4,7 @@ import com.xunmei.common.core.domain.R;
 import com.xunmei.system.api.RemoteDeviceService;
 import com.xunmei.system.api.domain.SysDevice;
 import com.xunmei.system.api.dto.SysDeviceInnerListDto;
+import com.xunmei.system.api.dto.device.DeviceDto;
 import com.xunmei.system.api.dto.device.DeviceReceivePageDto;
 import com.xunmei.system.api.dto.protection.ReceiveErrorDto;
 import org.slf4j.Logger;
@@ -44,6 +45,11 @@ public class RemoteDeviceFallbackFactory implements FallbackFactory<RemoteDevice
             public ReceiveErrorDto save(DeviceReceivePageDto deviceReceivePageDto, String source) {
                 return null;
             }
+
+            @Override
+            public ReceiveErrorDto saveChannel(List<DeviceDto> deviceDtoList, String branchId, String msgId, String source) {
+                return null;
+            }
         };
 
     }

+ 12 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/factory/RemoteMediatorFallbackFactory.java

@@ -1,8 +1,10 @@
 package com.xunmei.system.api.factory;
 
+import com.xunmei.common.core.domain.mediator.domain.MediatorCategory;
 import com.xunmei.system.api.RemoteDictDataService;
 import com.xunmei.system.api.RemoteMediatorService;
 import com.xunmei.system.api.domain.SysDictData;
+import com.xunmei.system.api.domain.north.NorthError;
 import com.xunmei.system.api.dto.device.DeviceReceivePageDto;
 import com.xunmei.system.api.enums.DataType;
 import org.slf4j.Logger;
@@ -40,6 +42,16 @@ public class RemoteMediatorFallbackFactory implements FallbackFactory<RemoteMedi
             public void saveOrUpdateBaseCountByDataType(Integer dataType, int size, boolean boo, String source) {
 
             }
+
+            @Override
+            public void saveErrorData(List<NorthError> errors, String source) {
+
+            }
+
+            @Override
+            public MediatorCategory findCategoryByCodeAndParentId(String code, long parentId, String source) {
+                return null;
+            }
         };
     }
 }

+ 26 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/constant/CacheConstants.java

@@ -76,4 +76,30 @@ public class CacheConstants
      * 登记簿批量导出本地文件名称前缀key
      */
     public static final String REGISTER_PDF_FILE_KEY = "register_pdf_file_key_";
+
+    /**
+     * 接收的布防信息
+     */
+    public static final String RECEIVE_PROTECTION = "RECEIVE_PROTECTION";
+
+    //录像完整性检查
+    public static final String VIDEO_INTEGRITY_CHECK_KEY= "VideoIntegrityCheck_";
+
+    public static final String REPORT_DATA_REFUSE_MSG= "相同数据于短时间内重复上报,暂时不做处理";
+
+    //录像完整性检查
+    public static final String VIDEO_DIAGNOSIS_CHECK_KEY= "VideoDiagnosisCHECK_";
+
+    public static final String NOT_ALARM_AGAIN = "not_alarm_again_";
+
+    /**
+     * key  对应数据的后缀
+     */
+    public static final String AFTER_DATA = "_DATA";
+
+    /**
+     * 用于存放生成通道信息同步的信息
+     */
+    public static final String CHANNEL_KEY = "channel_base_info_uid";
+
 }

+ 2 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/constant/Constants.java

@@ -159,4 +159,6 @@ public class Constants {
     public static final String HMS_FORMAT = "yyyy-MM-dd HH:mm:ss";
 
     public static final String HM_FORMAT = "yyyyMMddHHmmss";
+
+    public static final String LIMIT1 = "limit 1";
 }

+ 43 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/mediator/vo/EquipmentOrgVo.java

@@ -0,0 +1,43 @@
+package com.xunmei.common.core.domain.mediator.vo;
+
+import lombok.Data;
+
+@Data
+public class EquipmentOrgVo {
+
+    /**
+     * 设备code
+     */
+    private String equipmentCode;
+    /**
+     * 机构id
+     */
+    private Long orgId;
+
+    @Override
+    public int hashCode() {
+        int a = equipmentCode.hashCode() * 10 -1;
+        int b = orgId.hashCode() * 10 + 1;
+        return  a + b;
+    }
+    @Override
+    public boolean equals(Object obj) {
+        if(this == obj){
+            return true;//地址相等
+        }
+
+        if(obj == null){
+            return false;//非空性:对于任意非空引用x,x.equals(null)应该返回false。
+        }
+
+        if(obj instanceof EquipmentOrgVo){
+            EquipmentOrgVo other = (EquipmentOrgVo) obj;
+            //需要比较的字段相等,则这两个对象相等
+            if(this.equipmentCode.equals(other.getEquipmentCode()) && other.getOrgId().equals(this.orgId)){
+                return true;
+            }
+        }
+
+        return false;
+    }
+}

+ 39 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/controller/DataController.java

@@ -1,18 +1,22 @@
 package com.xunmei.mediator.api.controller;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.xunmei.common.core.constant.SecurityConstants;
 import com.xunmei.mediator.api.service.RabbitMsgIdService;
+import com.xunmei.system.api.dto.device.DeviceDto;
 import com.xunmei.system.api.dto.device.DeviceReceivePageDto;
 import com.xunmei.system.api.dto.protection.ReceiveErrorDto;
 import com.xunmei.system.api.util.LogUtils;
 import com.xunmei.system.api.RemoteDeviceService;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.codec.digest.DigestUtils;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 
 import javax.annotation.Resource;
+import java.util.List;
 
 /**
  * @author jingyuanchao
@@ -71,4 +75,39 @@ public class DataController {
         return ReceiveErrorDto.error("数据处理异常");
     }
 
+    /***
+     * 频率:每日录像机信息同步完成后,同步正在使用的、全量的通道信息
+     * 粒度:按每个录像机推送接入的通道记录为一个数据包
+     * 处理逻辑 ,
+     * 1.逻辑删除录像机的摄像机数据 deleted = 1
+     * 2.更新录像机的摄像机数据 deleted = 0
+     * @param branchId
+     * @param msgId
+     * @param deviceDtos
+     * @return ReceiveErrorDto
+     * @author 高雄
+     * @time 2022/8/17 17:21
+     */
+    @ApiOperation("通道信息同步")
+    @PostMapping({"/api/{branchId}/data/channelList"})
+    public ReceiveErrorDto channelList(@PathVariable String branchId, String msgId, @RequestBody List<DeviceDto> deviceDtos) {
+        rabbitMsgIdService.sendMsgId(msgId, "/data/channelList", "通道信息同步");
+        LogUtils.BASE_INFO_CHANNEL.info("【北向接口-{}】【branchId:{}】【msgId:{}】【接收参数:{}】", "通道信息同步:/api/data/channelList", branchId, msgId, JSONArray.toJSONString(deviceDtos));
+        ReceiveErrorDto errorDto = new ReceiveErrorDto();
+        String str = JSONArray.toJSONString(deviceDtos);
+        String value = DigestUtils.md5Hex(str);
+        DeviceDto deviceDto = deviceDtos.get(0);
+        String key = deviceDto.getEquipmentCode() + "_" + deviceDto.getOrganizationGuid() + "channel_data";
+        try {
+            errorDto = this.deviceService.saveChannel(deviceDtos, branchId, msgId,SecurityConstants.INNER);
+            LogUtils.BASE_INFO_CHANNEL.info("【北向接口-{}】【branchId:{}】【msgId:{}】【返回参数:{}】", "设备信息同步:/api/data/channelList", branchId, msgId, JSON.toJSONString(errorDto));
+            return errorDto;
+        } catch (Exception e) {
+            e.printStackTrace();
+            LogUtils.BASE_INFO_CHANNEL.error("【北向接口-{}】【branchId:{}】【msgId:{}】【异常原因:{}】", "设备信息同步:/api/data/channelList", branchId, msgId, e);
+            return ReceiveErrorDto.error("msgId 异常");
+        }
+
+    }
+
 }

+ 24 - 7
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/controller/MediatorController.java

@@ -1,9 +1,9 @@
 package com.xunmei.mediator.api.controller;
 
+import com.xunmei.common.core.domain.mediator.domain.MediatorCategory;
 import com.xunmei.common.security.annotation.InnerAuth;
-import com.xunmei.mediator.api.service.EquipmentSyncService;
-import com.xunmei.mediator.api.service.IMediatorNorthBaseStatisticsService;
-import com.xunmei.mediator.api.service.NorthStatisticsSyncService;
+import com.xunmei.mediator.api.service.*;
+import com.xunmei.system.api.domain.north.NorthError;
 import com.xunmei.system.api.dto.device.DeviceReceivePageDto;
 import org.springframework.web.bind.annotation.*;
 
@@ -23,7 +23,10 @@ public class MediatorController {
     private EquipmentSyncService equipmentSyncService;
     @Resource
     private NorthStatisticsSyncService northStatisticsSyncService;
-
+    @Resource
+    private NorthErrorService northErrorService;
+    @Resource
+    private IMediatorCategoryService categoryService;
 
     @InnerAuth
     @PostMapping("/isCompleted")
@@ -31,15 +34,29 @@ public class MediatorController {
         return equipmentSyncService.isCompleted(pageData);
     }
 
+    @InnerAuth
     @PostMapping("/saveDeviceData")
     public void saveDeviceData(@RequestBody List<DeviceReceivePageDto> pageData) {
         equipmentSyncService.saveDeviceData(pageData);
     }
 
+    @InnerAuth
     @GetMapping("/saveOrUpdateBaseCountByDataType")
     public void saveOrUpdateBaseCountByDataType(@RequestParam("dataType") Integer dataType,
-                                         @RequestParam("size") int size,
-                                         @RequestParam("boo") boolean boo){
-        northStatisticsSyncService.saveOrUpdateBaseCountByDataType(dataType,size,boo);
+                                                @RequestParam("size") int size,
+                                                @RequestParam("boo") boolean boo) {
+        northStatisticsSyncService.saveOrUpdateBaseCountByDataType(dataType, size, boo);
+    }
+
+    @InnerAuth
+    @PostMapping("/saveErrorData")
+    void saveErrorData(@RequestBody List<NorthError> errors) {
+        northErrorService.saveErrorData(errors);
+    }
+
+    @InnerAuth
+    @GetMapping("/findCategoryByCodeAndParentId")
+    MediatorCategory findCategoryByCodeAndParentId(@RequestParam String code, @RequestParam long parentId) {
+        return categoryService.findCategoryByCodeAndParentId(code, parentId);
     }
 }

+ 2 - 1
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/MediatorAlarmCodeServiceImpl.java

@@ -1,6 +1,7 @@
 package com.xunmei.mediator.api.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.constant.Constants;
 import com.xunmei.common.core.domain.mediator.domain.MediatorAlarmCode;
 import com.xunmei.mediator.api.mapper.MediatorAlarmCodeMapper;
 import com.xunmei.mediator.api.service.IMediatorAlarmCodeService;
@@ -19,6 +20,6 @@ public class MediatorAlarmCodeServiceImpl extends ServiceImpl<MediatorAlarmCodeM
 
     @Override
     public MediatorAlarmCode selectByCode(String code) {
-        return lambdaQuery().eq(MediatorAlarmCode::getCode, code).last("limit 1").one();
+        return lambdaQuery().eq(MediatorAlarmCode::getCode, code).last(Constants.LIMIT1).one();
     }
 }

+ 2 - 1
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/MediatorCategoryServiceImpl.java

@@ -1,6 +1,7 @@
 package com.xunmei.mediator.api.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.constant.Constants;
 import com.xunmei.common.core.domain.mediator.domain.MediatorCategory;
 import com.xunmei.mediator.api.mapper.MediatorCategoryMapper;
 import com.xunmei.mediator.api.service.IMediatorCategoryService;
@@ -20,6 +21,6 @@ public class MediatorCategoryServiceImpl extends ServiceImpl<MediatorCategoryMap
 
     @Override
     public MediatorCategory findCategoryByCodeAndParentId(String categoryCode, long parentId) {
-        return lambdaQuery().eq(MediatorCategory::getCode, categoryCode).eq(MediatorCategory::getParentId, parentId).last("limit 1").one();
+        return lambdaQuery().eq(MediatorCategory::getCode, categoryCode).eq(MediatorCategory::getParentId, parentId).last(Constants.LIMIT1).one();
     }
 }

+ 2 - 1
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/VideoDaysCheckServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.constant.Constants;
 import com.xunmei.common.core.constant.SecurityConstants;
 import com.xunmei.common.core.domain.video.MediatorVideoDaysCheck;
 import com.xunmei.common.core.utils.DateUtils;
@@ -149,7 +150,7 @@ public class VideoDaysCheckServiceImpl extends ServiceImpl<VideoDaysCheckMapper,
         qw.eq(MediatorVideoDaysCheck::getEquipmentCode, equipmentCode);
         qw.eq(MediatorVideoDaysCheck::getChannelCode, channelCode);
         qw.orderByDesc(MediatorVideoDaysCheck::getUpdateTime);
-        qw.last("limit 1");
+        qw.last(Constants.LIMIT1);
         return baseMapper.selectOne(qw);
     }
 }

+ 2 - 1
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/VideoDiagnosisRecordServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.constant.Constants;
 import com.xunmei.common.core.constant.SecurityConstants;
 import com.xunmei.common.core.domain.mediator.domain.MediatorAlarmCode;
 import com.xunmei.common.core.domain.mediator.domain.MediatorCategory;
@@ -308,7 +309,7 @@ public class VideoDiagnosisRecordServiceImpl extends ServiceImpl<VideoDiagnosisR
                 .eq(MediatorVideoDiagnosisRecord::getOrgId, orgId)
                 .eq(MediatorVideoDiagnosisRecord::getEquipmentCode, equipmentCode)
                 .eq(MediatorVideoDiagnosisRecord::getChannelCode, channelCode)
-                .last("limit 1").one();
+                .last(Constants.LIMIT1).one();
     }
 
 

+ 3 - 2
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/VideoIntegrityCheckServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.constant.Constants;
 import com.xunmei.common.core.constant.SecurityConstants;
 import com.xunmei.common.core.domain.video.MediatorVideoDaysCheck;
 import com.xunmei.common.core.domain.video.MediatorVideoIntegrityCheck;
@@ -164,7 +165,7 @@ public class VideoIntegrityCheckServiceImpl extends ServiceImpl<VideoIntegrityCh
         qw.eq(MediatorVideoIntegrityCheck::getEquipmentCode, equipmentCode);
         qw.eq(MediatorVideoIntegrityCheck::getChannelCode, channelCode);
         qw.eq(MediatorVideoIntegrityCheck::getRecordDate, recordDate);
-        qw.last("limit 1");
+        qw.last(Constants.LIMIT1);
         return baseMapper.selectOne(qw);
     }
 
@@ -175,7 +176,7 @@ public class VideoIntegrityCheckServiceImpl extends ServiceImpl<VideoIntegrityCh
         qw.eq(MediatorVideoIntegrityCheck::getEquipmentCode, equipmentCode);
         qw.eq(MediatorVideoIntegrityCheck::getChannelCode, channelCode);
         qw.orderByDesc(MediatorVideoIntegrityCheck::getUpdateTime);
-        qw.last("limit 1");
+        qw.last(Constants.LIMIT1);
         return baseMapper.selectOne(qw);
     }
 }

+ 6 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/domain/dto/redis/RedisKey.java

@@ -16,4 +16,10 @@ public class RedisKey {
     public static final String VIDEO_DIAGNOSIS_CHECK_KEY= "VideoDiagnosisCHECK_";
 
     public static final String NOT_ALARM_AGAIN = "not_alarm_again_";
+
+    /**
+     * key  对应数据的后缀
+     */
+    public static final String AFTER_DATA = "_DATA";
+
 }

+ 7 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysDeviceController.java

@@ -15,6 +15,7 @@ import com.xunmei.system.api.domain.SysDevice;
 import com.xunmei.system.api.domain.SysDictData;
 import com.xunmei.system.api.domain.SysOrg;
 import com.xunmei.system.api.dto.SysDeviceInnerListDto;
+import com.xunmei.system.api.dto.device.DeviceDto;
 import com.xunmei.system.api.dto.device.DeviceReceivePageDto;
 import com.xunmei.system.api.dto.protection.ReceiveErrorDto;
 import com.xunmei.system.api.util.LogUtils;
@@ -309,4 +310,10 @@ public class SysDeviceController extends BaseController {
     ReceiveErrorDto save(@RequestBody DeviceReceivePageDto deviceReceivePageDto){
      return  sysDeviceService.northSave(deviceReceivePageDto);
     }
+
+    @PostMapping("/device/north/saveChannel")
+    ReceiveErrorDto saveChannel(List<DeviceDto> deviceDtoList, String branchId, String msgId){
+
+        return sysDeviceService.saveChannel(deviceDtoList,branchId,msgId);
+    }
 }

+ 6 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/ISysDeviceService.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.xunmei.common.core.web.page.TableDataInfo;
 import com.xunmei.system.api.domain.SysDevice;
 import com.xunmei.system.api.dto.SysDeviceInnerListDto;
+import com.xunmei.system.api.dto.device.DeviceDto;
 import com.xunmei.system.api.dto.device.DeviceReceivePageDto;
 import com.xunmei.system.api.dto.protection.ReceiveErrorDto;
 import com.xunmei.system.vo.area.HostVO;
@@ -112,4 +113,9 @@ public interface ISysDeviceService extends IService<SysDevice> {
 
     ReceiveErrorDto northSave(DeviceReceivePageDto deviceReceivePageDto);
 
+    ReceiveErrorDto saveChannel(List<DeviceDto> deviceDtoList, String branchId, String msgId);
+
+    SysDevice findByHostCodeAndCodeAndOrgId(String equipmentCode, String channelCode, Long orgId);
+
+    SysDevice findByCodeAndOrgId(String equipmentCode, Long orgId);
 }

+ 174 - 1
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysDeviceServiceImpl.java

@@ -6,13 +6,18 @@ import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.nacos.common.utils.CollectionUtils;
+import com.xunmei.common.core.constant.CacheConstants;
+import com.xunmei.common.core.constant.Constants;
 import com.xunmei.common.core.constant.ErrorMsgConstants;
 import com.xunmei.common.core.constant.SecurityConstants;
+import com.xunmei.common.core.domain.mediator.domain.MediatorCategory;
+import com.xunmei.common.core.domain.mediator.vo.EquipmentOrgVo;
 import com.xunmei.common.core.domain.retrieval.vo.CoreMonitoringRetrievalTaskExcelVo;
 import com.xunmei.common.core.exception.ServiceException;
 import com.xunmei.common.core.utils.DateHelper;
@@ -22,12 +27,18 @@ import com.xunmei.system.api.RemoteMediatorService;
 import com.xunmei.system.api.RemoteProtectionService;
 import com.xunmei.system.api.domain.SysDevice;
 import com.xunmei.system.api.domain.SysDictData;
+import com.xunmei.system.api.domain.SysOperLog;
 import com.xunmei.system.api.domain.SysOrg;
+import com.xunmei.system.api.domain.north.NorthError;
 import com.xunmei.system.api.dto.ProtectionDTO;
 import com.xunmei.system.api.dto.SysDeviceInnerListDto;
+import com.xunmei.system.api.dto.device.DeviceDto;
 import com.xunmei.system.api.dto.device.DeviceReceivePageDto;
 import com.xunmei.system.api.dto.protection.ReceiveErrorDto;
 import com.xunmei.system.api.enums.DataType;
+import com.xunmei.system.api.enums.DeviceOnlineStatus;
+import com.xunmei.system.api.enums.DeviceStatus;
+import com.xunmei.system.api.enums.DeviceType;
 import com.xunmei.system.api.function.RemoteCallHandlerExecutor;
 import com.xunmei.system.api.util.LogUtils;
 import com.xunmei.system.api.vo.ProtectionVO;
@@ -39,6 +50,7 @@ import com.xunmei.system.vo.area.VideoVO;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 import com.xunmei.system.service.ISysOrgService;
@@ -70,6 +82,8 @@ public class SysDeviceServiceImpl extends ServiceImpl<SysDeviceMapper, SysDevice
     private RemoteProtectionService remoteProtectionService;
     @Autowired
     private RemoteMediatorService remoteMediatorService;
+    @Autowired
+    private RedisTemplate redisTemplate;
 
     @Override
     public TableDataInfo<SysDevice> selectPage(SysDevice sysDevice) {
@@ -350,7 +364,7 @@ public class SysDeviceServiceImpl extends ServiceImpl<SysDeviceMapper, SysDevice
 
     @Override
     public SysDevice findByHostCode(String code) {
-        return lambdaQuery().eq(SysDevice::getHostCode, code).last("limit 1").one();
+        return lambdaQuery().eq(SysDevice::getHostCode, code).last(Constants.LIMIT1).one();
     }
 
     @Override
@@ -379,4 +393,163 @@ public class SysDeviceServiceImpl extends ServiceImpl<SysDeviceMapper, SysDevice
         }
         return ReceiveErrorDto.success();
     }
+
+    @Override
+    public ReceiveErrorDto saveChannel(List<DeviceDto> deviceDtoList, String branchId, String msgId) {
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(deviceDtoList)) {
+            return ReceiveErrorDto.error("通道数据为空");
+        } else {
+            MediatorCategory category = remoteMediatorService.findCategoryByCodeAndParentId("18", -1L,SecurityConstants.INNER);
+
+            DeviceDto deviceDto;
+            List<NorthError> errors = new ArrayList<>();
+            List<SysDevice> list = new ArrayList<>();
+            String equipmentId = null;
+
+            deviceDto = deviceDtoList.get(0);
+            equipmentId = deviceDto.getEquipmentCode();
+            final SysOrg org = orgService.findByGuid(deviceDto.getOrganizationGuid());
+            String UK = UUID.randomUUID().toString();
+
+            if (org != null) {
+                //制作一个随时变化的key
+                Boolean flag = redisTemplate.hasKey(CacheConstants.CHANNEL_KEY);
+                if (!flag) {
+                    //判断是否存在这个key
+                    this.redisTemplate.opsForValue().set(CacheConstants.CHANNEL_KEY, UK);
+                } else {
+                    UK = (String) this.redisTemplate.opsForValue().get(CacheConstants.CHANNEL_KEY);
+                }
+                //根据变化的key,缓存数据,供定时任务使用
+                EquipmentOrgVo eov = new EquipmentOrgVo();
+                eov.setEquipmentCode(equipmentId);
+                eov.setOrgId(org.getId());
+                redisTemplate.opsForList().rightPush(UK, eov);
+                redisTemplate.expire(UK, 1, TimeUnit.HOURS);
+            }
+
+            for (int i = 0; i < deviceDtoList.size(); i++) {
+                deviceDto = deviceDtoList.get(i);
+                if (StringUtils.isEmpty(deviceDto.getEquipmentCode())) {
+                    NorthError error = new NorthError(msgId, branchId, "/data/channelList"
+                            , deviceDto, "equipmentCode 为空");
+                    errors.add(error);
+                    continue;
+                }
+
+                if (StringUtils.isEmpty(deviceDto.getOrganizationGuid())) {
+                    NorthError error = new NorthError(msgId, branchId, "/data/channelList"
+                            , deviceDto, "organizationGuid 为空");
+                    errors.add(error);
+                    continue;
+                }
+
+                if (StringUtils.isEmpty(deviceDto.getChannelCode())) {
+                    NorthError error = new NorthError(msgId, branchId, "/data/channelList"
+                            , deviceDto, "channelCode 为空");
+                    errors.add(error);
+                    continue;
+                }
+
+                if (StringUtils.isEmpty(deviceDto.getChannelName())) {
+                    NorthError error = new NorthError(msgId, branchId, "/data/channelList"
+                            , deviceDto, "channelName 为空");
+                    errors.add(error);
+                    continue;
+                }
+
+
+                if (org == null) {
+                    NorthError error = new NorthError(msgId, branchId, "/data/channelList"
+                            , deviceDto, "orgGUID:" + deviceDto.getOrganizationGuid() + " 不正确");
+                    errors.add(error);
+                    continue;
+                }
+
+
+                /**
+                 * 逻辑删除数据
+                 */
+                //修改成单独事务执行
+                //equipmentSyncService.deleteChannel(equipmentId,org.getId(),category);
+
+                /**
+                 * 先不做数据处理,先缓存所有待处理的数据,然后每5分钟处理一次缓存数据
+                 */
+
+
+                deviceDto.setOrg(org);
+                SysDevice host = this.findByCodeAndOrgId(deviceDto.getEquipmentCode(), org.getId());
+                if (host == null) {
+                    NorthError error = new NorthError(msgId, branchId, "/data/channelList"
+                            , deviceDto, "equipmentCode:" + deviceDto.getEquipmentCode() + "该主机code不存在");
+                    errors.add(error);
+                    continue;
+                }
+
+                SysDevice device = getChannelDevice(deviceDto, category);
+
+                list.add(device);
+
+            }
+            //this.northStatisticsSyncService.saveOrUpdateAllBaseCountByDataType(DataType.channelCount,list.size());
+            //deviceDao.saveOrUpdateBatch(list);
+            if (list.size() > 0) {
+                redisTemplate.opsForList().rightPushAll(UK + CacheConstants.AFTER_DATA, list);
+                redisTemplate.expire(UK + CacheConstants.AFTER_DATA, 1, TimeUnit.HOURS);
+            }
+            if (errors.size() > 0) {
+                remoteMediatorService.saveErrorData(errors,SecurityConstants.INNER);
+            }
+
+            return ReceiveErrorDto.success();
+        }
+    }
+
+    private SysDevice getChannelDevice(DeviceDto deviceDto, MediatorCategory category) {
+        SysDevice device = new SysDevice();
+        SysDevice old = this.findByHostCodeAndCodeAndOrgId(deviceDto.getEquipmentCode(), deviceDto.getChannelCode(), deviceDto.getOrg().getId());
+        if (old != null) {
+            device = old;
+        }
+        device.setDeviceName(deviceDto.getChannelName());
+        device.setDeviceType(String.valueOf(DeviceType.Camera.ordinal()));
+        device.setHostCode(deviceDto.getEquipmentCode());
+        device.setOrgId(deviceDto.getOrg().getId());
+        device.setOrgPath(deviceDto.getOrg().getPath());
+        device.setOrgName(deviceDto.getOrg().getName());
+        device.setStatus(DeviceStatus.ENABLE.ordinal());
+        device.setChannelId(deviceDto.getChannelCode());
+        device.setIp(deviceDto.getNetAddress());
+        device.setOnlineStatus(DeviceOnlineStatus.UNKNOW.ordinal());
+        Date date = new Date();
+        device.setUpdateTime(date);
+        device.setCreateTime(date);
+        if (category != null) {
+            device.setCategoryId(category.getId());
+        }
+        device.setSource(1);
+        device.setDelFlag("0");
+        return device;
+    }
+
+    @Override
+    public SysDevice findByHostCodeAndCodeAndOrgId(String equipmentCode, String channelCode, Long orgId) {
+        return lambdaQuery()
+                .eq(SysDevice::getHostCode, equipmentCode)
+                .eq(SysDevice::getChannelId, channelCode)
+                .eq(SysDevice::getOrgId, orgId)
+                .last(Constants.LIMIT1)
+                .one();
+    }
+
+    @Override
+    public SysDevice findByCodeAndOrgId(String code, Long orgId) {
+
+        return lambdaQuery()
+                .eq(SysDevice::getChannelId, code)
+                .eq(SysDevice::getOrgId, orgId)
+                .last(Constants.LIMIT1)
+                .one();
+    }
 }

+ 1 - 1
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysOrgServiceImpl.java

@@ -973,6 +973,6 @@ public class SysOrgServiceImpl extends ServiceImpl<SysOrgMapper, SysOrg> impleme
 
     @Override
     public SysOrg findByGuid(String guid) {
-        return lambdaQuery().eq(SysOrg::getGuid, guid).last("limit 1").one();
+        return lambdaQuery().eq(SysOrg::getGuid, guid).last(Constants.LIMIT1).one();
     }
 }