yangyj 1 vuosi sitten
vanhempi
commit
606d4e724a

+ 52 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/SubTable.java

@@ -8,7 +8,9 @@ import org.springblade.manager.dto.ElementData;
 import org.springblade.manager.dto.FormData;
 
 import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 /**
  * @author yangyj
@@ -35,8 +37,8 @@ public class 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));
+                /*这是把所有数据重置为空,如果要实现手填就必须分析出项目,按项目名称覆盖LinkedHashMap<String, List<Object>> group*/
+                /*fd.getValues().forEach(e -> e.setValue(null));*/
                 switch (KEYS.indexOf(fd.getEName().trim())) {
                     case 0:
                         itemName = fd;
@@ -52,6 +54,13 @@ public class SubTable {
                 }
             });
         }
+        /*初始化group,保留原先内容,只做同KEY覆盖*/
+        initGroup();
+    }
+
+    /*获取每页的行数*/
+    public Integer getColumnSize(){
+       return this.itemName.getCoordsList().size();
     }
 
     public boolean checked() {
@@ -65,20 +74,35 @@ public class SubTable {
     }
 
     public void flush() {
+        /*行号,起始为0,当前行号整除列大小余0就是每页首行*/
+        AtomicInteger index=new AtomicInteger(0);
         if (group.size() > 0) {
             List<String> itemNameList = new ArrayList<>();
             List<Object> designList = new ArrayList<>();
             List<Object> dataList = new ArrayList<>();
+            int columnSize = getColumnSize();
             for (Map.Entry<String, List<Object>> entry : group.entrySet()) {
                 String key = entry.getKey();
                 String[] nameAndDesign = key.split("@");
                 List<Object> values = entry.getValue();
                 /*写人的行数*/
                 int count = (int) Math.ceil((double) values.size() / (double) ROW_SIZE);
-//                   int count2=count/STEP[0];
-                itemNameList.add(nameAndDesign[0]);
                 if(count>1) {
-                    itemNameList.addAll(Collections.nCopies(count-1, StringPool.EMPTY));
+                    /*每一页的首行都要显示*/
+                    int head= index.get();
+                     List<String> tmp=  IntStream.range(head,head+count).boxed().map(i->{
+                         String res=StringPool.EMPTY;
+                        if(i==head||(i%columnSize==0)){
+                            res= nameAndDesign[0];
+                        }
+                         index.getAndIncrement();
+                         return res;
+                    }).collect(Collectors.toList());
+                    itemNameList.addAll(tmp);
+                }else{
+                    /*行号+1*/
+                    index.getAndIncrement();
+                    itemNameList.add(nameAndDesign[0]);
                 }
                 if (design != null) {
                     if (nameAndDesign.length >= 2) {
@@ -108,4 +132,27 @@ public class SubTable {
         }
     }
 
+    /*用原有数据初始化*/
+    private void initGroup(){
+        if(checked()) {
+            List<String> itemName = this.itemName.getValues().stream().map(ElementData::stringValue).collect(Collectors.toList());
+            List<String> designs = this.design.getValues().stream().map(ElementData::stringValue).collect(Collectors.toList());
+            List<Object> data = this.data.getRawValue();
+            String name = itemName.get(0);
+            if(StringUtils.isNotEmpty(name)) {
+                int head = 0;
+                for (int i = 1; i < itemName.size(); i++) {
+                    String x = itemName.get(i);
+                    /*如果非空且与当前的不一样则视为新项目*/
+                    if (StringUtils.isNotEmpty(x) && !x.equals(name) || (i == itemName.size() - 1)) {
+                        String des = designs.subList(head, i).stream().filter(StringUtils::isNotEmpty).distinct().collect(Collectors.joining("/"));
+                        group.put(name + StringPool.AT + des, data.subList(head*15,  i*ROW_SIZE));
+                        head = i;
+                        name = x;
+                    }
+                }
+            }
+        }
+    }
+
 }