浏览代码

范围随机值

yangyj 2 年之前
父节点
当前提交
040c3ca1f5

+ 5 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/RangeInfo.java

@@ -31,7 +31,11 @@ public class RangeInfo {
     private String key;
     @ApiModelProperty("表节点的唯一id")
     private Long pkId;
+    @ApiModelProperty("不合格数量,也可以用百分比表示如2%")
+    private String fail;
+    @ApiModelProperty("容量")
+    private Integer capacity;
     public Boolean verify(){
-        return Func.isNotBlank(design)&&Func.isNotEmpty(size)&&size>0&&Func.isNotBlank(key)&&(Func.isNotEmpty(pkId)||Func.isNotBlank(dev));
+        return Func.isNotBlank(design)&&((Func.isNotEmpty(size)&&size>0)||(Func.isNotEmpty(capacity)&&capacity>0))&&Func.isNotBlank(key)&&(Func.isNotEmpty(pkId)||Func.isNotBlank(dev));
     }
 }

+ 67 - 1
blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java

@@ -2066,7 +2066,73 @@ public class CustomFunction {
 		   return result;
 	}
 
-
+	public static String coefficient(String dev,double xN){
+		if(StringUtils.isNotEmpty(dev)&&xN!=1){
+			String[] da=dev.split("[,,]");
+			int scale=StringUtils.getScale(xN);
+			dev= StringUtils.number2StringZero(Double.parseDouble(da[0])*xN,scale)+","+StringUtils.number2StringZero(Double.parseDouble(da[1])*xN,scale);
+		}
+		return dev;
+	}
+
+	public static List<Object> b445random(Object hz,Object design,Object dev,Object failed,Object xN){
+		List<Object> measureOut = new ArrayList<>();
+		String hzStr= StringUtils.handleNull(hz);
+		String designStr= StringUtils.handleNull(design);
+		String deviationStr= StringUtils.handleNull(dev);
+		if(StringUtils.isNotEmpty(hzStr,designStr,deviationStr)){
+			String passStr = StringUtils.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 = StringUtils.getScale(e, _deviation);
+					String delimiter=StringUtils.handleNull(matcherFindGroup("[^0-9.]",e,0,false));
+					if(StringUtils.isEmpty(delimiter)){
+						delimiter=CONCAT;
+					}
+					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(ListUtils.isNotEmpty(list)){
+							if(list.size()>_tmp.size()){
+								_tmp.addAll(list);
+							}else{
+								for(int n=0;n<_tmp.size();n++){
+									/*假如设计值是DxD1这种形式,则需要把生成的实测值拼接起来*/
+									_tmp.set(n,StringUtils.join(_tmp.get(n),list.get(n),delimiter));
+								}
+							}
+						}
+					}
+					measureOut.addAll(_tmp);
+					measureOut.add("");
+				}
+			}
+		}
+		return measureOut;
+	}
 
 	/**
 	 * @Description 共检点合格点公式

+ 11 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java

@@ -195,16 +195,24 @@ public class FormulaController {
             if(Func.isBlank(info.getDev())){
                info.setDev("-3,3");
             }
+            if(Func.isNotEmpty(info.getCapacity())){
+                info.setSize(info.getCapacity());
+            }
+            if(Func.isBlank(info.getFail())){
+                info.setFail("0");
+            }else if(info.getFail().contains("%")){
+                String tmp = info.getFail().replace("%","");
+                info.setFail(String.valueOf((int)Math.round(Double.parseDouble(tmp)*(double)info.getSize()/100)));
+            }
             Map<String,String> keymap = this.tabService.getTablbCols(info.getPkId().toString(),null);
             if(!keymap.containsKey(info.getKey())){
                 return R.fail("获取元素定位失败");
             }
-            int scale=StringUtils.getScale(info.getDesign(),info.getDev());
-            List<Object> data = CustomFunction.rangeList(info.getSize(),info.getDesign(),info.getDev(),1,scale,1);
+            List<Object> data = CustomFunction.b445random(info.getSize(),info.getDesign(),info.getDev(),info.getFail(),1);
             String[] dw = keymap.get(info.getKey()).split(StringPool.SEMICOLON);
             Map<String,Object> result = new HashMap<>();
             if(dw.length==1){
-                result.put(info.getKey()+"__"+dw[0],data.stream().map(Func::toStr).collect(Collectors.joining("、")));
+                result.put(info.getKey()+"__"+dw[0],data.stream().filter(StringUtils::isNotEmpty).map(Func::toStr).collect(Collectors.joining("、")));
             }else{
                 for(int i=0;i<dw.length;i++){
                     if(data.size()>i){

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

@@ -19,6 +19,7 @@ import org.springblade.manager.entity.WbsParam;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.formula.Container;
 import org.springblade.manager.formula.FormulaStrategyFactory;
+import org.springblade.manager.formula.impl.CompositeDataAccess;
 import org.springblade.manager.formula.impl.TableElementConverter;
 import org.springblade.manager.mapper.FormulaMapper;
 import org.springblade.manager.service.*;
@@ -230,38 +231,69 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     List<String>  relyList = fd.getFormula().getRelyList();
                     if(CollectionUtil.isNotEmpty(relyList)){
                         List<FormData>  ele = this.env.formDataList.stream().filter(e->relyList.contains(e.getCode())).collect(Collectors.toList());
-                        if(CollectionUtil.isNotEmpty(ele)){
-                            /*每一组依赖的数据*/
-                            Map<Integer,Map<String,List<Object>>> dataSource = new HashMap<>(20);
-                            for(FormData e:ele){
-                                /*分组*/
-                                Map<Integer,List<ElementData>> m = e.getValues().stream().collect(Collectors.groupingBy(ElementData::getGroupId));
-                                for(Map.Entry<Integer,List<ElementData>> entry:m.entrySet()){
-                                    /*拿到每一组数据*/
-                                    Map<String,List<Object>> t = dataSource.computeIfAbsent(entry.getKey(), k -> new HashMap<String,List<Object>>(20));
-                                    t.put(e.getCode(),entry.getValue().stream().map(ElementData::getValue).flatMap(o->Collections.nCopies(e.getStep(),o).stream()).collect(Collectors.toList()));
-                                }
+                        if(ele.size()<relyList.size()){
+                            System.out.println("不满足依赖要求");
+                        }
+                        LinkedHashMap<String,FormData> fdMap =new LinkedHashMap<>();
+                        ele.forEach(e->{
+                            fdMap.put(e.getCode(),e);
+                        });
+                        CompositeDataAccess cda = new CompositeDataAccess(fdMap);
+                        List<LocalVariable>  local= new ArrayList<>();
+                        while (cda.hasNext()){
+                           LinkedHashMap<String,ElementData> tip= cda.next();
+                            Map<String, Object> variable = new HashMap<>(this.env.constantMap);
+                            Map<String,Object> E=getMap(variable,"E");
+                            for(Map.Entry<String,ElementData> se:tip.entrySet()){
+                                E.put(se.getKey(),se.getValue().getValue());
                             }
-                            if(dataSource.size()>0){
-                                for(Map.Entry<Integer,Map<String,List<Object>>> entry:dataSource.entrySet()){
-                                    if(entry.getValue().keySet().size()>=ele.size()){
-                                        List<Object> values = slice(entry.getValue(),this.env.constantMap,f,entry.getKey());
-                                        if(values.size()>fd.getValues().size()){
-                                            /*当生成的数据超过实际容量的时候,会自动合并到第一个单元格*/
-                                            fd.getValues().get(0).setValue(values.stream().map(StringUtils::handleNull).collect(Collectors.joining("、")));
-                                        }else{
-                                            for(int n=0;n<values.size();n++){
-                                                fd.getValues().get(n).setValue(values.get(n));
-                                            }
-                                        }
-
-                                    }
+                            local.add(new LocalVariable(0,f,currentMap));
+                        }
+                        if(local.size()>0){
+                            List<Object> values = slice( local,this.env.constantMap,f);
+                            if(values.size()>fd.getValues().size()){
+                                /*当生成的数据超过实际容量的时候,会自动合并到第一个单元格*/
+                                fd.getValues().get(0).setValue(values.stream().map(StringUtils::handleNull).collect(Collectors.joining("、")));
+                            }else{
+                                for(int n=0;n<values.size();n++){
+                                    fd.getValues().get(n).setValue(values.get(n));
                                 }
                             }
-
-                        }else{
-                            fd.getValues().add(new ElementData(0,0,Expression.parse(formula.getFormula()).calculate(currentMap)));
                         }
+//                        if(CollectionUtil.isNotEmpty(ele)){
+//                            /*每一组依赖的数据*/
+//                            Map<Integer,Map<String,List<Object>>> dataSource = new HashMap<>(20);
+//                            for(FormData e:ele){
+//                                /*分组*/
+//                                Map<Integer,List<ElementData>> m = e.getValues().stream().collect(Collectors.groupingBy(ElementData::getGroupId));
+//                                for(Map.Entry<Integer,List<ElementData>> entry:m.entrySet()){
+//                                    /*拿到每一组数据*/
+//                                    Map<String,List<Object>> t = dataSource.computeIfAbsent(entry.getKey(), k -> new HashMap<String,List<Object>>(20));
+//                                    /*步伐不为1的数据要用步伐做倍数来膨胀*/
+//                                    t.put(e.getCode(),entry.getValue().stream().map(ElementData::getValue).flatMap(o->Collections.nCopies(e.getStep(),o).stream()).collect(Collectors.toList()));
+//                                }
+//                            }
+//                            if(dataSource.size()>0){
+//                                /**{groupId:{code:List<Object>}}*/
+//                                for(Map.Entry<Integer,Map<String,List<Object>>> entry:dataSource.entrySet()){
+//                                    if(entry.getValue().keySet().size()>=ele.size()){
+//                                        List<Object> values = slice(entry.getValue(),this.env.constantMap,f,entry.getKey());
+//                                        if(values.size()>fd.getValues().size()){
+//                                            /*当生成的数据超过实际容量的时候,会自动合并到第一个单元格*/
+//                                            fd.getValues().get(0).setValue(values.stream().map(StringUtils::handleNull).collect(Collectors.joining("、")));
+//                                        }else{
+//                                            for(int n=0;n<values.size();n++){
+//                                                fd.getValues().get(n).setValue(values.get(n));
+//                                            }
+//                                        }
+//
+//                                    }
+//                                }
+//                            }
+//
+//                        }else{
+//                            fd.getValues().add(new ElementData(0,0,Expression.parse(formula.getFormula()).calculate(currentMap)));
+//                        }
                     }else{
                         fd.getValues().add(new ElementData(0,0,Expression.parse(formula.getFormula()).calculate(currentMap)));
                     }
@@ -353,37 +385,22 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         return  result;
     }
 
-    public  List<Object> slice(Map<String,List<Object>> elementMap,Map<String,Object> constantMap,String formula,Integer groupId){
+    public  List<Object> slice(List<LocalVariable>  local,Map<String,Object> constantMap,String formula){
         int min =0;
         List<Object> result = new ArrayList<>();
         try {
-            for(Map.Entry<String,List<Object>> entry:elementMap.entrySet()){
-                List<Object> tmp =  entry.getValue();
-                min = min==0?tmp.size():Math.min(min,tmp.size());
-            }
-            if(min>0){
-                List<LocalVariable>  lvab= new ArrayList<>();
-                for(int i=0;i<min;i++){
-                    Map<String, Object> currentMap = new HashMap<>(constantMap);
-                    Map<String,Object> E=getMap(currentMap,"E");
-
-                    for(Map.Entry<String,List<Object>> e:elementMap.entrySet()){
-                        E.put(e.getKey(),e.getValue().get(i));
-                    }
-
-                    lvab.add(new LocalVariable(0,formula,currentMap));
-                }
                 /*并发执行*/
-                List<Object>  r= lvab.stream().map(e-> Expression.parse(e.getFormula()).calculate(e.getCurrentMap())).collect(Collectors.toList());
+                List<Object>  r= local.stream().map(e-> Expression.parse(e.getFormula()).calculate(e.getCurrentMap())).collect(Collectors.toList());
                 if(CollectionUtil.isNotEmpty(r)&&r.stream().anyMatch(StringUtils::isNotEmpty)){
                     result.addAll(r);
                 }
-            }
         }catch (Exception e){
             StaticLog.error("公式:{},执行出错",formula);
         }
         return  result;
     }
+
+
     public  static void sort( List<FormData> list,int n){
         /*System.out.println("剩余计算次数:"+n+"次");*/
         if(move(list)&&n>0){