From 2fcc1a1b8f09a731af53247d0b5e88397649fb44 Mon Sep 17 00:00:00 2001
From: dengzedong <dengzedong@email>
Date: 星期五, 10 一月 2025 17:50:44 +0800
Subject: [PATCH] 数据采集bug

---
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/hikvision/utils/MessageCode.java                  |    2 
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/DaPointCollectStatusServiceImpl.java |   26 ------------
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/DaPointCollectStatusService.java          |    2 
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CumulateHandle.java            |   20 ++++++++--
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/ConstantHandle.java            |    3 +
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/MeasureHandle.java             |   17 ++++----
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/PointCollector.java                    |   14 ++++---
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CalculateHandle.java           |   28 +++++++++-----
 8 files changed, 56 insertions(+), 56 deletions(-)

diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/PointCollector.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/PointCollector.java
index f263bd2..53f9b2f 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/PointCollector.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/PointCollector.java
@@ -89,22 +89,24 @@
         try {
             Map<String, Object> dataMap = new HashMap<>();
             List<InfluxPointValuePOJO> pointValues = new ArrayList<>();
-
+            // 记录点位状态
+            List<String> listGood = new ArrayList<>();
+            List<String> listBad = new ArrayList<>();
             log.info("读取常量点");
             List<DaPointDTO> pointConstantList = daPointService.getConstantPoint(minfreq);
-            pointValues.addAll(constantHandle.handle(collectTime, pointConstantList, dataMap));
+            pointValues.addAll(constantHandle.handle(collectTime, pointConstantList, dataMap,listGood,listBad));
 
             log.info("读取测量点");
             List<DaPointDTO> pointMeasureList = daPointService.getMeasurePoint(minfreq);
-            pointValues.addAll(measureHandle.handle(collectTime, pointMeasureList, dataMap));
+            pointValues.addAll(measureHandle.handle(collectTime, pointMeasureList, dataMap,listGood,listBad));
 
             log.info("读取计算点");
             List<DaPointDTO> pointCalculateList = daPointService.getMathPoint(minfreq);
-            pointValues.addAll(calculateHandle.handle(collectTime, pointCalculateList, dataMap));
+            pointValues.addAll(calculateHandle.handle(collectTime, pointCalculateList, dataMap,listGood,listBad));
 
             log.info("读取累计点");
             List<DaPointDTO> pointCumulateList = daPointService.getCumulatePoint(minfreq);
-            pointValues.addAll(cumulateHandle.handle(collectTime, pointCumulateList));
+            pointValues.addAll(cumulateHandle.handle(collectTime, pointCumulateList,listGood,listBad));
 
             log.info("存入时序库");
             influxDBService.asyncWritePointValues(pointValues);
@@ -123,7 +125,7 @@
                 }
             }
             log.info("更新采集状态");
-            daPointCollectStatusService.recordStatusList(pointValues, collectTime);
+            daPointCollectStatusService.recordStatusList(listGood,listBad, collectTime);
             log.info("采集完成");
         } catch (Exception ex) {
             log.info("采集异常!");
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CalculateHandle.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CalculateHandle.java
index f140509..d97b8f7 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CalculateHandle.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CalculateHandle.java
@@ -50,7 +50,7 @@
 
     public static final String regex = "[+\\-\\*/()\\&\\|\\>\\<]";
 
-    public List<InfluxPointValuePOJO> handle(Date collectTime, List<DaPointDTO> dtos, Map<String, Object> dataMap) {
+    public List<InfluxPointValuePOJO> handle(Date collectTime, List<DaPointDTO> dtos, Map<String, Object> dataMap,List<String> listGood,List<String> listBad) {
         List<InfluxPointValuePOJO> result = new ArrayList<>();
         try {
             log.info("计算点处理开始");
@@ -59,7 +59,7 @@
             }
             dtos.forEach(dto -> {
                 try {
-                    Object value = singleCompute(dto, dataMap);
+                    Object value = singleCompute(dto, dataMap, listGood, listBad);
                     InfluxPointValuePOJO pojo = GenInfluxPointValueUtils.getByPoint(dto, value);
                     pojo.setTimestamp(collectTime.toInstant());
                     result.add(pojo);
@@ -77,14 +77,20 @@
         return result;
     }
 
-    private Object singleCompute(DaPointDTO dto, Map<String, Object> dataMap) {
+    private Object singleCompute(DaPointDTO dto, Map<String, Object> dataMap,List<String> listGood,List<String> listBad) {
         String expression = dto.getExpression();
         String[] arr = expression.split(regex);
+        // 判断arr都在dataMap中包含
+        if (!Arrays.stream(arr).allMatch(dataMap::containsKey)) {
+            listBad.add(dto.getPointNo());
+            return CommonConstant.BAD_VALUE;
+        }
 
         for (int i = 0; i < arr.length; i++) {
             String s = arr[i];
             if (StringUtils.isNotBlank(s) && dataMap.containsKey(s)) {
-                expression = expression.replace(s, dataMap.get(s).toString());
+                // 对每个数加(),否则负值报错
+                expression = expression.replace(s, "(" + dataMap.get(s).toString() + ")");
             }
         }
         expression = expression.replace("&", "&&");
@@ -94,22 +100,24 @@
         log.info("PointNo=" + dto.getPointNo() + ";expression=" + expression);
         String result = javaScriptHandler.eval(expression);
         log.info("result=" + result);
-        if (result == null) {
+        if (result == null || result.contains(JsErrorCode.Infinity.name()) || result.contains(JsErrorCode.NaN.name())) {
+            listBad.add(dto.getPointNo());
             return CommonConstant.BAD_VALUE;
-        } else if (result.contains(JsErrorCode.Infinity.name()) ||
-                result.contains(JsErrorCode.NaN.name())) {
-            log.info("计算异常,使用默认值");
-            return dto.getDefaultValue() == null ? BigDecimal.ZERO : dto.getDefaultValue();
         } else {
             if (DataTypeEnum.INT.getCode().equals(dto.getDataType())) {
+                listGood.add(dto.getPointNo());
                 return new BigDecimal(result).intValue();
             } else if (DataTypeEnum.FLOAT.getCode().equals(dto.getDataType())) {
+                listGood.add(dto.getPointNo());
                 return new BigDecimal(result).setScale(4, BigDecimal.ROUND_UP).doubleValue();
             } else if (DataTypeEnum.BOOLEAN.getCode().equals(dto.getDataType())) {
+                listGood.add(dto.getPointNo());
                 return Boolean.parseBoolean(result);
+            } else {
+                listBad.add(dto.getPointNo());
+                throw new RuntimeException("计算异常,未知数据类型");
             }
         }
-        return result;
     }
 
     public Map<String, Object> getCurrent(List<String> pointNos) {
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/ConstantHandle.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/ConstantHandle.java
index 96f7e8a..8aed10c 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/ConstantHandle.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/ConstantHandle.java
@@ -25,7 +25,7 @@
     @Resource
     private DaPointService daPointService;
 
-    public List<InfluxPointValuePOJO> handle(Date collectTime, List<DaPointDTO> dtos, Map<String, Object> dataMap) {
+    public List<InfluxPointValuePOJO> handle(Date collectTime, List<DaPointDTO> dtos, Map<String, Object> dataMap,List<String> listGood,List<String> listBad) {
         log.info("常量点处理开始");
         List<InfluxPointValuePOJO> result = new ArrayList<>();
         if (CollectionUtils.isEmpty(dtos)) {
@@ -36,6 +36,7 @@
             pojo.setTimestamp(collectTime.toInstant());
             dataMap.put(dto.getPointNo(), dto.getDefaultValue());
             result.add(pojo);
+            listGood.add(dto.getPointNo());
         });
         log.info("常量点处理结束");
         return result;
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CumulateHandle.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CumulateHandle.java
index 23a3287..05e28d2 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CumulateHandle.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CumulateHandle.java
@@ -43,7 +43,7 @@
     @Autowired
     private RedisTemplate<String, Object> redisTemplate;
 
-    public List<InfluxPointValuePOJO> handle(Date collectTime, List<DaPointDTO> dtos) {
+    public List<InfluxPointValuePOJO> handle(Date collectTime, List<DaPointDTO> dtos,List<String> listGood,List<String> listBad) {
         List<InfluxPointValuePOJO> result = new ArrayList<>();
         try {
             log.info("累计点处理开始");
@@ -52,7 +52,7 @@
             }
             dtos.forEach(dto -> {
                 try {
-                    Object value = singleCompute(dto, collectTime);
+                    Object value = singleCompute(dto, collectTime,listGood,listBad);
                     InfluxPointValuePOJO pojo = GenInfluxPointValueUtils.getByPoint(dto, value);
                     pojo.setTimestamp(collectTime.toInstant());
                     result.add(pojo);
@@ -89,10 +89,16 @@
         return data;
     }
 
-
     private Object singleCompute(DaPointDTO dto, Date collectTime) {
+        return singleCompute(dto,collectTime,null,null);
+    }
+
+    private Object singleCompute(DaPointDTO dto, Date collectTime,List<String> listGood,List<String> listBad) {
         ApiPointDTO pointDTO = dataPointApi.getInfoByNo(dto.getMomentPoint());
         if (pointDTO == null) {
+            if (listBad != null) {
+                listBad.add(dto.getPointNo());
+            }
             return CommonConstant.BAD_VALUE;
         }
         Calendar calendar = Calendar.getInstance();
@@ -108,12 +114,18 @@
 
         List<ApiPointValueDTO> dataList = dataPointApi.queryPointHistoryValue(queryDto);
         if (CollectionUtils.isEmpty(dataList)) {
+            if (listGood != null) {
+                listGood.add(dto.getPointNo());
+            }
             return BigDecimal.ZERO;
         } else if (dataList.size() < dto.getLength()) {
             // 补全数据
             dataList = completionData(dto.getLength(), dataList, startTime, endTime, pointDTO);
         }
         double total = dataList.stream().mapToDouble(ApiPointValueDTO::getV).sum();
+        if (listGood != null) {
+            listGood.add(dto.getPointNo());
+        }
         return new BigDecimal(total).divide(new BigDecimal(dto.getDivisor()), 2, BigDecimal.ROUND_HALF_UP);
     }
 
@@ -169,6 +181,6 @@
                 return item.getValue();
             }
         }
-        return null;
+        return 0.0;
     }
 }
\ No newline at end of file
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/MeasureHandle.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/MeasureHandle.java
index 482c718..27cfad0 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/MeasureHandle.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/MeasureHandle.java
@@ -64,7 +64,7 @@
     @Autowired
     private RedisTemplate<String, Object> redisTemplate;
 
-    public List<InfluxPointValuePOJO> handle(Date collectTime, List<DaPointDTO> dtos, Map<String, Object> dataMap) {
+    public List<InfluxPointValuePOJO> handle(Date collectTime, List<DaPointDTO> dtos, Map<String, Object> dataMap,List<String> listGood,List<String> listBad) {
         log.info("测量点处理开始");
         List<InfluxPointValuePOJO> result = new ArrayList<>();
         if (CollectionUtils.isEmpty(dtos)) {
@@ -112,26 +112,31 @@
         if (!CollectionUtils.isEmpty(httpTagIhd)) {
             tagValues.putAll(httpCollectorForIhd.getTagValues(httpTagIhd, collectTime));
         }
-        this.toCommonResult(collectTime, dtos, tagValues, dataMap, result);
+        this.toCommonResult(collectTime, dtos, tagValues, dataMap, result,listGood,listBad);
         log.info("测量点处理结束");
         return result;
     }
 
     private void toCommonResult(Date collectTime, List<DaPointDTO> dtos, Map<String, Object> tagValues,
-                          Map<String, Object> dataMap, List<InfluxPointValuePOJO> result) {
+                          Map<String, Object> dataMap, List<InfluxPointValuePOJO> result,List<String> listGood,List<String> listBad) {
         if (!CollectionUtils.isEmpty(tagValues)) {
             tagValues.forEach((k, v) -> {
                 dataMap.put(k, v);
             });
             dtos.forEach(dto -> {
                 String tagId = TagUtils.genTagId(dto.getSourceType(), dto.getSourceName(), dto.getTagNo());
-                if (tagValues.get(tagId) != null) {
+                if (tagValues.containsKey(tagId)) {
                     Object value = handleData(dto, tagValues.get(tagId));
                     InfluxPointValuePOJO pojo = GenInfluxPointValueUtils.getByPoint(dto, value);
                     pojo.setTimestamp(collectTime.toInstant());
                     dataMap.put(dto.getPointNo(), value);
                     result.add(pojo);
+                    listGood.add(dto.getPointNo());
                 } else {
+                    InfluxPointValuePOJO pojo = GenInfluxPointValueUtils.getByPoint(dto, CommonConstant.BAD_VALUE);
+                    pojo.setTimestamp(collectTime.toInstant());
+                    result.add(pojo);
+                    listBad.add(dto.getPointNo());
                     System.out.println("值异常!TagId=" + tagId);
                 }
             });
@@ -147,10 +152,6 @@
             if (DataTypeEnum.FLOAT.getCode().equals(dto.getDataType()) || DataTypeEnum.INT.getCode().equals(dto.getDataType())) {
                 BigDecimal rawValue = new BigDecimal(value.toString());
                 if(CommonConstant.BAD_VALUE.compareTo(rawValue) == 0) {
-                    return CommonConstant.BAD_VALUE;
-                }
-                // 异常值处理
-                if (rawValue.compareTo(maxValue) > 0 || rawValue.compareTo(minValue) < 0) {
                     return CommonConstant.BAD_VALUE;
                 }
                 BigDecimal coefficient = dto.getUnittransfactor() == null ? BigDecimal.ONE : dto.getUnittransfactor();
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/DaPointCollectStatusService.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/DaPointCollectStatusService.java
index 7948ab6..03d1fef 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/DaPointCollectStatusService.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/DaPointCollectStatusService.java
@@ -21,6 +21,6 @@
     void recordStatus(String pointNo, String collectValue, Date collectTime);
 
     @Async
-    void recordStatusList(List<InfluxPointValuePOJO> pointValues, Date collectTime);
+    void recordStatusList(List<String> listGood,List<String> listBad, Date collectTime);
 
 }
\ No newline at end of file
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/DaPointCollectStatusServiceImpl.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/DaPointCollectStatusServiceImpl.java
index c426c92..a21f21b 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/DaPointCollectStatusServiceImpl.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/DaPointCollectStatusServiceImpl.java
@@ -57,31 +57,7 @@
     }
 
     @Override
-    public void recordStatusList(List<InfluxPointValuePOJO> pointValues, Date collectTime) {
-        List<String> listGood = new ArrayList<>();
-        List<String> listBad = new ArrayList<>();
-        Object collectValue = null;
-        for (InfluxPointValuePOJO pointValue : pointValues) {
-            if (pointValue instanceof InfluxPointValueSimPOJO) {
-                InfluxPointValueSimPOJO pvo = (InfluxPointValueSimPOJO) pointValue;
-                collectValue = pvo.getValue();
-            } else if (pointValue instanceof InfluxPointValueDigPOJO) {
-                InfluxPointValueDigPOJO pvo = (InfluxPointValueDigPOJO) pointValue;
-                collectValue = pvo.getValue();
-            } else {
-                continue;
-            }
-            switch (DataQualityEnum.getEumByValue(collectValue)) {
-                case GOOD:
-                    listGood.add(pointValue.getPoint());
-                    break;
-                case BAD:
-                    listBad.add(pointValue.getPoint());
-                    break;
-                default:
-                    break;
-            }
-        }
+    public void recordStatusList(List<String> listGood,List<String> listBad, Date collectTime) {
         if (!CollectionUtils.isEmpty(listGood)) {
             QueryWrapper<DaPointCollectStatusEntity> queryWrapper = new QueryWrapper<>();
             queryWrapper.in("point_no", listGood);
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/hikvision/utils/MessageCode.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/hikvision/utils/MessageCode.java
index 546062b..0ca86dd 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/hikvision/utils/MessageCode.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/video/hikvision/utils/MessageCode.java
@@ -10,7 +10,7 @@
 //	public static final  String JsonSavePath = "D:/DLUT/json";//海康威视抓取图片上传路径
 	
 //	public static final String HIK_WIN_PATH = "hikvision/win64/HCNetSDK.dll";
-	public static final String HIK_WIN_PATH = "D:\\DLUT\\lib\\HCNetSDK.dll";
+	public static final String HIK_WIN_PATH = "D:\\DLUT\\lib\\hikvision\\win64\\HCNetSDK.dll";
 
 	public static final String ModelCode = "Image_feature";//模型代码
 

--
Gitblit v1.9.3