浏览代码

北向布撤防接口,传感器同步接口 代码提交

jingyuanchao 1 年之前
父节点
当前提交
f85fab8ff3
共有 36 个文件被更改,包括 1273 次插入106 次删除
  1. 1 1
      pom.xml
  2. 8 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/RemoteDeviceService.java
  3. 18 50
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/domain/SysDevice.java
  4. 1 1
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/dto/DataPageDto.java
  5. 22 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/dto/SensorDto.java
  6. 30 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/dto/SensorStatusDto.java
  7. 5 5
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/dto/protection/DefenceAreaDto.java
  8. 1 1
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/dto/protection/DefenceareaPageDto.java
  9. 25 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/enums/DeviceAlarmStatus.java
  10. 11 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/factory/RemoteDeviceFallbackFactory.java
  11. 1 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/vo/SysOrgVO.java
  12. 89 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/protect/domain/IotChannel.java
  13. 97 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/protect/domain/IotDefenceAre.java
  14. 85 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/protect/domain/IotSubSystem.java
  15. 4 4
      soc-common/soc-common-redis/src/main/java/com/xunmei/common/redis/utils/RedisUtils.java
  16. 20 19
      soc-modules/soc-modules-gen/src/main/java/com/xunmei/gen/util/CodeGenerators.java
  17. 22 1
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/controller/DataController.java
  18. 53 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/controller/ProtectionController.java
  19. 16 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/mapper/IotChannelMapper.java
  20. 16 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/mapper/IotDefenceAreMapper.java
  21. 18 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/mapper/IotSubSystemMapper.java
  22. 2 2
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/EquipmentSyncService.java
  23. 16 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/IIotChannelService.java
  24. 19 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/IIotDefenceAreService.java
  25. 23 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/IIotSubSystemService.java
  26. 20 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/IotChannelServiceImpl.java
  27. 27 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/IotDefenceAreServiceImpl.java
  28. 373 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/IotSubSystemServiceImpl.java
  29. 1 1
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/util/CheckDataUtil.java
  30. 5 0
      soc-modules/soc-modules-mediator/src/main/resources/mapper/IotChannelMapper.xml
  31. 5 0
      soc-modules/soc-modules-mediator/src/main/resources/mapper/IotDefenceAreMapper.xml
  32. 8 0
      soc-modules/soc-modules-mediator/src/main/resources/mapper/IotSubSystemMapper.xml
  33. 10 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysDeviceController.java
  34. 4 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/ISysDeviceService.java
  35. 216 21
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysDeviceServiceImpl.java
  36. 1 0
      soc-modules/soc-modules-system/src/main/resources/mapper/system/SysOrgMapper.xml

+ 1 - 1
pom.xml

@@ -39,7 +39,7 @@
         <commons.lang3.version>3.12.0</commons.lang3.version>
         <okhttp.version>3.10.0</okhttp.version>
         <lombok.version>1.18.26</lombok.version>
-        <generator.version>3.2.0</generator.version>
+        <generator.version>3.4.1</generator.version>
         <freemarker.version>2.7.2</freemarker.version>
         <velocity.version>2.3</velocity.version>
         <knife4j.version>3.0.3</knife4j.version>

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

@@ -13,6 +13,7 @@ import com.xunmei.system.api.factory.RemoteDeviceFallbackFactory;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -37,4 +38,11 @@ public interface RemoteDeviceService {
 
     @PostMapping("/device/north/saveChannel")
     ReceiveErrorDto saveChannel(@RequestBody Map<String, Object> dataMap, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+    @GetMapping("/device/findAlarmHostDevice/{categoryId}")
+    List<SysDevice> findAlarmHostDevice(@PathVariable("categoryId")Long categoryId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+    @PostMapping("/device/north/saveDirectHost")
+    ReceiveErrorDto saveDirectHost(@RequestBody HashMap<String, Object> dataMap, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
 }

+ 18 - 50
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/domain/SysDevice.java

@@ -28,91 +28,66 @@ import java.util.Date;
 public class SysDevice extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
-    /**
-     * 设备id
-     */
     @JsonSerialize(using = ToStringSerializer.class)
     private Long id;
 
-    /**
-     * 机构id
-     */
     @ApiModelProperty(value = "机构id")
     @JsonSerialize(using = ToStringSerializer.class)
     private Long orgId;
 
-    /**
-     * 机构名字
-     */
     @ApiModelProperty(value = "机构名字")
     private String orgName;
 
-    /**
-     * 设备名称
-     */
+    @ApiModelProperty(value = "orgPath")
+    private String orgPath;
+
+    @ApiModelProperty(value = "设备编号")
+    private String deviceCode;
+
     @ApiModelProperty(value = "设备名称")
     private String deviceName;
 
-    /**
-     * 资产类别
-     */
     @ApiModelProperty(value = "资产类别")
     private String assetType;
 
-    /**
-     * 设备分类
-     */
     @ApiModelProperty(value = "设备分类")
     private String deviceType;
 
-    /**
-     * 设备品牌
-     */
     @ApiModelProperty(value = "设备品牌")
     private String deviceBrand;
 
-    /**
-     * 验收日期
-     */
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     @ApiModelProperty(value = "有效期至")
     private Date checkTime;
 
-    /**
-     * 保修期限默认年
-     */
     @ApiModelProperty(value = "保修期限默认年")
-
-
     private String maintenanceTerm;
 
-    /**
-     * 0存在2删除
-     */
+    @ApiModelProperty(value = "0存在2删除")
     private String delFlag;
 
-    /**
-     * 主机id
-     */
     @ApiModelProperty(value = "主机id")
     @JsonSerialize(using = ToStringSerializer.class)
     private Long hostId;
 
-    /**
-     * 通道号
-     */
     @ApiModelProperty(value = "通道号")
     private Long channel;
 
     @ApiModelProperty(value = "是否高清")
     private String definition;
 
+    @ApiModelProperty(value = "来源,0或null:手动添加,1:主机平台,")
+    private Integer source;
+
     @ApiModelProperty(value = "设备分类")
     private Long categoryId;
 
     @ApiModelProperty(value = "主机code")
     private String hostCode;
 
+    @ApiModelProperty(value = "通道code")
+    private String channelCode;
+
     /**
      * @see com.xunmei.system.api.enums.DeviceType
      */
@@ -122,23 +97,16 @@ public class SysDevice extends BaseEntity {
     @ApiModelProperty(value = "设备ip")
     private String ip;
 
-    @ApiModelProperty(value = "orgPath")
-    private String orgPath;
-
     /**
      * @see com.xunmei.system.api.enums.DeviceOnlineStatus
      */
     @ApiModelProperty(value = "在线状态")
-    private Integer onlineStatus;
+    private Integer online;
 
-    private Integer source;
-
-    /**
-     * @see com.xunmei.system.api.enums.DeviceStatus
-     */
-    @ApiModelProperty(value = "在线状态")
-    private Integer status;
+    @ApiModelProperty(value = "是否报警,0:未报警,1:报警中")
+    private Integer isAlarm;
 
-    private String ChannelId;
+    @ApiModelProperty(value = "告警信息处理状态,0未处理,1:已处理")
+    private Integer doStatus;
 
 }

+ 1 - 1
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/domain/dto/DataPageDto.java → soc-api/soc-api-system/src/main/java/com/xunmei/system/api/dto/DataPageDto.java

@@ -1,4 +1,4 @@
-package com.xunmei.mediator.domain.dto;
+package com.xunmei.system.api.dto;
 
 import lombok.AllArgsConstructor;
 import lombok.Builder;

+ 22 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/dto/SensorDto.java

@@ -0,0 +1,22 @@
+package com.xunmei.system.api.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class SensorDto {
+    @ApiModelProperty(value = "机构guid")
+    private String orgCode;
+
+    @ApiModelProperty(value = "视频物联网检测主机唯一标识")
+    private String hostCode;
+
+    @ApiModelProperty(value = "设备类型名称?")
+    private String deviceName;
+
+    @ApiModelProperty(value = "设备code")
+    private String deviceCode;
+
+    @ApiModelProperty(value = "设备类型编码: 4183-温湿度, 4181-红外, 4182-烟感, 4184-水浸")
+    private String deviceType;
+}

+ 30 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/dto/SensorStatusDto.java

@@ -0,0 +1,30 @@
+package com.xunmei.system.api.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class SensorStatusDto {
+    @ApiModelProperty(value = "机构guid")
+    private String orgCode;
+
+    @ApiModelProperty(value = "视频物联网检测主机唯一标识")
+    private String hostCode;
+
+    @ApiModelProperty(value = "设备名称")
+    private String deviceName;
+
+    @ApiModelProperty(value = "设备code")
+    private String deviceCode;
+
+    @ApiModelProperty(value = "设备类型编码: 408")
+    private String deviceType;
+
+    @ApiModelProperty(value = "数据更新时间")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "属性信息数组")
+    private String infos;
+}

+ 5 - 5
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/dto/protection/DefenceareaDto.java → soc-api/soc-api-system/src/main/java/com/xunmei/system/api/dto/protection/DefenceAreaDto.java

@@ -18,7 +18,7 @@ import java.util.List;
 @NoArgsConstructor
 @Builder
 @ApiModel("报警主机子系统及防区信息")
-public class DefenceareaDto {
+public class DefenceAreaDto {
 
     @ApiModelProperty("编号")
     private Long id;
@@ -27,11 +27,11 @@ public class DefenceareaDto {
     @Length(max = 64, message = "名称长度不能超过64")
     private String organizationGuid;
 
-    @ApiModelProperty("防区的唯一标识")
-    private String defenceareaCode;
+    @ApiModelProperty("子系统的唯一标识")
+    private String defenceAreaCode;
 
-    @ApiModelProperty("防区的名称")
-    private String defenceareaName;
+    @ApiModelProperty("子系统的名称")
+    private String defenceAreaName;
 
     @ApiModelProperty("更新时间")
     @Length(max = 64, message = "更新时间长度不能超过64")

+ 1 - 1
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/dto/protection/DefenceareaPageDto.java

@@ -16,5 +16,5 @@ public class DefenceareaPageDto {
     private Long currPage;
     private String packageGuid;
     private String buildTime;
-    private List<DefenceareaDto> data;
+    private List<DefenceAreaDto> data;
 }

+ 25 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/enums/DeviceAlarmStatus.java

@@ -0,0 +1,25 @@
+package com.xunmei.system.api.enums;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.xunmei.system.api.enums.serializer.EnumSerializer;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+/**
+ * 设备报警状态
+ */
+@JsonSerialize(using = EnumSerializer.class)
+@AllArgsConstructor
+@Getter
+public enum DeviceAlarmStatus {
+    NORMAL(0,"正常"),
+    ALARM(1,"告警"),
+
+    ;
+
+
+    private final Integer status;
+    private final String text;
+
+}

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

@@ -12,6 +12,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.cloud.openfeign.FallbackFactory;
 import org.springframework.stereotype.Component;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -51,6 +52,16 @@ public class RemoteDeviceFallbackFactory implements FallbackFactory<RemoteDevice
             public ReceiveErrorDto saveChannel(Map<String, Object> dataMap, String source) {
                 return null;
             }
+
+            @Override
+            public List<SysDevice> findAlarmHostDevice(Long categoryId, String source) {
+                return null;
+            }
+
+            @Override
+            public ReceiveErrorDto saveDirectHost(HashMap<String, Object> dataMap, String source) {
+                return null;
+            }
         };
 
     }

+ 1 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/vo/SysOrgVO.java

@@ -32,6 +32,7 @@ public class SysOrgVO {
     private Integer type;
     private String shortName;
     private String treeShowPath;
+    private String guid;
     private Integer sort;
     @JsonSerialize(using = ToStringSerializer.class)
     private Long treeShowParentId;

+ 89 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/protect/domain/IotChannel.java

@@ -0,0 +1,89 @@
+package com.xunmei.common.core.domain.protect.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author oygj
+ * @since 2024-01-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("iot_channel")
+@ApiModel(value="IotChannel对象", description="")
+public class IotChannel implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId("id")
+    private Long id;
+
+    @ApiModelProperty(value = "机构ID")
+    @TableField("org_id")
+    private Long orgId;
+
+    @ApiModelProperty(value = "机构名称")
+    @TableField("org_name")
+    private String orgName;
+
+    @ApiModelProperty(value = "机构路径")
+    @TableField("org_path")
+    private String orgPath;
+
+    @ApiModelProperty(value = "监控主机(硬盘录像机)的编码")
+    @TableField("host_code")
+    private String hostCode;
+
+    @ApiModelProperty(value = "设备编码(自己,摄像机的编码)")
+    @TableField("device_code")
+    private String deviceCode;
+
+    @ApiModelProperty(value = "通道编号")
+    @TableField("channel_code")
+    private String channelCode;
+
+    @ApiModelProperty(value = "通道地址")
+    @TableField("channel_addr")
+    private String channelAddr;
+
+    @ApiModelProperty(value = "通道名称")
+    @TableField("channel_name")
+    private String channelName;
+
+    @ApiModelProperty(value = "1:使用中,0:未使用")
+    @TableField("using")
+    private Integer using;
+
+    @ApiModelProperty(value = "是否删除")
+    @TableField("deleted")
+    private Integer deleted;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField("create_by")
+    private String createBy;
+
+    @ApiModelProperty(value = "更新人")
+    @TableField("update_by")
+    private String updateBy;
+
+
+}

+ 97 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/protect/domain/IotDefenceAre.java

@@ -0,0 +1,97 @@
+package com.xunmei.common.core.domain.protect.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author oygj
+ * @since 2024-01-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("iot_defence_are")
+@ApiModel(value="IotDefenceAre对象", description="")
+public class IotDefenceAre implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId("id")
+    private Long id;
+
+    @ApiModelProperty(value = "机构ID")
+    @TableField("org_id")
+    private Long orgId;
+
+    @ApiModelProperty(value = "机构名称")
+    @TableField("org_name")
+    private String orgName;
+
+    @ApiModelProperty(value = "机构路径")
+    @TableField("org_path")
+    private String orgPath;
+
+    @ApiModelProperty(value = "报警主机唯一标识")
+    @TableField("alarm_host_code")
+    private String alarmHostCode;
+
+    @ApiModelProperty(value = "子系统编号")
+    @TableField("sub_system_code")
+    private String subSystemCode;
+
+    @ApiModelProperty(value = "防区名称")
+    @TableField("defence_area_name")
+    private String defenceAreaName;
+
+    @ApiModelProperty(value = "专感器类型枚举")
+    @TableField("sensor_type")
+    private String sensorType;
+
+    @ApiModelProperty(value = "专感器类型名称")
+    @TableField("sensor_type_name")
+    private String sensorTypeName;
+
+    @ApiModelProperty(value = "防区序号(在子系统的编号)")
+    @TableField("defence_area_index")
+    private Integer defenceAreaIndex;
+
+    @ApiModelProperty(value = "防区传感器状态值")
+    @TableField("status_value")
+    private String statusValue;
+
+    @ApiModelProperty(value = "防区传感器状态值名称")
+    @TableField("status_text")
+    private String statusText;
+
+    @ApiModelProperty(value = "是否删除")
+    @TableField("deleted")
+    private Integer deleted;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField("create_by")
+    private String createBy;
+
+    @ApiModelProperty(value = "更新人")
+    @TableField("update_by")
+    private String updateBy;
+
+
+}

+ 85 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/protect/domain/IotSubSystem.java

@@ -0,0 +1,85 @@
+package com.xunmei.common.core.domain.protect.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author oygj
+ * @since 2024-01-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("iot_sub_system")
+@ApiModel(value="IotSubSystem对象", description="")
+public class IotSubSystem implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId("id")
+    private Long id;
+
+    @ApiModelProperty(value = "机构ID")
+    @TableField("org_id")
+    private Long orgId;
+
+    @ApiModelProperty(value = "机构名称")
+    @TableField("org_name")
+    private String orgName;
+
+    @ApiModelProperty(value = "机构路径")
+    @TableField("org_path")
+    private String orgPath;
+
+    @ApiModelProperty(value = "主机编码")
+    @TableField("host_code")
+    private String hostCode;
+
+    @ApiModelProperty(value = "子系统名称")
+    @TableField("sub_system_name")
+    private String subSystemName;
+
+    @ApiModelProperty(value = "子系统唯一标识")
+    @TableField("sub_system_code")
+    private String subSystemCode;
+
+    @ApiModelProperty(value = "报警主机唯一标识")
+    @TableField("alarm_host_code")
+    private String alarmHostCode;
+
+    @ApiModelProperty(value = "子系统状态:0:撤防,1:布防, 2:未知")
+    @TableField("status")
+    private Integer status;
+
+    @ApiModelProperty(value = "是否删除")
+    @TableField("deleted")
+    private Integer deleted;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField("create_by")
+    private String createBy;
+
+    @ApiModelProperty(value = "更新人")
+    @TableField("update_by")
+    private String updateBy;
+
+
+}

+ 4 - 4
soc-common/soc-common-redis/src/main/java/com/xunmei/common/redis/utils/RedisUtils.java

@@ -1,16 +1,16 @@
 package com.xunmei.common.redis.utils;
 
+import com.alibaba.fastjson2.JSON;
 import com.xunmei.common.core.utils.SpringUtils;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.redisson.api.*;
+import org.springframework.data.redis.core.RedisTemplate;
 
 import java.text.MessageFormat;
 import java.time.Duration;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;

+ 20 - 19
soc-modules/soc-modules-gen/src/main/java/com/xunmei/gen/util/CodeGenerators.java

@@ -1,5 +1,4 @@
-/*
-package com.xunmei.gen.util;
+package com.isp.common.util;
 
 
 import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
@@ -15,14 +14,12 @@ import java.util.Scanner;
 
 public class CodeGenerators {
 
-    */
-/**
+    /**
      * 读取控制填的内容
      * @param tip
      * @return
-     *//*
-
-    public static String scanner(String tip) {
+     */
+  /*  public static String scanner(String tip) {
         Scanner scanner = new Scanner(System.in);
         System.out.println("请输入" + tip + ":");
         if (scanner.hasNext()) {
@@ -32,7 +29,10 @@ public class CodeGenerators {
             }
         }
         throw new MybatisPlusException("请输入正确的" + tip + "!");
-    }
+    }*/
+
+    public static final String moduleName="com.xunmei.mediator";
+    public static final String tableNames="iot_channel,iot_defence_are,iot_sub_system";
 
     public static void main(String[] args) {
         // 代码生成器
@@ -40,10 +40,10 @@ public class CodeGenerators {
         // 全局配置
         GlobalConfig gc = new GlobalConfig();
         // System.getProperty("user.dir");
-        String projectPath = "/Users/jingyuanchao/Downloads";
+        String projectPath = "D:\\test";
         //生成文件输出目录
         gc.setOutputDir(projectPath + "/java");
-        gc.setAuthor("jingyuanchao");
+        gc.setAuthor("oygj");
         //生成代码后,是否打开文件夹
         gc.setOpen(true);
         // 实体属性 Swagger2 注解
@@ -51,9 +51,12 @@ public class CodeGenerators {
         mpg.setGlobalConfig(gc);
         // 数据源配置
         DataSourceConfig dsc = new DataSourceConfig();
-        dsc.setUrl("jdbc:mysql://10.87.10.54:3306/soc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8");
+       /* dsc.setUrl("jdbc:mysql://39.103.229.41:3306/isp_ah?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&characterSetResults=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true");
+        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
+        dsc.setUsername("root");
+        dsc.setPassword("jinJie@2021");*/
+        dsc.setUrl("jdbc:mysql://10.87.21.224:3306/soc?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&characterSetResults=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true");
         dsc.setDriverName("com.mysql.cj.jdbc.Driver");
-        //com.microsoft.sqlserver.jdbc.SQLServerDriver
         dsc.setUsername("root");
         dsc.setPassword("XM_zm2019");
         mpg.setDataSource(dsc);
@@ -61,7 +64,7 @@ public class CodeGenerators {
 
         // 包配置
         PackageConfig pc = new PackageConfig();
-        pc.setModuleName(scanner("模块名"));
+        pc.setModuleName(moduleName);
         pc.setEntity("domain");
         pc.setMapper("mapper");
         pc.setService("service");
@@ -98,18 +101,17 @@ public class CodeGenerators {
         // 实体字段生成策略
         strategy.setColumnNaming(NamingStrategy.underline_to_camel);
         // 需要生成的表
-//        strategy.setInclude(scanner("表名").split(","));
-        strategy.setInclude("core_safety_responsibility_task,core_safety_responsibility_book,core_safety_responsibility_type".split(","));
+        strategy.setInclude(tableNames.split(","));
         // 使用lombook
         strategy.setEntityLombokModel(true);
         strategy.setRestControllerStyle(true);
         // 生成注解
         strategy.setEntityTableFieldAnnotationEnable(true);
         // 自动生成实体类继承基类(基类必须已存在)
-        //strategy.setTablePrefix("t_","core_");
-        strategy.setSuperEntityClass("com.xunmei.common.core.web.domain.BaseEntity");
+        strategy.setTablePrefix("t_","t_app_");
+        //strategy.setSuperEntityClass("com.isp.common.jpa.BaseEntity");
         // 写于父类中的公共字段
-        strategy.setSuperEntityColumns("create_by","create_time", "update_by", "update_time");
+        //strategy.setSuperEntityColumns("create_time","update_time", "modified_id", "modified_name");
         mpg.setStrategy(strategy);
         //mpg.setTemplateEngine(new FreemarkerTemplateEngine());
         mpg.execute();
@@ -118,4 +120,3 @@ public class CodeGenerators {
 
 
 }
-*/

+ 22 - 1
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/controller/DataController.java

@@ -1,10 +1,11 @@
 package com.xunmei.mediator.api.controller;
 
-import cn.hutool.core.map.MapUtil;
 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.DataPageDto;
+import com.xunmei.system.api.dto.SensorDto;
 import com.xunmei.system.api.dto.device.DeviceDto;
 import com.xunmei.system.api.dto.device.DeviceReceivePageDto;
 import com.xunmei.system.api.dto.protection.ReceiveErrorDto;
@@ -116,4 +117,24 @@ public class DataController {
 
     }
 
+    @ApiOperation(value = "传感器通用设备信息同步",notes = "直连主机传感器")
+    @PostMapping({"/api/{branchId}/data/sensorCommonList"})
+    public ReceiveErrorDto sensor(@PathVariable String branchId, String msgId, @RequestBody DataPageDto<SensorDto> sensors) {
+        LogUtils.DIRECT_HOST_SENSOR.info("【北向接口-{}】【branchId:{}】【msgId:{}】【接收参数:{}】", "接受传感器通用设备信息同步:/api/data/sensorCommonList", branchId, msgId, JSON.toJSONString(sensors));
+        ReceiveErrorDto errorDto = ReceiveErrorDto.success();
+        try {
+            final HashMap<String, Object> dataMap = new HashMap<>();
+            dataMap.put("sensors", sensors);
+            dataMap.put("branchId", branchId);
+            dataMap.put("msgId", msgId);
+            errorDto = this.deviceService.saveDirectHost(dataMap,SecurityConstants.INNER);
+        } catch (Exception e) {
+            e.printStackTrace();
+            LogUtils.DIRECT_HOST_SENSOR.error("保存失败,{}", e);
+            return ReceiveErrorDto.error("保存失败:"+ e);
+        }
+        LogUtils.DIRECT_HOST_SENSOR.info("【北向接口-{}】【branchId:{}】【msgId:{}】【返回参数:{}】", "接受传感器通用设备信息同步:/api/data/sensorCommonList", branchId, msgId, JSON.toJSONString(errorDto));
+        return errorDto;
+    }
+
 }

+ 53 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/controller/ProtectionController.java

@@ -0,0 +1,53 @@
+package com.xunmei.mediator.api.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.xunmei.mediator.api.service.IIotDefenceAreService;
+import com.xunmei.mediator.api.service.IIotSubSystemService;
+import com.xunmei.mediator.api.service.RabbitMsgIdService;
+import com.xunmei.system.api.dto.protection.DefenceareaPageDto;
+import com.xunmei.system.api.dto.protection.ReceiveErrorDto;
+import com.xunmei.system.api.util.LogUtils;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * @author jingyuanchao
+ * @date 2024/1/29 11:17
+ */
+@RestController
+public class ProtectionController {
+
+    @Resource
+    private RabbitMsgIdService rabbitMsgIdService;
+    @Resource
+    private IIotSubSystemService subSystemService;
+
+    @ApiOperation("报警主机子系统及防区信息同步")
+    @PostMapping({"/api/{branchId}/data/defenceareaList"})
+    public ReceiveErrorDto defenceareaList(@PathVariable String branchId, String msgId, @RequestBody DefenceareaPageDto request) {
+        rabbitMsgIdService.sendMsgId(msgId, "/data/defenceareaList", "报警主机子系统及防区信息同步");
+        LogUtils.BASE_INFO_DEFENCEAREA.info("【北向接口-{}】【branchId:{}】【msgId:{}】【接收参数:{}】", "报警主机子系统及防区信息同步:/api/data/defenceareaList", branchId, msgId, JSONArray.toJSONString(request));
+        ReceiveErrorDto errorDto = ReceiveErrorDto.success();
+        try {
+            try {
+                errorDto = this.subSystemService.defenceAreaList(request, branchId, msgId);
+            } catch (Exception e) {
+                e.printStackTrace();
+                LogUtils.BASE_INFO_DEFENCEAREA.error("保存失败,{}", e);
+            }
+            LogUtils.BASE_INFO_DEFENCEAREA.info("【北向接口-{}】【branchId:{}】【msgId:{}】【返回参数:{}】", "报警主机子系统及防区信息同步:/api/data/defenceareaList", branchId, msgId, JSON.toJSONString(errorDto));
+            return errorDto;
+        } catch (Exception e) {
+            e.printStackTrace();
+            LogUtils.BASE_INFO_DEFENCEAREA.info("【北向接口-{}】【branchId:{}】【msgId:{}】【异常原因:{}】", "报警主机子系统及防区信息同步:/api/data/defenceareaList", branchId, msgId, e.getMessage());
+            return ReceiveErrorDto.error("数据处理异常");
+        }
+    }
+}

+ 16 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/mapper/IotChannelMapper.java

@@ -0,0 +1,16 @@
+package com.xunmei.mediator.api.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xunmei.common.core.domain.protect.domain.IotChannel;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author oygj
+ * @since 2024-01-29
+ */
+public interface IotChannelMapper extends BaseMapper<IotChannel> {
+
+}

+ 16 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/mapper/IotDefenceAreMapper.java

@@ -0,0 +1,16 @@
+package com.xunmei.mediator.api.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xunmei.common.core.domain.protect.domain.IotDefenceAre;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author oygj
+ * @since 2024-01-29
+ */
+public interface IotDefenceAreMapper extends BaseMapper<IotDefenceAre> {
+
+}

+ 18 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/mapper/IotSubSystemMapper.java

@@ -0,0 +1,18 @@
+package com.xunmei.mediator.api.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xunmei.common.core.domain.protect.domain.IotSubSystem;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author oygj
+ * @since 2024-01-29
+ */
+public interface IotSubSystemMapper extends BaseMapper<IotSubSystem> {
+
+    void updateAllDelete();
+
+}

+ 2 - 2
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/EquipmentSyncService.java

@@ -334,7 +334,7 @@ public class EquipmentSyncService {
         //device.setIsComplete(1);
         device.setHostCode(datum.getEquipmentCode());
         //设置设备默认状态为未知
-        device.setOnlineStatus(DeviceOnlineStatus.UNKNOW.ordinal());
+        device.setOnline(DeviceOnlineStatus.UNKNOW.ordinal());
         String categoryCode = null;
         switch (datum.getEquipmentType()) {
             case 1:
@@ -412,7 +412,7 @@ public class EquipmentSyncService {
         Date date = new Date();
         device.setCreateTime(date);
         device.setUpdateTime(date);
-        device.setStatus(DeviceStatus.ENABLE.ordinal());
+        device.setDelFlag("0");
         map.put("device", device);
         return map;
     }

+ 16 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/IIotChannelService.java

@@ -0,0 +1,16 @@
+package com.xunmei.mediator.api.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xunmei.common.core.domain.protect.domain.IotChannel;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author oygj
+ * @since 2024-01-29
+ */
+public interface IIotChannelService extends IService<IotChannel> {
+
+}

+ 19 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/IIotDefenceAreService.java

@@ -0,0 +1,19 @@
+package com.xunmei.mediator.api.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xunmei.common.core.domain.protect.domain.IotDefenceAre;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author oygj
+ * @since 2024-01-29
+ */
+public interface IIotDefenceAreService extends IService<IotDefenceAre> {
+
+    List<IotDefenceAre> findBySubSystemCode(String defenceAreaCode);
+}

+ 23 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/IIotSubSystemService.java

@@ -0,0 +1,23 @@
+package com.xunmei.mediator.api.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xunmei.common.core.domain.protect.domain.IotSubSystem;
+import com.xunmei.system.api.dto.protection.DefenceareaPageDto;
+import com.xunmei.system.api.dto.protection.ReceiveErrorDto;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author oygj
+ * @since 2024-01-29
+ */
+public interface IIotSubSystemService extends IService<IotSubSystem> {
+
+    ReceiveErrorDto defenceAreaList(DefenceareaPageDto request, String branchId, String msgId);
+
+    IotSubSystem findByCodeAndOrgId(String defenceAreaCode, Long orgId);
+
+
+}

+ 20 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/IotChannelServiceImpl.java

@@ -0,0 +1,20 @@
+package com.xunmei.mediator.api.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.domain.protect.domain.IotChannel;
+import com.xunmei.mediator.api.mapper.IotChannelMapper;
+import com.xunmei.mediator.api.service.IIotChannelService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author oygj
+ * @since 2024-01-29
+ */
+@Service
+public class IotChannelServiceImpl extends ServiceImpl<IotChannelMapper, IotChannel> implements IIotChannelService {
+
+}

+ 27 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/IotDefenceAreServiceImpl.java

@@ -0,0 +1,27 @@
+package com.xunmei.mediator.api.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.domain.protect.domain.IotDefenceAre;
+import com.xunmei.mediator.api.mapper.IotDefenceAreMapper;
+import com.xunmei.mediator.api.service.IIotDefenceAreService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author oygj
+ * @since 2024-01-29
+ */
+@Service
+public class IotDefenceAreServiceImpl extends ServiceImpl<IotDefenceAreMapper, IotDefenceAre> implements IIotDefenceAreService {
+
+
+    @Override
+    public List<IotDefenceAre> findBySubSystemCode(String defenceAreaCode) {
+        return lambdaQuery().eq(IotDefenceAre::getSubSystemCode,defenceAreaCode).eq(IotDefenceAre::getDeleted,0).list();
+    }
+}

+ 373 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/IotSubSystemServiceImpl.java

@@ -0,0 +1,373 @@
+package com.xunmei.mediator.api.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.constant.CacheConstants;
+import com.xunmei.common.core.constant.Constants;
+import com.xunmei.common.core.constant.SecurityConstants;
+import com.xunmei.common.core.domain.mediator.domain.MediatorCategory;
+import com.xunmei.common.core.domain.protect.domain.IotDefenceAre;
+import com.xunmei.common.core.domain.protect.domain.IotSubSystem;
+import com.xunmei.common.core.util.BeanHelper;
+import com.xunmei.common.core.utils.DateUtils;
+import com.xunmei.common.core.utils.IDHelper;
+import com.xunmei.common.redis.utils.RedisUtils;
+import com.xunmei.mediator.api.mapper.IotSubSystemMapper;
+import com.xunmei.mediator.api.service.*;
+import com.xunmei.system.api.RemoteDeviceService;
+import com.xunmei.system.api.RemoteOrgService;
+import com.xunmei.system.api.domain.SysDevice;
+import com.xunmei.system.api.domain.north.NorthError;
+import com.xunmei.system.api.dto.protection.DefenceAreaDto;
+import com.xunmei.system.api.dto.protection.DefenceareaPageDto;
+import com.xunmei.system.api.dto.protection.ReceiveErrorDto;
+import com.xunmei.system.api.dto.protection.SensorDto;
+import com.xunmei.system.api.enums.DataType;
+import com.xunmei.system.api.util.LogUtils;
+import com.xunmei.system.api.vo.SysOrgVO;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+import sun.management.Sensor;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author oygj
+ * @since 2024-01-29
+ */
+@Service
+public class IotSubSystemServiceImpl extends ServiceImpl<IotSubSystemMapper, IotSubSystem> implements IIotSubSystemService {
+    @Resource
+    RemoteOrgService orgService;
+    @Resource
+    RedisTemplate redisTemplate;
+    @Resource
+    NorthStatisticsSyncService northStatisticsSyncService;
+    @Resource
+    IMediatorCategoryService categoryService;
+    @Resource
+    RemoteDeviceService deviceService;
+    @Resource
+    private IIotDefenceAreService defenceAreService;
+    @Resource
+    private NorthErrorService northErrorService;
+    @Override
+    public IotSubSystem findByCodeAndOrgId(String defenceAreaCode, Long orgId) {
+        return lambdaQuery()
+                .eq(IotSubSystem::getSubSystemCode, defenceAreaCode)
+                .eq(IotSubSystem::getOrgId, orgId)
+                .last(Constants.LIMIT1)
+                .one();
+
+    }
+
+
+    @Override
+    public ReceiveErrorDto defenceAreaList(DefenceareaPageDto request, String branchId, String msgId) {
+        String packageGuid = request.getPackageGuid();
+        if (StringUtils.isEmpty(packageGuid)) {
+            return ReceiveErrorDto.error("packageGuid参数非法");
+        }
+        Long totalPage = request.getTotalPage();
+        if (totalPage == null) {
+            return ReceiveErrorDto.error("totalPage参数非法");
+        }
+
+        if (CollectionUtils.isEmpty(request.getData())) {
+            return ReceiveErrorDto.error("报警主机子系统及防区信息为空");
+        }
+        boolean completed = this.isCompleted(request);
+        LogUtils.BASE_INFO_DEFENCEAREA.info("判断是否获取全部报警主机子系统及防区信息分页数据:{}", completed);
+        if (completed) {
+            LogUtils.BASE_INFO_DEFENCEAREA.info("获取全部的报警主机子系统及防区信息,开始数据处理界面!");
+            List<DefenceAreaDto> defenceareaList = new ArrayList<>();
+            for (int i = 1; i <= totalPage; i++) {
+                String ak = packageGuid + "_" + i;
+                Object obj = this.redisTemplate.opsForValue().get(ak);
+                List<DefenceAreaDto> defenceareaDtos = JSON.parseArray((String) obj, DefenceAreaDto.class);
+                if (defenceareaDtos != null) {
+                    defenceareaList.addAll(defenceareaDtos);
+                }
+            }
+            for (int i = 1; i <= totalPage; i++) {
+                String ak = packageGuid + "_" + i;
+                this.redisTemplate.delete(ak);
+            }
+            //protectionDao.updateAllDelete();
+            this.northStatisticsSyncService.saveOrUpdateBaseCountByDataType(DataType.protectionCount.getIndex(), defenceareaList.size(), false);
+            new Thread(() -> {
+                this.saveAndUpdate(defenceareaList, branchId, msgId);
+            }).start();
+
+        }
+        return ReceiveErrorDto.success();
+    }
+
+    public ReceiveErrorDto saveAndUpdate(List<DefenceAreaDto> defenceareaList, String branchId, String msgId) {
+        if (CollectionUtils.isEmpty(defenceareaList)) {
+            return ReceiveErrorDto.error("报警主机子系统及防区信息为空");
+        }
+        List<NorthError> errors = new ArrayList<>();
+        List<IotSubSystem> protectionList = new ArrayList<>();
+        List<IotDefenceAre> sensorList = new ArrayList<>();
+        List<IotSubSystem> deviceList = new ArrayList<>();
+        //获取机构列表
+        final List<SysOrgVO> orgList = RedisUtils.getCacheList(CacheConstants.ORG_CACHE_LIST_KEY);
+        //获取category列表
+        List<MediatorCategory> categorys = categoryService.list();
+        //查询报警主机主机设备列表
+        List<SysDevice> devices = deviceService.findAlarmHostDevice(3713671920926720L, SecurityConstants.INNER);
+        checkParam(defenceareaList, branchId, msgId, errors, orgList, categorys, devices, deviceList, protectionList,sensorList);
+        return ReceiveErrorDto.success();
+    }
+
+    private void checkParam(List<DefenceAreaDto> defenceareaList, String branchId, String msgId, List<NorthError> errors, List<SysOrgVO> orgList, List<MediatorCategory> categorys, List<SysDevice> devices, List<IotSubSystem> deviceList, List<IotSubSystem> protectionList, List<IotDefenceAre> sensorList) {
+        NorthError error = null;
+        for (DefenceAreaDto dto : defenceareaList) {
+            SysOrgVO org = null;
+            if (StringUtils.isEmpty(dto.getOrganizationGuid())) {
+                error = new NorthError(msgId, branchId, "/api/data/defenceareaList"
+                        , dto, "参数非法:未传organizationGuid");
+                errors.add(error);
+                continue;
+            } else {
+                List<SysOrgVO> orgs = orgList.stream().filter(r -> r.getGuid().equals(dto.getOrganizationGuid())).collect(Collectors.toList()); //orgDao.findByGuid(dto.getOrganizationGuid());
+                if (orgs.size() == 0) {
+                    error = new NorthError(msgId, branchId, "/api/data/defenceareaList"
+                            , dto, "orgGUID:" + dto.getOrganizationGuid() + "不正确");
+                    errors.add(error);
+                    continue;
+                } else {
+                    org = orgs.get(0);
+                }
+            }
+
+            if (StringUtils.isEmpty(dto.getDefenceAreaCode())) {
+                error = new NorthError(msgId, branchId, "/api/data/defenceareaList"
+                        , dto, "参数非法:未传defenceareaCode");
+                errors.add(error);
+                continue;
+            }
+
+            if (StringUtils.isEmpty(dto.getDefenceAreaName())) {
+                error = new NorthError(msgId, branchId, "/api/data/defenceareaList"
+                        , dto, "参数非法:未传defenceareaName");
+                errors.add(error);
+                continue;
+            }
+
+            if (StringUtils.isEmpty(dto.getAlarmHostCode())) {
+                error = new NorthError(msgId, branchId, "/api/data/defenceareaList"
+                        , dto, "参数非法:未传alarmHostCode");
+                errors.add(error);
+                continue;
+            }
+
+            if (dto.getSensorArray() == null || dto.getSensorArray().size() == 0) {
+                error = new NorthError(msgId, branchId, "/api/data/defenceareaList"
+                        , dto, "参数非法:未传sensorArray");
+                errors.add(error);
+                //continue;
+            } else {
+                List<SensorDto> sensorArray = dto.getSensorArray();
+
+                for (SensorDto sensorDto : sensorArray) {
+                    if (StringUtils.isEmpty(sensorDto.getInputName())) {
+                        error = new NorthError(msgId, branchId, "/api/data/defenceareaList"
+                                , dto, "参数非法:未传InputName");
+                        errors.add(error);
+                        continue;
+                    }
+                    if (sensorDto.getInputIndex() == null) {
+                        error = new NorthError(msgId, branchId, "/api/data/defenceareaList"
+                                , dto, "参数非法:未传InputIndex");
+                        errors.add(error);
+                        continue;
+                    }
+                    if (StringUtils.isEmpty(sensorDto.getModuleAddress())) {
+                        error = new NorthError(msgId, branchId, "/api/data/defenceareaList"
+                                , dto, "参数非法:未传ModuleAddress");
+                        errors.add(error);
+                        continue;
+                    }
+                    if (StringUtils.isEmpty(sensorDto.getSensorType())) {
+                        error = new NorthError(msgId, branchId, "/api/data/defenceareaList"
+                                , dto, "参数非法:未传SensorType");
+                        errors.add(error);
+                        continue;
+                    }
+                    if (StringUtils.isEmpty(sensorDto.getSensorTypeName())) {
+                        error = new NorthError(msgId, branchId, "/api/data/defenceareaList"
+                                , dto, "参数非法:未传SensorTypeName");
+                        errors.add(error);
+                    }
+
+                    List<MediatorCategory> categorysa = categorys.stream().filter(r -> r.getName().equals(sensorDto.getSensorTypeName())).collect(Collectors.toList());//categoryDao.getOne(qw);
+                    if (categorysa.size() == 0) {
+                        error = new NorthError(msgId, branchId, "/api/data/defenceareaList"
+                                , dto, "参数非法:没有找到设备类型,默认归到其他类型中");
+                        errors.add(error);
+                    }
+                }
+            }
+            SysOrgVO finalOrg = org;
+            SysDevice device = null;
+            List<SysDevice> devicesa = devices.stream().filter(r -> r.getHostCode().equals(dto.getAlarmHostCode()) && r.getOrgId().equals(finalOrg.getId())).collect(Collectors.toList());
+            if (devicesa == null || devicesa.size() == 0) {
+                error = new NorthError(msgId, branchId, "/api/data/defenceareaList"
+                        , dto, "参数非法:没有找到报警主机");
+                errors.add(error);
+                continue;
+            }
+            Map<String, Object> map = this.protectionBuild(dto, org);
+            if (map != null) {
+                protectionList.add((IotSubSystem) map.get("protection"));
+                List<IotDefenceAre> list = (List<IotDefenceAre>) map.get("sensorList");
+                if (list != null && list.size() > 0) {
+                    sensorList.addAll(list);
+                }
+            }
+
+        }
+        try {
+            //删除传感器表中的数据
+            defenceAreService.remove(new LambdaQueryWrapper<>());
+        } catch (Exception e) {
+            log.error("删除传感器表中的数据失败,失败原因:" + e.getMessage(), e);
+        }
+
+
+        if (errors.size() > 0) {
+            northErrorService.saveErrorData(errors);
+        }
+        try {
+            baseMapper.updateAllDelete();
+        } catch (Exception e) {
+            log.error("修改子系统为逻辑删除失败,失败原因:" + e.getMessage(), e);
+        }
+        try {
+            this.saveOrUpdateBatch(protectionList);
+        } catch (Exception e) {
+            log.error("更新子系统数据失败,失败原因:" + e.getMessage(), e);
+        }
+        try {
+            defenceAreService.saveOrUpdateBatch(sensorList);
+        } catch (Exception e) {
+            log.error("更新t_sensor表传感器数据失败,失败原因:" + e.getMessage(), e);
+        }
+        this.northStatisticsSyncService.saveOrUpdateBaseCountByDataType(DataType.protectionCount.getIndex(), defenceareaList.size(), true);
+    }
+
+    public Map<String, Object> protectionBuild(DefenceAreaDto dto, SysOrgVO org) {
+        Map<String, Object> map = new HashMap<>();
+        IotSubSystem protection = null;
+        IotSubSystem old = this.findByCodeAndOrgId(dto.getDefenceAreaCode(), org.getId());
+        if (old != null) {
+            protection = old;
+        } else {
+            protection = new IotSubSystem();
+            protection.setId(IDHelper.id());
+            protection.setCreateTime(DateUtils.toLocalDateTime(new Date()));
+            protection.setStatus(2);
+        }
+        protection.setDeleted(0);
+        protection.setAlarmHostCode(dto.getAlarmHostCode());
+        protection.setSubSystemCode(dto.getDefenceAreaCode());
+        protection.setSubSystemName(dto.getDefenceAreaName());
+        protection.setOrgId(org.getId());
+        protection.setOrgName(org.getName());
+        protection.setOrgPath(org.getPath());
+        map.put("protection", protection);
+
+
+        List<SensorDto> sensorArray = dto.getSensorArray();
+        if (sensorArray != null && sensorArray.size() > 0) {
+            List<IotDefenceAre> list = new ArrayList<>();
+            List<IotDefenceAre> list1 = new ArrayList<>();
+            List<IotDefenceAre> sensorList=  defenceAreService.findBySubSystemCode(dto.getDefenceAreaCode());
+            for (SensorDto sensorDto : sensorArray) {
+                IotDefenceAre sensor = new IotDefenceAre();
+                sensor.setAlarmHostCode(dto.getAlarmHostCode());
+                sensor.setSubSystemCode(dto.getDefenceAreaCode());
+                sensor.setDefenceAreaName(dto.getDefenceAreaName());
+                sensor.setOrgId(org.getId());
+                sensor.setOrgName(org.getName());
+                sensor.setOrgPath(org.getPath());
+                sensor.setDefenceAreaIndex(sensorDto.getInputIndex());
+                sensor.setDefenceAreaName(sensorDto.getInputName());
+                //sensor.setModuleAddress(sensorDto.getModuleAddress());
+                sensor.setSensorType(sensorDto.getSensorType());
+                sensor.setSensorTypeName(sensorDto.getSensorTypeName());
+                //sensor.setStrDeviceId(dto.getDefenceAreaCode() + sensorDto.getInputIndex());
+                String strDeviceId = dto.getDefenceAreaCode() + sensorDto.getInputIndex();
+                final Optional<IotDefenceAre> optional = sensorList.stream()
+                        .filter(r -> r.getOrgId().equals(org.getId()))
+                        .filter(r -> r.getAlarmHostCode().equals(dto.getAlarmHostCode()))
+                        .filter(r -> r.getSubSystemCode().equals(dto.getDefenceAreaCode()))
+                        .filter(r -> r.getDefenceAreaIndex().equals(sensorDto.getInputIndex()))
+                        .max(Comparator.comparing(IotDefenceAre::getUpdateTime));
+                if (optional.isPresent()) {
+                    final IotDefenceAre iotDefenceAre = optional.get();
+                    BeanHelper.copyProperties(iotDefenceAre, sensor);
+                    list.add(iotDefenceAre);
+                } else {
+                    sensor.setId(IDHelper.id());
+                    sensor.setStatusValue("unKnown");
+                    sensor.setStatusText("未知");
+                    list.add(sensor);
+                }
+            }
+
+            map.put("sensorList", list);
+            map.put("deviceList", list1);
+        }
+
+        return map;
+    }
+
+    public boolean isCompleted(DefenceareaPageDto request) {
+        String guid = request.getPackageGuid();
+        Long currPage = request.getCurrPage();
+        Long totalPage = request.getTotalPage();
+        List<DefenceAreaDto> defenceareaList = request.getData();
+
+        /**
+         * 生成每一页的redis key值
+         */
+        String key = guid + "_" + currPage;
+
+        /**
+         * 判断是否已经获取到该分页数据,如果已获取到,则直接返回
+         */
+        Boolean isExist = redisTemplate.hasKey(key);
+
+        if (!isExist) {
+            String data = JSON.toJSONString(defenceareaList);
+            this.redisTemplate.opsForValue().set(key, data);
+            this.redisTemplate.expire(key, 1, TimeUnit.DAYS);
+        }
+
+
+        //判断是否完整
+        for (int i = 1; i <= totalPage; i++) {
+            String ak = guid + "_" + i;
+            Boolean isOk = redisTemplate.hasKey(ak);
+            if (!isOk) {
+                return false;
+            }
+        }
+        return true;
+    }
+}

+ 1 - 1
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/util/CheckDataUtil.java

@@ -1,6 +1,6 @@
 package com.xunmei.mediator.util;
 
-import com.xunmei.mediator.domain.dto.DataPageDto;
+import com.xunmei.system.api.dto.DataPageDto;
 import com.xunmei.system.api.domain.north.NorthError;
 import com.xunmei.system.api.dto.protection.ReceiveErrorDto;
 import lombok.extern.slf4j.Slf4j;

+ 5 - 0
soc-modules/soc-modules-mediator/src/main/resources/mapper/IotChannelMapper.xml

@@ -0,0 +1,5 @@
+<?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.xunmei.mediator.api.mapper.IotChannelMapper">
+
+</mapper>

+ 5 - 0
soc-modules/soc-modules-mediator/src/main/resources/mapper/IotDefenceAreMapper.xml

@@ -0,0 +1,5 @@
+<?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.xunmei.mediator.api.IotDefenceAreMapper">
+
+</mapper>

+ 8 - 0
soc-modules/soc-modules-mediator/src/main/resources/mapper/IotSubSystemMapper.xml

@@ -0,0 +1,8 @@
+<?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.xunmei.mediator.api.mapper.IotSubSystemMapper">
+
+    <update id="updateAllDelete">
+        update iot_sub_system set deleted=1;
+    </update>
+</mapper>

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

@@ -14,6 +14,8 @@ import com.xunmei.common.security.annotation.InnerAuth;
 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.DataPageDto;
+import com.xunmei.system.api.dto.SensorDto;
 import com.xunmei.system.api.dto.SysDeviceInnerListDto;
 import com.xunmei.system.api.dto.device.DeviceDto;
 import com.xunmei.system.api.dto.device.DeviceReceivePageDto;
@@ -319,4 +321,12 @@ public class SysDeviceController extends BaseController {
         final String msgId = (String) dataMap.get("msgId");
         return sysDeviceService.saveChannel(deviceDtoList, branchId, msgId);
     }
+
+    @PostMapping("/device/north/saveDirectHost")
+    ReceiveErrorDto saveDirectHost(@RequestBody HashMap<String, Object> dataMap){
+        final DataPageDto<SensorDto> sensorList = (DataPageDto<SensorDto>) dataMap.get("sensors");
+        final String branchId = (String) dataMap.get("branchId");
+        final String msgId = (String) dataMap.get("msgId");
+        return sysDeviceService.saveDirectHost(sensorList, branchId, msgId);
+    }
 }

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

@@ -7,6 +7,8 @@ import java.util.List;
 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.DataPageDto;
+import com.xunmei.system.api.dto.SensorDto;
 import com.xunmei.system.api.dto.SysDeviceInnerListDto;
 import com.xunmei.system.api.dto.device.DeviceDto;
 import com.xunmei.system.api.dto.device.DeviceReceivePageDto;
@@ -118,4 +120,6 @@ public interface ISysDeviceService extends IService<SysDevice> {
     SysDevice findByHostCodeAndCodeAndOrgId(String equipmentCode, String channelCode, Long orgId);
 
     SysDevice findByCodeAndOrgId(String equipmentCode, Long orgId);
+
+    ReceiveErrorDto saveDirectHost(DataPageDto<SensorDto> sensorList, String branchId, String msgId);
 }

+ 216 - 21
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysDeviceServiceImpl.java

@@ -1,45 +1,44 @@
 package com.xunmei.system.service.impl;
 
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
-import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.excel.EasyExcel;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.nacos.common.utils.CollectionUtils;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 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;
 import com.xunmei.common.core.utils.DateUtils;
+import com.xunmei.common.core.utils.IDHelper;
+import com.xunmei.common.core.utils.SpringUtils;
+import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.common.security.utils.SecurityUtils;
 import com.xunmei.system.api.RemoteMediatorService;
+import com.xunmei.system.api.RemoteOrgService;
 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.DataPageDto;
 import com.xunmei.system.api.dto.ProtectionDTO;
+import com.xunmei.system.api.dto.SensorDto;
 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.enums.*;
 import com.xunmei.system.api.util.LogUtils;
 import com.xunmei.system.api.vo.ProtectionVO;
 import com.xunmei.system.mapper.SysOrgMapper;
@@ -47,11 +46,11 @@ import com.xunmei.system.util.DeviceExport;
 import com.xunmei.system.vo.area.AccessType;
 import com.xunmei.system.vo.area.HostVO;
 import com.xunmei.system.vo.area.VideoVO;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.apache.poi.ss.formula.functions.T;
 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;
 
@@ -62,6 +61,7 @@ import com.xunmei.common.core.web.page.TableDataInfo;
 import com.xunmei.system.mapper.SysDeviceMapper;
 import com.xunmei.system.service.ISysDeviceService;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 
 /**
@@ -70,6 +70,7 @@ import javax.servlet.http.HttpServletResponse;
  * @author xunmei
  * @date 2023-08-22
  */
+@Slf4j
 @Service
 public class SysDeviceServiceImpl extends ServiceImpl<SysDeviceMapper, SysDevice> implements ISysDeviceService {
     @Autowired
@@ -399,7 +400,7 @@ public class SysDeviceServiceImpl extends ServiceImpl<SysDeviceMapper, SysDevice
         if (org.apache.commons.collections4.CollectionUtils.isEmpty(deviceDtoList)) {
             return ReceiveErrorDto.error("通道数据为空");
         } else {
-            MediatorCategory category = remoteMediatorService.findCategoryByCodeAndParentId("18", -1L,SecurityConstants.INNER);
+            MediatorCategory category = remoteMediatorService.findCategoryByCodeAndParentId("18", -1L, SecurityConstants.INNER);
 
             DeviceDto deviceDto;
             List<NorthError> errors = new ArrayList<>();
@@ -499,7 +500,7 @@ public class SysDeviceServiceImpl extends ServiceImpl<SysDeviceMapper, SysDevice
                 redisTemplate.expire(UK + CacheConstants.AFTER_DATA, 1, TimeUnit.HOURS);
             }
             if (errors.size() > 0) {
-                remoteMediatorService.saveErrorData(errors,SecurityConstants.INNER);
+                remoteMediatorService.saveErrorData(errors, SecurityConstants.INNER);
             }
 
             return ReceiveErrorDto.success();
@@ -518,10 +519,10 @@ public class SysDeviceServiceImpl extends ServiceImpl<SysDeviceMapper, SysDevice
         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.setDelFlag("0");
+        device.setChannelCode(deviceDto.getChannelCode());
         device.setIp(deviceDto.getNetAddress());
-        device.setOnlineStatus(DeviceOnlineStatus.UNKNOW.ordinal());
+        device.setOnline(DeviceOnlineStatus.UNKNOW.ordinal());
         Date date = new Date();
         device.setUpdateTime(date);
         device.setCreateTime(date);
@@ -537,7 +538,7 @@ public class SysDeviceServiceImpl extends ServiceImpl<SysDeviceMapper, SysDevice
     public SysDevice findByHostCodeAndCodeAndOrgId(String equipmentCode, String channelCode, Long orgId) {
         return lambdaQuery()
                 .eq(SysDevice::getHostCode, equipmentCode)
-                .eq(SysDevice::getChannelId, channelCode)
+                .eq(SysDevice::getChannelCode, channelCode)
                 .eq(SysDevice::getOrgId, orgId)
                 .last(Constants.LIMIT1)
                 .one();
@@ -545,11 +546,205 @@ public class SysDeviceServiceImpl extends ServiceImpl<SysDeviceMapper, SysDevice
 
     @Override
     public SysDevice findByCodeAndOrgId(String code, Long orgId) {
-
         return lambdaQuery()
-                .eq(SysDevice::getChannelId, code)
+                .eq(SysDevice::getChannelCode, code)
                 .eq(SysDevice::getOrgId, orgId)
                 .last(Constants.LIMIT1)
                 .one();
     }
+
+    @Override
+    public ReceiveErrorDto saveDirectHost(DataPageDto<SensorDto> request, String branchId, String msgId) {
+        //验证基础分页信息
+        ReceiveErrorDto dto = checkObjFieldIsNull(request);
+
+
+        if (dto.getSuccess()) {
+            //分页数据的存取
+            final List<SensorDto> data = isCompleted(request, SensorDto.class);
+
+            log.info("判断是否获取通用传感器全部信息分页数据:{}", data.size() > 0);
+            if (data.size() == 0) {
+                return dto;
+            }
+
+            new Thread(() -> {
+                //删除直连主机传感器一个月前的状态数据
+                // productDeviceMapper.deleteDirectHostHistory(DateUtil.offset(new Date(), DateField.MONTH, -1));
+            }).start();
+
+            List<Long> deletedDeviceIds = new ArrayList<>();
+            List<SysDevice> devices = convertToDomain(data, msgId, branchId, deletedDeviceIds);
+            this.removeByIds(deletedDeviceIds);
+            this.saveOrUpdateBatch(devices);
+        }
+        return dto;
+    }
+
+    private List<SysDevice> convertToDomain(List<SensorDto> sensorDtos, String msgId, String branchId, List<Long> deletedDeviceIds) {
+        List<SysDevice> domains = new ArrayList<>();
+        List<NorthError> errors = new ArrayList<>();
+        String path = "/api/{branchId}/data/sensorCommonList";
+        Map<String, List<SysDevice>> productDeviceMap = getAllDevice();
+        Set<String> uniqueSet = new HashSet<>();
+        for (SensorDto sensorDto : sensorDtos) {
+            NorthError error = null;
+            SysDevice domain = new SysDevice();
+
+            if (StringUtils.isEmpty(sensorDto.getOrgCode())) {
+                error = new NorthError(msgId, branchId, path
+                        , sensorDto, "参数非法:未传orgCode");
+                errors.add(error);
+                continue;
+            }
+
+            SysOrg org = orgService.findByGuid(sensorDto.getOrgCode());
+            if (org == null) {
+                error = new NorthError(msgId, branchId, path
+                        , sensorDto, "参数非法:机构orgCode不存在:" + sensorDto.getOrgCode());
+                errors.add(error);
+                continue;
+            }
+            String key = org.getId() + sensorDto.getDeviceCode();
+            if (uniqueSet.contains(key)) {
+                errors.add(new NorthError(msgId, branchId, path
+                        , sensorDto, "数据来源中,同机构中设备编号重复。"));
+                continue;
+            }
+            Long deviceType = convertDeviceType(sensorDto.getDeviceType());
+            if (ObjectUtil.isNull(deviceType)) {
+                errors.add(new NorthError(msgId, branchId, path
+                        , sensorDto, "无法识别的设备类型"));
+                continue;
+            }
+            uniqueSet.add(key);
+
+            List<SysDevice> exists = productDeviceMap.get(key);
+            domain.setId(IDHelper.id());
+            domain.setOnline(DeviceOnlineStatus.UNKNOW.ordinal());
+            domain.setIsAlarm(DeviceAlarmStatus.NORMAL.getStatus());
+            domain.setDoStatus(0);
+            domain.setDelFlag("0");
+            domain.setCreateTime(new Date());
+
+            if (ObjectUtil.isNotEmpty(exists)) {
+                if (exists.size() > 1) {
+                    errors.add(new NorthError(msgId, branchId, path, sensorDto, "同机构下设备编号重复,将取第一条"));
+                }
+                domain = exists.get(0);
+            }
+            domain.setUpdateTime(new Date());
+            domain.setDeviceName(sensorDto.getDeviceName().replace("机房/基站环境", "物联环境"));
+            domain.setCategoryId(deviceType);
+            domain.setHostCode(sensorDto.getHostCode());
+            domain.setChannelCode(sensorDto.getDeviceCode());
+            domain.setOrgId(org.getId());
+            domain.setOrgName(org.getName());
+            domain.setOrgPath(org.getPath());
+            domain.setSource(1);
+            domains.add(domain);
+        }
+        if (errors.size() > 0) {
+            remoteMediatorService.saveErrorData(errors, SecurityConstants.INNER);
+        }
+
+        productDeviceMap.keySet().stream().filter(k -> !uniqueSet.contains(k)).forEach(k -> productDeviceMap.get(k).forEach(d -> deletedDeviceIds.add(d.getId())));
+
+        return domains;
+    }
+
+    private Map<String, List<SysDevice>> getAllDevice() {
+        return baseMapper.selectList(new LambdaQueryWrapper<SysDevice>()
+                        .eq(SysDevice::getCategoryId, 1))
+                .stream()
+                .collect(Collectors.groupingBy(c -> c.getOrgId().toString()));
+    }
+
+    private Long convertDeviceType(String deviceCode) {
+        Long type = null;
+        switch (deviceCode) {
+            case "4183"://温湿度
+                type = 3712195941285888L; //todo
+                break;
+//            case "4181"://红外
+//                type = 3713672266842116L;
+//                break;
+            case "4182": //烟感
+                type = 3712194930442240L;
+                break;
+            case "4184": //水浸
+                type = 3712196701503488L;
+                break;
+            case "4160"://智能电表
+                type = 3712198166114160L;
+        }
+
+        return type;
+    }
+
+    public static <T> ReceiveErrorDto checkObjFieldIsNull(DataPageDto<T> request) {
+        String packageGuid = request.getPackageGuid();
+        if (StringUtils.isEmpty(packageGuid)) {
+            return ReceiveErrorDto.error("packageGuid参数非法");
+        }
+        Long totalPage = request.getTotalPage();
+        if (totalPage == null) {
+            return ReceiveErrorDto.error("totalPage参数非法");
+        }
+        Long currPage = request.getCurrPage();
+        if (currPage == null) {
+            return ReceiveErrorDto.error("currPage参数非法");
+        }
+        if (ObjectUtil.isEmpty(request.getData())) {
+            return ReceiveErrorDto.error("data信息为空");
+        }
+        return ReceiveErrorDto.success();
+    }
+
+    public <T> List<T> isCompleted(DataPageDto<T> request, Class<T> clazz) {
+        List<T> resultList = new ArrayList<>();
+        String guid = request.getPackageGuid();
+        Long currPage = request.getCurrPage();
+        Long totalPage = request.getTotalPage();
+        List<?> dtoList = request.getData();
+
+        /**
+         * 生成每一页的redis key值
+         */
+        String key = guid + "_" + currPage;
+
+        /**
+         * 判断是否已经获取到该分页数据,如果已获取到,则直接返回
+         */
+        Boolean isExist = RedisUtils.hasKey(key);
+
+        if (!isExist) {
+            String data = JSON.toJSONString(dtoList);
+            redisTemplate.opsForValue().set(key, data);
+            redisTemplate.expire(key, 1, TimeUnit.DAYS);
+        }
+        //判断是否完整
+        for (int i = 1; i <= totalPage; i++) {
+            String ak = guid + "_" + i;
+            Boolean isOk = RedisUtils.hasKey(ak);
+            if (!isOk) {
+                return resultList;
+            }
+        }
+        //数据完整了将数据取出
+        for (int i = 1; i <= totalPage; i++) {
+            String ak = guid + "_" + i;
+            Object obj = redisTemplate.opsForValue().get(ak);
+            List<T> data = JSON.parseArray((String) obj, clazz);
+            if (data != null) {
+                resultList.addAll(data);
+            }
+        }
+        for (int i = 1; i <= totalPage; i++) {
+            String ak = guid + "_" + i;
+            redisTemplate.delete(ak);
+        }
+
+        return resultList;
+    }
 }

+ 1 - 0
soc-modules/soc-modules-system/src/main/resources/mapper/system/SysOrgMapper.xml

@@ -647,6 +647,7 @@
                `name`,
                if(short_name is null,`name` ,short_name) as short_name,
                code,
+               guid,
                path,
                parent_id,
                type,