Browse Source

范围随机数纠正保留小数防止范围值(0,0)循环

yangyj 1 year ago
parent
commit
932d8ad762

+ 102 - 10
blade-common/src/main/java/org/springblade/common/utils/BaseUtils.java

@@ -1,26 +1,20 @@
 package org.springblade.common.utils;
 
-import cn.hutool.core.lang.func.Func;
 import com.alibaba.cloud.commons.lang.StringUtils;
 import org.springblade.common.constant.RegexConstant;
 
 import java.io.*;
-import java.lang.annotation.Annotation;
 import java.math.BigDecimal;
 import java.math.BigInteger;
-import java.net.JarURLConnection;
-import java.net.URL;
+import java.math.RoundingMode;
 import java.security.MessageDigest;
 import java.util.*;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
-import static java.math.BigDecimal.ROUND_CEILING;
-import static java.math.BigDecimal.ROUND_HALF_UP;
+import static java.math.BigDecimal.*;
 
 /**
  * @author yangyj
@@ -246,6 +240,7 @@ public class BaseUtils {
         }
     }
 
+
     /**
      * @return java.util.List<java.lang.Object> 不能包含0
      * @Description specifiedRangeList
@@ -275,9 +270,11 @@ public class BaseUtils {
             }
             Random rd = new Random();
             int hzi = new BigDecimal(hz.toString()).multiply(new BigDecimal(passRate.toString())).setScale(0, ROUND_CEILING).intValue();
+            int loop=200;
             for (int i = 0; i < hzi; i++) {
                 BigDecimal tb = new BigDecimal(rd.nextInt(max - min + 1) + min).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);
-                if(tb.equals(BigDecimal.ZERO)){
+                if(tb.compareTo(BigDecimal.ZERO)==0&&loop>0){
+                    loop--;
                     i--;
                 }else{
                     if (scaleI > 0) {
@@ -289,6 +286,7 @@ public class BaseUtils {
             }
             int total = handleObj2Integer(hz);
             if (total - hzi > 0) {
+                loop=200;
                 for (int k = 0; k < total - hzi; k++) {
                     BigDecimal tb;
                     if (rd.nextBoolean()) {
@@ -296,7 +294,8 @@ public class BaseUtils {
                     } else {
                         tb = new BigDecimal(min - 1 - rd.nextInt(((max - min) / 2))).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);
                     }
-                    if(tb.equals(BigDecimal.ZERO)){
+                    if(tb.compareTo(BigDecimal.ZERO)==0&&loop>0){
+                        loop--;
                         k--;
                     }else {
                         if (scaleI > 0) {
@@ -348,7 +347,100 @@ public class BaseUtils {
         }
         return false;
     }
+    public static Integer getScale(Object... number) {
+        int max = 0;
+        if (number != null) {
+            return getScale(scaleParam(number),1);
+        }
+        return max;
+    }
+    /**保留有效数字后面的0*/
+    public static Integer getScaleZero(Object... number){
+        int max = 0;
+        if (number != null) {
+            return getScale(scaleParam(number),0);
+        }
+        return max;
+    }
+
+    public static boolean containsZH(Object chars) {
+        Matcher m = Pattern.compile("[\u4e00-\u9fa5]").matcher(handleNull(chars));
+        return m.find();
+    }
 
+/*    public static void main(String[] args) {
+        System.out.println(getScaleZero(152000,"±10.0"));
+        System.out.println(getScaleZero(152000,"-10.0,10"));
+        System.out.println(getScaleZero(152000,"-10.0,10.0"));
+        System.out.println(getScaleZero(Double.MAX_VALUE,"-10.0,10"));
+        System.out.println(getScaleZero(152000,"-10,10"));
+    }*/
+public static List<Object> obj2List(Object obj) {
+    List<Object> result = new ArrayList<>();
+    if (obj != null) {
+        List<Object> datas = new ArrayList<>();
+        if (obj instanceof List) {
+            datas = (List<Object>) obj;
+        } else {
+            datas.add(obj);
+        }
+        if (isNotEmpty(datas)) {
+            for (Object e : datas) {
+                boolean fi = isNotEmpty(e) && !containsZH(e.toString()) && (e.toString().contains("、") || e.toString().contains(",") || e.toString().contains(" ") || e.toString().contains(","));
+                if (fi) {
+                    String s = e.toString().trim();
+                    if (s.contains(" ")) {
+                        s = s.replaceAll("\\s+", "、");
+                    }
+                    Object[] bs = s.split("[、,,]");
+                    result.addAll(Arrays.asList(bs));
+                } else {
+                    result.add(e);
+                }
+            }
+        }
+    }
+    return result;
+}
+    public static List<Object> obj2ListNe(Object obj) {
+        List<Object> list = obj2List(obj);
+        return list.parallelStream().filter(BaseUtils::isNotEmpty).collect(Collectors.toList());
+    }
+    public static List<Object> scaleParam(Object ... number){
+        return Arrays.stream(number).filter(BaseUtils::isNotEmpty).flatMap(e-> BaseUtils.obj2ListNe(e).stream()).distinct().map(s->s.toString().replaceAll("±","")).filter(BaseUtils::isNumber).map(e->{
+            /*0.3999999999999986 检测到超长小数位先转double处理,再还原回String*/
+            String tg=e.toString();
+            int dot=tg.indexOf(".");
+            boolean unlimited=dot>0&&(tg.length()-dot>6);
+            if(unlimited||tg.contains("e")){
+                return BigDecimal.valueOf(Double.parseDouble(tg)).setScale(2, RoundingMode.HALF_UP).toString();
+            }else {
+                return e;
+            }
+        }).collect(Collectors.toList());
+    }
+
+    public static final String[] SCALE_REG=new String[]{"(\\d)+.(\\d)*[0-9]","(\\d)+.(\\d)*[1-9]"};
+    private static Integer getScale(List<Object> number,Integer zero){
+        int max=0;
+        if(isNotEmpty(number)){
+            for (Object n : number) {
+                if (isNotEmpty(n)) {
+                    String[] sa = n.toString().split(",");
+                    for (String s : sa) {
+                        Matcher m = Pattern.compile(SCALE_REG[zero]).matcher(s);
+                        if (m.find()) {
+                            int cp = new StringBuilder(m.group()).reverse().toString().indexOf(".");
+                            if (cp < 5) {
+                                max = Math.max(cp, max);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return max;
+    }
 
 
 }

+ 10 - 4
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -1966,10 +1966,16 @@ public class InformationWriteQueryController extends BladeController {
         return value;
     }
 
-    public String imitate(String v, List<RangeJson> rjs) {
-        RangeJson best = rjs.stream().min(Comparator.comparingDouble(j -> Double.parseDouble(v) - Double.parseDouble(j.getDesign()))).orElse(rjs.get(0));
-        int scale = Math.max(new StringBuilder(v).reverse().indexOf("."), 0);
-        return BaseUtils.rangeList(1, best.getDesign(), best.getDev(), 1, scale, 1).get(0).toString();
+    public  String imitate(String v, List<RangeJson> rjs) {
+        try {
+            RangeJson best = rjs.stream().min(Comparator.comparingDouble(j -> Double.parseDouble(v) - Double.parseDouble(j.getDesign()))).orElse(rjs.get(0));
+           // int scale = Math.max(new StringBuilder(v).reverse().indexOf("."), 0);
+            int scale=BaseUtils.getScaleZero(v,best.getDev(),best.getDesign());
+            return BaseUtils.rangeList(1, best.getDesign(), best.getDev(), 1, scale, 1).get(0).toString();
+        }catch (Exception e){
+            e.printStackTrace();
+            return StringPool.EMPTY;
+        }
     }
 
     /*元素情况,表字段,表单流水号,数据库表名*/

+ 8 - 5
blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java

@@ -10,6 +10,7 @@ import com.jfireel.expression.node.impl.StaticObjectMethodNode;
 import com.jfireel.expression.node.impl.VariableNode;
 import com.jfireel.expression.token.Token;
 import org.apache.commons.collections4.MapUtils;
+import org.springblade.common.utils.BaseUtils;
 import org.springblade.core.tool.utils.*;
 import org.springblade.manager.dto.ParamElements;
 
@@ -1738,9 +1739,11 @@ public class CustomFunction {
             }
             Random rd = new Random();
             int hzi = new BigDecimal(hz.toString()).multiply(new BigDecimal(passRate.toString())).setScale(0, ROUND_CEILING).intValue();
+            int loop=200;
             for (int i = 0; i < hzi; i++) {
                 BigDecimal tb = new BigDecimal(rd.nextInt(max - min + 1) + min).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);
-                if(tb.equals(BigDecimal.ZERO)){
+                if(tb.compareTo(BigDecimal.ZERO)==0&&loop>0){
+                    loop--;
                     i--;
                 }else{
                     if (scaleI > 0) {
@@ -1752,6 +1755,7 @@ public class CustomFunction {
             }
             int total = StringUtils.handleObj2Integer(hz);
             if (total - hzi > 0) {
+                loop=200;
                 for (int k = 0; k < total - hzi; k++) {
                     BigDecimal tb;
                     if (rd.nextBoolean()) {
@@ -1759,7 +1763,8 @@ public class CustomFunction {
                     } else {
                         tb = new BigDecimal(min - 1 - rd.nextInt(((max - min) / 2))).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);
                     }
-                    if(tb.equals(BigDecimal.ZERO)){
+                    if(tb.compareTo(BigDecimal.ZERO)==0&&loop>0){
+                        loop--;
                         k--;
                     }else {
                         if (scaleI > 0) {
@@ -1777,9 +1782,7 @@ public class CustomFunction {
         return result;
     }
 
-/*    public static void main(String[] args) {
-        rangeList(100,0,"-5,5",1,0,1).forEach(System.out::println);
-    }*/
+
     /**
      * @return java.util.List<java.lang.Object>
      * @Description obj 转List