Răsfoiți Sursa

空调基础信息接口代码提交

jingyuanchao 1 an în urmă
părinte
comite
10d5ac1e98
20 a modificat fișierele cu 697 adăugiri și 25 ștergeri
  1. 46 0
      project_data/sql/0.1.1/soc/soc.sql
  2. 4 1
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/enums/DataType.java
  3. 4 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/util/LogUtils.java
  4. 95 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/iot/domain/IotAirConditioner.java
  5. 95 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/iot/domain/IotAirConditionerLog.java
  6. 3 3
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/enums/iot/UpsStatus.java
  7. 1 1
      soc-modules/soc-modules-gen/src/main/java/com/xunmei/gen/util/CodeGenerators.java
  8. 68 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/airconditioner/controller/IotAirConditionerController.java
  9. 24 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/airconditioner/dto/AirConditionerDeviceDataReq.java
  10. 35 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/airconditioner/dto/AirConditionerDeviceStatusReq.java
  11. 16 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/airconditioner/mapper/IotAirConditionerLogMapper.java
  12. 16 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/airconditioner/mapper/IotAirConditionerMapper.java
  13. 16 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/airconditioner/service/IotAirConditionerLogService.java
  14. 23 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/airconditioner/service/IotAirConditionerService.java
  15. 20 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/airconditioner/service/impl/IotAirConditionerLogServiceImpl.java
  16. 189 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/airconditioner/service/impl/IotAirConditionerServiceImpl.java
  17. 0 20
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/breaker/dto/BreakerDevicePageDto.java
  18. 32 0
      soc-modules/soc-modules-mediator/src/main/resources/logback.xml
  19. 5 0
      soc-modules/soc-modules-mediator/src/main/resources/mapper/IotAirConditionerLogMapper.xml
  20. 5 0
      soc-modules/soc-modules-mediator/src/main/resources/mapper/IotAirConditionerMapper.xml

+ 46 - 0
project_data/sql/0.1.1/soc/soc.sql

@@ -217,4 +217,50 @@ CREATE TABLE `iot_power_off_alarm` (
        PRIMARY KEY (`id`) USING BTREE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='停电告警'
 
+-- 新增空调设备表
+drop table if exists iot_air_conditioner;
+CREATE TABLE `iot_air_conditioner` (
+       `id` bigint NOT NULL DEFAULT '0',
+       `device_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+       `org_id` bigint DEFAULT NULL,
+       `org_path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+       `org_name` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+       `host_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '主机code',
+       `unique_code` varchar(225) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'orgCode+hostCode+deviceCode组成设备唯一',
+       `status` int DEFAULT NULL COMMENT '0正常1告警2未知',
+       `device_type` varchar(50) DEFAULT NULL COMMENT '设备类型',
+       `device_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '设备code07市电控制线08ups控制线',
+       `info` varchar(225) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '空调状态详情',
+       `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者',
+       `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+       `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者',
+       `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+       `deleted` int DEFAULT NULL COMMENT '0正常1删除',
+       PRIMARY KEY (`id`) USING BTREE,
+       KEY `unique_code` (`unique_code`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
+
+-- 新增空调设备日志表
+drop table if exists iot_air_conditioner_log;
+CREATE TABLE `iot_air_conditioner_log` (
+       `id` bigint NOT NULL DEFAULT '0',
+       `air_conditioner_id` bigint NOT NULL DEFAULT '0',
+       `device_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+       `org_id` bigint DEFAULT NULL,
+       `org_path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+       `org_name` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+       `host_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '主机code',
+       `unique_code` varchar(225) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'orgCode+hostCode+deviceCode组成设备唯一',
+       `status` int DEFAULT NULL COMMENT '0正常1告警2未知',
+       `device_type` varchar(50) DEFAULT NULL COMMENT '设备类型',
+       `device_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '设备code07市电控制线08ups控制线',
+       `info` varchar(225) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '空调状态详情',
+       `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者',
+       `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+       `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者',
+       `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+       PRIMARY KEY (`id`) USING BTREE,
+       KEY `unique_code` (`unique_code`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
+
 

+ 4 - 1
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/enums/DataType.java

@@ -20,7 +20,10 @@ public enum DataType {
     upsDeviceCount(7,"UPS信息数"),
     breakerDeviceCount(8,"8小时回路信息数"),
     notifyInfoCount(9,"订阅通知信息数"),
-    dvrdiskCount(10,"DVR硬盘空间信息数");
+    dvrdiskCount(10,"DVR硬盘空间信息数"),
+    airConditionerCount(11,"空调数"),
+
+    ;
 
     Integer index;
     String dataType;

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

@@ -123,4 +123,8 @@ public class LogUtils {
      * 主机直连传感器
      */
     public  static  final Logger DIRECT_HOST_SENSOR_STATUS=LoggerFactory.getLogger("directHostSensorStatus");
+
+    public  static  final Logger BASE_AIR_CONDITIONER_DATA=LoggerFactory.getLogger("airConditionerDataLog");
+
+    public  static  final Logger STATUS_AIR_CONDITIONER_DATA=LoggerFactory.getLogger("airConditionerStatusLog");
 }

+ 95 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/iot/domain/IotAirConditioner.java

@@ -0,0 +1,95 @@
+package com.xunmei.common.core.domain.iot.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-06-25
+ */
+@Data
+@Builder
+@EqualsAndHashCode(callSuper = false)
+@TableName("iot_air_conditioner")
+@ApiModel(value = "IotAirConditioner对象", description = "")
+public class IotAirConditioner implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId("id")
+    private Long id;
+
+    @TableField("device_name")
+    private String deviceName;
+
+    @TableField("org_id")
+    private Long orgId;
+
+    @TableField("org_path")
+    private String orgPath;
+
+    @TableField("org_name")
+    private String orgName;
+
+    @ApiModelProperty(value = "主机code")
+    @TableField("host_code")
+    private String hostCode;
+
+    @ApiModelProperty(value = "orgCode+hostCode+deviceCode组成设备唯一")
+    @TableField("unique_code")
+    private String uniqueCode;
+
+    @ApiModelProperty(value = "0断电1通电2异常")
+    @TableField("status")
+    private Integer status;
+
+    @ApiModelProperty(value = "1市电8小时回路2UPS8小时回路")
+    @TableField("device_type")
+    private String deviceType;
+
+    @ApiModelProperty(value = "设备code07市电控制线08ups控制线")
+    @TableField("device_code")
+    private String deviceCode;
+
+    @ApiModelProperty(value = "空调状态详情")
+    @TableField("info")
+    private String info;
+
+    @ApiModelProperty(value = "创建者")
+    @TableField("create_by")
+    private String createBy;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "更新者")
+    @TableField("update_by")
+    private String updateBy;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "0正常1删除")
+    @TableField("deleted")
+    private Integer deleted;
+
+
+    public static String getUniqueCode(String orgCode, String hostCode, String deviceCode) {
+        return orgCode + "_" + hostCode + "_" + deviceCode;
+    }
+}

+ 95 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/iot/domain/IotAirConditionerLog.java

@@ -0,0 +1,95 @@
+package com.xunmei.common.core.domain.iot.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-06-25
+ */
+@Data
+@Builder
+@EqualsAndHashCode(callSuper = false)
+@TableName("iot_air_conditioner_log")
+@ApiModel(value="IotAirConditionerLog对象", description="")
+public class IotAirConditionerLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId("id")
+    private Long id;
+
+    @TableField("air_conditioner_id")
+    private Long airConditionerId;
+
+    @TableField("device_name")
+    private String deviceName;
+
+    @TableField("org_id")
+    private Long orgId;
+
+    @TableField("org_path")
+    private String orgPath;
+
+    @TableField("org_name")
+    private String orgName;
+
+    @ApiModelProperty(value = "主机code")
+    @TableField("host_code")
+    private String hostCode;
+
+    @ApiModelProperty(value = "orgCode+hostCode+deviceCode组成设备唯一")
+    @TableField("unique_code")
+    private String uniqueCode;
+
+    @ApiModelProperty(value = "0断电1通电2异常")
+    @TableField("status")
+    private Integer status;
+
+    @ApiModelProperty(value = "1市电8小时回路2UPS8小时回路")
+    @TableField("device_type")
+    private Integer deviceType;
+
+    @ApiModelProperty(value = "设备code07市电控制线08ups控制线")
+    @TableField("device_code")
+    private String deviceCode;
+
+    @ApiModelProperty(value = "空调状态详情")
+    @TableField("info")
+    private String info;
+
+    @ApiModelProperty(value = "创建者")
+    @TableField("create_by")
+    private String createBy;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "更新者")
+    @TableField("update_by")
+    private String updateBy;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "0正常1删除")
+    @TableField("deleted")
+    private Integer deleted;
+
+
+}

+ 3 - 3
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/enums/iot/UpsStatus.java

@@ -9,11 +9,11 @@ import java.util.Map;
 @AllArgsConstructor
 public enum UpsStatus {
 
-    NORMAL(0, "水浸"),
+    NORMAL(0, "正常"),
 
-    ALARM(1, "烟感"),
+    ALARM(1, "告警"),
 
-    UN_KNOW(2, "温湿度"),
+    UN_KNOW(2, "未知"),
 
 
     ;

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

@@ -30,7 +30,7 @@ public class CodeGenerators {
     }*/
 
     public static final String moduleName="com.xunmei.mediator";
-    public static final String tableNames="iot_power_off_alarm";
+    public static final String tableNames="iot_air_conditioner,iot_air_conditioner_log";
 
     public static void main(String[] args) {
         // 代码生成器

+ 68 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/airconditioner/controller/IotAirConditionerController.java

@@ -0,0 +1,68 @@
+package com.xunmei.mediator.api.airconditioner.controller;
+
+
+import com.alibaba.fastjson2.JSON;
+import com.xunmei.mediator.api.airconditioner.dto.AirConditionerDeviceDataReq;
+import com.xunmei.mediator.api.airconditioner.dto.AirConditionerDeviceStatusReq;
+import com.xunmei.mediator.api.airconditioner.service.IotAirConditionerService;
+import com.xunmei.system.api.dto.DataPageDto;
+import com.xunmei.system.api.dto.protection.ReceiveErrorDto;
+import com.xunmei.system.api.util.LogUtils;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-06-25
+ */
+@RestController
+@RequestMapping
+public class IotAirConditionerController {
+
+    @Autowired
+    private IotAirConditionerService airConditionerService;
+
+    public static final String AIR_CONDITIONER_BASE_DATA_PATH = "/api/data/airConditionerDeviceList";
+
+    public static final String AIR_CONDITIONER_STATUS_PATH = "/api/status/airConditioner";
+
+    public static final String REQ_LOG_FORMAT = "【北向接口-%s】msgId:%s】【接收参数:%s】";
+
+    public static final String RESP_LOG_FORMAT = "【北向接口-%s】msgId:%s】【返回参数:%s】";
+
+    @ApiOperation("空调基本信息同步")
+    @PostMapping(AIR_CONDITIONER_BASE_DATA_PATH)
+    public ReceiveErrorDto breakerDeviceList(String msgId, @RequestBody DataPageDto<AirConditionerDeviceDataReq> request) {
+        LogUtils.BASE_AIR_CONDITIONER_DATA.info(String.format(REQ_LOG_FORMAT, "空调基本信息同步:" + AIR_CONDITIONER_BASE_DATA_PATH, msgId, JSON.toJSONString(request)));
+
+        ReceiveErrorDto errorDto = this.airConditionerService.saveDeviceData(request, msgId, AIR_CONDITIONER_BASE_DATA_PATH);
+
+        LogUtils.BASE_AIR_CONDITIONER_DATA.info(String.format(RESP_LOG_FORMAT, "空调基本信息同步:" + AIR_CONDITIONER_BASE_DATA_PATH, msgId, JSON.toJSONString(errorDto)));
+        return errorDto;
+    }
+
+    @ApiOperation("空调状态信息同步")
+    @PostMapping(AIR_CONDITIONER_STATUS_PATH)
+    public ReceiveErrorDto statusBreaker(String msgId, @RequestBody AirConditionerDeviceStatusReq request) {
+        LogUtils.STATUS_AIR_CONDITIONER_DATA.info(String.format(RESP_LOG_FORMAT, "空调状态信息同步:" + AIR_CONDITIONER_STATUS_PATH, msgId, JSON.toJSONString(request)));
+        ReceiveErrorDto errorDto = ReceiveErrorDto.success();
+        try {
+            errorDto = this.airConditionerService.saveDeviceStatus(request, msgId, AIR_CONDITIONER_STATUS_PATH);
+        } catch (Exception e) {
+            LogUtils.STATUS_AIR_CONDITIONER_DATA.error("保存失败,{}", e);
+            return ReceiveErrorDto.error("保存失败:" + e);
+        }
+        LogUtils.STATUS_AIR_CONDITIONER_DATA.info(String.format(RESP_LOG_FORMAT, "空调状态信息同步:" + AIR_CONDITIONER_STATUS_PATH, msgId, JSON.toJSONString(errorDto)));
+        return errorDto;
+    }
+
+}
+

+ 24 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/airconditioner/dto/AirConditionerDeviceDataReq.java

@@ -0,0 +1,24 @@
+package com.xunmei.mediator.api.airconditioner.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class AirConditionerDeviceDataReq {
+
+    @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;
+
+}

+ 35 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/airconditioner/dto/AirConditionerDeviceStatusReq.java

@@ -0,0 +1,35 @@
+package com.xunmei.mediator.api.airconditioner.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class AirConditionerDeviceStatusReq {
+
+    @ApiModelProperty(value = "机构guid")
+    private String orgCode;
+
+    @ApiModelProperty(value = "视频物联网检测主机唯一标识")
+    private String hostCode;
+
+    @ApiModelProperty(value = "设备code")
+    private String deviceCode;
+
+    @ApiModelProperty(value = "设备名称")
+    private String deviceName;
+
+    @ApiModelProperty(value = "设备类型编码: 415")
+    private String deviceType;
+
+    @ApiModelProperty(value = "数据更新时间")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "状态数据")
+    private List<Map> infos;
+
+
+}

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

@@ -0,0 +1,16 @@
+package com.xunmei.mediator.api.airconditioner.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xunmei.common.core.domain.iot.domain.IotAirConditionerLog;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-06-25
+ */
+public interface IotAirConditionerLogMapper extends BaseMapper<IotAirConditionerLog> {
+
+}

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

@@ -0,0 +1,16 @@
+package com.xunmei.mediator.api.airconditioner.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xunmei.common.core.domain.iot.domain.IotAirConditioner;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-06-25
+ */
+public interface IotAirConditionerMapper extends BaseMapper<IotAirConditioner> {
+
+}

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

@@ -0,0 +1,16 @@
+package com.xunmei.mediator.api.airconditioner.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xunmei.common.core.domain.iot.domain.IotAirConditionerLog;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-06-25
+ */
+public interface IotAirConditionerLogService extends IService<IotAirConditionerLog> {
+
+}

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

@@ -0,0 +1,23 @@
+package com.xunmei.mediator.api.airconditioner.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xunmei.common.core.domain.iot.domain.IotAirConditioner;
+import com.xunmei.mediator.api.airconditioner.dto.AirConditionerDeviceDataReq;
+import com.xunmei.mediator.api.airconditioner.dto.AirConditionerDeviceStatusReq;
+import com.xunmei.system.api.dto.DataPageDto;
+import com.xunmei.system.api.dto.protection.ReceiveErrorDto;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-06-25
+ */
+public interface IotAirConditionerService extends IService<IotAirConditioner> {
+
+    ReceiveErrorDto saveDeviceData(DataPageDto<AirConditionerDeviceDataReq> request, String msgId,String path);
+
+    ReceiveErrorDto saveDeviceStatus(AirConditionerDeviceStatusReq request, String msgId,String path);
+}

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

@@ -0,0 +1,20 @@
+package com.xunmei.mediator.api.airconditioner.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.domain.iot.domain.IotAirConditionerLog;
+import com.xunmei.mediator.api.airconditioner.mapper.IotAirConditionerLogMapper;
+import com.xunmei.mediator.api.airconditioner.service.IotAirConditionerLogService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-06-25
+ */
+@Service
+public class IotAirConditionerLogServiceImpl extends ServiceImpl<IotAirConditionerLogMapper, IotAirConditionerLog> implements IotAirConditionerLogService {
+
+}

+ 189 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/airconditioner/service/impl/IotAirConditionerServiceImpl.java

@@ -0,0 +1,189 @@
+package com.xunmei.mediator.api.airconditioner.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.constant.CacheConstants;
+import com.xunmei.common.core.domain.iot.domain.IotAirConditioner;
+import com.xunmei.common.core.enums.iot.UpsStatus;
+import com.xunmei.common.core.thread.ThreadPoolConfig;
+import com.xunmei.common.redis.utils.RedisUtils;
+import com.xunmei.mediator.api.airconditioner.dto.AirConditionerDeviceDataReq;
+import com.xunmei.mediator.api.airconditioner.dto.AirConditionerDeviceStatusReq;
+import com.xunmei.mediator.api.airconditioner.mapper.IotAirConditionerMapper;
+import com.xunmei.mediator.api.airconditioner.service.IotAirConditionerService;
+import com.xunmei.mediator.api.north.service.NorthErrorService;
+import com.xunmei.mediator.api.north.service.impl.NorthStatisticsSyncService;
+import com.xunmei.mediator.util.CheckDataUtil;
+import com.xunmei.mediator.util.RedisCheckRepeatDataUtil;
+import com.xunmei.system.api.domain.north.NorthError;
+import com.xunmei.system.api.dto.DataPageDto;
+import com.xunmei.system.api.dto.protection.ReceiveErrorDto;
+import com.xunmei.system.api.enums.DataType;
+import com.xunmei.system.api.util.LogUtils;
+import com.xunmei.system.api.vo.SysOrgVO;
+import io.netty.util.internal.StringUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.concurrent.Future;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-06-25
+ */
+@Service
+public class IotAirConditionerServiceImpl extends ServiceImpl<IotAirConditionerMapper, IotAirConditioner> implements IotAirConditionerService {
+    @Autowired
+    @Qualifier(ThreadPoolConfig.SOC_EXECUTOR)
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    @Autowired
+    NorthStatisticsSyncService northStatisticsSyncService;
+    @Autowired
+    NorthErrorService northErrorService;
+
+    @Override
+    public ReceiveErrorDto saveDeviceData(DataPageDto<AirConditionerDeviceDataReq> request, String msgId, String path) {
+        try {   //验证基础分页信息
+            ReceiveErrorDto dto = CheckDataUtil.checkObjFieldIsNull(request);
+            if (!dto.getSuccess()) {
+                return dto;
+            }
+            List<AirConditionerDeviceDataReq> airConditionerDeviceList = RedisCheckRepeatDataUtil.isCompleted(request, AirConditionerDeviceDataReq.class);
+            LogUtils.BASE_INFO_UPS_DEVICE.info("判断空调基础信息是否已获取完整分页数据:{}", !airConditionerDeviceList.isEmpty());
+            if (airConditionerDeviceList.isEmpty()) {
+                return ReceiveErrorDto.success();
+            }
+            Map<String, Object> dataMap = checkParmaAndBuildData(airConditionerDeviceList, msgId, path);
+            doSyncTask(() -> saveData(dataMap,airConditionerDeviceList.size()));
+        } catch (Exception e) {
+            LogUtils.BASE_INFO_UPS_DEVICE.error("保存空调基础信息发生异常:{}", e);
+            return ReceiveErrorDto.error(e.getMessage());
+        }
+        return ReceiveErrorDto.success();
+    }
+
+    private void saveData(Map<String, Object> map,int size) {
+
+        List<NorthError> errors = (List<NorthError>) map.get("errors");
+        List<IotAirConditioner> insertList = (List<IotAirConditioner>) map.get("insertList");
+        List<IotAirConditioner> updateList = (List<IotAirConditioner>) map.get("updateList");
+        List<Long> orgIdList = (List<Long>) map.get("orgIdList");
+        this.northStatisticsSyncService.saveOrUpdateBaseCountByDataType(DataType.airConditionerCount.getIndex(), size, false);
+
+        try {
+            northErrorService.saveErrorData(errors);
+            //this.updateDel(orgIdList);
+            if (ObjectUtil.isNotEmpty(insertList)) {
+                this.saveOrUpdateBatch(insertList);
+            }
+            if (ObjectUtil.isNotEmpty(updateList)) {
+                this.saveOrUpdateBatch(updateList);
+            }
+        } catch (Exception e) {
+            LogUtils.BASE_INFO_UPS_DEVICE.error("批量保存ups失败,{}", e);
+            throw new RuntimeException(e.getMessage());
+        }
+
+    }
+
+    private void doSyncTask(Runnable runnable) throws RuntimeException  {
+        Future<?> future = threadPoolTaskExecutor.submit(runnable);
+        try {
+            future.get(); // 这将阻塞直到任务完成,并捕获任何异常
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt(); // 恢复中断状态
+            LogUtils.BASE_INFO_UPS_DEVICE.error("异步任务被中断:{}", e.getMessage());
+        } catch (Exception e) {
+            LogUtils.BASE_INFO_UPS_DEVICE.error("异步任务执行异常:{}", e.getMessage());
+            throw new RuntimeException(e);
+        }
+    }
+
+    private Map<String, Object> checkParmaAndBuildData(List<AirConditionerDeviceDataReq> airConditionerDeviceList, String msgId, String path) throws IllegalAccessException {
+        List<SysOrgVO> orgList = RedisUtils.getCacheList(CacheConstants.ORG_CACHE_LIST_KEY);
+        Map<String, Object> map = new HashMap<>();
+        List<NorthError> errors = new ArrayList<>();
+        List<Long> list = new ArrayList<>();
+        List<IotAirConditioner> insertList = new ArrayList<>();
+        List<IotAirConditioner> updateList = new ArrayList<>();
+        List<IotAirConditioner> conditionerList = findList();
+        NorthError error = null;
+        for (AirConditionerDeviceDataReq req : airConditionerDeviceList) {
+            error = CheckDataUtil.checkObjFieldIsNull(req, msgId, path, null);
+            if (error != null) {
+                errors.add(error);
+                continue;
+            }
+            Optional<SysOrgVO> orgOptional = orgList.stream().filter(r -> r.getCode().equals(req.getOrgCode())).findFirst();
+            if (!orgOptional.isPresent()) {
+                error = new NorthError(msgId, path, req, "orgCode:" + req.getOrgCode() + "不正确");
+                errors.add(error);
+                continue;
+            }
+            SysOrgVO org = orgOptional.get();
+            if (!list.contains(org.getId())) {
+                list.add(org.getId());
+            }
+            IotAirConditioner newAirConditioner = populateAirConditioner(req, org);
+            //判断老数据中是否有新数据
+            Optional<IotAirConditioner> optional = conditionerList.stream().filter(r -> ObjectUtil.equal(r.getUniqueCode(), newAirConditioner.getUniqueCode())).findAny();
+            if (optional.isPresent()) {
+                IotAirConditioner airConditioner = optional.get();
+                BeanUtils.copyProperties(newAirConditioner, airConditioner, "id");
+                airConditioner.setUpdateTime(LocalDateTime.now());
+                updateList.add(airConditioner);
+            } else {
+                insertList.add(newAirConditioner);
+            }
+        }
+        map.put("insertList", insertList);
+        map.put("updateList", updateList);
+        map.put("errors", errors);
+        map.put("orgIdList", list);
+        return map;
+    }
+
+    private IotAirConditioner populateAirConditioner(AirConditionerDeviceDataReq req, SysOrgVO org) {
+        return IotAirConditioner.builder()
+                .id(IdWorker.getId())
+                .deviceName(req.getDeviceName())
+                .orgId(org.getId())
+                .orgName(org.getShortName())
+                .orgPath(org.getPath())
+                .hostCode(req.getHostCode())
+                .uniqueCode(IotAirConditioner.getUniqueCode(org.getCode(), req.getHostCode(), req.getDeviceCode()))
+                .status(UpsStatus.UN_KNOW.getStatus())
+                .deviceType(req.getDeviceType())
+                .deviceCode(req.getDeviceCode())
+                .info(StringUtil.EMPTY_STRING)
+                .createTime(LocalDateTime.now())
+                .updateTime(LocalDateTime.now())
+                .deleted(0)
+                .build();
+
+    }
+
+    private List<IotAirConditioner> findList() {
+        LambdaQueryWrapper<IotAirConditioner> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(IotAirConditioner::getDeleted, 0);
+        return baseMapper.selectList(wrapper);
+    }
+
+    @Override
+    public ReceiveErrorDto saveDeviceStatus(AirConditionerDeviceStatusReq request, String msgId, String path) {
+        return null;
+    }
+
+
+}

+ 0 - 20
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/breaker/dto/BreakerDevicePageDto.java

@@ -1,20 +0,0 @@
-package com.xunmei.mediator.api.breaker.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.util.List;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-@Builder
-public class BreakerDevicePageDto {
-    private Long totalPage;
-    private Long currPage;
-    private String packageGuid;
-    private String buildTime;
-    private List<BreakerDeviceDto> data;
-}

+ 32 - 0
soc-modules/soc-modules-mediator/src/main/resources/logback.xml

@@ -459,6 +459,30 @@
             <cleanHistoryOnStart>true</cleanHistoryOnStart>
         </rollingPolicy>
     </appender>
+    <appender name="airConditionerDataLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <encoder>
+            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_HOME}/base_air_conditioner/%d{yyyy-MM-dd}-%i.log</fileNamePattern>
+            <maxHistory>${max.history}</maxHistory>
+            <maxFileSize>${max.file.size}</maxFileSize>
+            <totalSizeCap>${total.size.cap}</totalSizeCap>
+            <cleanHistoryOnStart>true</cleanHistoryOnStart>
+        </rollingPolicy>
+    </appender>
+    <appender name="airConditionerStatusLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <encoder>
+            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_HOME}/status_air_conditioner/%d{yyyy-MM-dd}-%i.log</fileNamePattern>
+            <maxHistory>${max.history}</maxHistory>
+            <maxFileSize>${max.file.size}</maxFileSize>
+            <totalSizeCap>${total.size.cap}</totalSizeCap>
+            <cleanHistoryOnStart>true</cleanHistoryOnStart>
+        </rollingPolicy>
+    </appender>
     <!--name属性是代码里创建日志用的(例如:Logger clog = LoggerFactory.getLogger("createLog");)-->
     <logger name="equipmentLog" additivity="false" level="info">
         <!--上面appender元素的name值。为了和logger的name属性做区分,我故意写的不一样-->
@@ -576,6 +600,14 @@
         <!--上面appender元素的name值。为了和logger的name属性做区分,我故意写的不一样-->
         <appender-ref ref="directHostSensorStatus"/>
     </logger>
+    <logger name="airConditionerDataLog" additivity="false" level="info">
+        <!--上面appender元素的name值。为了和logger的name属性做区分,我故意写的不一样-->
+        <appender-ref ref="airConditionerDataLog"/>
+    </logger>
+    <logger name="airConditionerStatusLog" additivity="false" level="info">
+        <!--上面appender元素的name值。为了和logger的name属性做区分,我故意写的不一样-->
+        <appender-ref ref="airConditionerStatusLog"/>
+    </logger>
 
     <!-- 日志输出级别 -->
     <root level="INFO">

+ 5 - 0
soc-modules/soc-modules-mediator/src/main/resources/mapper/IotAirConditionerLogMapper.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.airconditioner.mapper.IotAirConditionerLogMapper">
+
+</mapper>

+ 5 - 0
soc-modules/soc-modules-mediator/src/main/resources/mapper/IotAirConditionerMapper.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.airconditioner.mapper.IotAirConditionerMapper">
+
+</mapper>