yangyj 1 жил өмнө
parent
commit
f03e92eef1

+ 3 - 0
blade-common/src/main/java/org/springblade/common/utils/BaseUtils.java

@@ -2,6 +2,7 @@ package org.springblade.common.utils;
 
 import com.alibaba.cloud.commons.lang.StringUtils;
 import org.springblade.common.constant.RegexConstant;
+import org.springblade.common.vo.DataVO;
 
 import java.io.*;
 import java.math.BigDecimal;
@@ -493,4 +494,6 @@ public static List<Object> obj2List(Object obj) {
     }
 
 
+
+
 }

+ 2 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ReportResult.java

@@ -39,6 +39,8 @@ public class ReportResult {
     private List<Map<String,Object>> data=new ArrayList<>();
     /**每一页的固定内容*/
     private Map<String,Object> commonData =new HashMap<>();
+    /**电签信息*/
+    private Map<String,String> eSignMap = new HashMap<>();
 
     public String getPdfPath(){
         return this.pdfPath;

+ 20 - 0
blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java

@@ -39,6 +39,7 @@ import org.jfree.data.xy.XYSeries;
 import org.jfree.data.xy.XYSeriesCollection;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
+import org.jsoup.select.Elements;
 import org.springblade.common.utils.BaseUtils;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.tool.utils.*;
@@ -806,6 +807,9 @@ public class FormulaUtils {
     public static Map<String, String> getElementExcelCoords(String uri){
         return getElementExcelCoords(uri,null,null);
     }
+    public static Map<String, String> getElementExcelCoords(Document document){
+        return getElementExcelCoords(null,null,document);
+    }
     public static Map<String, String> getElementExcelCoords(String uri,String key,Document document){
         try {
             String filter=" [keyname]";
@@ -839,6 +843,22 @@ public class FormulaUtils {
         }
     }
 
+    /*解析html里的电签关键字*/
+    public static Map<String,String> getESignMap(Document document){
+        Map<String,String> result = new HashMap<>();
+        if(document!=null) {
+            Elements list = document.getElementsByAttribute("dqid");
+            if (list != null && !list.isEmpty()) {
+                list.forEach(element -> {
+                    int y1 = Func.toInt(element.attr("y1"));
+                    int x1 = Func.toInt(element.attr("x1"));
+                    result.put(y1+"_"+x1,element.attr("dqid"));
+                });
+            }
+        }
+        return result;
+    }
+
     public static List<ElementData> setScale(Integer scale, List<ElementData> data){
         if(scale==null){
             scale=StringUtils.getScale(data.stream().map(ElementData::getValue).filter(StringUtils::isDouble).collect(Collectors.toList()));

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

@@ -63,6 +63,8 @@ public class TableElementConverter implements ITableElementConverter {
      * {tableName:{key:val}}
      */
     Map<String, Map<String, String>> coordinateMap = new HashMap<>();
+    /**电签信息*/
+    Map<String, Map<String, String>> eSignMaps = new HashMap<>();
     /**业务表所包含的所有页面,根据表名查询*/
     Map<String,List<Long>> tableNamePkeyIdMap;
     /**pkeyId对应的表名称*/
@@ -468,6 +470,7 @@ public class TableElementConverter implements ITableElementConverter {
                    ReportResult rt = new ReportResult();
                    rt.setUrl(report.getHtmlUrl());
                    rt.setInitTableName(report.getInitTableName());
+                   rt.setESignMap(eSignMaps.get(report.getInitTableName()));
                    rt.setName(report.getNodeName());
                    rt.setExcelId(report.getExcelId());
                    rt.setPkeyId(report.getPKeyId()); //返回表单的主表Id

+ 18 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -2630,7 +2630,23 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         /*元素创建*/
         Map<String,String> parent=  getWtpParent(meterType.getName(),contractInfo.getPId());
         List<NodeTable> tableList=getTableListMeter(parent);
-        Map<String,Map<String,String>> coordinateMap=tableList.parallelStream().collect(Collectors.toMap(NodeTable::getInitTableName,m->FormulaUtils.getElementExcelCoords(m.getHtmlUrl()),(v1,v2)->v2));
+        Map<String,Document> documentMap=  tableList.parallelStream().collect(Collectors.toMap(NodeTable::getInitTableName,m->{
+            InputStream inputStreamByUrl = null;
+            try {
+                inputStreamByUrl = FileUtils.getInputStreamByUrl(m.getHtmlUrl());
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            return Jsoup.parse(IoUtil.readToString(inputStreamByUrl));
+         },(v1,v2)->v2));
+        Map<String,Map<String,String>> coordinateMap = new HashMap<>();
+        Map<String,Map<String,String>> eSignMaps=new HashMap<>();
+        tableList.forEach(nt -> {
+            String initTableName =nt.getInitTableName();
+            Document document =documentMap.get(nt.getInitTableName());
+            coordinateMap.put(initTableName, FormulaUtils.getElementExcelCoords(document));
+            eSignMaps.put(initTableName,FormulaUtils.getESignMap(document));
+        });
         /*额外单元格坐标配置*/
         settingCoordsExtend(coordinateMap);
         List<FormData> processFds = this.createFormDataByTableName(tableList.stream().map(NodeTable::getInitTableName).collect(Collectors.joining("','")));
@@ -2639,6 +2655,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         /*转换器声明*/
         TableElementConverter tec = new TableElementConverter(processFds,coordinateMap,tableList);
         tec.setProjectId(Long.parseLong(contractInfo.getPId()));
+        tec.setESignMaps(eSignMaps);
         tec.setContractId(contractInfo.getId());
         tec.setReportId(reportId);
         tec.setLog(new FormulaLog());

+ 18 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java

@@ -21,6 +21,7 @@ import lombok.Data;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.time.DateUtils;
 import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.util.IOUtils;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.jsoup.Jsoup;
 import org.jsoup.select.Elements;
@@ -34,6 +35,7 @@ import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.BaseUtils;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.common.vo.DataVO;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseService;
@@ -2738,7 +2740,22 @@ public class TaskController extends BladeController {
                                         if (row != null) {
                                             Cell cell = row.getCell(x1 - 1);
                                             if (cell != null) {
-                                                cell.setCellValue(dataMap.getOrDefault(keys, StringPool.EMPTY).toString());
+                                                String value=dataMap.getOrDefault(keys, StringPool.EMPTY).toString();
+                                                if(value.startsWith("http")){
+                                                    InputStream imageIn = CommonUtil.getOSSInputStream(value);
+                                                    if(imageIn!=null) {
+                                                        byte[] bytes = CommonUtil.compressImage(IOUtils.toByteArray(imageIn));
+                                                        CreationHelper helper = workbook.getCreationHelper();
+                                                        ClientAnchor anchor = helper.createClientAnchor();
+                                                        Drawing<?> drawing = sheet.createDrawingPatriarch();
+                                                        anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
+                                                        Picture pict = drawing.createPicture(anchor, workbook.addPicture(bytes, Workbook.PICTURE_TYPE_PNG)); // 调整图片占单元格百分比的大小,1.0就是100%
+                                                        pict.resize(1, 1);
+                                                        CollectionUtils.imageOrientation(sheet, anchor, new DataVO(x1 - 1, y1 - 1));
+                                                    }
+                                                }else {
+                                                    cell.setCellValue(value);
+                                                }
                                             } else {
                                                 System.out.println(keys + "不存在");
                                             }

+ 52 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/utils/CollectionUtils.java

@@ -4,23 +4,29 @@ import com.aspose.cells.SaveFormat;
 import com.itextpdf.text.Document;
 import com.itextpdf.text.pdf.PdfCopy;
 import com.itextpdf.text.pdf.PdfReader;
+import org.apache.poi.ss.usermodel.ClientAnchor;
 import org.apache.poi.ss.usermodel.PrintSetup;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.WorkbookFactory;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.util.Units;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SystemUtils;
+import org.springblade.common.vo.DataVO;
 import org.springblade.core.tool.utils.IoUtil;
 import org.springblade.core.tool.utils.ResourceUtil;
 import org.springblade.system.cache.ParamCache;
 
 import java.io.*;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Function;
 import java.util.function.Predicate;
+import java.util.regex.Matcher;
 
 /**
  * @Param   集合相关工具
@@ -155,4 +161,50 @@ public class CollectionUtils {
         }
     }
 
+
+    public static void imageOrientation(Sheet sheet, ClientAnchor anchor, DataVO dataVO) {
+        anchor.setDx1(Units.pixelToEMU(5));
+        anchor.setDy1(Units.pixelToEMU(5));
+        anchor.setCol2(anchor.getCol1());
+        anchor.setRow2(anchor.getRow1());
+        int k = getMergedRegionIndex(sheet, CommonUtil.join(dataVO.getX(), dataVO.getY(), dataVO.getX(), dataVO.getY(), ","));
+        if (k > -1) {
+            /*如果是合并单元格,则锚点第二坐标设置为合并区右下角单元格坐标*/
+            CellRangeAddress ca = sheet.getMergedRegion(k);
+            anchor.setCol1(ca.getFirstColumn());
+            anchor.setRow1(ca.getFirstRow());
+            anchor.setCol2(ca.getLastColumn());
+            anchor.setRow2(ca.getLastRow());
+        }
+        int dx = (int) (sheet.getColumnWidthInPixels(anchor.getCol2()) + 3);
+        int dy = Units.pointsToPixel(sheet.getRow(anchor.getRow2()).getHeightInPoints()) - 5;
+        anchor.setDx2(Units.pixelToEMU(dx));
+        anchor.setDy2(Units.pixelToEMU(dy));
+    }
+
+    public static int getMergedRegionIndex(Sheet sheet, String coords) {
+        for (int i = 0; i < sheet.getNumMergedRegions(); i++) {
+            CellRangeAddress ca = sheet.getMergedRegion(i);
+            int firstColumn = ca.getFirstColumn();
+            int lastColumn = ca.getLastColumn();
+            int firstRow = ca.getFirstRow();
+            int lastRow = ca.getLastRow();
+            Matcher mu = CommonUtil.matcher("(\\d{1,3}),(\\d{1,3}),(\\d{1,3}),(\\d{1,3})", coords);
+            /*合并单元格四个角坐标,只要任意一个在落在将要合并的区域里面意味着两者重合,就必须拆分前者*/
+            List<Integer[]> corners = Arrays.asList(new Integer[]{firstColumn, firstRow}, new Integer[]{lastColumn, firstRow}, new Integer[]{firstColumn, lastRow}, new Integer[]{lastColumn, lastRow});
+            if (mu.find()) {
+                int firstColumn2 = mu.group(1) == null ? 0 : Integer.parseInt(mu.group(1));
+                int lastColumn2 = mu.group(3) == null ? 0 : Integer.parseInt(mu.group(3));
+                int firstRow2 = mu.group(2) == null ? 0 : Integer.parseInt(mu.group(2));
+                int lastRow2 = mu.group(4) == null ? 0 : Integer.parseInt(mu.group(4));
+                for (Integer[] corner : corners) {
+                    if (firstColumn2 <= corner[0] && corner[0] <= lastColumn2 && firstRow2 <= corner[1] && corner[1] <= lastRow2) {
+                        return i;
+                    }
+                }
+            }
+        }
+        return -1;
+    }
+
 }