|
|
@@ -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;
|
|
|
}
|
|
|
|
|
|
|