소스 검색

八小时回路接口代码优化

jingyuanchao 1 년 전
부모
커밋
f23a6e298a

+ 1 - 1
project_data/sql/0.1.1/soc/soc.sql

@@ -166,7 +166,7 @@ CREATE TABLE `iot_breaker_data_log` (
           `device_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '设备code(外网平台用于匹配8小时回路名称)',
           `device_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '设备类型编码: 4186',
           `device_unique_code` varchar(225) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'orgCode+hostCode+deviceCode组成设备唯一',
-          `status` int DEFAULT NULL COMMENT '状态标识(0/1)0:断电 | 1:通电',
+          `status` int DEFAULT NULL COMMENT '状态标识(0/1)0:断电 | 1:通电 | 2:未知',
           `deleted` int DEFAULT NULL COMMENT '0正常1删除',
           `breaker_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回路电相名同步的名称',
           `breaker_alias_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回路电相名用户取的名称',

+ 1 - 1
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/iot/domain/IotBreakerDevice.java

@@ -62,7 +62,7 @@ public class IotBreakerDevice implements Serializable {
     @TableField("device_unique_code")
     private String deviceUniqueCode;
 
-    @ApiModelProperty(value = "状态标识(0/1)0:断电 | 1:通电")
+    @ApiModelProperty(value = "状态标识(0/1)0:断电 | 1:通电 | 2:未知")
     @TableField("status")
     private Integer status;
 

+ 1 - 17
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/breaker/controller/BreakerController.java

@@ -6,7 +6,6 @@ import com.alibaba.fastjson2.JSON;
 import com.xunmei.mediator.api.breaker.dto.BreakerDeviceDataDto;
 import com.xunmei.mediator.api.breaker.dto.BreakerDeviceDto;
 import com.xunmei.mediator.api.breaker.service.IotBreakerDeviceService;
-import com.xunmei.mediator.util.RedisCheckRepeatDataUtil;
 import com.xunmei.system.api.dto.DataPageDto;
 import com.xunmei.system.api.dto.protection.ReceiveErrorDto;
 import com.xunmei.system.api.util.LogUtils;
@@ -34,7 +33,6 @@ public class BreakerController {
     IotBreakerDeviceService breakerDeviceService;
 
 
-
     @ApiOperation("接受8小时回路信息同步")
     @PostMapping({"/api/data/breakerDeviceList"})
     public ReceiveErrorDto breakerDeviceList(String msgId, @RequestBody DataPageDto<BreakerDeviceDto> request) {
@@ -43,7 +41,6 @@ public class BreakerController {
         try {
             errorDto = this.breakerDeviceService.saveBreakerDevice(request, msgId);
         } catch (Exception e) {
-
             LogUtils.BASE_INFO_BREAKER_DEVICE.error("保存失败,{}", e);
             return ReceiveErrorDto.error("保存失败:" + e);
         }
@@ -56,21 +53,8 @@ public class BreakerController {
     public ReceiveErrorDto statusBreaker(String msgId, @RequestBody BreakerDeviceDataDto request) {
         LogUtils.BASE_INFO_BREAKER_DEVICE_DATA.info("【北向接口-{}】【branchId:{}】接收参数:{}】", "8小时回路实时状态信息:/api/status/breaker", msgId, JSON.toJSONString(request));
         ReceiveErrorDto errorDto = ReceiveErrorDto.success();
-        String value = request.getStatus() + "";
-        String key = request.getOrgCode() + request.getDeviceCode() + "breakerdata";
         try {
-            //目前对数据不做拦截
-            if (RedisCheckRepeatDataUtil.checkData(key, value, 24 * 60 * 60 * 1000)) {
-                //修改为状态不变用不接受
-                if (RedisCheckRepeatDataUtil.checkData(key, value, -1)) {
-                    errorDto = this.breakerDeviceService.saveBreakerData(request, msgId);
-                } else {
-                    //保存拦截数据
-                    this.breakerDeviceService.saveBreakerDataLog(request, msgId);
-                    errorDto.setSuccess(true);
-                    errorDto.setErrorMsg("数据已接受,短时间内收到相同的回路数据,处理结果忽略:拒绝处理该数据");
-                }
-            }
+            errorDto = this.breakerDeviceService.saveBreakerData(request, msgId);
         } catch (Exception e) {
             LogUtils.BASE_INFO_BREAKER_DEVICE_DATA.error("保存失败,{}", e);
             return ReceiveErrorDto.error("保存失败:" + e);

+ 75 - 45
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/breaker/service/impl/IotBreakerDeviceServiceImpl.java

@@ -102,10 +102,9 @@ public class IotBreakerDeviceServiceImpl extends ServiceImpl<IotBreakerDeviceMap
 
     private void saveBreaker(List<BreakerDeviceDto> list, List<SysOrgVO> orgList, String msgId) throws IllegalAccessException {
         //对回路信息按机构进行分组
-        // Map<String,List<BreakerDeviceDto>> listMap = breakerDeviceDtoLists.stream().collect(Collectors.groupingBy(r -> r.getOrgCode()));
-        List<IotBreaker> breakers = new ArrayList<>();
+        List<IotBreaker> insertBreakersList = new ArrayList<>();
         List<IotBreaker> listAll = breakerMapper.selectList(null);
-        List<IotBreaker> breakers1 = new ArrayList<>();
+        List<IotBreaker> updateBreakersList = new ArrayList<>();
         List<NorthError> errors = new ArrayList<>();
         NorthError error = null;
         for (BreakerDeviceDto dto : list) {
@@ -125,20 +124,26 @@ public class IotBreakerDeviceServiceImpl extends ServiceImpl<IotBreakerDeviceMap
                 continue;
             }
             IotBreaker breaker = this.buildBreaker(dto, org);
-            if (listAll.stream().anyMatch(r -> r.getUniqueCode().equals(breaker.getUniqueCode()))) {
-                breakers1.add(breaker);
+            Optional<IotBreaker> breakerOptional = listAll.stream().filter(r -> r.getUniqueCode().equals(breaker.getUniqueCode())).findAny();
+            if (breakerOptional.isPresent()) {
+                IotBreaker iotBreaker = breakerOptional.get();
+                iotBreaker.setUpdateTime(LocalDateTime.now());
+                BeanUtils.copyProperties(breaker, iotBreaker, "id");
+                updateBreakersList.add(iotBreaker);
             } else {
-                breakers.add(breaker);
+                breaker.setCreateTime(LocalDateTime.now());
+                breaker.setUpdateTime(LocalDateTime.now());
+                insertBreakersList.add(breaker);
             }
         }
         northErrorService.saveErrorData(errors);
         try {
             breakerMapper.updateAllDel();
-            if (ObjectUtil.isNotEmpty(breakers)) {
-                breakerMapper.batchInsert(breakers);
+            if (ObjectUtil.isNotEmpty(insertBreakersList)) {
+                breakerMapper.batchInsert(insertBreakersList);
             }
-            if (ObjectUtil.isNotEmpty(breakers1)) {
-                breakerMapper.batchUpdate(breakers1);
+            if (ObjectUtil.isNotEmpty(updateBreakersList)) {
+                breakerMapper.batchUpdate(updateBreakersList);
             }
 
         } catch (Exception e) {
@@ -176,43 +181,51 @@ public class IotBreakerDeviceServiceImpl extends ServiceImpl<IotBreakerDeviceMap
 
     @Override
     public ReceiveErrorDto saveBreakerData(BreakerDeviceDataDto request, String msgId) throws IllegalAccessException {
+        String uniqueCode = IotBreaker.getUniqueCode(request.getOrgCode(), request.getHostCode(), request.getDeviceCode());
+        if (!RedisCheckRepeatDataUtil.checkData(uniqueCode, request.getStatus() + "", -1)) {
+            //保存拦截数据
+            this.saveBreakerDataLog(request, msgId);
+            return ReceiveErrorDto.success("数据已接受,短时间内收到相同的回路数据,处理结果忽略:拒绝处理该数据");
+        }
         //验证参数是否齐全
         List<SysOrgVO> cacheList = RedisUtils.getCacheList(CacheConstants.ORG_CACHE_LIST_KEY);
-        ReceiveErrorDto dto = checkBreakerDataInfo(request,cacheList);
-        if (dto.getSuccess()) {
-            //处理数据
-            Map<String, Object> map = this.buildBreakerAndData(request);
-            dto = (ReceiveErrorDto) map.get("errorDto");
-            if (dto.getSuccess()) {
-                IotBreakerDevice breakerDevice = (IotBreakerDevice) map.get("breakerDevice");
-                IotBreakerDeviceData breakerDeviceData = (IotBreakerDeviceData) map.get("breakerDeviceData");
-                IotBreaker breaker = (IotBreaker) map.get("breaker");
-                IotBreakerData breakerData = (IotBreakerData) map.get("breakerData");
-                IotPowerOffAlarm powerOffAlarm = (IotPowerOffAlarm) map.get("powerOffAlarm");
-
-                try{
-                    baseMapper.updateById(breakerDevice);
-                    breakerDeviceDataMapper.insert(breakerDeviceData);
-                    if(breaker!=null){
-                        breakerMapper.updateById(breaker);
-                    }
-                    if(breakerData!=null){
-                        breakerDataMapper.insert(breakerData);
-                        breakerDataLogMapper.insertDataLog(breakerData);
-                    }
-                    if(powerOffAlarm!=null){
-                        powerOffAlarmService.saveOrUpdate(powerOffAlarm);
-                        //如果是通电,则将他之前的所有断电记录的恢复时间设置为当前记录的恢复时间
-                        if(powerOffAlarm.getRecoveryTime()!=null){
-                            powerOffAlarmMapper.saveOrUpdateOtherPower(powerOffAlarm);
-                        }
-                    }
+        ReceiveErrorDto dto = checkBreakerDataInfo(request, cacheList);
+        if (!dto.getSuccess()) {
+            return dto;
+        }
+        //处理数据
+        Map<String, Object> map = this.buildBreakerAndData(request);
+        dto = (ReceiveErrorDto) map.get("errorDto");
+        if (!dto.getSuccess()) {
+            return dto;
+        }
+        IotBreakerDevice breakerDevice = (IotBreakerDevice) map.get("breakerDevice");
+        IotBreakerDeviceData breakerDeviceData = (IotBreakerDeviceData) map.get("breakerDeviceData");
+        IotBreaker breaker = (IotBreaker) map.get("breaker");
+        IotBreakerData breakerData = (IotBreakerData) map.get("breakerData");
+        IotPowerOffAlarm powerOffAlarm = (IotPowerOffAlarm) map.get("powerOffAlarm");
 
-                }catch (Exception e){
-                    LogUtils.BASE_INFO_BREAKER_DEVICE_DATA.error("保存回路数据失败:{}", e);
-                    throw new RuntimeException (e.getMessage());
+        try {
+            baseMapper.updateById(breakerDevice);
+            breakerDeviceDataMapper.insert(breakerDeviceData);
+            if (breaker != null) {
+                breakerMapper.updateById(breaker);
+            }
+            if (breakerData != null) {
+                breakerDataMapper.insert(breakerData);
+                breakerDataLogMapper.insertDataLog(breakerData);
+            }
+            if (powerOffAlarm != null) {
+                powerOffAlarmService.saveOrUpdate(powerOffAlarm);
+                //如果是通电,则将他之前的所有断电记录的恢复时间设置为当前记录的恢复时间
+                if (powerOffAlarm.getRecoveryTime() != null) {
+                    powerOffAlarmMapper.saveOrUpdateOtherPower(powerOffAlarm);
                 }
             }
+
+        } catch (Exception e) {
+            LogUtils.BASE_INFO_BREAKER_DEVICE_DATA.error("保存回路数据失败:{}", e);
+            throw new RuntimeException(e.getMessage());
         }
         return dto;
     }
@@ -245,7 +258,10 @@ public class IotBreakerDeviceServiceImpl extends ServiceImpl<IotBreakerDeviceMap
         Map<String, Object> map = new HashMap<>();
         ReceiveErrorDto errorDto = new ReceiveErrorDto();
         QueryWrapper<IotBreakerDevice> qbreaker = new QueryWrapper<>();
-        qbreaker.lambda().eq(IotBreakerDevice::getDeviceUniqueCode, IotBreakerDevice.getUniqueCode(request.getOrgCode(), request.getHostCode(), request.getDeviceCode()));
+        qbreaker.lambda().eq(IotBreakerDevice::getDeviceUniqueCode,
+                IotBreakerDevice.getUniqueCode(request.getOrgCode(),
+                        request.getHostCode(),
+                        request.getDeviceCode()));
         qbreaker.lambda().eq(IotBreakerDevice::getDeleted, 0);
 
         IotBreakerDevice breakerDevice = baseMapper.selectOne(qbreaker);
@@ -405,8 +421,8 @@ public class IotBreakerDeviceServiceImpl extends ServiceImpl<IotBreakerDeviceMap
             Optional<IotBreakerDevice> deviceOptional = breakerDeviceAllOlds.stream().filter(r -> r.getDeviceUniqueCode().equals(breakerDeviceNew.getDeviceUniqueCode())).findAny();
             if (deviceOptional.isPresent()) {
                 IotBreakerDevice breakerDeviceOld = deviceOptional.get();
-                BeanUtils.copyProperties(breakerDeviceNew, breakerDeviceOld);
                 breakerDeviceNew.setUpdateTime(LocalDateTime.now());
+                BeanUtils.copyProperties(breakerDeviceNew, breakerDeviceOld, "id");
                 breakerDeviceOlds.add(breakerDeviceOld);
             } else {
                 breakerDeviceNew.setId(IdWorker.getId());
@@ -449,7 +465,9 @@ public class IotBreakerDeviceServiceImpl extends ServiceImpl<IotBreakerDeviceMap
                 .orgPath(org.getPath())
                 .deviceUniqueCode(IotBreakerDevice.getUniqueCode(org.getCode(), req.getHostCode(), req.getDeviceCode()))
                 .breakerName(breakerName)
+                .status(2)
                 .deleted(0)
+                .createTime(LocalDateTime.now())
                 .breakerUniqueCode(breakerUniqueCode).build();
     }
 
@@ -472,6 +490,18 @@ public class IotBreakerDeviceServiceImpl extends ServiceImpl<IotBreakerDeviceMap
             deviceCode = dto.getDeviceCode().substring(0, dto.getDeviceCode().length() - 4) + "1001";
         }
         String uniqueCode = IotBreaker.getUniqueCode(org.getCode(), dto.getHostCode(), index);
-        return IotBreaker.builder().name(name).orgId(org.getId()).orgName(org.getName()).orgPath(org.getPath()).id(IdWorker.getId()).uniqueCode(uniqueCode).deleted(0).deviceCode(deviceCode).type(type).build();
+        return IotBreaker.builder().
+                name(name)
+                .orgId(org.getId())
+                .orgName(org.getName())
+                .orgPath(org.getPath())
+                .id(IdWorker.getId())
+                .uniqueCode(uniqueCode)
+                .deleted(0)
+                .status(2)
+                .breakerName(name)
+                .deviceCode(deviceCode)
+                .type(type)
+                .build();
     }
 }

+ 10 - 9
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/ups/service/impl/IotUpsServiceImpl.java

@@ -61,14 +61,16 @@ public class IotUpsServiceImpl extends ServiceImpl<IotUpsMapper, IotUps> impleme
     public ReceiveErrorDto saveUpsDevice(DataPageDto<UpsDeviceDto> request, String msgId) throws IllegalAccessException {
         //验证基础分页信息
         ReceiveErrorDto dto = CheckDataUtil.checkObjFieldIsNull(request);
-        if (dto.getSuccess()) {
-            List<UpsDeviceDto> upsDeviceDtoLists = RedisCheckRepeatDataUtil.isCompleted(request, UpsDeviceDto.class);
-            LogUtils.BASE_INFO_UPS_DEVICE.info("判断是否获取UPS同步全部信息分页数据:{}", !upsDeviceDtoLists.isEmpty());
-            if (!upsDeviceDtoLists.isEmpty()) {
-                Map<String, Object> map = this.checkUpsInfo(upsDeviceDtoLists, msgId);
-                this.saveAll(map, upsDeviceDtoLists);
-            }
+        if (!dto.getSuccess()) {
+           return dto;
+        }
+        List<UpsDeviceDto> upsDeviceDtoLists = RedisCheckRepeatDataUtil.isCompleted(request, UpsDeviceDto.class);
+        LogUtils.BASE_INFO_UPS_DEVICE.info("判断是否获取UPS同步全部信息分页数据:{}", !upsDeviceDtoLists.isEmpty());
+        if (upsDeviceDtoLists.isEmpty()) {
+           return ReceiveErrorDto.success();
         }
+        Map<String, Object> map = this.checkUpsInfo(upsDeviceDtoLists, msgId);
+        this.saveAll(map, upsDeviceDtoLists);
         return dto;
     }
 
@@ -80,10 +82,8 @@ public class IotUpsServiceImpl extends ServiceImpl<IotUpsMapper, IotUps> impleme
         if (!RedisCheckRepeatDataUtil.checkData(key, value)) {
             return ReceiveErrorDto.success("数据已接受,短时间内收到相同的ups数据,处理结果忽略:拒绝处理该数据");
         }
-
         //验证参数是否齐全
         ReceiveErrorDto dto = checkUpsDataInfo(request);
-
         if (!dto.getSuccess()) {
             return dto;
         }
@@ -97,6 +97,7 @@ public class IotUpsServiceImpl extends ServiceImpl<IotUpsMapper, IotUps> impleme
         try {
             baseMapper.updateById(upsDevice);
         } catch (Exception e) {
+            RedisCheckRepeatDataUtil.delKey(key);
             log.error("保存upsDevice失败:{}", e.getMessage());
             throw new RuntimeException(e.getMessage());
         }

+ 15 - 40
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/util/RedisCheckRepeatDataUtil.java

@@ -26,55 +26,30 @@ public class RedisCheckRepeatDataUtil {
      * @return
      */
     public static boolean checkData(String key, String value) {
-        boolean flag = true;
-        if (redisTemplate.hasKey(key)) {
-            String val = (String) redisTemplate.opsForValue().get(key);
-            if (val != null) {
-                if (value.equals(val)) {
-                    flag = false;
-                } else {
-                    redisTemplate.opsForValue().set(key, value);
-                    redisTemplate.expire(key, 60, TimeUnit.MINUTES);
-                }
-            } else {
-                redisTemplate.opsForValue().set(key, value);
-                redisTemplate.expire(key, 60, TimeUnit.MINUTES);
-            }
-        } else {
-            redisTemplate.opsForValue().set(key, value);
-            redisTemplate.expire(key, 60, TimeUnit.MINUTES);
-        }
-        return flag;
+        return checkData(key, value, -1);
     }
 
     public static boolean checkData(String key, String value, int timeOut) {
         boolean flag = true;
-        if (Boolean.TRUE.equals(redisTemplate.hasKey(key))) {
-            String val = (String) redisTemplate.opsForValue().get(key);
-            if (val != null) {
-                if (value.equals(val)) {
-                    flag = false;
-                } else {
-                    redisTemplate.opsForValue().set(key, value);
-                    if (timeOut > 0) {
-                        redisTemplate.expire(key, timeOut, TimeUnit.MINUTES);
-                    }
-                }
-            } else {
-                redisTemplate.opsForValue().set(key, value);
-                if (timeOut > 0) {
-                    redisTemplate.expire(key, timeOut, TimeUnit.MINUTES);
-                }
-            }
+        if (Boolean.FALSE.equals(redisTemplate.hasKey(key))) {
+            redisTemplate.opsForValue().set(key, value);
+            redisTemplate.expire(key, timeOut, TimeUnit.MINUTES);
+            return flag;
+        }
+        String val = (String) redisTemplate.opsForValue().get(key);
+        if (value.equals(val)) {
+            flag = false;
         } else {
             redisTemplate.opsForValue().set(key, value);
-            if (timeOut > 0) {
-                redisTemplate.expire(key, timeOut, TimeUnit.MINUTES);
-            }
+            redisTemplate.expire(key, timeOut, TimeUnit.MINUTES);
         }
         return flag;
     }
 
+    public static boolean delKey(String key) {
+        return Boolean.TRUE.equals(redisTemplate.delete(key));
+    }
+
     /**
      * 分页数据数据在redis中的存取
      *
@@ -109,7 +84,7 @@ public class RedisCheckRepeatDataUtil {
         //判断是否拿到所有的数据
         final List<Boolean> list = allPageKeyList.stream().map(redisTemplate::hasKey).distinct().collect(Collectors.toList());
         if (list.contains(Boolean.FALSE)) {
-             return ListUtil.empty();
+            return ListUtil.empty();
         }
 
         return allPageKeyList.stream().map(k -> {