فهرست منبع

Merge branch 'refs/heads/dev' into test-merge

# Conflicts:
#	blade-service/blade-repair/src/main/java/org/springblade/repair/controller/CheckAndRepairController.java
LHB 2 هفته پیش
والد
کامیت
0c6e79e859
18فایلهای تغییر یافته به همراه260 افزوده شده و 75 حذف شده
  1. 10 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveProjectConfig.java
  2. 2 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveProjectConfigController.java
  3. 10 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  4. 1 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/external/impl/ExternalDataArchiveFileService.java
  5. 14 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/external/utils/TransUtil.java
  6. 3 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveAutoPdfServiceImpl.java
  7. 5 4
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  8. 33 3
      blade-service/blade-archive/src/main/java/org/springblade/archive/utils/FileUtils.java
  9. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml
  10. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ArchiveFileServiceImpl.java
  11. 1 1
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVDataServiceImpl.java
  12. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/TurnPoint.java
  13. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  14. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java
  15. 62 60
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  16. 12 0
      blade-service/blade-repair/pom.xml
  17. 52 0
      blade-service/blade-repair/src/main/java/org/springblade/repair/controller/CheckAndRepairController.java
  18. 46 0
      blade-service/blade-repair/src/main/java/org/springblade/repair/util/FileUtils.java

+ 10 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveProjectConfig.java

@@ -48,6 +48,16 @@ public class ArchiveProjectConfig extends BaseEntity {
      */
     private Integer indexNum;
 
+    /**
+     *  页码流水号类型,0 默认,无虚数, 1 3位虚数
+     */
+    private Integer pageType;
+
+    /**
+     *  页码序号位数,默认为0
+     */
+    private Integer pageLen;
+
     //是否打页码
     public boolean isPage() {
         return getFactorType().contains("5");

+ 2 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveProjectConfigController.java

@@ -38,6 +38,8 @@ public class ArchiveProjectConfigController {
         archiveProjectConfig.setIndexType(config.getIndexType());
         archiveProjectConfig.setDirType(config.getDirType());
         archiveProjectConfig.setIndexNum(config.getIndexNum());
+        archiveProjectConfig.setPageType(config.getPageType());
+        archiveProjectConfig.setPageLen(config.getPageLen());
         boolean result = archiveProjectConfigService.updateById(archiveProjectConfig);
         return R.status(result);
     }

+ 10 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -158,6 +158,16 @@ public class ArchivesAutoController extends BladeController {
 		int test = 0;
 		//todo 后续去掉
 		if (test > 1) {
+
+			List<ArchiveTreeContract> archiveTreeContracts = this.archiveTreeContractClient.queryAllChildByAncestors(queryVo.getNodeIds(),queryVo.getContractId());
+
+			List<String> ids = JSONArray.parseArray(JSONObject.toJSONString(archiveTreeContracts.stream().map(ArchiveTreeContract::getId).distinct().collect(Collectors.toList())), String.class);
+			ids.add(queryVo.getNodeIds());
+
+	        String result = String.join(",", ids);
+
+			System.out.println("nodeid (" + result + ")");
+
 			List<String> nodeIdArray = queryVo.getNodeIdArray();
 			// 注意:在设置nodeIdArray的条件分支外,nodeIdArray可能为null
 			if (nodeIdArray != null) {

+ 1 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/external/impl/ExternalDataArchiveFileService.java

@@ -218,6 +218,7 @@ public class ExternalDataArchiveFileService {
         local.setFileSize(external.getFileSize());
         local.setUtime(external.getUtime());
         local.setNodeId(external.getNodeId());
+        local.setSort(external.getSort());
         //local.setArchiveId(external.getArchiveId());
     }
 

+ 14 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/external/utils/TransUtil.java

@@ -51,6 +51,20 @@ public class TransUtil {
         //建设单位数字化扫描档案(第二部分 决算和审计文件) 一、支付报表及计算单
         put("c3073682882249cb83fb87ef83d4", 1945670728317665296L);
 
+
+        //==========特殊
+        //建设单位数字化扫描档案(第一部分 综合文件)-二、建设依据及上级有关指示-立项
+        put("0284c9f77242489d93da723584ce", 1945670728317665287L);
+        //建设单位数字化扫描档案(第一部分 综合文件)-二、建设依据及上级有关指示-勘察
+        put("3ae2565bad2b498182b8077f03ed", 1945670728317665288L);
+        //建设单位数字化扫描档案(第一部分 综合文件)-二、建设依据及上级有关指示-许可批准
+        put("e9eea9a2ef34469c8fb1c935499a", 1945670728317665289L);
+
+        //建设单位数字化扫描档案(第一部分 综合文件)-二、工程管理文件-工程招标
+        put("d41e35addf2f49a8aa3cd552c3ba", 1945670728317665293L);
+        //建设单位数字化扫描档案(第一部分 综合文件)-二、工程管理文件-其他文件和资料
+        put("39afe1a44c664f23a4dc8b3a817f", 1945670728317665294L);
+
         //====监理
         //====================【第一总监】
 

+ 3 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveAutoPdfServiceImpl.java

@@ -378,7 +378,9 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
             }
         }
         String localPath = FileUtils.getSysLocalFileUrl();
-        List<String> pageUrls = FileUtils.doForPageNumberUseItextpdf(urls, localPath, newIOSSClient, archivesAuto.getProjectId());
+        // 传递页码配置参数
+        List<String> pageUrls = FileUtils.doForPageNumberUseItextpdf(urls, localPath, newIOSSClient,
+                archivesAuto.getProjectId(), config.getPageType(), config.getPageLen());
         for (int i = 0; i < waitArchiveFiles.size(); i++) {
             waitArchiveFiles.get(i).setPdfPageUrl(pageUrls.get(i));
         }

+ 5 - 4
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -447,6 +447,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 				if (fileUrl.contains("$$$")) {
 					fileUrl = fileUrl.substring(0, fileUrl.indexOf("$$$"));
 				}
+				fileUrl = fileUrl.trim();
 				if (frontUrl.contains("$$$")) {
 					fileId = frontUrl.substring(frontUrl.indexOf("$$$") + 3);
 				} else {
@@ -2887,11 +2888,11 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 				//				urlList.add(frontUrls[1]);
 				//			}
 				if (StringUtils.isNotEmpty(front)) {
-					urlList.add(front);
+					urlList.add(front.trim());
 				}
 
 				if (StringUtils.isNotEmpty(cataLog)) {
-					urlList.add(cataLog);
+					urlList.add(cataLog.trim());
 				}
 
 				urlList.addAll(fileUrls);
@@ -2901,11 +2902,11 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 				//				urlList.add(frontUrls[3]);
 				//			}
 				if (StringUtils.isNotEmpty(spare)) {
-					urlList.add(spare);
+					urlList.add(spare.trim());
 				}
 
 				if (StringUtils.isNotEmpty(back)) {
-					urlList.add(back);
+					urlList.add(back.trim());
 				}
 				String fileName = SnowFlakeUtil.getId().toString();
 				url = archiveAutoPdfService.MergePdfAndUpload(urlList, fileName, null, archivesAuto.getProjectId());

+ 33 - 3
blade-service/blade-archive/src/main/java/org/springblade/archive/utils/FileUtils.java

@@ -495,6 +495,10 @@ public class FileUtils {
      * @Date 2021.12.17 14:21
      **/
     public static List<String> doForPageNumberUseItextpdf(List<String> uris, String localPath, NewIOSSClient newIOSSClient, Long projectId) {
+        return doForPageNumberUseItextpdf(uris, localPath, newIOSSClient, projectId, 0, 0);
+    }
+
+    public static List<String> doForPageNumberUseItextpdf(List<String> uris, String localPath, NewIOSSClient newIOSSClient, Long projectId, Integer pageType, Integer pageLen) {
         List<String> result = new ArrayList<>();
         if (uris != null && uris.size() > 0) {
             int cursor = 0;
@@ -563,19 +567,22 @@ public class FileUtils {
 //                                heigh = temp;
 //                            }
 
+                            // 格式化页码
+                            String pageNumber = formatPageNumber(cursor + index, pageType, pageLen);
+                            
                             if (width > heigh && heigh != 0) {
                                 //横表旋转270
                                 pdfReader.getPageN(index).put(PdfName.ROTATE, new PdfNumber(270)); // 顺时针旋转270°
                                 //横表旋转后打页码坐标不一样
-                                over.showTextAligned(Element.ALIGN_LEFT, String.valueOf(cursor + index), heigh - 35, 20, 0);
+                                over.showTextAligned(Element.ALIGN_LEFT, pageNumber, heigh - 35, 20, 0);
                             } else {
                                 if (rotate!= null && rotate.intValue() == 270) {
                                     //交换width和height
                                     pdfReader.getPageN(index).put(PdfName.ROTATE, new PdfNumber(0)); // 顺时针旋转270°
                                     //横表旋转后打页码坐标不一样
-                                    over.showTextAligned(Element.ALIGN_LEFT, String.valueOf(cursor + index), width - 35, 20, 0);
+                                    over.showTextAligned(Element.ALIGN_LEFT, pageNumber, width - 35, 20, 0);
                                 }else {
-                                    over.showTextAligned(Element.ALIGN_LEFT, String.valueOf(cursor + index), width - 35, 20, 0);
+                                    over.showTextAligned(Element.ALIGN_LEFT, pageNumber, width - 35, 20, 0);
                                 }
                             }
                             over.endText();
@@ -838,4 +845,27 @@ public class FileUtils {
         return cleaned.length() > 8 ? cleaned.substring(0, 8) : cleaned;
     }
 
+    /**
+     * 格式化页码
+     * @param pageNumber 原始页码
+     * @param pageType 页码类型,0-默认无虚数,1-有虚数
+     * @param pageLen 页码位数
+     * @return 格式化后的页码
+     */
+    private static String formatPageNumber(int pageNumber, Integer pageType, Integer pageLen) {
+        if (pageType == null || pageType == 0) {
+            // 默认情况,直接返回页码
+            return String.valueOf(pageNumber);
+        }
+        
+        if (pageType == 1 && pageLen != null && pageLen > 0) {
+            // 需要补齐虚数
+            String format = "%0" + pageLen + "d";
+            return String.format(format, pageNumber);
+        }
+        
+        // 其他情况返回默认页码
+        return String.valueOf(pageNumber);
+    }
+
 }

+ 2 - 2
blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml

@@ -198,8 +198,8 @@
         CASE (select count(tcf.id) from u_tree_contract_first AS tcf where tcf.is_deleted = 0 and tcf.wbs_node_id =
         wtc.p_key_id) WHEN 0 THEN 'false' ELSE 'true'
         END AS isFirst,
-        ( SELECT count(1) from m_wbs_tree_contract where id in(SELECT parent_id from m_wbs_tree_contract a where
-        a.is_deleted=0 and a.type=2 and table_owner in(1,2,3)) and contract_id=wtc.contract_id and type =1 and
+        ( SELECT count(1) from m_wbs_tree_contract where id in(SELECT DISTINCT parent_id from m_wbs_tree_contract a where
+        a.is_deleted=0 and a.type=2 and a.contract_id = #{contractId} and table_owner in(1,2,3)) and contract_id=wtc.contract_id and type =1 and
         is_deleted=0 and (FIND_IN_SET(wtc.id,ancestors) or wtc.p_key_id=p_key_id)
         ) as allCount,
         (SELECT count(1) from u_information_query b where b.wbs_id in(SELECT p_key_id from m_wbs_tree_contract a

+ 2 - 2
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ArchiveFileServiceImpl.java

@@ -177,10 +177,10 @@ public class ArchiveFileServiceImpl extends BaseServiceImpl<ArchiveFileMapper, A
                 }
             }
             //循环查看是否把需要审批改为不需要审批,  不可能把不需要审批改为需要审批 ,0不需要,1需要
-            if (vo.getStatus() == 0 && vo.getIsApproval() == 0) {
+            if (vo.getStatus() != null && vo.getStatus() == 0 && vo.getIsApproval() != null &&  vo.getIsApproval() == 0) {
                 vo.setStatus(2);
             }
-            if(vo.getIsApproval() == 1){
+            if(vo.getIsApproval() != null && vo.getIsApproval() == 1){
                 Set<String> aopParamsSet = new HashSet<>();
                 //判断现在的数据是否是待审批数据,只有上报状态、未认证状态的数据才能撤销
                 ArchiveFile archiveFile = jdbcTemplate.queryForObject("select * from u_archive_file where id = " + vo.getId(), new BeanPropertyRowMapper<>(ArchiveFile.class));

+ 1 - 1
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVDataServiceImpl.java

@@ -240,7 +240,7 @@ public class EVDataServiceImpl implements EVDataService {
                     Long pdfSize = 0L;
                     String nodePdfUrl = "";
 
-                    List<Map<String, Object>> mapList = jdbcTemplate.queryForList("select *,domain_url as url from m_table_file where is_deleted = 0 and type in (10,11,12) and tab_id = (select wbs_id from u_information_query WHERE id = + " + taskApp.getFormDataId() + ")");
+                    List<Map<String, Object>> mapList = jdbcTemplate.queryForList("select *,domain_url as url from m_table_file where is_deleted = 0 and type in (10,11,12) and (tab_id,classify) in (select wbs_id, classify from u_information_query WHERE id = + " + taskApp.getFormDataId() + ")");
                     if (Func.isNotEmpty(mapList) && mapList.size() >= 1) {
                         String file_path = FileUtils.getSysLocalFileUrl();
                         List<String> datainfo = new ArrayList<>();

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

@@ -173,6 +173,9 @@ public class TurnPoint implements Serializable {
     }
 
     public String getSj() {
+        if(StringUtils.isEmpty(sj)){
+            sj = null;
+        }
         return sj;
     }
 

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

@@ -956,6 +956,6 @@
                (select node_type from m_wbs_tree_private where p_key_id = ucl.wbs_node_id) as logType,
                (select node_name from m_wbs_tree_private where p_key_id = ucl.wbs_node_id) as logName
         from u_contract_log ucl
-        where contract_id = #{contractId} and is_deleted = 0
+        where contract_id = #{contractId} and is_deleted = 0 and pdf_url IS NOT NULL order by record_time
     </select>
 </mapper>

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

@@ -1148,7 +1148,7 @@ public class ArchiveTreeContractSyncImpl {
         if (StringUtils.isBlank(contractLogType)){
             throw new ServiceException("当前节点未配置同步日志资料类型");
         }
-        List<Integer> logType = Arrays.stream(contractLogType.split(","))
+        List<Integer> logType = Arrays.stream(contractLogType.split(",")).filter(l -> StringUtils.isNotBlank(l))
                 .map(Integer::parseInt) // 将每个字符串转换为Integer
                 .collect(Collectors.toList());
         //获取日志类型字典

+ 62 - 60
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -1900,38 +1900,42 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                     values.set(i, String.join("☆",heightDeviationList));
                                 }
                             }
-                            if(rowMin==null){
-                                continue;
-                            }
-                            List<String> list = new ArrayList<>();
+                            if(rowMin!=null){
+                                List<String> list = new ArrayList<>();
 
-                            //获取当前key对应的坐标
-                            Set<String> strings = coordinateMap.get(initTabName);
-                            String index = null;
-                            for (String string : strings) {
-                                String[] split = string.split("__");
-                                if(Objects.equals(split[0],actualElevationNew)){
-                                    index = split[1];
+                                //获取当前key对应的坐标
+                                Set<String> strings = coordinateMap.get(initTabName);
+                                String index = null;
+                                for (String string : strings) {
+                                    String[] split = string.split("__");
+                                    if(Objects.equals(split[0],actualElevationNew)){
+                                        index = split[1];
+                                    }
                                 }
-                            }
-                            //按照最小行数来计算
-                            for (int i = rowMin; i <= rowMax; i++) {
-                                BigDecimal designed = designedElevationNewMap.get(i);
-                                BigDecimal height = heightDeviationNewMap.get(i);
+                                //按照最小行数来计算
+                                for (int i = rowMin; i <= rowMax; i++) {
+                                    BigDecimal designed = designedElevationNewMap.get(i);
+                                    BigDecimal height = heightDeviationNewMap.get(i);
 
-                                if(designed == null || height == null){
-                                    continue;
+                                    if(designed == null || height == null){
+                                        continue;
+                                    }
+                                    BigDecimal v = designed.add(height.divide(new BigDecimal(1000)));
+                                    //第5列,索引为4
+                                    list.add(v.doubleValue() + "_^_"+ i + "_" + index);
+                                }
+                                //未获取到当前key的坐标就不设置值
+                                if(index != null){
+                                    //设置实际标高的值
+                                    if(keys.indexOf(actualElevationNew) > -1){
+                                        values.set(keys.indexOf(actualElevationNew), String.join("☆",list));
+                                    }else{
+                                        keys.add(actualElevationNew);
+                                        values.add(String.join("☆",list));
+                                    }
                                 }
-                                BigDecimal v = designed.add(height.divide(new BigDecimal(1000)));
-                                //第5列,索引为4
-                                list.add(v.doubleValue() + "_^_"+ i + "_" + index);
-                            }
-                            //未获取到当前key的坐标就不设置值
-                            if(index == null){
-                                continue;
                             }
-                            //设置实际标高的值
-                            values.set(keys.indexOf(actualElevationNew), String.join("☆",list));
+
                         }else if(planePositionTableName.equals(initTabName)){
                             //CL10平面位置检测记录表(监理)
                             //差值
@@ -1994,42 +1998,40 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                 }
                                 values.set(i, String.join("☆",list));
                             }
-                            if(rowMin==null){
-                                continue;
-                            }
-                            List<String> list = new ArrayList<>();
-                            //获取当前key对应的坐标
-                            Set<String> strings = coordinateMap.get(initTabName);
-                            String index = null;
-                            for (String string : strings) {
-                                String[] split = string.split("__");
-                                if(Objects.equals(split[0],deviationNew)){
-                                    index = split[1];
+                            if(rowMin!=null){
+                                List<String> list = new ArrayList<>();
+                                //获取当前key对应的坐标
+                                Set<String> strings = coordinateMap.get(initTabName);
+                                String index = null;
+                                for (String string : strings) {
+                                    String[] split = string.split("__");
+                                    if(Objects.equals(split[0],deviationNew)){
+                                        index = split[1];
+                                    }
                                 }
-                            }
-                            //按照最小行数来计算
-                            for (int i = rowMin; i <= rowMax; i++) {
-                                BigDecimal x = differenceNewXMap.get(i);
-                                BigDecimal y = differenceNewYMap.get(i);
+                                //按照最小行数来计算
+                                for (int i = rowMin; i <= rowMax; i++) {
+                                    BigDecimal x = differenceNewXMap.get(i);
+                                    BigDecimal y = differenceNewYMap.get(i);
 
-                                if(x == null || y == null){
-                                    continue;
-                                }
-                                BigDecimal sqrt = sqrt(x.multiply(x).add(y.multiply(y)), 0);
+                                    if(x == null || y == null){
+                                        continue;
+                                    }
+                                    BigDecimal sqrt = sqrt(x.multiply(x).add(y.multiply(y)), 0);
 
-                                //第9列,索引为8
-                                list.add(sqrt.intValue() + "_^_"+ i + "_" + index);
-                            }
-                            //未获取到当前key的坐标就不设置值
-                            if(index == null){
-                                continue;
-                            }
-                            //设置实际标高的值
-                            if(keys.indexOf(deviationNew) > -1){
-                                values.set(keys.indexOf(deviationNew), String.join("☆",list));
-                            }else{
-                                keys.add(deviationNew);
-                                values.add(String.join("☆",list));
+                                    //第9列,索引为8
+                                    list.add(sqrt.intValue() + "_^_"+ i + "_" + index);
+                                }
+                                //未获取到当前key的坐标就不设置值
+                                if(index != null){
+                                    //设置实际标高的值
+                                    if(keys.indexOf(deviationNew) > -1){
+                                        values.set(keys.indexOf(deviationNew), String.join("☆",list));
+                                    }else{
+                                        keys.add(deviationNew);
+                                        values.add(String.join("☆",list));
+                                    }
+                                }
                             }
                         }
 

+ 12 - 0
blade-service/blade-repair/pom.xml

@@ -81,5 +81,17 @@
             <artifactId>commons-io</artifactId>
             <version>2.11.0</version>
         </dependency>
+        <dependency>
+            <groupId>com.lowagie</groupId>
+            <artifactId>itext</artifactId>
+            <version>4.2.2</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itextpdf</artifactId>
+            <version>5.5.13.3</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 </project>

+ 52 - 0
blade-service/blade-repair/src/main/java/org/springblade/repair/controller/CheckAndRepairController.java

@@ -10,6 +10,7 @@ import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
+import org.springblade.business.entity.InformationQuery;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
@@ -17,6 +18,11 @@ import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tool.utils.FileUtil;
 import org.springblade.core.tool.utils.IoUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.core.tool.utils.ResourceUtil;
+import org.springblade.manager.entity.ExcelTab;
+import org.springblade.manager.entity.TableFile;
+import org.springblade.manager.entity.WbsTreeContract;
+import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.manager.entity.*;
 import org.springblade.repair.util.ExcelInfoUtils;
@@ -25,6 +31,7 @@ import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.cache.ParamCache;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.SingleColumnRowMapper;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.transaction.support.TransactionTemplate;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -680,4 +687,49 @@ public class CheckAndRepairController {
         }
         return null;
     }
+
+    @GetMapping("/checkNodePdfByClsssify")
+    //@Scheduled(cron = "00 10 17 * * ?")
+    public void checkNodePdfByClsssify() throws FileNotFoundException {
+        String sql="select id,wbs_id,classify,pdf_url,e_visa_pdf_url FROM u_information_query WHERE project_id in(1750070685257990145,1795277868551389185) AND is_deleted=0 AND node_pdf_url is NOT NULL AND status in(0,1,2)";
+        List<InformationQuery> informationQueryList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(InformationQuery.class));
+        System.out.println("一共有"+informationQueryList.size()+"条数据");
+         int i=1;
+        for (InformationQuery informationQuery : informationQueryList) {
+            List<String> pdfs=new ArrayList<>();
+          String sql1="select domain_pdf_url from m_table_file where tab_id="+informationQuery.getWbsId()+" and classify="+informationQuery.getClassify()+" and  domain_pdf_url is not null and is_deleted=0 order by sort ASC";
+          List<String> tableFileList = jdbcTemplate.query(sql1,new SingleColumnRowMapper<>(String.class));
+          tableFileList=tableFileList.stream().filter(StringUtils::isNotEmpty).collect(Collectors.toList());
+          if(!tableFileList.isEmpty()){
+              String informationQueryPdf=StringUtils.isNotEmpty(informationQuery.getEVisaPdfUrl())?informationQuery.getEVisaPdfUrl():informationQuery.getPdfUrl();
+              pdfs.add(informationQueryPdf);
+              pdfs.addAll(tableFileList);
+              String file_path = FileUtils.getSysLocalFileUrl();
+              String listPdf = file_path + "/nodePDF/" + informationQuery.getWbsId() + ".pdf";
+              File tabpdf2 = ResourceUtil.getFile(listPdf);
+              if (tabpdf2.exists()) {
+                  tabpdf2.delete();
+              }
+              try {
+                  FileUtils.mergePdfPublicMethods(pdfs, listPdf);
+                  BladeFile bladeFile = this.newIOSSClient.uploadFile(informationQuery.getWbsId() + ".pdf", listPdf);
+                  if(bladeFile!=null && StringUtils.isNotEmpty(bladeFile.getLink())){
+                      String update="update u_information_query set node_pdf_url="+"'"+bladeFile.getLink()+"'"+" where id="+informationQuery.getId();
+                      System.out.println("合并后======================================"+update);
+                      jdbcTemplate.update(update);
+                  }
+              }catch (Exception e){
+                  System.out.println("合并pdf失败!informationQueryID:"+informationQuery.getId());
+                  continue;
+              }
+          }else {
+              String informationQueryPdf=StringUtils.isNotEmpty(informationQuery.getEVisaPdfUrl())?informationQuery.getEVisaPdfUrl():informationQuery.getPdfUrl();
+              String update="update u_information_query set node_pdf_url="+"'"+informationQueryPdf+"'"+" where id="+informationQuery.getId();
+              System.out.println(update);
+              jdbcTemplate.update(update);
+          }
+            System.out.println("已处理"+i+"条数据,还剩下条"+(informationQueryList.size()-i)+"数据:"+informationQuery.getId());
+          i++;
+        }
+    }
 }

+ 46 - 0
blade-service/blade-repair/src/main/java/org/springblade/repair/util/FileUtils.java

@@ -1,11 +1,16 @@
 package org.springblade.repair.util;
 
+import com.itextpdf.text  .Document;
+import com.itextpdf.text.pdf.PdfCopy;
+import com.itextpdf.text.pdf.PdfReader;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SystemUtils;
 import org.springblade.system.cache.ParamCache;
 
 import java.io.*;
+import java.util.List;
+import java.util.Objects;
 
 public class FileUtils {
     // 获取本地 或 远程工作流ParamCache
@@ -104,4 +109,45 @@ public class FileUtils {
         }
         return file_path;
     }
+
+    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(Objects.requireNonNull(CommonUtil.getOSSInputStream(urlStr)));
+                    PdfReader.unethicalreading = true;
+                    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();
+        }
+    }
 }