浏览代码

虚警抑制添加常用公式计算, 默认全部参数

Gaokun Wang 3 月之前
父节点
当前提交
4b44c0a2c8

+ 5 - 0
als-modules/agile-assurance/pom.xml

@@ -49,5 +49,10 @@
             <groupId>com.alibaba</groupId>
             <artifactId>QLExpress</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-math4-core</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 27 - 1
als-modules/agile-assurance/src/main/java/org/eco/als/controller/AlgorithmController.java

@@ -2,6 +2,8 @@ package org.eco.als.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.util.StrUtil;
+import com.ql.util.express.DefaultContext;
+import com.ql.util.express.ExpressRunner;
 import jakarta.annotation.Resource;
 import lombok.RequiredArgsConstructor;
 import org.eco.als.domain.bo.AlgorithmBo;
@@ -13,7 +15,9 @@ import org.eco.common.core.core.domain.CommonResult;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 算法相关控制
@@ -146,6 +150,28 @@ public class AlgorithmController {
     public CommonResult<Object> executeExpress(@RequestBody ExpressBo expressBo) throws Exception {
         // 执行表达式求值
 //        Object result = formulaService.evaluateExpression(expressBo);
-        return CommonResult.success();
+        ExpressRunner runner = new ExpressRunner();
+
+        Map<String, Object> variables = new HashMap<>();
+        variables.put("高度", 846.96);
+        variables.put("压力", 97.87);
+        DefaultContext<String, Object> context = new DefaultContext<>();
+
+        context.putAll(variables);
+        Boolean isMatch = (Boolean) runner.execute(expressBo.getExpression(), context, null, true, false);
+        return CommonResult.success(isMatch);
     }
+
+    /**
+     * 执行公式
+     *
+     * @param queryBo 入参
+     * @return org.eco.common.core.core.domain.CommonResult<java.lang.String> 结果
+     **/
+    @PostMapping("/execute/math")
+    public CommonResult<Object> executeMath(@RequestBody Map<String, String> queryBo) throws Exception {
+        return CommonResult.success(algorithmService.executeMath(queryBo));
+    }
+
+
 }

+ 3 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/service/IAlgorithmService.java

@@ -6,6 +6,7 @@ import org.eco.als.domain.bo.QaBo;
 import org.eco.als.domain.bo.TaskBo;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * @Description: IAlgorithmService
@@ -28,4 +29,6 @@ public interface IAlgorithmService {
     JSONArray getArrayByOssId(Long ossId);
 
     String executeQa(QaBo qaBo);
+
+    Map<String, Object> executeMath(Map<String, String> queryBo);
 }

+ 46 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/service/impl/AlgorithmService.java

@@ -17,6 +17,7 @@ import org.eco.als.domain.bo.*;
 import org.eco.als.domain.vo.*;
 import org.eco.als.service.*;
 import org.eco.als.utils.CsvUtils;
+import org.eco.als.utils.StatisticsCalculator;
 import org.eco.common.core.config.EcoConfig;
 import org.eco.common.core.constant.Constants;
 import org.eco.common.core.exception.BusinessException;
@@ -34,6 +35,7 @@ import java.util.*;
 
 /**
  * @Description: AlgorithmService
+ *
  * @Author: GaoKun Wang
  * @Date: 2024/7/30
  */
@@ -399,4 +401,48 @@ public class AlgorithmService implements IAlgorithmService {
         qaHistoryService.insert(qaHistoryBo);
         return data;
     }
+
+    @Override
+    public Map<String, Object> executeMath(Map<String, String> queryBo) {
+        String code = queryBo.get("code");
+        String sortieNo = queryBo.get("sortieNo");
+        String beginTime = queryBo.get("beginTime");
+        String endTime = queryBo.get("endTime");
+        JudgeFaultLogicVo judgeFaultLogicVo = judgeFaultLogicService.selectByHmc(code);
+        if (ObjectUtil.isEmpty(judgeFaultLogicVo)) {
+            throw new BusinessException("判故逻辑不能为空,请配置.");
+        }
+        DataImportVo dataImportVo = dataImportService.selectBySortieNo(sortieNo);
+        SysOssVo ossVo = ossService.getById(dataImportVo.getOssId());
+//        SysOssVo ossVo = ossService.getById(252244732393746432L);
+        // 数据库资源地址
+        String path = StringUtils.substringAfter(ossVo.getFileName(), Constants.RESOURCE_PREFIX);
+        String columnData = "高压压气机转子转数,风扇转子转速";
+//        String columnData = judgeFaultLogicVo.getAttribute1();
+        List<String> headerNames = Arrays.asList(columnData.split(","));
+        JSONObject res = CsvUtils.getDataByHeaders(path, Arrays.asList(columnData.split(",")), beginTime, endTime);
+        Map<String, Object> mapList = new HashMap<>();
+
+        headerNames.forEach(header -> {
+            JSONArray jsonArray = res.getJSONArray(header);
+            this.convert(jsonArray);
+            Map<String, Object> map = new HashMap<>();
+            StatisticsCalculator.STATISTICS_MAP.forEach((k, v) -> {
+                map.put(k, StatisticsCalculator.calculateStatistic(k, this.convert(jsonArray)));
+            });
+            mapList.put(header, map);
+        });
+        return mapList;
+    }
+
+    private double[] convert(JSONArray jsonArray) {
+        if (jsonArray == null || jsonArray.isEmpty()) {
+            return new double[0];
+        }
+        double[] doubleArray = new double[jsonArray.size()];
+        for (int i = 0; i < jsonArray.size(); i++) {
+            doubleArray[i] = Double.parseDouble(jsonArray.get(i).toString());
+        }
+        return doubleArray;
+    }
 }

+ 47 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/utils/CsvUtils.java

@@ -1,6 +1,8 @@
 package org.eco.als.utils;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.text.csv.CsvData;
@@ -8,6 +10,7 @@ import cn.hutool.core.text.csv.CsvReader;
 import cn.hutool.core.text.csv.CsvRow;
 import cn.hutool.core.text.csv.CsvUtil;
 import cn.hutool.core.util.CharsetUtil;
+import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
@@ -24,6 +27,7 @@ import org.eco.common.core.utils.uuid.Seq;
 import java.io.File;
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -280,6 +284,49 @@ public class CsvUtils {
         return jsonObject;
     }
 
+    public static JSONObject getDataByHeaders(String csvFilePath, List<String> headerNames, String begin, String end) {
+        log.info("getDataByHeaders 参数列:{}", headerNames);
+        List<CsvRow> rows = getCsvRowList(EcoConfig.getProfile() + csvFilePath);
+        // 获取CSV表头,即第一行数据
+        List<String> headers = rows.get(0).getRawList();
+        log.info("getDataByHeaders CSV表头:{}", headers.toString());
+        List<Integer> indexList = new ArrayList<>();
+        headerNames.forEach(name -> {
+            int index = headers.indexOf(name);
+            if (index != -1) {
+                log.info("表头:{},索引为:{}", name, index);
+                indexList.add(index);
+            }
+        });
+        if (CollectionUtil.isEmpty(indexList)) {
+            return null;
+        }
+        Date beginDate = null;
+        Date endDate = null;
+        if (StrUtil.isNotBlank(begin) && StrUtil.isNotBlank(end)) {
+            beginDate = DateUtil.parse(begin, DatePattern.NORM_DATETIME_MS_PATTERN);
+            endDate = DateUtil.parse(end, DatePattern.NORM_DATETIME_MS_PATTERN);
+        }
+        // 去除第一行,保留后续数据
+        List<CsvRow> dataLines = rows.subList(1, rows.size());
+        JSONObject jsonObject = new JSONObject();
+        for (int i = 0; i < headers.size(); i++) {
+            JSONArray jsonArray = new JSONArray();
+            for (CsvRow line : dataLines) {
+                Date currDate = DateUtil.parse(line.getRawList().get(headers.indexOf("时间")), DatePattern.NORM_DATETIME_MS_PATTERN);
+                if (!(ObjUtil.isEmpty(beginDate) || ObjUtil.isEmpty(end)) && !DateUtil.isIn(currDate, beginDate, endDate)) {
+                    continue;
+                }
+                jsonArray.add(line.getRawList().get(i));
+            }
+            // 参数索引位置
+            if (indexList.contains(i)) {
+                jsonObject.putOnce(headers.get(i), jsonArray);
+            }
+        }
+        return jsonObject;
+    }
+
     /**
      * 处理数据帧
      *

+ 61 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/utils/StatisticsCalculator.java

@@ -0,0 +1,61 @@
+package org.eco.als.utils;
+
+
+import org.apache.commons.math3.stat.StatUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Function;
+
+/**
+ * @description StatisticsCalculator
+ *
+ * @author GaoKunW
+ * @date 2025/3/14 10:37
+ */
+public class StatisticsCalculator {
+    // 定义公式名称与对应方法的映射
+    public static final Map<String, Function<double[], Object>> STATISTICS_MAP = new HashMap<>();
+    static {
+        // 算数平均数
+        STATISTICS_MAP.put("mean", StatUtils::mean);
+        // 方差
+        STATISTICS_MAP.put("variance", StatUtils::variance);
+        // 总体方差
+        STATISTICS_MAP.put("populationVariance", StatUtils::populationVariance);
+        // 和
+        STATISTICS_MAP.put("sum", StatUtils::sum);
+        // 最大值
+        STATISTICS_MAP.put("max", StatUtils::max);
+        // 最小值
+        STATISTICS_MAP.put("min", StatUtils::min);
+        // 众数
+        STATISTICS_MAP.put("mode", StatUtils::mode);
+        // 标准化
+//        STATISTICS_MAP.put("normalize", StatUtils::normalize);
+        // 几何平均数
+        STATISTICS_MAP.put("geometricMean", StatUtils::geometricMean);
+        // 对数求和
+//        STATISTICS_MAP.put("sumLog", StatUtils::sumLog);
+        // 平方和
+        STATISTICS_MAP.put("sumSq", StatUtils::sumSq);
+        // 可以继续添加其他公式
+    }
+//    public static Object
+
+
+    /**
+     * 根据公式名称计算统计指标
+     *
+     * @param formula 公式名称(如 "mean", "variance", "populationVariance" 等)
+     * @param values  数据集
+     * @return 计算结果
+     */
+    public static Object calculateStatistic(String formula, double[] values) {
+        Function<double[], Object> function = STATISTICS_MAP.get(formula);
+        if (function == null) {
+            throw new IllegalArgumentException("Unsupported formula: " + formula);
+        }
+        return function.apply(values);
+    }
+}

+ 9 - 0
pom.xml

@@ -66,6 +66,7 @@
         <easy-es.version>2.0.0-beta4</easy-es.version>
         <es.version>7.12.1</es.version>
         <ql.version>3.3.4</ql.version>
+        <commons-math4.version>4.0-beta1</commons-math4.version>
     </properties>
 
     <profiles>
@@ -109,6 +110,14 @@
                 <type>pom</type>
                 <scope>import</scope>
             </dependency>
+
+            <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-math4-core -->
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-math4-core</artifactId>
+                <version>${commons-math4.version}</version>
+            </dependency>
+
             <!-- QLExpress规则引擎的依赖配置-->
             <dependency>
                 <groupId>com.alibaba</groupId>