Prechádzať zdrojové kódy

公式相关:合格率计算对多组设计值优化

yangyj 1 rok pred
rodič
commit
be73b76da3

+ 77 - 29
blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java

@@ -20,6 +20,8 @@ import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Function;
+import java.util.function.Supplier;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -1204,18 +1206,31 @@ public class CustomFunction {
                 /*多个设计值*/
                 String[] designArr = designs.toString().split("/");
                 String[] devArr = dev.toString().split("/");
-                int total = 0;
-                int pass = 0;
-                List<List<Object>> dl = dataSpaceSplit(data, designArr);
-                for (int i = 0; i < designArr.length; i++) {
-                    Object[] obs = ck(dl.size() > i ? dl.get(i) : dl.get(dl.size() - 1), designArr[i], devArr.length > i ? devArr[i] : devArr[devArr.length - 1], xN);
-                    total += StringUtils.handleObj2Integer(obs[0]);
-                    pass += StringUtils.handleObj2Integer(obs[1]);
-                }
-                if (total > 0) {
+                AtomicInteger total = new AtomicInteger();
+                AtomicInteger pass = new AtomicInteger();
+                List<List<Object>> dl = dataSpaceSplit(data);
+                if(dl.size()==designArr.length){
+                    for (int i = 0; i < designArr.length; i++) {
+                        Object[] obs = ck(dl.size() > i ? dl.get(i) : dl.get(dl.size() - 1), designArr[i], devArr.length > i ? devArr[i] : devArr[devArr.length - 1], xN);
+                        total.addAndGet(StringUtils.handleObj2Integer(obs[0]));
+                        pass.addAndGet(StringUtils.handleObj2Integer(obs[1]));
+                    }
+                }else{
+                    data.stream().map(d -> Arrays.stream(designArr).filter(StringUtils::isNotEmpty).map(e -> CustomFunction.dXd(e, d,1,3)).reduce(Double.MAX_VALUE, (p, n) -> offRangeSum(p) < offRangeSum(n) ? p : n)).collect(Collectors.toCollection((Supplier<ArrayList<Object>>) ArrayList::new));
+                    List<Object> designList=Arrays.asList(designArr);
+                    Function<Object,Object> fc=d-> designList.stream().reduce(Double.MAX_VALUE, (p, n) -> offRangeSum(CustomFunction.dXd(p, d,1,3)) < offRangeSum(CustomFunction.dXd(n, d,1,3)) ? p : n);
+                    Map<Integer,List<Object>> group=data.stream().filter(StringUtils::isNotEmpty).collect(Collectors.groupingBy(x->designList.indexOf(fc.apply(x))));
+                    Object finalXN = xN;
+                    group.forEach((k, v)->{
+                        Object[] obs = ck(v, designArr[k], devArr.length > k ? devArr[k] : devArr[devArr.length - 1], finalXN);
+                        total.addAndGet(StringUtils.handleObj2Integer(obs[0]));
+                        pass.addAndGet(StringUtils.handleObj2Integer(obs[1]));
+                    });
+                }
+                if (total.get() > 0) {
                     result.add(total);
                     result.add(pass);
-                    result.add(total - pass);
+                    result.add(total.get() - pass.get());
                 }
             } else {
                 Object[] target = ck(data, designs, dev, xN);
@@ -1239,6 +1254,13 @@ public class CustomFunction {
         return result;
     }
 
+
+ /*   public static void main(String[] args) {
+        List<Object> list = Arrays.asList(21967,20853);
+        b445check(list,"21966/20849","±3",1).forEach(System.out::println);
+    }*/
+
+
     public static Object designFormat(Object design) {
         if (StringUtils.isNotEmpty(design)) {
             return Arrays.stream(design.toString().split("[^\\d.]")).filter(StringUtils::isNotEmpty).collect(Collectors.joining("/"));
@@ -1246,27 +1268,53 @@ public class CustomFunction {
         return "";
     }
 
-    public static List<List<Object>> dataSpaceSplit(List<Object> data, String[] designArr) {
+
+    public static double offRangeSum(Object o){
+        if(o.equals(Double.MAX_VALUE)){
+            return Double.MAX_VALUE;
+        }
+        return Arrays.stream(o.toString().split("[^0-9.\\-]")).mapToDouble(e->Math.pow(Double.parseDouble(e),2)).sum();
+    }
+
+
+    public static List<List<Object>> dataSpaceSplit(List<Object> data) {
         List<List<Object>> result = new ArrayList<>();
-        if (ListUtils.isNotEmpty(data) && designArr != null) {
-            /*首尾去空*/
-            data = listTrim(data);
-            String tmp = data.stream().map(StringUtils::handleNull).collect(Collectors.joining(","));
-            tmp = tmp.replaceAll(",,,+", ",,");
-            List<List<Object>> preliminary = Arrays.stream(tmp.split(",,")).map(CustomFunction::obj2ListNe).collect(Collectors.toList());
-            /*默认容量16,小于12不会自动扩容*/
-            LinkedHashMap<Integer, List<Object>> classify = new LinkedHashMap<>();
-            for (int i = 0; i < preliminary.size(); i++) {
-                int key = i % designArr.length;
-                classify.merge(key, preliminary.get(i), (v1, v2) -> {
-                    v1.addAll(v2);
-                    return v1;
-                });
-            }
-            result = new ArrayList<>(classify.values());
+        if (ListUtils.isNotEmpty(data)) {
+            List<Double> list= data.stream().filter(StringUtils::isNumber).map(x->Double.parseDouble(x.toString())).collect(Collectors.toList());
+            List<List<Double>> target=segmentList(list);
+            result=target.stream().map(l->l.stream().collect(Collectors.toCollection((Supplier<ArrayList<Object>>) ArrayList::new))).collect(Collectors.toList());
         }
         return result;
     }
+    static List<List<Double>> segmentList(List<Double> inputList) {
+        List<List<Double>> segments = new ArrayList<>();
+        List<Double> currentSegment = new ArrayList<>();
+        inputList.forEach(number -> {
+            if (currentSegment.isEmpty() || shouldSplit(currentSegment, number)) {
+                if (!currentSegment.isEmpty()) {
+                    segments.add(new ArrayList<>(currentSegment));
+                }
+                currentSegment.clear();
+            }
+            currentSegment.add(number);
+        });
+
+        if (!currentSegment.isEmpty()) {
+            segments.add(new ArrayList<>(currentSegment));
+        }
+
+        return segments;
+    }
+
+    static boolean shouldSplit(List<Double> segment, double number) {
+        if (segment.isEmpty()) {
+            return false;
+        }
+        double lastNumber = segment.get(segment.size() - 1);
+        double difference = Math.abs((number - lastNumber) / lastNumber);
+        return difference > 0.2 || difference > ((double) 50 / 100.0);
+    }
+
 
     public static List<Object> listTrim(List<Object> list) {
         List<Object> result = new ArrayList<>();
@@ -2629,11 +2677,11 @@ public class CustomFunction {
             if (StringUtils.isEmpty(scale)) {
                 scale = 0;
             }
-            String delimiter = handleNull(matcherFindGroup("[^0-9./]", design.toString(), 0, false));
+            String delimiter = handleNull(matcherFindGroup("[^0-9./E]", design.toString(), 0, false));
             if (StringUtils.isEmpty(delimiter)) {
                 delimiter = CONCAT;
             }
-            String delimiter2 = handleNull(matcherFindGroup("[^0-9.]", design.toString(), 0, false));
+            String delimiter2 = handleNull(matcherFindGroup("[^0-9.E]", data.toString(), 0, false));
             if (StringUtils.isEmpty(delimiter2)) {
                 delimiter2 = CONCAT;
             }

+ 18 - 11
blade-service/blade-manager/src/main/java/com/mixsmart/utils/StringUtils.java

@@ -1300,8 +1300,7 @@ public class StringUtils {
      * @Param [number]
      * @Author yangyj
      * @Date 2021.12.23 15:08
-     **/
-    /**去除有效数字后面的0*/
+     去除有效数字后面的0*/
     public static Integer getScale(Object... number) {
         int max = 0;
         if (number != null) {
@@ -1352,15 +1351,18 @@ public class StringUtils {
         return max;
     }
 
-//    public static void main(String[] args) {
-//        List<Double> list = new ArrayList<>();
-//        list.add(Double.parseDouble("0.3999999999999986"));
-//        list.add(Double.parseDouble("0.1999999999999996"));
-//        list.add(Double.parseDouble("-0.21"));
-//        list.add(Double.parseDouble("-1.2632e1"));
-//        System.out.println(getScale(list));
-//        System.out.println(getScaleZero(list));
-//    }
+/*
+    public static void main(String[] args) {
+        List<Object> list = new ArrayList<>();
+        list.add(Double.parseDouble("0.3999999999999986"));
+        list.add(Double.parseDouble("0.1999999999999996"));
+        list.add(Double.parseDouble("-0.21"));
+        list.add(Double.parseDouble("-1.21"));
+        list.add("-1.260");
+        System.out.println(getScale(list));
+        System.out.println(getScaleZero(list));
+    }
+*/
 
 /*    public static void main(String[] args) {
          List<Object> list = Arrays.asList("16.001",27.0,5,6);
@@ -1369,6 +1371,11 @@ public class StringUtils {
         System.out.println(getScale(150.0));
 
     }*/
+/*public static void main(String[] args) {
+    double x=Double.parseDouble("1.2562e2");
+    BigDecimal big= new BigDecimal(String.valueOf(x));
+    System.out.println(big.scale());
+}*/
 
     /**
      * @return java.lang.String

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -768,7 +768,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             /*初始化排序值,每个点间隔1000,方便插入*/
             AtomicInteger sort = new AtomicInteger();
             tec.formDataList.forEach(e -> e.setSort(sort.getAndAdd(1000)));
-            /*汇总阶段执行的公式*/
+            /*收集汇总阶段执行的公式*/
             summaryPre();
         }catch (Exception e){
             e.printStackTrace();