瀏覽代碼

检验单续表bug

yangyj 1 年之前
父節點
當前提交
0066cd2537

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

@@ -807,7 +807,7 @@ public class ExecutorMeter extends FormulaExecutor {
             if(pageFd!=null) {
                 int total = totalPage();
                 String pageTmp = "第$1页 共" + total + "页";
-                pageFd.setValues(IntStream.range(0, total).boxed().map(i -> new ElementData(pageTmp.replace("$1", i.toString()))).collect(Collectors.toList()));
+                pageFd.setValues(IntStream.rangeClosed(1, total).boxed().map(i -> new ElementData(pageTmp.replace("$1", i.toString()))).collect(Collectors.toList()));
             }
         }
         /*动态行数据写入对应的元素*/

+ 21 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/SubTable.java

@@ -7,6 +7,7 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringPool;
 import org.springblade.manager.dto.ElementData;
 import org.springblade.manager.dto.FormData;
+import org.springblade.manager.formula.NodeTable;
 
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -32,7 +33,7 @@ public class SubTable {
     /**上次的记录*/
     private LinkedHashMap<String, Item> original = new LinkedHashMap<>();
     /**检验单检查项目元素,用来排序*/
-    private List<FormData> mainList;
+    private List<FormData> mainList = new ArrayList<>();
     /**项目名称*/
     private FormData itemName;
     /**设计值*/
@@ -40,11 +41,20 @@ public class SubTable {
     /**实测值*/
     private FormData data;
 
+    private TableElementConverter tec;
+
 
     public SubTable() {
     }
 
-    public SubTable(List<FormData> source,List<FormData> mainList) {
+    /**
+     * @Description 初始化附表 对象
+     * @Param [source 附表关键元素 项目名-设计值-实测值, tec 上下文, mainTableList 主表集合(部分工序节点可能存在续表等多种主表,所以用集合传参)]
+     * @Author yangyj
+     * @Date 2024.02.01 17:56
+     **/
+    public SubTable(List<FormData> source,TableElementConverter tec, List<NodeTable> mainTableList) {
+        this.tec=tec;
         if (source != null && source.size() > 0) {
             source.stream().filter(e -> KEYS.contains(e.getEName().trim())).forEach(fd -> {
                 switch (KEYS.indexOf(fd.getEName().trim())) {
@@ -61,8 +71,13 @@ public class SubTable {
                         break;
                 }
             });
+            /*主表的所有项目,附表的输出排序*/
+            for(NodeTable nodeTable:mainTableList){
+                List<FormData> tmp=tec.pick(e->nodeTable.getNodeName().equals(e.getTableName())&&e.getCoordsList().size()>1);
+                tmp.sort(Comparator.comparingInt(FormData::getMaxRow));
+                this.mainList.addAll(tmp);
+            }
         }
-        this.mainList=mainList;
     }
 
     /*获取每页的行数*/
@@ -77,7 +92,7 @@ public class SubTable {
 
 
     /*解析项目信息*/
-    public void put(List<FormData> inspectionList,Map<String, FormData> formDataMap) {
+    public void put(List<FormData> inspectionList) {
         /*根据行号排序*/
         inspectionList.sort(Comparator.comparingInt(e->e.getCoordsList().get(0).getY()));
         /*检验单、评定表不能超过一页,多余的需要删除并把检测项数据写人附表*/
@@ -89,7 +104,7 @@ public class SubTable {
               if (overList.stream().anyMatch(ElementData::isNotEmpty)){
                   Item item = new Item(FormulaUtils.parseItemName(fd.getEName()).trim());
                   /*同项目*/
-                  Optional<FormData> designFdOp = formDataMap.values().stream().filter(o -> o.getTableName().equals(fd.getTableName()) && !o.equals(fd) && fd.getMaxRow().equals(o.getMaxRow()) && o.getEName().contains("设计")).findAny();
+                  Optional<FormData> designFdOp = tec.formDataMap.values().stream().filter(o -> o.getTableName().equals(fd.getTableName()) && !o.equals(fd) && fd.getMaxRow().equals(o.getMaxRow()) && o.getEName().contains("设计")).findAny();
                   designFdOp.ifPresent(formData -> item.setDesign(formData.getValues().stream().map(ElementData::stringValue).filter(StringUtils::isNotEmpty).collect(Collectors.toList())));
                   item.setData(FormulaUtils.setScale(null, overList).stream().map(ElementData::getValue).filter(StringUtils::isNotEmpty).collect(Collectors.toList()));
                   group.put(item.getName(), item);
@@ -168,7 +183,7 @@ public class SubTable {
         initOriginal();
         List<Item> itemList = new ArrayList<>(group.values());
         if(this.mainList!=null){
-            List<String> itemNameIndex = this.mainList.stream().sorted(Comparator.comparingInt(FormData::getMaxRow)).map(e->FormulaUtils.parseItemName(e.getEName()).trim()).collect(Collectors.toList());
+            List<String> itemNameIndex = this.mainList.stream().map(e->FormulaUtils.parseItemName(e.getEName()).trim()).collect(Collectors.toList());
             /*额外手写的项目排在所有检验项的后面*/
             itemList.sort(Comparator.comparingInt(item-> itemNameIndex.contains(item.getName()) ?itemNameIndex.indexOf(item.getName()):itemNameIndex.size()));
             itemList.forEach(e->{

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

@@ -1125,34 +1125,48 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             if(Func.isEmpty(mainTable)){
                 return;
             }
-            NodeTable main = mainTable.get(0);
+            List<NodeTable> mainTableList= mainTable.stream().collect(Collectors.groupingBy(NodeTable::getInitTableName)).values().stream().map(l->l.get(0)).collect(Collectors.toList());
+            /*NodeTable main = mainTable.get(0);*/
+            List<Long> pkeyIdsMain=mainTableList.stream().map(NodeTable::getPKeyId).collect(Collectors.toList());
             if(mainTable.size()>1){
-                /*超过一页全部删除*/
-                List<Long> removeIds = mainTable.stream().skip(1L).map(NodeTable::getPKeyId).collect(Collectors.toList());
-                tec.getKeyMappers().removeIf(e->removeIds.contains(e.getPkId()));
-                this.wbsTreeContractMapper.deleteByIds(removeIds);
+                List<Long> removeIds = mainTable.stream().map(NodeTable::getPKeyId).filter(x ->!pkeyIdsMain.contains(x)).collect(Collectors.toList());
+                if(removeIds.size()>0) {
+                    /*每种检验单,除了第一页都删掉*/
+                    tec.getKeyMappers().removeIf(e -> removeIds.contains(e.getPkId()));
+                    /*同时tableAll里也要删除*/
+                    tec.getTableAll().removeIf(e -> removeIds.contains(e.getPKeyId()));
+                    this.wbsTreeContractMapper.deleteByIds(removeIds);
+                }
                 /*多余的表删除之后需要,裁剪多余表头数据保留全部实测数据然后重新设置增页大小*/
-                tec.getKeyMappers().stream().filter(e->e.getPkId().equals(main.getPKeyId())).map(KeyMapper::getCode).forEach(e->{
-                   FormData target= tec.formDataMap.get(e);
-                   int capacity=target.getCoordsList().size();
-                   List<ElementData> eds = target.getValues();
-                   if(eds.size()>capacity){
-                       if(capacity>1){
-                          target.setAddPages((eds.size()/capacity)-1);
-                       }else{
-                          target.setValues(eds.stream().limit(capacity).collect(Collectors.toList()));
-                       }
-                   }
-                });
+                for(NodeTable mt:mainTableList) {
+                    tec.getKeyMappers().stream().filter(e -> e.getPkId().equals(mt.getPKeyId())).map(KeyMapper::getCode).forEach(e -> {
+                        FormData target = tec.formDataMap.get(e);
+                        int capacity = target.getCoordsList().size();
+                        List<ElementData> eds = target.getValues();
+                        if (eds.size() > capacity) {
+                            if (capacity > 1) {
+                                /*元素每页单元格数量大于1则重新视为业务数据,重新计算增页*/
+                                target.setAddPages((eds.size() / capacity) - 1);
+                            } else {
+                                /*表头表尾元素只留首页的内容*/
+                                target.setValues(eds.stream().limit(capacity).collect(Collectors.toList()));
+                            }
+                        }
+                        if(target.getAddPages()>0){
+                            /*筛选元素长度超1页的元素*/
+                            inspectionList.add(target);
+                        }
+                    });
+                }
             }
             /*获取所有挂在检验单、评定表里的元素映射关系*/
-            tec.getKeyMappers().stream().filter(p -> p.getPkId().equals(main.getPKeyId())).forEach(k -> {
-                /*筛选元素长度超1页的元素*/
+/*            tec.getKeyMappers().stream().filter(p -> p.getPkId().equals(main.getPKeyId())).forEach(k -> {
+                *//*筛选元素长度超1页的元素*//*
                 List<FormData> target = tec.formDataMap.values().stream().filter(f -> f.getCode().equals(k.getCode()) && f.getAddPages() > 0).collect(Collectors.toList());
                 if (Func.isNotEmpty(target)) {
                     inspectionList.addAll(target);
                 }
-            });
+            });*/
             if (Func.isNotEmpty(inspectionList)) {
                 /*检查是否存在附表,不存在挂载*/
                 List<NodeTable> subTabList = tec.getTableAll().stream().filter(e -> e.getNodeName().contains("附表")).collect(Collectors.toList());
@@ -1166,11 +1180,9 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 }
                 /*名称,设计值,实测值 附表元素*/
                 List<FormData> subTableFds=tec.pick(e->StringUtils.isEquals(first.getInitTableName(),e.getTableName()));
-                /*主表的所有项目,附表的输出排序*/
-                List<FormData> mainList=tec.pick(e->StringUtils.isEquals(main.getInitTableName(),e.getTableName())&&e.getCoordsList().size()>1);
                 /*初始化附表对象*/
-                SubTable sta=new SubTable(subTableFds,mainList);
-                sta.put(inspectionList,tec.formDataMap);
+                SubTable sta=new SubTable(subTableFds,tec, mainTableList);
+                sta.put(inspectionList);
                 /*把附表数据刷入对应的附表元素对象*/
                 sta.flush();
                 /*把主表的表头表尾信息拷贝*/
@@ -1725,26 +1737,29 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             if(wtc!=null) {
                 System.out.println("A0耗时"+(System.currentTimeMillis()-start));
                 List<Map<String, Object>> listMap = this.jdbcTemplate.queryForList("select init_table_name number ,node_name nodeName ,b.tab_ch_name tableName from m_wbs_tree_contract a  join m_table_info b on a.init_table_name = b.tab_en_name where parent_id =?  and a.is_deleted=0 and contract_id = ?", wtc.getId(), wtc.getContractId());
-                Predicate<Map<String, Object>> tableNameFilter = map ->true;
-                if(Func.isNotEmpty(tableName)){
-                    tableNameFilter=map->map.get("nodeName").toString().contains(tableName);
-                }
-                Map<String, Map<String, Object>> tablesMap = listMap.stream().filter(tableNameFilter).collect(Collectors.toMap(m -> m.get("number").toString(), m -> m, (m1, m2) -> m1));
+                Map<String, Map<String, Object>> tablesMap = listMap.stream().collect(Collectors.toMap(m -> m.get("number").toString(), m -> m, (m1, m2) -> m1));
                 System.out.println("A1耗时"+(System.currentTimeMillis()-start));
                 if(tablesMap.size()>0) {
                     String tableNames = String.join("','", tablesMap.keySet());
                     List<FormData> processFds = this.createFormDataByTableName(tableNames);
                     System.out.println("B耗时"+(System.currentTimeMillis()-start));
                     if(processFds.size()>0) {
+                        Map<String,String> dictMap = processFds.stream().collect(Collectors.toMap(FormData::getCode,fd->fd.getTableChName()+":"+fd.getEName(),(p,n)->p));
                         Predicate<FormData> elementFilter = ele ->true;
+                        if(Func.isNotEmpty(tableName)){
+                           Map<String,Map<String, Object>> initTableNamesMap=  listMap.stream().filter(map->map.get("nodeName").toString().contains(tableName)).collect(Collectors.toMap(m -> m.get("number").toString(), m -> m, (m1, m2) -> m1));
+                           if(initTableNamesMap.size()>0){
+                               List<String> initTableNames = new ArrayList<>(initTableNamesMap.keySet());
+                               elementFilter=ele->initTableNames.contains(ele.getTableName());
+                           }
+                        }
                         if(Func.isNotEmpty(elementName)){
-                            elementFilter=ele->ele.getEName().contains(elementName);
+                            elementFilter=   elementFilter.and(ele->ele.getEName().contains(elementName));
                         }
-                        Map<String,String> dictMap = processFds.stream().collect(Collectors.toMap(FormData::getCode,fd->fd.getTableChName()+":"+fd.getEName(),(p,n)->p));
-                        processFds=processFds.stream().filter(elementFilter).collect(Collectors.toList());
-                        this.formulaInto(processFds, wtc.getProjectId(), String.valueOf(pkeyId), ExecuteType.INSPECTION);
+                        List<FormData> result=processFds.stream().filter(elementFilter).collect(Collectors.toList());
+                        this.formulaInto(result, wtc.getProjectId(), String.valueOf(pkeyId), ExecuteType.INSPECTION);
                         System.out.println("C耗时"+(System.currentTimeMillis()-start));
-                        Map<String, List<Map<String, Object>>> fdGroup = processFds.stream()
+                        Map<String, List<Map<String, Object>>> fdGroup = result.stream()
                                 .filter(FormData::executable)
                                 .collect(Collectors.groupingBy(
                                         FormData::getTableChName,