瀏覽代碼

meter refrence

yangyj 1 年之前
父節點
當前提交
fd8f9650aa

+ 25 - 9
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ReportResult.java

@@ -2,14 +2,14 @@ package org.springblade.manager.vo;
 
 import lombok.Data;
 import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringPool;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.CompletableFuture;
+import java.util.stream.Collectors;
 
 /**
  * @author yangyj
@@ -43,8 +43,8 @@ public class ReportResult {
     private Map<String,Object> commonData =new HashMap<>();
     /**电签信息*/
     private Map<String,String> eSignMap = new HashMap<>();
-    /**合并单元格*/
-    private Map<String,String> mergeCellsMap = new HashMap<>();
+    /**合并单元格,格式:{页码@x@y}*/
+    private Set<String> mergeCellsSet = new HashSet<>();
     /**模板类型*/
     private Integer modelType=MeterInfo.MB_GX;
 
@@ -58,10 +58,10 @@ public class ReportResult {
     public String getId(){
         return  0L+""+excelId;
     }
-    public void pathInit(String sysLocalFileUrl){
-        this.pdfPath=sysLocalFileUrl + "/pdf//" +getId() + ".pdf";
+    public void pathInit(String sysLocalFileUrl,Long contractId){
+        this.pdfPath=sysLocalFileUrl + "/pdf//"+contractId+"_"+getId()+".pdf";
         /*this.excelPath=sysLocalFileUrl + "/pdf//" + getId() + ".xlsx";*/
-        this.excelPath=sysLocalFileUrl + "/pdf//" + getName().trim()+ ".xlsx";
+        this.excelPath=sysLocalFileUrl + "/pdf//"+contractId+"_"+ getName().trim()+ ".xlsx";
     }
     /*添加公共部分*/
     public void putCommon(){
@@ -108,4 +108,20 @@ public class ReportResult {
 
     }
 
+    /*是否包含合并单元格操作*/
+    private boolean hasMergeCell(){
+        return mergeCellsSet.size()>0;
+    }
+
+    /**获取动态合并配置*/
+    public Map<Integer,Set<CellRangeAddress>> buildMergeConfig(){
+        if(hasMergeCell()){
+           return mergeCellsSet.stream().collect(Collectors.groupingBy(s->Integer.parseInt(s.split("@")[0]),Collectors.mapping(s->{
+                String[] arr =s.split("@");
+                return new CellRangeAddress(Integer.parseInt(arr[2])-1,Integer.parseInt(arr[4])-1,Integer.parseInt(arr[1])-1,Integer.parseInt(arr[3])-1);
+            },Collectors.toSet())));
+        }
+        return new HashMap<>();
+    }
+
 }

+ 6 - 1
blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java

@@ -8,6 +8,8 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.annotation.JSONField;
+import com.itextpdf.text.pdf.PdfReader;
+import com.itextpdf.text.pdf.parser.*;
 import com.jfireel.expression.Expression;
 import org.apache.commons.lang.math.NumberUtils;
 import org.apache.http.*;
@@ -63,6 +65,7 @@ import java.awt.*;
 import java.awt.Font;
 import java.awt.Shape;
 import java.awt.geom.Ellipse2D;
+import java.awt.geom.Rectangle2D;
 import java.io.*;
 
 import java.lang.reflect.Field;
@@ -142,7 +145,7 @@ public class FormulaUtils {
         @SuppressWarnings("unchecked")
         Map<String,Object> em = (Map<String, Object>) currentMap.computeIfAbsent(E,(k)-> new HashMap<>());
         /*如果输入输出元素都是1对1*/
-        if(f.split("[/+\\-*]").length>1&&ele.stream().map(e->e.getCoordsList().size()).max(Comparator.comparingInt(e->e)).orElse(1)==1&&fd.getCoordsList().size()==1){
+        if(f.split("[/+\\-*]").length>1&&!f.contains("{}")&&ele.stream().map(e->e.getCoordsList().size()).max(Comparator.comparingInt(e->e)).orElse(1)==1&&fd.getCoordsList().size()==1){
             ele.forEach(e->{
                 Object value=e.getValues().get(0).getValue();
                 if(CustomFunction.isNumber(value)){
@@ -1391,6 +1394,8 @@ public static Map<String,List<Long>> relatedPages(List<FormData> curFormDatas ,L
         return fdm.values().stream().filter(e->key.equals(e.getCode().split(":")[1])).findAny();
     }
 
+
+
     public static List<TableInfo> getTableInfoList(JSONArray dataArray) {
         if (dataArray != null && !dataArray.isEmpty()) {
             List<TableInfo> result = new ArrayList<>();

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

@@ -4,11 +4,14 @@ import com.mixsmart.utils.FormulaUtils;
 import com.mixsmart.utils.StringUtils;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.springblade.core.tool.utils.StringPool;
 import org.springblade.manager.dto.ElementData;
 import org.springblade.manager.dto.FormData;
 import org.springblade.manager.entity.Formula;
 
-import java.util.Set;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 /**
  * @author yangyj
@@ -42,8 +45,34 @@ public class ExecutorFormat extends FormulaExecutor {
 
             }
         }
+        /*合并单元格*/
+        mergeCell();
+    }
 
+    public void mergeCell(){
+        FormData qdh= FormulaUtils.elementFindByCode(tec.formDataMap,"m_20240325154016_1772166597482381312:key_1").orElse(null);
+        FormData xm= FormulaUtils.elementFindByCode(tec.formDataMap,"m_20240325154016_1772166597482381312:key_13").orElse(null);
+        if(qdh!=null&&xm!=null){
+            List<ElementData> la = qdh.getValues();
+            List<ElementData> lb = xm.getValues();
+            if(la.size()>0&&lb.size()>0){
+               Set<String> mergeSet= IntStream.range(0, Math.min(la.size(),lb.size())).boxed().map(i->{
+                    ElementData ea=la.get(i);
+                    ElementData eb=lb.get(i);
+                    String b= eb.stringValue();
+                    if(b.contains("合计")){
+                        return  ea.getIndex()+"@"+ea.getX()+"@"+ea.getY()+"@"+eb.getX()+"@"+eb.getY();
+                    }
+                    return StringPool.EMPTY;
+                }).filter(s->!StringPool.EMPTY.equals(s)).collect(Collectors.toSet());
+                if(mergeSet.size()>0){
+                    Set<String> set=tec.getMergeCellMaps().computeIfAbsent("m_20240325154016_1772166597482381312", k->new HashSet<>());
+                    set.addAll(mergeSet);
+                }
+            }
+        }
     }
 
 
+
 }

+ 6 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/TableElementConverter.java

@@ -41,7 +41,6 @@ public class TableElementConverter implements ITableElementConverter {
     public static String JOIN_REG = "__\\d+_\\d+,?";
     public static Pattern RP = Pattern.compile("(?<=E\\[)[^]]+(?=])");
 
-
     private List<TableInfo> tableInfoList;
     private Long contractId;
     private Long projectId;
@@ -55,7 +54,6 @@ public class TableElementConverter implements ITableElementConverter {
      * 所有已经初始化数据的元素集
      */
     public Map<String, FormData> formDataMap = new HashMap<>();
-
     /**当前工序所有元素信息*/
     public Map<String, FormData> formDataNodeMap = new HashMap<>();
     /**根据表名分类存放当前工序所有元素*/
@@ -66,6 +64,8 @@ public class TableElementConverter implements ITableElementConverter {
     Map<String, Map<String, String>> coordinateMap = new HashMap<>();
     /**电签信息*/
     Map<String, Map<String, String>> eSignMaps = new HashMap<>();
+    /**动态合并单元格*/
+    Map<String,Set<String>>  mergeCellMaps=new HashMap<>();
     /**业务表所包含的所有页面,根据表名查询*/
     Map<String,List<Long>> tableNamePkeyIdMap;
     /**pkeyId对应的表名称*/
@@ -372,7 +372,7 @@ public class TableElementConverter implements ITableElementConverter {
         public void convert() {
               /*模版选择*/
               for(NodeTable nt:tableAll){
-                  if("m_20240222111932_1760504568283660288".equals(nt.getInitTableName())||"m_20240222093331_1760477888294944768".equals(nt.getInitTableName())){
+                  if("m_20240222111932_1760504568283660288".equals(nt.getInitTableName())||"m_20240222093331_1760477888294944768".equals(nt.getInitTableName())||"m_20240222110914_1760501976056987648".equals(nt.getInitTableName())){
                       meterInfo.setConfig(MeterInfo.MB_ZJ);
                       break;
                   }
@@ -488,6 +488,9 @@ public class TableElementConverter implements ITableElementConverter {
                    rt.setESignMap(eSignMaps.get(report.getInitTableName()));
                    rt.setName(report.getNodeName());
                    rt.setExcelId(report.getExcelId());
+                   if(mergeCellMaps.containsKey(rt.getInitTableName())){
+                       rt.getMergeCellsSet().addAll(mergeCellMaps.get(rt.getInitTableName()));
+                   }
                    rt.setPkeyId(report.getPKeyId()); //返回表单的主表Id
                    if(meterInfo.getConfig()!=null){
                        /*设置模版类型 广西、浙江或者其他*/

+ 23 - 15
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java

@@ -18,25 +18,17 @@ import com.itextpdf.text.pdf.PdfCopy;
 import com.itextpdf.text.pdf.PdfReader;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import io.swagger.models.auth.In;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.time.DateUtils;
-import org.apache.poi.hssf.usermodel.HSSFFont;
-import org.apache.poi.hssf.usermodel.HSSFRichTextString;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.util.IOUtils;
 import org.apache.poi.xssf.usermodel.XSSFRichTextString;
-import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import org.jsoup.Jsoup;
-import org.jsoup.nodes.Element;
-import org.jsoup.select.Elements;
 import org.springblade.business.entity.*;
 import org.springblade.business.feign.TaskClient;
 import org.springblade.common.constant.ClientIdConstant;
-import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.BaseUtils;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
@@ -54,9 +46,7 @@ import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.feign.ArchiveFileTaskClient;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.ContractRelationJlyz;
-import org.springblade.manager.entity.TextdictInfo;
 import org.springblade.manager.feign.FormulaClient;
-import org.springblade.manager.vo.MeterInfo;
 import org.springblade.manager.vo.ReportMergeCellsConfig;
 import org.springblade.manager.vo.ReportResult;
 import org.springblade.meter.dto.*;
@@ -69,7 +59,6 @@ import org.springblade.meter.utils.CollectionUtils;
 import org.springblade.meter.vo.*;
 import org.springblade.producer.bean.PushMessage;
 import org.springblade.resource.feign.NewIOSSClient;
-import org.springblade.system.cache.ParamCache;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
@@ -88,7 +77,6 @@ import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
-import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -2752,7 +2740,7 @@ public class TaskController extends BladeController {
                 /*准备*/
                 reportResults.forEach(rs -> {
                     /*初始化路径*/
-                    rs.pathInit(file_path);
+                    rs.pathInit(file_path,report.getContractId());
                     rs.setExcelUrl(fileUrlMapping.get(rs.getExcelId().toString()));
                     /*删除已经存在的PDF*/
                     File tabPdf;
@@ -2768,7 +2756,7 @@ public class TaskController extends BladeController {
                     }
                 });
                 /*写死合并*/
-                List<ReportMergeCellsConfig> configList = ReportMergeCellsConfig.bulider();
+                /*List<ReportMergeCellsConfig> configList = ReportMergeCellsConfig.bulider();*/
                 /*每种表生成一份pdf*/
                 StringBuffer sb = new StringBuffer();
                 reportResults.parallelStream().forEach(rs -> {
@@ -2783,7 +2771,10 @@ public class TaskController extends BladeController {
                         String title = rs.createTitle(projectName);
                         /*把公共部分内容释放到每一页*/
                         rs.putCommon();
-                        for (Map<String, Object> dataMap : rs.getData()) {
+                        /*合并单元格的配置信息*/
+                        Map<Integer,Set<CellRangeAddress>> mergeConfig= rs.buildMergeConfig();
+                        for (int n=0;n< rs.getData().size();n++) {
+                            Map<String, Object> dataMap = rs.getData().get(n);
                             try {
                                 Workbook workbook = WorkbookFactory.create(new ByteArrayInputStream(excelByte));
                                 //获取工作表
@@ -2819,6 +2810,23 @@ public class TaskController extends BladeController {
                                 rs.setTitle(sheet, title);
                                 /*添加电签*/
                                 setDQInfo(sheet,rs,title);
+                                /*合并单元格*/
+                                if(mergeConfig.containsKey(n)){
+                                    mergeConfig.get(n).forEach(ca->{
+                                        Cell first = sheet.getRow(ca.getFirstRow()).getCell(ca.getFirstColumn(), Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
+                                        StringBuilder vs= new StringBuilder();
+                                        for(int k=ca.getFirstRow();k<=ca.getLastRow();k++){
+                                            for (int w=ca.getFirstColumn();w<=ca.getLastColumn();w++){
+                                              Cell cell= sheet.getRow(k).getCell(w,Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
+                                              vs.append(cell.getStringCellValue());
+                                            }
+                                        }
+                                        if(vs.length()>0){
+                                            first.setCellValue(vs.toString());
+                                        }
+                                        sheet.addMergedRegionUnsafe(ca);
+                                    });
+                                }
                                 //去掉表格虚线
                                 sheet.setPrintGridlines(false);
                                 //设置 整个工作表为一页