瀏覽代碼

解决复制节点插入设计值/频率生成数据错误的问题

lvy 1 天之前
父節點
當前提交
77a467fc30

+ 145 - 2
blade-common/src/main/java/org/springblade/common/utils/BaseUtils.java

@@ -382,10 +382,11 @@ public class BaseUtils {
                 loop=200;
                 for (int k = 0; k < total - hzi; k++) {
                     BigDecimal tb;
+                    int salt=Math.max(1,(max - min) / 2);
                     if (rd.nextBoolean()) {
-                        tb = new BigDecimal(rd.nextInt(((max - min) / 2)) + max + 1).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);
+                        tb = new BigDecimal(rd.nextInt(salt) + max + 1).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);
                     } else {
-                        tb = new BigDecimal(min - 1 - rd.nextInt(((max - min) / 2))).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);
+                        tb = new BigDecimal(min - 1 - rd.nextInt(salt)).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);
                     }
                     if(tb.compareTo(BigDecimal.ZERO)==0&&loop>0){
                         loop--;
@@ -405,6 +406,148 @@ public class BaseUtils {
         }
         return result;
     }
+    public static List<Object> b445random(Object hz, Object design, Object dev, Object failed, Object xN) {
+        List<Object> measureOut = new ArrayList<>();
+        String hzStr =handleNull(hz);
+        String designStr =handleNull(design);
+        String deviationStr = handleNull(dev);
+        if (isNotEmpty(hzStr, designStr, deviationStr)) {
+            String passStr = handleNull(failed);
+            if (StringUtils.isEmpty(passStr)) {
+                passStr = "0";
+            }
+            String[] rateIn = hzStr.split("/");
+            rateIn = Arrays.stream(rateIn).filter(StringUtils::isNotEmpty).toArray(String[]::new);
+            String[] designIn = designStr.split("/");
+            designIn = Arrays.stream(designIn).filter(StringUtils::isNotEmpty).toArray(String[]::new);
+            String[] deviationIn = deviationStr.split("/");
+            deviationIn = Arrays.stream(deviationIn).filter(StringUtils::isNotEmpty).toArray(String[]::new);
+            if (xN != null) {
+                deviationIn = Arrays.stream(deviationIn).map(e -> coefficient(e, Double.parseDouble(xN.toString()))).toArray(String[]::new);
+            }
+            String[] passIn = passStr.split("/");
+            passIn = Arrays.stream(passIn).filter(StringUtils::isNotEmpty).toArray(String[]::new);
+            if (designIn.length > 0) {
+                for (int i = 0; i < designIn.length; i++) {
+                    String e = designIn[i];
+                    int _hz = Integer.parseInt(i < rateIn.length ? rateIn[i] : rateIn[rateIn.length - 1]);
+                    String _deviation = i < deviationIn.length ? deviationIn[i] : deviationIn[deviationIn.length - 1];
+                    String _pass = i < passIn.length ? passIn[i] : passIn[passIn.length - 1];
+                    int _scale = getScaleZero(e, _deviation);
+                    String delimiter = handleNull(matcherFindGroup("[^0-9.]", e, 0, false));
+                    if (StringUtils.isEmpty(delimiter)) {
+                        delimiter = "@";
+                    }
+                    String[] _des = e.split("[" + delimiter + "]");
+                    List<Object> _tmp = new ArrayList<>();
+                    for (String _de : _des) {
+                        List<Object> list;
+                        double passD = Double.parseDouble(_pass);
+                        /**大于0小于1则表示合格率,否则是不合格数量*/
+                        double rate = (0 < passD && passD < 1) ? passD : (_hz - passD) / _hz;
+                        list = cmv(_hz, _de, _deviation, rate, _scale);
+                        if (list != null && !list.isEmpty()) {
+                            if (list.size() > _tmp.size()) {
+                                _tmp.addAll(list);
+                            } else {
+                                for (int n = 0; n < _tmp.size(); n++) {
+                                    /*假如设计值是DxD1这种形式,则需要把生成的实测值拼接起来*/
+                                    _tmp.set(n, join(_tmp.get(n), list.get(n), delimiter));
+                                }
+                            }
+                        }
+                    }
+                    measureOut.addAll(_tmp);
+                }
+            }
+        }
+        return measureOut;
+    }
+
+    public static List<Object> cmv(Object n, Object design, Object scope, Object rate, Object scale) {
+        if (isNotEmpty(n) && isNotEmpty(design) && isNotEmpty(scope) && isNotEmpty(rate) && isNotEmpty(scale)) {
+            return rangeList(n, design, scope, 1, scale, rate);
+        }
+        return null;
+    }
+
+    /**
+     * @return java.lang.Object
+     * @Description 返回正则式匹配内容
+     * @Param [regex:正则式, value:匹配的字符串, i:group(i), g:是否返回全局搜索,全局搜索返回的是列表]
+     * @Author yangyj
+     * @Date 2021.01.08 16:31
+     **/
+    public static Object matcherFindGroup(String regex, String value, int i, boolean g) {
+        Matcher m = Pattern.compile(regex).matcher(value);
+        List<Object> result = new ArrayList<>();
+        while (m.find()) {
+            result.add(m.group(i));
+        }
+        if (!result.isEmpty()) {
+            if (g) {
+                return result;
+            } else {
+                if(result.get(0).equals("-")){
+                    String pattern = "^-?\\d+(\\.\\d+)?([+\\-*/]-?\\d+(\\.\\d+)?)*$";
+                    Pattern r = Pattern.compile(pattern);
+                    Matcher mm = r.matcher(String.valueOf(value));
+                    boolean b = mm.matches();
+                    if(b){
+                        return result.get(1);
+                    }
+                }
+                return result.get(0);
+            }
+        }
+        return null;
+    }
+
+    public static String join(Object... args) {
+        if (args != null) {
+            if (args.length > 2) {
+                List<String> list = Arrays.stream(args).limit(args.length - 1).map(BaseUtils::handleNull).collect(Collectors.toList());
+                String split = handleNull(args[args.length - 1]);
+                return join(list, split);
+            } else {
+                return handleNull(args[0]);
+            }
+        } else {
+            return "";
+        }
+    }
+    public static boolean isNotEmpty(Object... values) {
+        for (Object value : values) {
+            if (isEmpty(value)) {
+                return false;
+            }
+        }
+        return true;
+    }
+    public static String coefficient(String dev, double xN) {
+        if (StringUtils.isNotEmpty(dev) && xN != 1) {
+            String[] da = dev.split("[,,]");
+            int scale = getScale(xN);
+            dev = number2StringZero(Double.parseDouble(da[0]) * xN, scale) + "," + number2StringZero(Double.parseDouble(da[1]) * xN, scale);
+        }
+        return dev;
+    }
+    /**
+     * @return java.lang.String
+     * @Description 返回保留指定小数位数字字符串
+     * @Param [number, scale]
+     * @Author yangyj
+     * @Date 2021.10.15 10:35
+     **/
+    public static String number2StringZero(Object number, Object scale) {
+        if (isNumber(number)) {
+            if (isEmpty(scale)) {
+                scale = 0;
+            }
+            return new BigDecimal(handleNull(number)).setScale(handleObj2Integer(scale), RoundingMode.HALF_UP).toString();
+        }
+        return "";
+    }
 
     /*是否包含链*/
      public static boolean notInChain(List<String> cp,String s){

+ 43 - 2
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -2801,13 +2801,28 @@ private Object reviseValue(Map<String, String> p2, String key, Object value) {
                             /*全部为一个数的时候不用修改*/
                             if (la.stream().map(a -> a[0]).collect(Collectors.toSet()).size() > 1 || la.size() == 1) {
                                 List<String> result = new ArrayList<>();
+                                List<Object> objects = imitate(rangeJsons, la);
+                                int index = 0;
                                 for (String[] a : la) {
                                     String v = a[0];
                                     String sv;
                                     if (v.contains("、")) {
-                                        sv = Arrays.stream(v.split("[、]")).map(e -> imitate(e, rangeJsons)).collect(Collectors.joining("、"));
+                                        if (!objects.isEmpty() && index < objects.size()){
+                                            sv = "";
+                                            for (String s : v.split("[、]")) {
+                                                sv += objects.get(index) == null ? "" : objects.get(index).toString();
+                                                index++;
+                                            }
+                                        } else {
+                                            sv = Arrays.stream(v.split("[、]")).map(e -> imitate(e, rangeJsons)).collect(Collectors.joining("、"));
+                                        }
                                     } else {
-                                        sv = imitate(v, rangeJsons);
+                                        if (!objects.isEmpty() && index < objects.size()){
+                                            sv = objects.get(index) == null ? "" : objects.get(index).toString();
+                                            index++;
+                                        } else {
+                                            sv = imitate(v, rangeJsons);
+                                        }
                                     }
                                     result.add(sv + "_^_" + a[1]);
                                 }
@@ -2835,6 +2850,32 @@ public String imitate(String v, List<RangeJson> rjs) {
         return StringPool.EMPTY;
     }
 }
+    public List<Object> imitate(List<RangeJson> rjs, List<String[]> la) {
+        try {
+            la.sort((a, b) -> {
+                if (a.length > 1 && b.length > 1) {
+                    if (a[1].contains("_") && b[1].contains("_")) {
+                        String[] split = a[1].split("_");
+                        String[] split1 = b[1].split("_");
+                        int i = new Integer(split[0]).compareTo(new Integer(split1[0]));
+                        if (i == 0) {
+                            return new Integer(split[1]).compareTo(new Integer(split1[1]));
+                        } else {
+                            return i;
+                        }
+                    }
+                    return a[1].compareTo(b[1]);
+                }
+                return new Double(a[0]).compareTo(new Double(b[0]));
+            });
+            if (rjs != null && rjs.size() == 1) {
+                return BaseUtils.b445random(rjs.get(0).getSize(), rjs.get(0).getDesign(), rjs.get(0).getDev(), Integer.parseInt(rjs.get(0).getSize()) - Integer.parseInt(rjs.get(0).getPass()), 1);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return new ArrayList<>();
+    }
 
 /*元素情况,表字段,表单流水号,数据库表名*/
 private String reviseCols(Map<String, String> p2, String cols, Long pkeyId, String tableName) {