yangyj пре 2 година
родитељ
комит
44b0d87908

+ 1 - 1
blade-service/blade-manager/src/main/java/com/jfireel/expression/node/impl/MinusNode.java

@@ -17,7 +17,7 @@ public class MinusNode extends OperatorResultNode {
 	public Object calculate(Map<String, Object> variables) {
 		Object leftValue = leftOperand.calculate(variables);
 		Object rightValue = rightOperand.calculate(variables);
-		String reg="[0-9.]+(\\*[0-9.]+)*";
+		String reg="[0-9.-]+(\\*[0-9.-]+)+";
         if(StringUtils.handleNull(leftValue).matches(reg)&&StringUtils.handleNull(rightValue).matches(reg)){
         	return CustomFunction.dXd(rightValue,leftValue);
 		}

+ 18 - 3
blade-service/blade-manager/src/main/java/com/jfireel/expression/node/impl/MutliNode.java

@@ -2,10 +2,13 @@ package com.jfireel.expression.node.impl;
 
 import com.jfireel.expression.token.Operator;
 import com.jfireel.expression.util.number.MultiplyUtil;
+import com.mixsmart.utils.CustomFunction;
 import com.mixsmart.utils.StringUtils;
 
 import java.math.BigDecimal;
+import java.util.Collections;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 public class MutliNode extends OperatorResultNode {
 
@@ -16,17 +19,29 @@ public class MutliNode extends OperatorResultNode {
 	@Override
 	public Object calculate(Map<String, Object> variables) {
 		Object leftValue = leftOperand.calculate(variables);
+		Object rightValue = rightOperand.calculate(variables);
+		String reg="[0-9.-]+(\\*[0-9.-]+)+";
+		if(StringUtils.handleNull(leftValue).matches(reg)&&StringUtils.handleNull(rightValue).matches(reg)){
+			return CustomFunction.dXd(rightValue,leftValue);
+		}else if(StringUtils.handleNull(leftValue).matches(reg)){
+			int n= StringUtils.handleNull(leftValue).trim().split("[*]").length;
+			String rightValueStr=Collections.nCopies(n,rightValue).stream().map(StringUtils::handleNull).collect(Collectors.joining("*"));
+			return  CustomFunction.dXd(rightValueStr,leftValue,1,1);
+		}else if(StringUtils.handleNull(rightValue).matches(reg)){
+			int n= StringUtils.handleNull(rightValue).trim().split("[*]").length;
+			String leftValueStr=Collections.nCopies(n,leftValue).stream().map(StringUtils::handleNull).collect(Collectors.joining("*"));
+			return  CustomFunction.dXd(rightValue,leftValueStr,1,1);
+		}
 		if(leftValue instanceof String && StringUtils.isNumber(leftValue)) {
 			leftValue = new BigDecimal(leftValue.toString());
 		}
-		if (leftValue instanceof Number == false) {
+		if (!(leftValue instanceof Number)) {
 			return null;
 		}
-		Object rightValue = rightOperand.calculate(variables);
 		if(rightValue instanceof String && StringUtils.isNumber(rightValue)) {
 			rightValue = new BigDecimal(rightValue.toString());
 		}
-		if (rightValue instanceof Number == false) {
+		if (!(rightValue instanceof Number)) {
 			return null;
 		}
 		return MultiplyUtil.calculate((Number) leftValue, (Number) rightValue);

+ 23 - 48
blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java

@@ -2683,24 +2683,25 @@ public class CustomFunction {
 
 
 	public  static Object dXd(Object design,Object data){
-		return dXd(design,data,1,getScale(design,data));
+		return dXd(design,data,1,0);
 	}
-	public  static Object dXd(Object design,Object data,Object xN){
+	public  static Object dXd(Object design,Object data,Object xN,Integer mode){
 		int scale=0;
 		if(StringUtils.isNotEmpty(design,data,xN)){
 			 scale=getScale(design,data);
 			 scale= (int) (scale-Math.log10(Double.parseDouble(xN.toString())));
 		}
-		return dXd(design,data,xN,scale);
+		if(StringUtils.isEmpty(mode)){mode=0;}
+		return dXd(design,data,xN,scale,mode);
 	}
 	/**
 	 * @Description 求偏差公式  支持AXA-BXB=DXD或者A-B=D的格式
-	 * @Param [design:设计值, data:实测值, xN:倍率, scale:保留小数位]
+	 * @Param [design:设计值, data:实测值, xN:倍率, scale:保留小数位,mode:1乘法,其它默认减法]
 	 * @return java.lang.Object
 	 * @Author yangyj
 	 * @Date 2022.01.20 09:45
 	 **/
-	public  static Object dXd(Object design,Object data,Object xN,Object scale){
+	public  static Object dXd(Object design,Object data,Object xN,Object scale,Integer mode){
 		if(StringUtils.isNotEmpty(design,data)){
 			if(StringUtils.isEmpty(xN)){
 				xN=1;
@@ -2718,7 +2719,12 @@ public class CustomFunction {
 			for(int n=0;n<dArr.length;n++){
 				BigDecimal a = new BigDecimal(dArr[n]);
 				BigDecimal b = new BigDecimal(bArr[n]);
-				String _data=b.subtract(a).multiply(new BigDecimal(xN.toString())).setScale(Integer.parseInt(scale.toString()), ROUND_HALF_UP).toString();
+				String _data;
+				if(StringUtils.isEquals(1,mode)){
+					_data= b.multiply(a).multiply(new BigDecimal(xN.toString())).setScale(Integer.parseInt(scale.toString()), ROUND_HALF_UP).toString();
+				}else{
+					_data=	b.subtract(a).multiply(new BigDecimal(xN.toString())).setScale(Integer.parseInt(scale.toString()), ROUND_HALF_UP).toString();
+				}
 				if(StringUtils.isNotEmpty(_dx)){
 					_dx=StringUtils.join(_dx,_data,delimiter);
 				}else{
@@ -2731,49 +2737,9 @@ public class CustomFunction {
 	}
 
 
-	public  static Object over10(Object C82 ,Object C81 ,Object xmm, Object remark){
-         List<Object> list = obj2List(C82);
-         if(ListUtils.isNotEmpty(list)){
-         	if(list.stream().map(StringUtils::handleNull).anyMatch(e->e.contains(xmm.toString()))){
-				return remark;
-			}
-		 }
-		List<Object> list2 =obj2List(C81);
-		if(ListUtils.isNotEmpty(list2)){
-			return list2.stream().filter(StringUtils::isNotEmpty).map(StringUtils::handleNull).collect(Collectors.joining("、"));
-		}else{
-			return "";
-		}
-	}
 
-	/**
-	 * @Description 字符串连接
-	 * @Param [obs]
-	 * @return java.lang.Object
-	 * @Author yangyj
-	 * @Date 2022.02.12 17:21
-	 **/
-	public  static Object _concat(Object ...obs){
-		StringBuilder sb  = new StringBuilder();
-		if(obs!=null){
-			for(Object ob:obs){
-				sb.append(handleNull(ob));
-			}
-		}
-        return sb.toString();
-	}
-	public  static Object concat(Object o1,Object o2,Object o3,Object o4){
-		return _concat(o1,o2,o3,o4);
-	}
-	public  static Object concat(Object o1,Object o2,Object o3){
-		return _concat(o1,o2,o3);
-	}
-	public  static Object concat(Object o1,Object o2){
-		return _concat(o1,o2);
-	}
-	public  static Object concat(Object o1){
-		return _concat(o1);
-	}
+
+
 
 
 	/**
@@ -2796,7 +2762,16 @@ public class CustomFunction {
 		return "";
 	}
 
+	public static void main(String[] args) {
+		Map<String,Object> map =new HashMap<>();
+		map.put("A","13.3");
+		map.put("B","13.5");
+//		map.put("A","17*20");
+//		map.put("B","18*18");
+//		Expression.parse("(A-B)*10").calculate(map);
+		System.out.println(Expression.parse("(A-B)*10").calculate(map).toString());
 
+	}
 
 
 }

+ 8 - 2
blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java

@@ -65,9 +65,12 @@ public class FormulaUtils {
         return result;
     }
 
-    public  static void write(FormData fd, Object data){
+    public  static void write(FormData fd, Object data,Boolean nullOrBlank ){
         if(data instanceof List){
             List<Object> values = (List<Object>) data;
+            if(!nullOrBlank){
+               values=values.stream().filter(StringUtils::isNotEmpty).collect(Collectors.toList());
+            }
             if(values.size()>fd.getValues().size()){
                 /*当生成的数据超过实际容量的时候,会自动追加页数*/
                 if(fd.getCoordsList().size()==1){
@@ -264,5 +267,8 @@ public class FormulaUtils {
         //huangjn 每份填报数据的id,目前日志专用
     }
 
-
+    /*从元素名称中解析项目名称*/
+    public static  String parseItemName(String eName){
+        return StringUtils.handleNull(eName).replaceAll("^[^\\u4e00-\\u9fa5\\s]+","").split("[((].+[))]|_")[0];
+    }
 }

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

@@ -1627,6 +1627,7 @@ public class ExcelTabController extends BladeController {
             groupIds += "," + jsonObject.getString("tabGroupId");
             ;
         }
+        /*
         if (StringUtils.isNotEmpty(groupIds)) {
             List<WbsTreeContract> wbsTreeContractList = this.wbsTreeContractService.getBaseMapper().selectList(
                     Wrappers.<WbsTreeContract>lambdaQuery()
@@ -1642,8 +1643,33 @@ public class ExcelTabController extends BladeController {
                 }
             }
         }
-
+       */
+        /*全加载,或者可以优化成依赖加载*/
         List<TableInfo> tableInfoList = this.excelTabService.getTableInfoList(dataArray);
+        if(tableInfoList!=null){
+            List<AppWbsTreeContractVO> tableAll = wbsTreeContractService.searchNodeAllTable(nodeid, "1", contractId, projectId);
+            List<Long> tableAllIds=tableAll.stream().map(AppWbsTreeContractVO::getPKeyId).collect(Collectors.toList());
+            if(tableAll.size()>tableInfoList.size()){
+                List<Long> exclude=tableInfoList.stream().map(TableInfo::getPkeyId).map(Long::parseLong).collect(Collectors.toList());
+                JSONArray extra =new JSONArray();
+                for(Long pk:tableAllIds){
+                    if(!exclude.contains(pk)) {
+                        R bussDataInfo = this.excelTabService.getBussDataInfo(pk, 1);
+                        Map<String, Object>  jo = (Map<String, Object>) bussDataInfo.getData();
+                        jo.put("pkeyId",pk);
+                        extra.add(jo);
+                    }
+                }
+                List<TableInfo> tableInfoExtra = this.excelTabService.getTableInfoList(extra);
+                /*默认额外加载的默认不更新,除非有元素数据变动*/
+                tableInfoExtra.removeIf(e->e.getPkeyId()==null);
+                TableInfo example=tableInfoList.get(0);
+                tableInfoExtra.forEach(e->{e.setToBeUpdated(false);e.setBusinessId(null);e.setContractId(example.getContractId());e.setClassify(example.getClassify());e.setProjectId(example.getProjectId());e.setGroupId(example.getGroupId());});
+                tableInfoList.addAll(tableInfoExtra);
+                tableInfoList.sort(Comparator.comparingInt(a -> tableAllIds.indexOf(Long.parseLong(a.getPkeyId()))));
+            }
+        }
+
         try {
             this.excelTabService.formulaFillData(tableInfoList, Long.parseLong(nodeid));
             // 保存数据到数据库

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaTurnPoint.java

@@ -89,7 +89,7 @@ public class FormulaTurnPoint implements FormulaStrategy {
                     List<Object> dl =dataMap.get(ai.getAndIncrement());
                     v.setUpdate(1);
                     v.setFinished(Boolean.TRUE);
-                    FormulaUtils.write(v,dl);
+                    FormulaUtils.write(v,dl,true);
                 });
             }
 

+ 82 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/SubTable.java

@@ -0,0 +1,82 @@
+package org.springblade.manager.formula.impl;
+
+import com.mixsmart.utils.FormulaUtils;
+import com.mixsmart.utils.StringUtils;
+import lombok.Data;
+import org.springblade.manager.dto.ElementData;
+import org.springblade.manager.dto.FormData;
+
+import java.util.*;
+import java.util.logging.Handler;
+import java.util.stream.Collectors;
+
+/**
+ * @author yangyj
+ * @Date 2023/3/25 10:58
+ * @description TODO
+ */
+@Data
+public class SubTable {
+    public static  final String ITEM="检查项目";
+    public static  final String DESIGN="设计值";
+    public static  final String DATA="检验结果";
+    public static  final Integer[] STEP=new Integer[]{15,15,1};
+    public static final  List<String> KEYS= Arrays.asList(ITEM,DESIGN,DATA);
+    public static final  Integer ROW_SIZE=15;
+    private LinkedHashMap<String, List<String>> group=new LinkedHashMap<>();
+    private FormData itemName;
+    private FormData design;
+    private FormData data;
+
+
+    public SubTable() {
+    }
+    public SubTable(List<FormData> source) {
+        if(source!=null&&source.size()>0){
+            source.stream().filter(e->KEYS.contains(e.getEName().trim())).forEach(fd->{
+                fd.getValues().forEach(e->e.setValue(null));
+                switch (KEYS.indexOf(fd.getEName().trim())){
+                    case 0:itemName=fd;break;
+                    case 1:design=fd;break;
+                    case 2:data=fd;break;
+                    default:break;
+                }
+            });
+        }
+    }
+    public boolean checked(){
+        return itemName != null && design != null && data != null;
+    }
+
+   public void put(String key, List<ElementData> data){
+        if(data!=null&&data.size()>0){
+            group.put(key,data.stream().map(ElementData::stringValue).filter(StringUtils::isNotEmpty).collect(Collectors.toList()));
+        }
+   }
+
+   public void flush(){
+           if(group.size()>0){
+               List<String> itemNameList=new ArrayList<>();
+               List<String> designList=new ArrayList<>();
+               List<String> dataList = new ArrayList<>();
+               for(Map.Entry<String,List<String>> entry:group.entrySet()){
+                   String key = entry.getKey();
+                   String[] nameAndDesign=key.split("@");
+                   List<String> values=entry.getValue();
+                   int count = (int)Math.ceil((double)values.size()/(double)ROW_SIZE);
+                   int count2=count/STEP[0];
+                   itemNameList.addAll(Collections.nCopies(count2,nameAndDesign[0]));
+                   designList.addAll(Collections.nCopies(count2,nameAndDesign[1]));
+                   dataList.addAll(values);
+                   if(count>values.size()){
+                       dataList.addAll(Collections.nCopies(count-values.size(),""));
+                   }
+               }
+               /*写入元素*/
+               FormulaUtils.write(itemName,itemNameList,true);
+               FormulaUtils.write(design,designList,true);
+               FormulaUtils.write(data,dataList,true);
+           }
+   }
+
+}

+ 34 - 12
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -24,6 +24,7 @@ import org.springblade.manager.entity.*;
 import org.springblade.manager.formula.FormulaStrategyFactory;
 import org.springblade.manager.formula.KeyMapper;
 import org.springblade.manager.formula.impl.CompositeDataAccess;
+import org.springblade.manager.formula.impl.SubTable;
 import org.springblade.manager.formula.impl.TableElementConverter;
 import org.springblade.manager.mapper.FormulaMapper;
 import org.springblade.manager.service.*;
@@ -204,7 +205,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             for(String s:cki){
                 FormData fdTmp=this.formDataMap.get(s);
                 if(fdTmp!=null&&fdTmp.getValues().stream().map(ElementData::getValue).anyMatch(e->StringUtils.isNotEmpty(e)&&StringUtils.isNotEquals("/",e))){
-                    sb.append(fdTmp.getEName().replaceAll("^[^\\u4e00-\\u9fa5]+","").split("[((].+[))]|_")[0]).append(",");
+                    sb.append(FormulaUtils.parseItemName(fdTmp.getEName())).append(",");
                 }
             }
             if(sb.length()>1){
@@ -570,7 +571,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         }
 
 /*###############################附表的处理##################################*/
-        if(false) {
+        if(true) {
             try {
                 /*检验单附表处理*/
                 List<FormData> inspectionList = new ArrayList<>();
@@ -585,18 +586,19 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     });
                 });
                 if (Func.isNotEmpty(inspectionList)) {
-                    /*检查是否存在附表,不存在则加载*/
+                    /*检查是否存在附表,不存在载*/
                     List<AppWbsTreeContractVO> subTabList = this.tec.getTableAll().stream().filter(e -> e.getNodeName().contains("附表")).collect(Collectors.toList());
                     if (subTabList.size() == 0) {
-                        boolean pd=tec.getTableAll().stream().anyMatch(e->e.getNodeName().contains("评定表"));
-                        WbsTreePrivate sub = wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getNodeName, pd?"质量检验评定表(附表)":"质量检验表(附表)").eq(WbsTreePrivate::getProjectId, tec.getProjectId()));
+                        boolean pd=tec.getTableAll().stream().anyMatch(e->e.getNodeName().contains("评定表")||e.getFullName().contains("评定表"));
+                        WbsTreePrivate sub = wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().and(e->e.eq(WbsTreePrivate::getNodeName, pd?"质量检验评定表(附表)":"质量检验表(附表)").or().eq(WbsTreePrivate::getFullName, pd?"质量检验评定表(附表)":"质量检验表(附表)")).eq(WbsTreePrivate::getProjectId, tec.getProjectId()));
                         if (sub == null) {
                             this.tec.getLog().append("该项目没有挂有附表信息");
                         } else {
                             this.wbsTreePrivateService.addWbsTreeContractInfo(this.tec.getCurrentNode().getPkId().toString(), sub.getPKeyId().toString(), tec.getContractId());
                             AppWbsTreeContractVO one = this.tec.getTableAll().get(0);
-                            WbsTreeContract wtc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getParentId, one.getParentId()).eq(WbsTreeContract::getWbsId, one.getWbsId()).eq(WbsTreeContract::getNodeName, "质量检验表(附表)"));
+                            WbsTreeContract wtc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getParentId, one.getParentId()).eq(WbsTreeContract::getWbsId, one.getWbsId()).and(e->e.eq(WbsTreeContract::getNodeName, pd?"质量检验评定表(附表)":"质量检验表(附表)").or().eq(WbsTreeContract::getFullName, pd?"质量检验评定表(附表)":"质量检验表(附表)")));
                             if (wtc != null) {
+                                /*只需要挂载一张*/
                                 AppWbsTreeContractVO obj = BeanUtil.copy(wtc, AppWbsTreeContractVO.class);
                                 this.tec.getTableAll().add(obj);
                                 subTabList.add(obj);
@@ -617,7 +619,15 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                         tec.getCoordinateMap().put(subTabList.get(0).getInitTableName(), CustomFunction.getElementCell(first.getHtmlUrl()));
                         List<Map<String, Object>> elementMaps = this.jdbcTemplate.queryForList("select b.e_name name , CONCAT(a.tab_en_name,':',b.e_key) code , b.e_key ekey ,b.id fieldId,a.tab_en_name tableName from m_table_info a join m_wbs_form_element b on a.id = b.f_id where a.tab_en_name='" + first.getInitTableName() + "' and b.is_deleted=0 ");
                         if (Func.isNotEmpty(elementMaps)) {
-                            //missingFill(elementMaps.stream().map(e->StringUtils.handleNull(e.get("code"))).collect(Collectors.toList()));
+                            elementMaps.forEach(e->{
+                                /*生成附表元素*/
+                                String values=subTableInfo.stream().map(TableInfo::getDataMap).map(m->m.get(StringUtils.handleNull(e.get("ekey")))).filter(StringUtils::isNotEmpty).collect(Collectors.joining(";;"));
+                                FormData tmp=  createFormDataFast(StringUtils.handleNull(e.get("ename")),StringUtils.handleNull(e.get("code")),values);
+                                if(tmp!=null){
+                                    this.formDataMap.put(tmp.getCode(),tmp);
+                                    this.formDataList.add(tmp);
+                                }
+                            });
                             /*生成元素数据*/
                             subTabList.forEach(s->{
                                 elementMaps.forEach(e->{
@@ -632,13 +642,25 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
                         }
                     }
-
+                    List<FormData> subTableFds=this.formDataList.stream().filter(e->StringUtils.isEquals(first.getInitTableName(),e.getTableName())).collect(Collectors.toList());
+                    SubTable sta=new SubTable(subTableFds);
                     /*检验单或者评定表存在超页数据*/
                     inspectionList.forEach(f -> {
-
+                           List<ElementData> overList = f.getValues().stream().skip(f.getCoordsList().size()).collect(Collectors.toList());
+                           String itemName=FormulaUtils.parseItemName(f.getEName());
+                           String key=itemName.trim();
+                           Optional<FormData> designFdOp=  this.formDataMap.values().stream().filter(o->o.getTableName().equals(f.getTableName())&&StringUtils.isEquals(itemName,FormulaUtils.parseItemName(o.getEName()))).findAny();
+                           if(designFdOp.isPresent()){
+                               key+="@"+designFdOp.get().getValues().stream().map(ElementData::stringValue).filter(StringUtils::isNotEmpty).findAny().orElse("");
+                           }
+                           sta.put(key,overList);
                     });
+                    if(sta.checked()){
+                        sta.flush();
+                    }
                 }
             } catch (Exception e) {
+                this.tec.getLog().append("|=|").append("附表异常").append("|=|");
                 e.printStackTrace();
             }
         }
@@ -647,7 +669,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     public  void write(FormData fd,Object data){
         /*如果需要向额外元素或对象输出数据,在此处修改*/
-               FormulaUtils.write(fd,data);
+               FormulaUtils.write(fd,data,false);
     }
 
     /**加页增容*/
@@ -993,9 +1015,9 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                              FormData dataFd=this.formDataMap.get(codeList.get(0));
                              FormData designFd=this.formDataMap.get(codeList.get(1));
                              if(dataFd!=null&&designFd!=null){
-                                 if(designFd.getValues().size()>0){
+                                 if(dataFd.getValues().stream().map(ElementData::getValue).anyMatch(StringUtils::isNotEmpty)&&(designFd.getValues().size()>1||designFd.getValues().stream().map(ElementData::getValue).anyMatch(StringUtils::isEmpty))){
                                      /*多少个设计值暂时默认全部合格,满足绝大部分结果*/
-                                     data=dataFd.getValues().size();
+                                     data=dataFd.getValues().stream().map(ElementData::getValue).filter(StringUtils::isNotEmpty).count();
                                  }else{
                                      List<Object>  result =  CustomFunction.b445check(dataFd.getValues().stream().map(ElementData::getValue).collect(Collectors.toList()),designFd.getValues().stream().map(ElementData::getValue).collect(Collectors.toList()),formula.getDev(),1 );
                                      data=result.get(1);