Browse Source

表单提交

hongchuangyanfa 2 years ago
parent
commit
ba0105fa23

+ 17 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreeContract.java

@@ -204,5 +204,22 @@ public class WbsTreeContract extends BaseEntity {
     @ApiModelProperty(value = "原id,如果当前字段有数据则说明这条数据是复制节点")
     private String oldId;
 
+    /**
+     * 表单是否上传附件1否
+     */
+    @ApiModelProperty(value = "表单是否上传附件1否 2是")
+    private Integer tabFileType;
+
+    /**
+     * 表单是否上传附件1否
+     */
+    @ApiModelProperty(value = "是否复制表 1否 2是")
+    private Integer isCopeTab;
+
+    /**
+     * 是否能预览pdf
+     */
+    @ApiModelProperty(value = "是否能预览pdf 1否 2是")
+    private Integer isTabPdf;
 
 }

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

@@ -30,6 +30,6 @@ import lombok.EqualsAndHashCode;
 @EqualsAndHashCode(callSuper = true)
 public class TableFileVO extends TableFile {
 	private static final long serialVersionUID = 1L;
-
-
+	
+	private String url;
 }

+ 3 - 2
blade-service/blade-manager/pom.xml

@@ -94,8 +94,9 @@
 
         <dependency>
             <groupId>com.itextpdf</groupId>
-            <artifactId>font-asian</artifactId>
-            <version>7.1.2</version>
+            <artifactId>itextpdf</artifactId>
+            <version>5.5.13</version>
+            <scope>compile</scope>
         </dependency>
 
         <dependency>

+ 121 - 25
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -1,6 +1,7 @@
 package org.springblade.manager.controller;
 
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -13,6 +14,7 @@ import com.itextpdf.io.font.FontProgram;
 import com.itextpdf.io.font.FontProgramFactory;
 import com.itextpdf.kernel.geom.PageSize;
 import com.itextpdf.kernel.pdf.PdfDocument;
+import com.itextpdf.kernel.pdf.PdfPage;
 import com.itextpdf.kernel.pdf.PdfWriter;
 import com.itextpdf.layout.font.FontProvider;
 import com.spire.xls.Workbook;
@@ -25,6 +27,7 @@ import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
+import org.springblade.business.feign.FileUtilsClient;
 import org.springblade.business.feign.InformationQueryClient;
 import org.springblade.common.utils.MathUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
@@ -39,6 +42,7 @@ import org.springblade.core.tool.utils.*;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.service.*;
+import org.springblade.manager.unit.FileUtils;
 import org.springblade.manager.vo.*;
 import org.springblade.manager.wrapper.ExcelTabWrapper;
 import org.springblade.resource.feign.CommonFileClient;
@@ -59,6 +63,7 @@ import java.io.IOException;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 /**
  * 清表基础数据表 控制器
@@ -108,6 +113,8 @@ public class ExcelTabController extends BladeController {
     // pdf转换
     private final CommonFileClient commonFileClient;
 
+    private final FileUtilsClient fileUtilsClient;
+
     /**
      * 详情
      */
@@ -367,13 +374,11 @@ public class ExcelTabController extends BladeController {
                     updateWrapper.in("p_key_id",Long.parseLong(pkInfo));
                     updateWrapper.set("is_link_table",2);
                     updateWrapper.set("excel_id",excelTab.getId());
-
                     wbsTreePrivateService.update(updateWrapper);
                 }
             }
         }
 
-
         return R.success("添加成功!");
     }
 
@@ -563,23 +568,33 @@ public class ExcelTabController extends BladeController {
     @ApiOperationSupport(order = 13)
     @ApiOperation(value = "填报页面数据保存", notes = "填报页面数据保存")
     public R<String> saveBussData(@Valid @RequestBody JSONObject dataInfo, BladeUser bladeUser) {
+        JSONObject jsonObject = dataInfo.getJSONObject("dataInfo");
+        JSONArray dataArray = new JSONArray();
+        if(jsonObject.containsKey("orderList")){ // 节点保存
+            dataArray = jsonObject.getJSONArray("orderList");
+        }else{ // 单个保存
+            dataArray.add(jsonObject);
+        }
+
+       for(int m=0;m<dataArray.size();m++){
+           JSONObject dataInfo2= dataArray.getJSONObject(m);
         //
-        String contractId = dataInfo.getString("contractId");
-        String pkeyId = dataInfo.getString("pkeyId");
-        String projectId = dataInfo.getString("projectId");
+        String contractId = dataInfo2.getString("contractId");
+        String pkeyId = dataInfo2.getString("pkeyId");
+        String projectId = dataInfo2.getString("projectId");
         //huangjn 填报的类型,施工或监理
-        String classify = dataInfo.getString("classify");
+        String classify = dataInfo2.getString("classify");
 
         //huangjn 填报的类型,施工或监理
         // 去掉
-        dataInfo.remove("contractId");
-        dataInfo.remove("pkeyId");
-        dataInfo.remove("projectId");
-        dataInfo.remove("classify");
+           dataInfo2.remove("contractId");
+           dataInfo2.remove("pkeyId");
+           dataInfo2.remove("projectId");
+           dataInfo2.remove("classify");
 
         // 计算数据
         Map<String,String> dataMap = new HashMap<>();
-        for(String k:dataInfo.keySet()){
+        for(String k:dataInfo2.keySet()){
             String key = k.split("__")[0];
             if(dataMap.containsKey(key)){
                 dataMap.put(key,dataMap.get(key)+","+k);
@@ -612,24 +627,27 @@ public class ExcelTabController extends BladeController {
                     }
                 }
 
-                String lastStr = dataInfo.getString(ziduan[0])+"__"+ziduan[0].split("__")[1];
+                String lastStr = dataInfo2.getString(ziduan[0])+"__"+ziduan[0].split("__")[1];
                 for (int i=1 ;i<ziduan.length;i++){
-                    String keyData = dataInfo.getString(ziduan[i]);
+                    String keyData = dataInfo2.getString(ziduan[i]);
                     if(!keyData.equals("")){
-                        lastStr+=","+dataInfo.getString(ziduan[i])+"__"+ziduan[i].split("__")[1];
+                        lastStr+=","+dataInfo2.getString(ziduan[i])+"__"+ziduan[i].split("__")[1];
                     }
 
                 }
                 dataMap2.put(k,lastStr);
             }else{
-                if(!(dataInfo.getString(dataMap.get(k))).equals("")) {
-                    dataMap2.put(k, dataInfo.getString(dataMap.get(k)));
+                if(!(dataInfo2.getString(dataMap.get(k))).equals("")) {
+                    dataMap2.put(k, dataInfo2.getString(dataMap.get(k)));
                 }
             }
         }
 
         WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
                 .eq(WbsTreeContract::getPKeyId, pkeyId));
+        if(wbsTreeContract == null){
+            continue;
+        }
 
         String tabName = wbsTreeContract.getInitTableName();
 
@@ -651,11 +669,20 @@ public class ExcelTabController extends BladeController {
             valStr=valStr.substring(0,valStr.lastIndexOf(","));
             sqlInfo = sqlInfo + keyStr+") VALUES (" +valStr +")";
 
+
+            WbsTreeContract wbsTreeContractByP = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
+                    .eq(WbsTreeContract::getId, wbsTreeContract.getParentId()).eq(WbsTreeContract::getContractId,contractId));
+
+
+            UpdateWrapper<WbsTreeContract> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.in("p_key_id",pkeyId);
+            updateWrapper.set("is_tab_pdf",2);
+            wbsTreeContractService.update(updateWrapper);
+
             //huangjn 保存成功后调用生成资料查询列表数据
-            this.informationQueryClient.saveOrUpdateInformationQueryData(pkeyId, "文件名称(后面再完善)", Integer.parseInt(classify), 2);
+            this.informationQueryClient.saveOrUpdateInformationQueryData(wbsTreeContractByP.getPKeyId()+"", "文件名称(后面再完善)", Integer.parseInt(classify), 2);
         }else{ //更新
             sqlInfo = "update  "+tabName+" set ";
-
             for (String keys : dataMap2.keySet()){
                 sqlInfo += keys+"='"+dataMap2.get(keys)+"',";
             }
@@ -663,8 +690,9 @@ public class ExcelTabController extends BladeController {
             sqlInfo = sqlInfo + " where p_key_id="+pkeyId;
         }
 
-        System.out.println(sqlInfo);
         jdbcTemplate.execute(sqlInfo);
+
+       }
         return  R.success("1");
     }
 
@@ -1150,21 +1178,54 @@ public class ExcelTabController extends BladeController {
         }
 
         String pdfPath="/Users/hongchuangyanfa/Desktop/pdf//"+pkeyId+".pdf";
+
         File pdffile = ResourceUtil.getFile(pdfPath);
         PdfWriter writer = new PdfWriter(pdffile);
         com.itextpdf.kernel.pdf.PdfDocument pdf = new PdfDocument(writer);
         PageSize pageSize = new PageSize(795,842);
         pdf.setDefaultPageSize(pageSize);
-
         HtmlConverter.convertToPdf(doc.html(),writer,properties);
 
         BladeFile bladeFile = newIOSSClient.uploadFile(pkeyId + ".pdf", pdfPath);
+
+        //
+        TableFile tableFile1 = tableFileService.getBaseMapper().selectOne(Wrappers.<TableFile>query().lambda()
+                .eq(TableFile::getTabId, pkeyId).eq(TableFile::getType,1));
+        if(tableFile1!=null){
+            tableFile1.setDomainPdfUrl(bladeFile.getLink());
+            tableFileService.saveOrUpdate(tableFile1);
+        }else{
+            TableFile tableFile = new TableFile();
+            String fileExtension = FileUtil.getFileExtension(wbsTreeContract.getFullName()+".pdf");
+            tableFile.setTabId(pkeyId+"");
+            tableFile.setName(wbsTreeContract.getFullName()+".pdf");
+            tableFile.setType(1);
+            tableFile.setDomainUrl(bladeFile.getLink());
+            tableFile.setIsDeleted(0);
+            tableFile.setExtension(fileExtension);
+            tableFile.setDomainPdfUrl(bladeFile.getLink());
+            tableFileService.saveOrUpdate(tableFile);
+        }
+
+        List<TableFile> tableFileList = tableFileService.getBaseMapper().selectList(Wrappers.<TableFile>query().lambda().eq(TableFile::getTabId, pkeyId));
+        tableFileList.sort(Comparator.comparing(TableFile::getType));
+
+        //
+        List<String> dataListPdf = tableFileList.stream().filter(tableFile -> tableFile.getDomainPdfUrl()!=null).map(TableFile::getDomainPdfUrl).collect(Collectors.toList());
+
+        String pdfPath2 = "/Users/hongchuangyanfa/Desktop/pdf//"+pkeyId+"_2.pdf";
+
+        FileUtils.mergePdfPublicMethods(dataListPdf,pdfPath2);
+
+        BladeFile bladeFile2 = newIOSSClient.uploadFile(pkeyId + "2.pdf", pdfPath2);
+
         UpdateWrapper<WbsTreeContract> updateWrapper = new UpdateWrapper<>();
         updateWrapper.in("p_key_id",pkeyId);
-        updateWrapper.set("pdf_url",bladeFile.getLink());
-
+        updateWrapper.set("pdf_url",bladeFile2.getLink());
         wbsTreeContractService.update(updateWrapper);
-        return R.data(bladeFile.getLink());
+
+
+        return R.data(bladeFile2.getLink());
     }
 
 
@@ -1189,6 +1250,7 @@ public class ExcelTabController extends BladeController {
             deptName = deptName +"__"+wbsTreeContractList.size();
         }
         wbsTreeContract.setDeptName(deptName);
+        wbsTreeContract.setIsCopeTab(2);
         wbsTreeContractService.save(wbsTreeContract);
         return R.data("成功");
     }
@@ -1242,6 +1304,15 @@ public class ExcelTabController extends BladeController {
         tableFile.setStatus("finished");
         tableFileService.save(tableFile);
 
+        WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
+                .eq(WbsTreeContract::getPKeyId, pkeyId));
+
+        UpdateWrapper<WbsTreeContract> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.in("p_key_id",pkeyId);
+        updateWrapper.set("tab_file_type",2);
+        updateWrapper.set("is_tab_pdf",2);
+        wbsTreeContractService.update(updateWrapper);
+
         return R.data(tableFile.getId());
     }
 
@@ -1268,14 +1339,39 @@ public class ExcelTabController extends BladeController {
     @ApiImplicitParams(value = {
             @ApiImplicitParam(name = "nodeId", value = "当前节点Id", required = true),
             @ApiImplicitParam(name = "classify", value = "填报的类型(施工或监理)", required = true),
+            @ApiImplicitParam(name = "projectId", value = "项目ID", required = true),
             @ApiImplicitParam(name = "contractId", value = "合同段Id", required = true)
     })
-    public R getBussPdfs(Long nodeId,String classify,long contractId) throws FileNotFoundException {
+    public R getBussPdfs(String nodeId,String classify,String contractId,String projectId){
 
+        // 获取有权限的节点信息
+        List<WbsTreeContract> wbsTreeContractList = wbsTreeContractService.searchNodeAllTable(nodeId, classify, contractId, projectId);
+        List<String> data = wbsTreeContractList.stream().filter(wbsTreeContract -> wbsTreeContract.getPdfUrl()!=null).map(WbsTreeContract::getPdfUrl).collect(Collectors.toList());
 
+        String listPdf = "/Users/hongchuangyanfa/Desktop/pdf/"+nodeId+".pdf";
 
+        FileUtils.mergePdfPublicMethods(data,listPdf);
 
-        return R.data("成功");
+        BladeFile bladeFile = this.newIOSSClient.uploadFile(nodeId+".pdf", listPdf);
+
+        // 合并pdf集合
+        String sql = "update u_information_query set pdf_url ='"+bladeFile.getLink()+"' where classify='"+classify+"' and  wbs_id='"+nodeId+"' and contract_id ='"+contractId+"' ";
+        jdbcTemplate.execute(sql);
+        // 返回路径地址
+        return R.data(bladeFile.getLink());
+    }
+
+    /**
+     * 用户端删除复制信息表
+     */
+    @PostMapping("/remove-buss-tabInfo")
+    @ApiOperationSupport(order = 22)
+    @ApiOperation(value = "用户端删除复制信息表", notes = "pkeyid")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "pkeyid", value = "当前节点Id", required = true)
+    })
+    public R removeBussTabInfo(String pkeyid) {
+        return R.status(this.excelTabService.removeBussTabInfoById(pkeyid));
     }
 
 

+ 4 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TableFileController.java

@@ -129,6 +129,9 @@ public class TableFileController extends BladeController {
 	})
 	public R getBussFileList(Long pkeyid) {
 		List<TableFileVO> fileVOList = tableFileService.selectTableFileList(pkeyid);
-		return R.data(fileVOList);
+		if (fileVOList.size() > 0) {
+			return R.data(fileVOList);
+		}
+		return R.fail(200, "未查询到数据");
 	}
 }

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ExcelTabMapper.java

@@ -63,4 +63,6 @@ public interface ExcelTabMapper extends BaseMapper<ExcelTab> {
 	List<WbsTreeVO> lazyTreeByPri(@Param("wbsId") String wbsId,
 							 @Param("tenantId") String tenantId,
 							 @Param("parentId") Long parentId);
+
+	Integer removeBussTabInfoById(@Param("pkeyid") String pkeyid);
 }

+ 5 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ExcelTabMapper.xml

@@ -188,4 +188,9 @@
         </if>
         ORDER BY dept.create_time
     </select>
+
+    <delete id="removeBussTabInfoById" >
+        delete from m_wbs_tree_contract where p_key_id = #{rId}
+    </delete>
+
 </mapper>

+ 14 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/TableFileMapper.xml

@@ -14,13 +14,25 @@
         <result column="domain_pdf_url" property="domainPdfUrl"/>
     </resultMap>
 
+    <resultMap id="TableFileVO" type="org.springblade.manager.vo.TableFileVO">
+        <result column="id" property="id"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="tab_id" property="tabId"/>
+        <result column="domain_url" property="domainUrl"/>
+        <result column="name" property="name"/>
+        <result column="extension" property="extension"/>
+        <result column="type" property="type"/>
+        <result column="domain_pdf_url" property="domainPdfUrl"/>
+        <result column="url" property="url"/>
+    </resultMap>
+
 
     <select id="selectTableFilePage" resultMap="tableFileResultMap">
         select * from m_table_file where is_deleted = 0
     </select>
 
-    <select id="selectTableFileList" resultMap="tableFileResultMap">
-        select * from m_table_file where is_deleted = 0 and tab_id =#{pkid}
+    <select id="selectTableFileList" resultMap="TableFileVO">
+        select *,domain_url as url from m_table_file where is_deleted = 0 and type=2 and tab_id =#{pkid}
     </select>
 
 </mapper>

+ 4 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml

@@ -42,6 +42,9 @@
         <result column="html_url" property="htmlUrl"/>
         <result column="pdf_url" property="pdfUrl"/>
         <result column="is_buss_show" property="isBussShow"/>
+        <result column="tab_file_type" property="tabFileType"/>
+        <result column="is_cope_tab" property="isCopeTab"/>
+        <result column="is_tab_pdf" property="isTabPdf"/>
 
     </resultMap>
 
@@ -503,7 +506,7 @@
                 #{tableOwnerList}
             </foreach>
         </if>
-        ORDER BY sort
+        ORDER BY sort , dept_name,create_time
     </select>
 
     <select id="selectRoleInfo" resultType="org.springblade.manager.entity.SaveUserInfoByProject">

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IExcelTabService.java

@@ -74,4 +74,5 @@ public interface IExcelTabService extends BaseService<ExcelTab> {
 	 */
 	List<WbsTreeVO> lazyTreeByPri(String wbsId, String tenantId, Long parentId);
 
+	boolean removeBussTabInfoById(String pkeyid);
 }

+ 6 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -87,4 +87,10 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 		}
 		return ForestNodeMerger.merge(baseMapper.lazyTreeByPri(wbsId, tenantId, parentId));
 	}
+
+	@Override
+	public boolean removeBussTabInfoById(String pkeyid) {
+		baseMapper.removeBussTabInfoById(pkeyid);
+		return true;
+	}
 }

+ 194 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/unit/FileUtils.java

@@ -0,0 +1,194 @@
+package org.springblade.manager.unit;
+
+import com.itextpdf.text.Document;
+import com.itextpdf.text.pdf.PdfCopy;
+import com.itextpdf.text.pdf.PdfReader;
+import org.apache.commons.lang.StringUtils;
+import org.apache.poi.ss.usermodel.ClientAnchor;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.util.Units;
+import org.springblade.common.utils.CommonUtil;
+import org.springblade.common.vo.DataVO;
+import org.springblade.core.tool.utils.IoUtil;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedOutputStream;
+import java.io.DataOutputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.net.URLEncoder;
+import java.util.Arrays;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+public class FileUtils {
+
+    public static void batchDownloadFileToZip(List<String> urls, HttpServletResponse response){
+        // 设置压缩流:直接写入response,实现边压缩边下载
+        ZipOutputStream zipos = null;
+        // 循环将文件写入压缩流
+        DataOutputStream os = null;
+        try{
+
+            // 响应头的设置
+            response.reset();
+            response.setCharacterEncoding("utf-8");
+            response.setContentType("multipart/form-data");
+            // 设置压缩包的名字
+            // 解决不同浏览器压缩包名字含有中文时乱码的问题
+            String downloadName = "附件-" + System.currentTimeMillis() + ".zip";
+            response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(downloadName, "UTF-8"));
+
+
+            try {
+                zipos = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));
+                // 设置压缩方法
+                zipos.setMethod(ZipOutputStream.DEFLATED);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+            if(zipos == null){
+                return;
+            }
+
+            InputStream inputStream = null;
+
+            for(String url : urls){
+                if(StringUtils.isNotEmpty(url)){
+                    try{
+                        String fileName = null, symbol = "";
+                        if(url.contains("@@@")){
+                            String[] array = url.split("@@@");
+                            url = array[0];
+                            fileName = array[1];
+                            symbol = url.substring(url.lastIndexOf("."));
+                        }
+
+                        //获取文件流
+                        inputStream = CommonUtil.getOSSInputStream(url);
+                        //转换
+                        byte[] bytes = CommonUtil.InputStreamToBytes(inputStream);
+
+                        if(StringUtils.isEmpty(fileName)){
+                            fileName = url.substring(url.lastIndexOf("/") + 1);
+                            symbol = "";
+                        }
+                        zipos.putNextEntry(new ZipEntry(fileName + symbol));
+
+                        os = new DataOutputStream(zipos);
+                        os.write(bytes);
+                        zipos.closeEntry();
+
+                    }catch (Exception e){
+                        e.printStackTrace();
+                    } finally {
+                        IoUtil.closeQuietly(inputStream);
+                    }
+                }
+            }
+
+        }catch (Exception e){
+            e.printStackTrace();
+        } finally {
+            IoUtil.closeQuietly(os);
+            IoUtil.closeQuietly(zipos);
+        }
+    }
+
+    /**
+     * 图片定位
+     */
+    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;
+    }
+
+    /**
+     * 合并方法
+     */
+    public static void mergePdfPublicMethods(List<String> urlList, String localImgUrl){
+        PdfReader reader = null;
+
+        Document doc = new Document();
+        PdfCopy pdfCopy = null;
+        try{
+            pdfCopy = new PdfCopy(doc, new FileOutputStream(localImgUrl));
+            int pageCount;
+            doc.open();
+
+            for(String urlStr : urlList){
+                try{
+                    //获取OSS文件输入流
+                    reader = new PdfReader(CommonUtil.getOSSInputStream(urlStr));
+
+                    pageCount = reader.getNumberOfPages();
+
+                    for(int i = 0; i < pageCount; ++i){
+                        int is = i + 1;
+                        pdfCopy.addPage(pdfCopy.getImportedPage(reader,is));
+                    }
+                }catch (Exception e){
+                    e.printStackTrace();
+                } finally {
+                    if(reader != null){
+                        reader.close();
+                    }
+                }
+            }
+
+        }catch (Exception e){
+            e.printStackTrace();
+        } finally {
+            if(pdfCopy != null){
+                pdfCopy.flush();
+                pdfCopy.close();
+            }
+            doc.close();
+        }
+    }
+
+}

+ 128 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/unit/HtmlToPdf.java

@@ -0,0 +1,128 @@
+package org.springblade.manager.unit;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import com.itextpdf.html2pdf.ConverterProperties;
+import com.itextpdf.html2pdf.HtmlConverter;
+import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider;
+import com.itextpdf.kernel.colors.Color;
+import com.itextpdf.kernel.geom.PageSize;
+import com.itextpdf.kernel.geom.Rectangle;
+import com.itextpdf.kernel.pdf.PdfDocument;
+import com.itextpdf.kernel.pdf.PdfPage;
+import com.itextpdf.kernel.pdf.PdfWriter;
+import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
+import com.itextpdf.kernel.pdf.canvas.draw.ILineDrawer;
+import com.itextpdf.layout.Document;
+import com.itextpdf.layout.element.LineSeparator;
+
+/**
+ * 利用HTML代码片段生成PDF
+ *
+ * zkh 2018年3月13日 下午2:05:17
+ */
+public class HtmlToPdf {
+	private final static String DEST = "/Users/hongchuangyanfa/Desktop/pdf/test.pdf";
+	private final static String SRC = "/Users/hongchuangyanfa/Desktop/privateUrl/1550366339149856768.html";
+	public static final String FONT = "/Users/hongchuangyanfa/tool/NotoSansCJKsc-Regular.otf";
+
+	public void tomPdf(String html, String DEST) throws FileNotFoundException, IOException {
+		ConverterProperties props = new ConverterProperties();
+		DefaultFontProvider defaultFontProvider = new DefaultFontProvider(false, false, false);
+		defaultFontProvider.addFont(FONT);
+		props.setFontProvider(defaultFontProvider);
+		PdfWriter writer = new PdfWriter(DEST);
+		PdfDocument pdf = new PdfDocument(writer);
+		pdf.setDefaultPageSize(new PageSize(975, 650));
+		Document document = HtmlConverter.convertToDocument(new FileInputStream(html), pdf, props);
+		// 将所有内容在一个页面显示
+		EndPosition endPosition = new EndPosition();
+		LineSeparator separator = new LineSeparator(endPosition);
+		document.add(separator);
+		document.getRenderer().close();
+		PdfPage page = pdf.getPage(1);
+		float y = endPosition.getY() - 36;
+		page.setMediaBox(new Rectangle(0, y, 975, 650 - y));
+		document.close();
+		pdf.close();
+	}
+
+	public static void main(String[] args) {
+		try {
+			HtmlToPdf html = new HtmlToPdf();
+			html.tomPdf(SRC, DEST);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	class EndPosition implements ILineDrawer {
+
+		/** A Y-position. */
+		protected float y;
+
+		/**
+		 * Gets the Y-position.
+		 *
+		 * @return the Y-position
+		 */
+		public float getY() {
+			return y;
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see
+		 * com.itextpdf.kernel.pdf.canvas.draw.ILineDrawer#draw(com.itextpdf.kernel.pdf.
+		 * canvas.PdfCanvas, com.itextpdf.kernel.geom.Rectangle)
+		 */
+		@Override
+		public void draw(PdfCanvas pdfCanvas, Rectangle rect) {
+			this.y = rect.getY();
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see com.itextpdf.kernel.pdf.canvas.draw.ILineDrawer#getColor()
+		 */
+		@Override
+		public Color getColor() {
+			return null;
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see com.itextpdf.kernel.pdf.canvas.draw.ILineDrawer#getLineWidth()
+		 */
+		@Override
+		public float getLineWidth() {
+			return 0;
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see
+		 * com.itextpdf.kernel.pdf.canvas.draw.ILineDrawer#setColor(com.itextpdf.kernel.
+		 * color.Color)
+		 */
+		@Override
+		public void setColor(Color color) {
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see com.itextpdf.kernel.pdf.canvas.draw.ILineDrawer#setLineWidth(float)
+		 */
+		@Override
+		public void setLineWidth(float lineWidth) {
+		}
+
+	}
+}