|
@@ -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){
|