ソースを参照

空调状态信息接口代码提交

jingyuanchao 1 年間 前
コミット
35805ed9e0

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

@@ -53,13 +53,7 @@ public class IotAirConditionerController {
     @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);
-        }
+        ReceiveErrorDto errorDto = this.airConditionerService.saveDeviceStatus(request, msgId, AIR_CONDITIONER_STATUS_PATH);
         LogUtils.STATUS_AIR_CONDITIONER_DATA.info(String.format(RESP_LOG_FORMAT, "空调状态信息同步:" + AIR_CONDITIONER_STATUS_PATH, msgId, JSON.toJSONString(errorDto)));
         return errorDto;
     }

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

@@ -1,13 +1,17 @@
 package com.xunmei.mediator.api.airconditioner.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSON;
 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.constant.SecurityConstants;
 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.core.utils.DateUtils;
+import com.xunmei.common.core.utils.JacksonUtils;
 import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.mediator.api.airconditioner.dto.AirConditionerDeviceDataReq;
 import com.xunmei.mediator.api.airconditioner.dto.AirConditionerDeviceStatusReq;
@@ -17,6 +21,8 @@ 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.RemoteOrgService;
+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.protection.ReceiveErrorDto;
@@ -24,6 +30,7 @@ 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.apache.commons.codec.digest.DigestUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -51,6 +58,8 @@ public class IotAirConditionerServiceImpl extends ServiceImpl<IotAirConditionerM
     NorthStatisticsSyncService northStatisticsSyncService;
     @Autowired
     NorthErrorService northErrorService;
+    @Autowired
+    RemoteOrgService remoteOrgService;
 
     @Override
     public ReceiveErrorDto saveDeviceData(DataPageDto<AirConditionerDeviceDataReq> request, String msgId, String path) {
@@ -65,7 +74,7 @@ public class IotAirConditionerServiceImpl extends ServiceImpl<IotAirConditionerM
                 return ReceiveErrorDto.success();
             }
             Map<String, Object> dataMap = checkParmaAndBuildData(airConditionerDeviceList, msgId, path);
-            doSyncTask(() -> saveData(dataMap,airConditionerDeviceList.size()));
+            doSyncTask(() -> saveData(dataMap, airConditionerDeviceList.size()));
         } catch (Exception e) {
             LogUtils.BASE_INFO_UPS_DEVICE.error("保存空调基础信息发生异常:{}", e);
             return ReceiveErrorDto.error(e.getMessage());
@@ -73,7 +82,7 @@ public class IotAirConditionerServiceImpl extends ServiceImpl<IotAirConditionerM
         return ReceiveErrorDto.success();
     }
 
-    private void saveData(Map<String, Object> map,int size) {
+    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");
@@ -97,7 +106,7 @@ public class IotAirConditionerServiceImpl extends ServiceImpl<IotAirConditionerM
 
     }
 
-    private void doSyncTask(Runnable runnable) throws RuntimeException  {
+    private void doSyncTask(Runnable runnable) throws RuntimeException {
         Future<?> future = threadPoolTaskExecutor.submit(runnable);
         try {
             future.get(); // 这将阻塞直到任务完成,并捕获任何异常
@@ -180,9 +189,67 @@ public class IotAirConditionerServiceImpl extends ServiceImpl<IotAirConditionerM
         return baseMapper.selectList(wrapper);
     }
 
+    private IotAirConditioner getByUniqueCode(String uniqueCode) {
+        LambdaQueryWrapper<IotAirConditioner> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(IotAirConditioner::getDeleted, 0);
+        wrapper.eq(IotAirConditioner::getUniqueCode, uniqueCode);
+        return baseMapper.selectOne(wrapper);
+    }
+
     @Override
     public ReceiveErrorDto saveDeviceStatus(AirConditionerDeviceStatusReq request, String msgId, String path) {
-        return null;
+        try {
+            String value = DigestUtils.md5Hex(JacksonUtils.toJSONString(request.getInfos()));
+            String key = request.getOrgCode() + request.getDeviceCode() + "upsdata";
+            //验证是否在段时间内收到重复的数据
+            if (!RedisCheckRepeatDataUtil.checkData(key, value)) {
+                return ReceiveErrorDto.success("数据已接受,短时间内收到相同的数据,处理结果忽略:拒绝处理该数据");
+            }
+            //验证参数是否齐全
+            ReceiveErrorDto dto = CheckDataUtil.checkObjFieldIsNull(request, null);
+            if (!dto.getSuccess()) {
+                return dto;
+            }
+            //处理数据
+            Map<String, Object> map = this.buildUpsAndData(request);
+            dto = (ReceiveErrorDto) map.get("errorDto");
+            if (!dto.getSuccess()) {
+                return dto;
+            }
+            IotAirConditioner conditioner = (IotAirConditioner) map.get("airConditioner");
+
+            baseMapper.updateById(conditioner);
+        } catch (Exception e) {
+
+            LogUtils.STATUS_AIR_CONDITIONER_DATA.error("保存upsDevice失败:{}", e.getMessage());
+            return ReceiveErrorDto.error(e.getMessage());
+        }
+        return ReceiveErrorDto.success();
+    }
+
+    private Map<String, Object> buildUpsAndData(AirConditionerDeviceStatusReq request) {
+        String info = JSON.toJSONString(request.getInfos());
+        IotAirConditioner airConditioner = this.getByUniqueCode(IotAirConditioner.getUniqueCode(request.getOrgCode(), request.getHostCode(), request.getDeviceCode()));
+        ReceiveErrorDto errorDto = ReceiveErrorDto.success();
+        Map<String, Object> map = new HashMap<>();
+        if (airConditioner == null) {
+            errorDto.setSuccess(false);
+            errorDto.setErrorMsg("空调设备不存在!");
+            map.put("errorDto", errorDto);
+            return map;
+        }
+        SysOrg org = remoteOrgService.findByCode(request.getOrgCode(), SecurityConstants.INNER);
+        if (org == null) {
+            errorDto.setSuccess(false);
+            errorDto.setErrorMsg("orgCode不正确,机构信息未找到!");
+            map.put("errorDto", errorDto);
+            return map;
+        }
+        airConditioner.setUpdateTime(DateUtils.toLocalDateTime(request.getUpdateTime()));
+        airConditioner.setInfo(info);
+        map.put("errorDto", errorDto);
+        map.put("airConditioner", airConditioner);
+        return map;
     }