yangyj 2 vuotta sitten
vanhempi
commit
c8cae09e7a

+ 112 - 2
blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java

@@ -1877,8 +1877,110 @@ public class CustomFunction {
 	}
 
 
+	public static List<Object> b445check(List<Object> data,Object designs,Object dev,Object xN){
+		return b445check(data,designs,dev,xN,null);
+	}
+	/**
+	 * @Description   河南项目检查结果
+	 * @Param [data, designs, dev, xN, hz]
+	 * @return [共检数量,合格数量,不合格数量...]
+	 * @Author yangyj
+	 * @Date 2022.08.01 11:06
+	 **/
+	public static List<Object>  b445check(List<Object> data,Object designs,Object dev,Object xN,Object hz){
 
+		List<Object> result = new ArrayList<>();
+		designs=designFormat(designs);
+		if(StringUtils.isNotEmpty(data,designs,dev)){
+			if(StringUtils.isEmpty(xN)){
+				/*偏差范围单位转换倍率默认是1*/
+				/*同一个项目偏差范围单位理应一样,所以不用考虑多个值的情况*/
+				xN=1;
+			}
+			if(StringUtils.handleNull(designs).contains("/")){
+				/*多个设计值*/
+				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){
+					result.add(total);
+					result.add(pass);
+					result.add(total-pass);
+				}
+			}else {
+				Object[] target = ck(data,designs,dev,xN);
+				if(StringUtils.handObj2Integer(target[0])>0){
+					result.add(target[0]);
+					result.add(target[1]);
+					result.add(StringUtils.handObj2Integer(target[0])-StringUtils.handObj2Integer(target[1]));
+				}
+			}
+		}else if(ListUtils.isNotEmpty(data)) {
+			if(data.parallelStream().anyMatch(StringUtils::isNotEmpty)){
+				data=data.parallelStream().filter(StringUtils::isNotEmpty).collect(Collectors.toList());
+				result.add(data.size());
+				result.add(data.size());
+				result.add(0);
+			}
+		}
+		if(result.size()==0){
+			result.addAll(Collections.nCopies(3,""));
+		}
+		return result;
+	}
 
+	public static Object designFormat(Object design){
+		if(StringUtils.isNotEmpty(design)){
+			return  Arrays.stream(design.toString().split("[^\\d.]")).filter(StringUtils::isNotEmpty).collect(Collectors.joining("/"));
+		}
+		return "";
+	}
+	public static List<List<Object>> dataSpaceSplit(List<Object> data,String[] designArr){
+		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());
+		}
+		return  result;
+	}
+	public static  List<Object> listTrim(List<Object> list){
+		List<Object> result = new ArrayList<>();
+		if(ListUtils.isNotEmpty(list)){
+			int end =list.size();
+			for(int i=list.size()-1;i>=0;i--){
+				if(StringUtils.isNotEmpty(list.get(i))||i==0){
+					end=i+1;
+					break;
+				}
+			}
+			int start=0;
+			for(int i=0;i<list.size();i++){
+				if(StringUtils.isNotEmpty(list.get(i))){
+					start=i;
+					break;
+				}
+			}
+			return list.subList(start,end);
+		}
+		return result;
+	}
 	/**
 	 * @Description 评定表实测值
 	 * @Param [data, remark]
@@ -2468,15 +2570,23 @@ public class CustomFunction {
 	 **/
 	public static  Object setScale(Object o,Object scale){
 		if(StringUtils.isNumber(scale)&&o!=null){
-			if(o instanceof  List){
+			if(o instanceof  List ||o.toString().contains(",")||o.toString().contains("、")){
 				List<Object> result = new ArrayList<>();
-				for(Object e:(List<Object>)o){
+				List<Object> tmp = obj2ListNe(o);
+				for(Object e:tmp){
 					if(StringUtils.isNumber(e)){
 						result.add(StringUtils.number2String(e,scale));
 					}else{
 						result.add("");
 					}
 				}
+				if(o instanceof String){
+					String delimiter ="、";
+					if(o.toString().contains(",")){
+						delimiter=",";
+					}
+					return result.stream().map(StringUtils::handleNull).collect(Collectors.joining(delimiter));
+				}
 				return result;
 			}else{
 				if(StringUtils.isNumber(o)){

+ 0 - 6
blade-service/blade-manager/src/main/java/com/mixsmart/utils/StringUtils.java

@@ -1467,12 +1467,6 @@ public class StringUtils {
 		return max;
 	}
 
-	public static void main(String[] args) {
-		System.out.println(getScale(5.0));
-		System.out.println(getScale(5.01));
-		System.out.println(getScale(5.2001));
-		System.out.println(getScale(5.20010));
-	}
 
 
 }

+ 2 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -1490,7 +1490,7 @@ public class ExcelTabController extends BladeController {
         String classify = tableInfo1.getString("classify");
         List<TableInfo> tableInfoList = this.excelTabService.getTableInfoList(dataArray);
         try {
-            this.excelTabService.formulaFillData(tableInfoList);
+            this.excelTabService.formulaFillData(tableInfoList,Long.parseLong(nodeid));
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -2244,7 +2244,7 @@ public class ExcelTabController extends BladeController {
         }
         List<TableInfo> tableInfoList = this.excelTabService.getTableInfoList(dataArray);
         try {
-            this.excelTabService.formulaFillData(tableInfoList);
+            this.excelTabService.formulaFillData(tableInfoList,null);
         } catch (Exception e) {
             e.printStackTrace();
         }

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

@@ -251,7 +251,7 @@ public class FormulaController {
         list.add(makeFd("","zms","","19","5"));
         list.add(makeFd("FC.pow(E[zms],2)","pow","zms"));
 
-        this.service.execute(list,12563252L,45646L);
+        this.service.execute(list,12563252L,45646L,1000L);
        return R.success("执行完成");
     }
 

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/FormulaClientImpl.java

@@ -43,7 +43,7 @@ public class FormulaClientImpl implements  FormulaClient{
         list.add(makeFd("","b","",0,3,3,6,3,8));
         list.add(makeFd("","c","",0,5.5,3,7,3,9));
         list.add(makeFd("","d","",0,10,7,2,5,5));
-        service.execute(list,111111L,22222L);
+        service.execute(list,111111L,22222L,10000L);
     }
 
     @Override

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

@@ -91,7 +91,7 @@ public interface IExcelTabService extends BaseService<ExcelTab> {
 	/**
 	 *  公式填充
 	 */
-	void  formulaFillData(List<TableInfo> tableInfoList);
+	void  formulaFillData(List<TableInfo> tableInfoList,Long nodeId);
 	/**
 	 *  结果信息持久化
 	 */

+ 2 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IFormulaService.java

@@ -12,11 +12,11 @@ import java.util.List;
  */
 public interface IFormulaService extends BaseService<Formula> {
 
-    void execute(List<FormData> list,Long contractId,Long primaryKeyId);
+    void execute(List<FormData> list,Long contractId,Long id,Long primaryKeyId);
     void execute(TableElementConverter tec);
     /**
      * 变量准备*/
-    IFormulaService init(List<FormData> list,Long contractId,Long primaryKeyId);
+    IFormulaService init(List<FormData> list,Long contractId,Long id,Long primaryKeyId);
     /**
      * 依赖排序*/
     IFormulaService sort();

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsParamService.java

@@ -25,4 +25,7 @@ public interface IWbsParamService  extends BaseService<WbsParam> {
      * @Date 2022.09.16 17:54
      **/
     List<WbsParam> findByNodeId(Long nodeId);
+
+    List<WbsTreeContract>  chain(Long contractId ,Long id,Long pkId,WbsTreeContract wbsTreeContract);
+
 }

+ 2 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -317,7 +317,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
     }
 
     @Override
-    public void formulaFillData(List<TableInfo> tableInfoList) {
+    public void formulaFillData(List<TableInfo> tableInfoList,Long nodeId) {
         if (Func.isNotEmpty(tableInfoList)) {
             StopWatch stopWatch = new StopWatch();
             String ids = tableInfoList.stream().map(TableInfo::getPkeyId).filter(Func::isNotEmpty).collect(Collectors.joining(","));
@@ -337,7 +337,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 });
                 stopWatch.start("公式处理");
                 List<Formula> formulas = this.formulaService.list(Wrappers.<Formula>lambdaQuery().in(Formula::getElementId, keyMappers.stream().map(KeyMapper::getFieldId).distinct().collect(Collectors.toList())));
-                TableElementConverter tec = new TableElementConverter(tableInfoList, keyMappers, formulas, coordinateMap, 1111111L);
+                TableElementConverter tec = new TableElementConverter(tableInfoList, keyMappers, formulas, coordinateMap, nodeId);
                 if (tec.isPresent()) {
                     tec.before();
                     this.formulaService.execute(tec);

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

@@ -57,7 +57,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     public static final String ELE_CODE_REG= "(?<=E\\[)[^]]+(?=\\])";
     public static final  Pattern P = Pattern.compile(ELE_CODE_REG);
-    public static final String POLY_REG= "(avg|min|max|sum)\\(([^)]+)\\)";
+    public static final String POLY_REG= "(checkpoints|avg|min|max|sum)\\(([^)]+)\\)";
     public static final Pattern POLY = Pattern.compile(POLY_REG);
     public final static String CTI="ContractInfo";
     public final static String PJI="ProjectInfo";
@@ -72,9 +72,9 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
      * @Date 2022.08.03 14:03
      **/
     @Override
-    public void execute(List<FormData> list ,Long contractId,Long primaryKeyId){
+    public void execute(List<FormData> list ,Long contractId,Long id ,Long primaryKeyId){
         /*初始化变量>>依赖排序>>预处理>>特殊公式>>通用公式执行>>数据格式化*/
-        this.init(list,contractId,primaryKeyId)
+        this.init(list,contractId,id,primaryKeyId)
                 .sort()
                 .pre()
                 .special()
@@ -84,12 +84,12 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     @Override
     public void execute(TableElementConverter tec) {
-        WbsTreeContract one=  this.treeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId,tec.getTableInfoList().get(0).getPkeyId()));
-        this.execute(tec.getFds(),tec.getContractId(),Func.isNotEmpty(one.getOldId())?Long.parseLong(one.getOldId()):one.getParentId());
+        WbsTreeContract one=  this.treeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId,tec.getNodeId()));
+        this.execute(tec.getFds(),tec.getContractId(),Func.isNotEmpty(one.getOldId())?Long.parseLong(one.getOldId()):one.getParentId(),one.getPKeyId());
     }
 
     @Override
-    public IFormulaService init(List<FormData> list,Long contractId,Long primaryKeyId) {
+    public IFormulaService init(List<FormData> list,Long contractId,Long id,Long primaryKeyId) {
         this.env.constantMap=new HashMap<>(100);
         this.env.formDataList=list;
         this.env.constantMap.put("contractId",contractId);
@@ -98,17 +98,38 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         this.env.constantMap.put(CTI,info);
         /*项目信息*/
         this.env.constantMap.put(PJI,this.projectInfoService.getById(info.getPId()));
-        List<WbsTreeContract> nodes = treeContractService.searchParentAllNode(primaryKeyId,contractId);
+        /*wbs节点链*/
+        List<WbsTreeContract> nodes = wpService.chain(contractId,id,primaryKeyId,null);
         this.env.constantMap.put(CHAIN,nodes.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList()));
-        List<WbsParam> wps = this.wpService.list(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getWbsId,primaryKeyId));
-        Map<String,Object> wpMap= new HashMap<>(wps.size()*2);
-        if(CollectionUtil.isNotEmpty(wps)){
-            for(WbsParam p:wps){
-                wpMap.put(p.getK(),p.getV());
+        /*节点参数*/
+        this.env.constantMap.put(WP,getWpMap(id,primaryKeyId));
+        return this;
+    }
+
+    /**
+     * @Description 获取节点参数
+     * @return java.util.Map<java.lang.String,java.lang.Object>
+     * @Author yangyj
+     * @Date 2022.10.09 11:11
+     **/
+    public Map<String,Object> getWpMap(Long id,Long primaryKeyId){
+        Map<String,Object> result = new HashMap<>(100);
+        List<WbsParam> total = new ArrayList<>();
+        List<WbsParam> wpsPublic = this.wpService.list(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getWbsId,id));
+        if(Func.isNotEmpty(wpsPublic)){
+            total.addAll(wpsPublic);
+        }
+        List<WbsParam> wpsPrivate = this.wpService.list(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getWbsId,primaryKeyId));
+        if(Func.isNotEmpty(wpsPrivate)){
+            total.addAll(wpsPrivate);
+        }
+        if(CollectionUtil.isNotEmpty(total)){
+            /*同名参数私有覆盖公用*/
+            for(WbsParam p:total){
+                result.put(p.getK(),p.getV());
             }
         }
-        this.env.constantMap.put(WP,wpMap);
-        return this;
+        return result;
     }
 
     @Override
@@ -352,13 +373,16 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
 
 
+    /**
+     * 先把公式脚本需要聚合部分预处理
+     * */
     public void  polymerization(){
         for(FormData fd:this.env.formDataList){
             Formula formula = fd.getFormula();
             if(Func.isNotEmpty(formula)){
                 String f=formula.getFormula();
                 if(Func.isNotBlank(f)) {
-                    if (f.contains(CustomFunction.CLASS_CALL + "avg(") || f.contains(CustomFunction.CLASS_CALL + "min(") || f.contains(CustomFunction.CLASS_CALL + "max(") || f.contains(CustomFunction.CLASS_CALL + "sum(")) {
+                    if (f.contains(CustomFunction.CLASS_CALL + "checkpoints(") ||f.contains(CustomFunction.CLASS_CALL + "avg(") || f.contains(CustomFunction.CLASS_CALL + "min(") || f.contains(CustomFunction.CLASS_CALL + "max(") || f.contains(CustomFunction.CLASS_CALL + "sum(")) {
                         /*聚合*/
                         Matcher m = POLY.matcher(f);
                         while (m.find()) {
@@ -369,9 +393,15 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                             Map<String, Object> E = getMap(currentMap, "E");
                             tmp.forEach(e -> E.put(e.getCode(), e.getValues().stream().map(ElementData::getValue).collect(Collectors.toList())));
                             Object data = Expression.parse(CustomFunction.CLASS_CALL + m.group()).calculate(currentMap);
-                            data=StringUtils.number2String(data,StringUtils.getScale(data));
+                            if(StringUtils.isNotEmpty(data)) {
+                                data = CustomFunction.setScale(data, StringUtils.getScale(data));
+                            }
                             /*必须要用括号套壳,不然无法处理负数*/
-                            f = f.replace(CustomFunction.CLASS_CALL + m.group(), "("+data.toString()+")");
+                            if(StringUtils.isNumber(data)){
+                                f = f.replace(CustomFunction.CLASS_CALL + m.group(), "("+data.toString()+")");
+                            }else{
+                                f = f.replace(CustomFunction.CLASS_CALL + m.group(), "'"+data.toString()+"'");
+                            }
                             fd.getFormula().setFormula(f);
                         }
                     }

+ 20 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsParamServiceImpl.java

@@ -41,13 +41,13 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
     public String createFileTitle(Long nodeId,Long contractId,WbsTreeContract wbsTreeContract) {
         if(BaseUtils.isNotNull(nodeId,contractId)){
             StaticLog.info("获取节点{}文件题名",nodeId);
-            List<WbsTreeContract> nodes = treeContractService.searchParentAllNode(nodeId,contractId);
+            List<WbsTreeContract> nodes = chain(contractId,nodeId,wbsTreeContract.getPKeyId(),wbsTreeContract);
             if(Func.isNotEmpty(nodes)){
-                /*移除根节点*/
-                nodes.remove(nodes.size()-1);
-                wbsTreeContract.setNodeName(wbsTreeContract.getFullName());
-                nodes.set(0,wbsTreeContract);
-                WbsParam wp = this.getOne(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getWbsId,nodeId).eq(WbsParam::getK,FILE_TITLE));
+                /**优先取私有*/
+                WbsParam wp = this.getOne(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getWbsId,wbsTreeContract.getPKeyId()).eq(WbsParam::getK,FILE_TITLE));
+                if(wp==null){
+                     wp = this.getOne(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getWbsId,nodeId).eq(WbsParam::getK,FILE_TITLE));
+                }
                 if(Func.isNotEmpty(wp)){
                     return CustomFunction.tree(nodes.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList()), wp.getV()).toString();
                 }
@@ -65,6 +65,20 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
         return Collections.emptyList();
     }
 
+    @Override
+    public List<WbsTreeContract> chain(Long contractId ,Long id, Long pkId,WbsTreeContract wbsTreeContract) {
+        List<WbsTreeContract> nodes = treeContractService.searchParentAllNode(id,contractId);
+        if(Func.isNotEmpty(nodes)) {
+            if(pkId!=null&&wbsTreeContract==null) {
+                wbsTreeContract = treeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, pkId));
+            }
+            nodes.remove(nodes.size() - 1);
+            wbsTreeContract.setNodeName(wbsTreeContract.getFullName());
+            nodes.set(0, wbsTreeContract);
+        }
+        return nodes;
+    }
+
 
 }