zhuwei 3 hete
szülő
commit
7ea9198231
19 módosított fájl, 693 hozzáadás és 216 törlés
  1. 0 34
      blade-common/src/main/java/org/springblade/common/utils/AsyncConfigurer.java
  2. 19 0
      blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java
  3. 1 1
      blade-common/src/main/java/org/springblade/common/utils/SafeURLEncoder.java
  4. 0 28
      blade-common/src/main/java/org/springblade/common/utils/singleEexConfigurer.java
  5. 2 3
      blade-service/blade-archive/src/main/java/org/springblade/archive/external/impl/ExternalDataArchiveMetaService.java
  6. 3 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/TaskSplitMapper.java
  7. 7 4
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/TaskSplitMapper.xml
  8. 1 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExpertConclusionServiceImpl.java
  9. 4 3
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/TaskSplitServiceImpl.java
  10. 24 4
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  11. 1 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ArchiveFileServiceImpl.java
  12. 5 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java
  13. 7 2
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/EVisaApplication.java
  14. 433 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/Archive2Controller.java
  15. 137 125
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/ArchiveController.java
  16. 5 4
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/Chek.java
  17. 8 3
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/ChekSignData.java
  18. 1 1
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVController.java
  19. 35 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/ArchivePoolExecutorConfig.java

+ 0 - 34
blade-common/src/main/java/org/springblade/common/utils/AsyncConfigurer.java

@@ -1,34 +0,0 @@
-package org.springblade.common.utils;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.scheduling.annotation.EnableAsync;
-
-import java.util.concurrent.*;
-
-@Slf4j
-@Configuration
-@EnableAsync
-public class AsyncConfigurer {
-
-    /**
-     * cpu 核心数量
-     */
-    public static final int cpuNum = 1 ;//Runtime.getRuntime().availableProcessors();
-
-    /**
-     * 线程池配置
-     * @return
-     */
-    @Bean("taskExecutor1")
-    public ThreadPoolExecutor getAsyncExecutor() {
-        return new ThreadPoolMonitor(cpuNum
-                , 15
-                , 180
-                , TimeUnit.SECONDS
-                , new LinkedBlockingQueue<>(2000)
-                , new ThreadPoolExecutor.DiscardOldestPolicy(), "manager-thread-pool");
-    }
-
-}

+ 19 - 0
blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java

@@ -140,6 +140,25 @@ public class CommonUtil {
         inputStream.close();
     }
 
+
+    public static InputStream getOSSInputStream3(String urlStr) {
+        try {
+            System.out.println("----前-------"+urlStr);
+            int lastIndex = urlStr.lastIndexOf("/") + 1;
+            String fileName = urlStr.substring(lastIndex);
+            urlStr = urlStr.substring(0, lastIndex) + URLEncoder.encode(fileName, "UTF-8").replace("+", "%20");
+            //获取OSS文件流
+            URL url = new URL(urlStr);
+            URLConnection conn = url.openConnection();
+
+            conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
+            return conn.getInputStream();
+        } catch (Exception e) {
+            System.out.println("-----后------"+urlStr);
+            return null;
+        }
+    }
+
     /**
      * 根据OSS文件路径获取文件输入流
      */

+ 1 - 1
blade-common/src/main/java/org/springblade/common/utils/SafeURLEncoder.java

@@ -85,7 +85,7 @@ public class SafeURLEncoder {
     // 测试用例
     public static void main(String[] args) {
         // 需要编码的复杂URL
-        String complexUrl = "https://xinan1.zos.ctyun.cn/huazheng2021/folderFile/8035ed7caee244a09c93fb731fd2/27e5af52344e4f0baf4b0e5d53eb1406/54.G7522天峨至北海公路(平塘至天峨广西段)№1合同段碎石垫层、4%水泥稳定碎石底基层、5%水泥稳定碎石基层.pdf";
+        String complexUrl = "http://100.86.2.1:80/huazheng2021/folderFile/0cc855e1e2524a4183e03cc500e4/aff588c4a69d4b9c977cfa71c32d3b8f/5.G7522天峨至北海公路(平塘至天峨广西段)月里互通A匝道桥、月里6号桥、拉堡1号桥、拉京高架桥、老寨高架大桥、罗屯1号桥荷载试验报告,桥梁外观检测报告 (2)-20250717033205.pdf";
         System.out.println("编码后的URL: " + encodeFullUrl(complexUrl));
 
         // 不需要编码的简单URL

+ 0 - 28
blade-common/src/main/java/org/springblade/common/utils/singleEexConfigurer.java

@@ -1,28 +0,0 @@
-package org.springblade.common.utils;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-import org.springframework.scheduling.annotation.EnableAsync;
-
-import java.util.concurrent.*;
-
-@Slf4j
-@Configuration
-@EnableAsync
-public class singleEexConfigurer {
-
-    /**
-     * 线程池配置
-     *
-     * @return
-     */
-    @Bean("singleExecutor")
-    @Primary
-    public ExecutorService getSingleExecutor() {
-        log.info("线程池初始化......");
-        return Executors.newSingleThreadExecutor();
-    }
-
-}

+ 2 - 3
blade-service/blade-archive/src/main/java/org/springblade/archive/external/impl/ExternalDataArchiveMetaService.java

@@ -25,10 +25,9 @@ public class ExternalDataArchiveMetaService {
 
     private final JdbcTemplate jdbcTemplate;
 
-    @Resource(name = "singleExecutor")
-    private ExecutorService executorService;
+    private final ExecutorService executorService;
 
-    private ArchivesAutoMapper autoMapper;
+    private final ArchivesAutoMapper autoMapper;
     public void handleArchiveMetas(Long projectId, ArchiveReq req, ExternalDataInfo externalDataInfo){
         syncData(projectId, req, externalDataInfo);
     }

+ 3 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/TaskSplitMapper.java

@@ -46,5 +46,7 @@ public interface TaskSplitMapper extends BaseMapper<TaskSplit> {
 	// 获取分解任务是否存在
 	Integer getSpliteTaskCount(String contractId);
 
-	//Integer updateArchiveByIds(String contractId,);
+	Integer updateArchiveByContratId(String contractId);
+
+	Integer updateArchiveByIds(@Param("split") List<String> split);
 }

+ 7 - 4
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/TaskSplitMapper.xml

@@ -33,13 +33,16 @@
     <select id="getSpliteTaskCount" resultType="java.lang.Integer">
         select count(1) from u_task_split where contract_id = #{contractId} and type=2
     </select>
+    <update id="updateArchiveByContratId" >
+        update u_archives_auto set split_status = 0 where contract_id = #{contractId} and is_deleted = 0
+    </update>
 
-<!--    <update id="updateArchiveByIds">
-        update u_archives_auto set status = 1 where contract_id = #{contractId} and id in
-        <foreach item="item" collection="ids" separator="," close=")" open="(" index="index">
+    <update id="updateArchiveByIds">
+        update u_archives_auto set split_status = 0 where is_deleted = 0 and id in
+        <foreach item="item" collection="split" separator="," close=")" open="(" index="index">
             #{item}
         </foreach>
-    </update>-->
+    </update>
 
 
 </mapper>

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

@@ -336,6 +336,7 @@ public class ArchiveExpertConclusionServiceImpl extends BaseServiceImpl<ArchiveE
         //创建字体
 //        BaseFont baseFont2 =BaseFont.createFont("C:/WINDOWS/Fonts/simsun.ttc,0", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
         BaseFont baseFont2 =BaseFont.createFont("/usr/share/fonts/chinese/simsun.ttc,0", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
+       // BaseFont baseFont2 =BaseFont.createFont("/Users/hongchuangyanfa/fsdownload/simsun.ttc,0", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
       //  BaseFont baseFont2 =BaseFont.createFont("/Users/hongchuangyanfa/fsdownload/simsun.ttc", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
      //   BaseFont baseFont2 =BaseFont.createFont(); //BaseFont.createFont("/Users/hongchuangyanfa/fsdownload/simsun.ttc", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
         //字体对象,这里可以创建一个方法

+ 4 - 3
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/TaskSplitServiceImpl.java

@@ -84,6 +84,9 @@ public class TaskSplitServiceImpl extends BaseServiceImpl<TaskSplitMapper, TaskS
 			taskSplit.setTaskName("整个合同段 "+archiveCount+" 条的分解任务");
 			data.put("fileCount",archiveCount);
 			data.put("taskTime",i);
+			// 修改整个合同任务状态为 未分解
+			baseMapper.updateArchiveByContratId(contractId);
+
 		}else{ // 指定文件解析
 			taskSplit.setType(3);
 			//String[] split = splitIds.split(",");
@@ -92,9 +95,6 @@ public class TaskSplitServiceImpl extends BaseServiceImpl<TaskSplitMapper, TaskS
 			taskSplit.setFinished(0);
 
 			// 修改当前文件的状体
-			// baseMapper.updateArchiveByIds(contractId,splitIds);
-
-
 			Random random = new Random();
 			int randomNumber = random.nextInt(30) + 150;// 生成10到20之间的随机数
 			int i = (int) Math.ceil(randomNumber * split.size()/60.0 );
@@ -104,6 +104,7 @@ public class TaskSplitServiceImpl extends BaseServiceImpl<TaskSplitMapper, TaskS
 			DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss");
 			String formattedDateTime = now.format(formatter)+"_"+split.size()+"条分解任务";
 			taskSplit.setTaskName(formattedDateTime);
+			baseMapper.updateArchiveByIds(split);
 		}
 
 		int insert = baseMapper.insert(taskSplit);

+ 24 - 4
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -1825,6 +1825,10 @@ public R<Boolean> copyContractTreeNode(@RequestBody CopyContractTreeNodeVO vo) {
                     //根据表明查询指定数据集合
                     List<WbsTreeContract> tabs = tabsGroup.get(tabName);
                     for (WbsTreeContract tab : tabs) {
+                        // 在复制数据时,测量记录表 的数据不需要复制
+                        if(tab.getType()==2 && tab.getTableType()==6){
+                            continue;
+                        }
                         //根据字段
                         String dataSql = "SELECT " + keys + " FROM " + tabName + " WHERE p_key_id = " + tab.getPKeyId() + " LIMIT 1;";
                         try {
@@ -2619,7 +2623,11 @@ private void addCopyTabData(WbsTreeContract needCopyNode, WbsTreeContract toCopy
                             String testColVal = reviseCols(eMap, colVal, oldPKeyId, tableName);
                             StaticLog.info("KT3356:" + testColVal);
                             copyDataSql.append(delSql).append("insert into ").append(tableName).append("  (").append(col).append(") select ").append(testColVal).append(" from ").append(tableName).append(" where p_key_id='").append(oldPKeyId).append("' LIMIT 1;");
-                            resultTablesData.add(copyDataSql.toString());
+                            if(needTab.getType()==2 && needTab.getTableType()==6){
+                                continue;
+                            }else{
+                                resultTablesData.add(copyDataSql.toString());
+                            }
                         }
                     }
 
@@ -2678,7 +2686,11 @@ private void addCopyTabData(WbsTreeContract needCopyNode, WbsTreeContract toCopy
                                 String testColVal = reviseCols(eMap, colVal, oldPKeyId, tableName);
                                 StaticLog.info("KT3356:" + testColVal);
                                 copyDataSql.append(delSql).append("insert into ").append(tableName).append("  (").append(col).append(") select ").append(testColVal).append(" from ").append(tableName).append(" where p_key_id='").append(oldPKeyId).append("' LIMIT 1;");
-                                resultTablesData.add(copyDataSql.toString());
+                                if(needTab.getType()==2 && needTab.getTableType()==6){
+                                    continue;
+                                }else{
+                                    resultTablesData.add(copyDataSql.toString());
+                                }
                             }
                         }
                     }
@@ -2807,7 +2819,11 @@ private void addCopyNodesAndTabsBuildData(List<WbsTreeContract> addNodeList, Lis
                         String testColVal = reviseCols(eMap, colVal, oldPKeyId, tableName);
                         /*StaticLog.info("KT3356:" + testColVal);*/
                         copyDataSql.append(delSql).append("insert into ").append(tableName).append("  (").append(col).append(") select ").append(testColVal).append(" from ").append(tableName).append(" where p_key_id='").append(oldPKeyId).append("' LIMIT 1;");
-                        resultTablesData.add(copyDataSql.toString());
+                        if(needTab.getType()==2 && needTab.getTableType()==6){
+                            continue;
+                        }else{
+                            resultTablesData.add(copyDataSql.toString());
+                        }
                     }
                 }
             }
@@ -2953,7 +2969,11 @@ private void addCopyNodesAndTabsBuildData(List<WbsTreeContract> addNodeList, Lis
                                     String testColVal = reviseCols(eMap, colVal, oldPKeyId, tableName);
                                     StaticLog.info("KT3356:" + testColVal);
                                     copyDataSql.append(delSql).append("insert into ").append(tableName).append("  (").append(col).append(") select ").append(testColVal).append(" from ").append(tableName).append(" where p_key_id='").append(oldPKeyId).append("' LIMIT 1;");
-                                    resultTablesData.add(copyDataSql.toString());
+                                    if(needTab.getType()==2 && needTab.getTableType()==6){
+                                        continue;
+                                    }else{
+                                        resultTablesData.add(copyDataSql.toString());
+                                    }
                                 }
                             }
                         }

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

@@ -42,8 +42,7 @@ public class ArchiveFileServiceImpl extends BaseServiceImpl<ArchiveFileMapper, A
     private final IDictBizClient dictBizClient;
     private final NewIOSSClient iossClient;
 
-    @Resource(name = "singleExecutor")
-    private ExecutorService executorService;
+    private final ExecutorService executorService;
 
     private final ArchiveInspectionInfoClient archiveInspectionInfoClient;
     private final JdbcTemplate jdbcTemplate;

+ 5 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java

@@ -387,7 +387,11 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
         } else {
             //首先根据wbsId获取合同段ID和项目ID
             WbsTreeContract contractTree = this.wbsTreeContractClient.getContractWbsTreeByPrimaryKeyId(Long.parseLong(primaryKeyId));
-            int type = (contractTree.getIsExpernode() == null || contractTree.getIsExpernode() <= 0) ? 1 : 2;
+           // int type = (contractTree.getIsExpernode() == null || contractTree.getIsExpernode() <= 0) ? 1 : 2;
+            int type = contractTree.getWbsType(); // 1质检,2试验
+            if(type>=3 || type<=0){
+                type = 1;
+            }
             if (DistributedRedisLock.acquire("saveOrUpdateInformationQueryData:" + primaryKeyId + ":" + contractTree.getContractId() + ":" + classify + ":" + type,5)) {
                 try {
                     //判断当前填报节点下是否已经存在相应数据

+ 7 - 2
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/EVisaApplication.java

@@ -4,6 +4,10 @@ import org.springblade.common.constant.EVisaConstant;
 import org.springblade.core.cloud.feign.EnableBladeFeign;
 import org.springblade.core.launch.BladeApplication;
 import org.springframework.cloud.client.SpringCloudApplication;
+import org.springframework.context.ConfigurableApplicationContext;
+
+import java.util.Arrays;
+import java.util.concurrent.ThreadPoolExecutor;
 
 /**
  * 电签服务启动类
@@ -13,8 +17,9 @@ import org.springframework.cloud.client.SpringCloudApplication;
 public class EVisaApplication {
 
     public static void main(String[] args) {
-
-        BladeApplication.run(EVisaConstant.APPLICATION_WEATHER_NAME, EVisaApplication.class, args);
+        ConfigurableApplicationContext ctx = BladeApplication.run(EVisaConstant.APPLICATION_WEATHER_NAME, EVisaApplication.class, args);
+        System.out.println("ThreadPoolExecutor beans: " +
+                Arrays.toString(ctx.getBeanNamesForType(ThreadPoolExecutor.class)));
     }
 
 }

+ 433 - 0
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/Archive2Controller.java

@@ -0,0 +1,433 @@
+package org.springblade.evisa.controller;
+
+import io.swagger.annotations.Api;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.rendering.PDFRenderer;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+import org.springblade.common.utils.CommonUtil;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.oss.model.BladeFile;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.IoUtil;
+import org.springblade.evisa.utils.FileUtils;
+import org.springblade.evisa.vo.ArchivesSplitInfoVO;
+import org.springblade.evisa.vo.TaskArchiveSplitVO;
+import org.springblade.resource.feign.NewIOSSClient;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+
+/**
+ * 清表基础数据表 控制器
+ *
+ * @author BladeX
+ * @since 2022-05-18
+ */
+@RestController
+@AllArgsConstructor
+@Api(value = "电签类", tags = "电签类接口")
+@Slf4j
+public class Archive2Controller {
+
+    private final StringRedisTemplate RedisTemplate;
+
+    private final JdbcTemplate jdbcTemplate;
+
+    private final NewIOSSClient newIOSSClient;
+
+    // 线程池
+    @Resource(name = "archivePoolExecutor")
+    private ThreadPoolExecutor archExecutor;
+
+    @Scheduled(cron = "0/30 * * * * ?")
+    public void SignTaskBatchPng() {
+        //执行代码
+        log.info("分解pdf专图片");
+       // String sql = "SELECT distinct b.id,b.archive_id as archiveId ,REPLACE(b.file_url,'https://xinan1.zos.ctyun.cn','http://100.86.2.1:80') as fileUrl from u_archives_auto a ,u_archive_file b  where a.id=b.archive_id  and a.is_deleted=0 and b.is_deleted=0 and a.split_status=10 LIMIT 20";
+        String sql = "SELECT distinct b.id,b.archive_id as archiveId ,b.file_url as fileUrl from u_archives_auto a ,u_archive_file b  where a.id=b.archive_id  and a.is_deleted=0 and b.is_deleted=0 and a.split_status=10 and a.id=1945020959844990977 LIMIT 20";
+        List<TaskArchiveSplitVO> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TaskArchiveSplitVO.class));
+
+        if (query != null && query.size() >= 1) {
+            for (TaskArchiveSplitVO dataInfo : query) {
+                if (archExecutor.getQueue().size() <= 20) {
+                    Boolean aBoolean = RedisTemplate.hasKey("splitpng-" + dataInfo.getArchiveId());
+                    if (!aBoolean) {
+                        RedisTemplate.opsForValue().setIfAbsent("splitpng-" + dataInfo.getArchiveId(), "1", 600, TimeUnit.SECONDS);
+                        CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
+                            try {
+                                signTaskBatchpngToHtml(dataInfo);
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                            }
+                        }, archExecutor);
+                    }
+                }
+            }
+        }
+        System.out.println("队列数量_img" + archExecutor.getQueue().size());
+        System.out.println("活跃数量_img" + archExecutor.getActiveCount());
+        System.out.println("总共数量_img" + archExecutor.getTaskCount());
+        System.out.println("完成数量_img" + archExecutor.getCompletedTaskCount());
+    }
+
+    // 分解第一页的任务
+
+    public void signTaskBatchpngToHtml(TaskArchiveSplitVO taskSign) {
+        try {
+
+            String archiveId = taskSign.getArchiveId();
+            String fileUrl = taskSign.getFileUrl();
+            List<String> listPdf = new ArrayList<>();
+            int startPage = 0;
+            for (int i = 2; i <= 10; i++) {
+
+                // 获取pdf第二页的数据
+                String firstUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/" + archiveId + "first__" + i + "__.pdf";
+                int pdfByPage = getPdfByPage(i, i, fileUrl, firstUrl);
+                File file = new File(firstUrl);
+
+                // 保存第一页为300DPI图片
+                String imagePath = FileUtils.getSysLocalFileUrl() + "archiveSplit/" + archiveId + "first__" + i + "__.png";
+                File imgfile = new File(imagePath);
+                int dataNum = savePdfAsImage(1, firstUrl, imagePath);
+
+                // 删除pdf
+                file.delete();
+                String state = OcrTitle(imagePath, "1");
+                if (state.equals("1")) {
+                    if (startPage < 2) {
+                        startPage = i;
+                    }
+                    listPdf.add(imagePath);
+                } else {
+                    imgfile.delete();
+                    break;
+                }
+            }
+
+            String filePath = startPage + "--" + (listPdf.size() + 1);
+            //
+            ArchivesSplitInfoVO data =new ArchivesSplitInfoVO();
+            data.setId(taskSign.getId());
+            data.setArchiveId(taskSign.getArchiveId());
+            data.setFileUrl(taskSign.getFileUrl());
+            data.setFirstFileUrl(filePath);
+            signTaskBatchpng(data);
+
+        } catch (Exception e) {
+            System.out.println("12321312");
+            e.printStackTrace();
+        }
+    }
+
+    public void signTaskBatchpng(ArchivesSplitInfoVO taskSign) {
+        try {
+            System.out.println("分解001");
+            String archiveId = taskSign.getArchiveId();
+            String fileUlr = taskSign.getFileUrl();
+            String firstPage = FileUtils.getSysLocalFileUrl() + "archiveSplit/";
+            String firstFileUrl = taskSign.getFirstFileUrl();
+            String firstUrl[] = firstFileUrl.split("--");
+            int basePage = Integer.parseInt(firstUrl[1]);
+            int baseStart = Integer.parseInt(firstUrl[0]);
+            String dutyUser = "";
+            int bkb = 0;
+            //将imagePath 的数据转成一个可解析的html
+            String htmlUrl = pngToHtml(firstPage, archiveId, taskSign.getFirstFileUrl());
+            System.out.println("分解002=" + htmlUrl);
+
+            if (htmlUrl.indexOf("_001.html") >= 0 && htmlUrl.indexOf("archiveSplit") >= 0) {
+                String htmlString = IoUtil.readToString(new FileInputStream(htmlUrl));
+                Document doc = Jsoup.parse(htmlString);
+                Element table = doc.select("table").first();
+                Elements trs = table.select("tr");
+                //由于解析已经成功,可能数据已经分解过,需要删除
+                if (trs != null && trs.size() >= 1) {
+                    String sql = "delete from u_archive_file where id<>'" + taskSign.getId() + "' and archive_id='" + archiveId + "'";
+                    jdbcTemplate.execute(sql);
+                }
+
+                for (int i = 0; i <= trs.size() - 1; i++) {
+                    Element tr = trs.get(i);
+                    String zrz = tr.select("td").get(0).text();
+                    String wjtm = tr.select("td").get(1).text();
+                    String rq = tr.select("td").get(2).text();
+                    String ym = tr.select("td").get(3).text();
+                    if (zrz.equals("责任者") && wjtm.equals("文件题名") && rq.equals("日期")) {
+                        continue;
+                    }
+                    int startYm = 0;
+                    int endYm = 0;
+                    if (i < trs.size() - 1) {
+                        startYm = Func.toInt(ym);
+                        String enData = trs.get(i + 1).select("td").get(3).text();
+                        if (enData.indexOf("页") >= 0) {
+                            enData = trs.get(i + 2).select("td").get(3).text();
+                        }
+
+                        String[] parts = enData.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
+                        if (parts != null && parts.length >= 1) {
+                            endYm = Func.toInt(parts[0]);
+                        }
+                    } else {
+                        String[] split = ym.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
+                        if (split != null && split.length >= 3) {
+                            startYm = Func.toInt(split[0]);
+                            endYm = Func.toInt(split[2]);
+                        } else {
+                            startYm = Func.toInt(split[0]);
+                            endYm = Func.toInt(split[0]);
+                        }
+                    }
+                    startYm = basePage + startYm;
+                    endYm = basePage + endYm;
+                    dutyUser = zrz;
+                    System.out.println("序号=" + i + "--文件提名:" + wjtm + "--开始(" + startYm + "-" + endYm + ")---页数" + (endYm - startYm + 1));
+                    // 分解文件
+                    String fmlUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/" + archiveId + "_cf_00" + i + ".pdf";
+                    getPdfByPage(startYm, endYm, fileUlr, fmlUrl);
+                    saveDataToMysql(fmlUrl, wjtm, taskSign.getId(), endYm - startYm + 1, i, zrz, rq);
+                    bkb = endYm;
+                }
+            } else {
+                return;
+            }
+
+            // 添加封面信息
+            String fmlUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/" + archiveId + "_fm_001.pdf";
+            getPdfByPage(1, 1, fileUlr, fmlUrl);
+            saveDataToMysql(fmlUrl, "封面", taskSign.getId(), 1, -4, dutyUser, "");
+
+            // 卷内目录
+            String jnmuUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/" + archiveId + "_jnml_001.pdf";
+            getPdfByPage(baseStart, basePage, fileUlr, jnmuUrl);
+            saveDataToMysql(jnmuUrl, "卷内目录", taskSign.getId(), 1, -3, dutyUser, "");
+
+            // 卷内备考表
+            String jnbkbUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/" + archiveId + "_jnbkb_001.pdf";
+            getPdfByPage(bkb + 1, bkb + 1, fileUlr, jnbkbUrl);
+
+            File jlPdfFile = new File(jnbkbUrl);
+            if (jlPdfFile.exists()) {
+                saveDataToMysql(jnbkbUrl, "卷内备考表", taskSign.getId(), 1, 100, dutyUser, "");
+            }
+
+            // 背脊表
+            String bjbUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/" + archiveId + "_beiji_001.pdf";
+            String bjbUrlPng = FileUtils.getSysLocalFileUrl() + "archiveSplit/" + archiveId + "_beiji_001.png";
+
+            int pdfByPage = getPdfByPage(bkb + 2, bkb + 2, fileUlr, bjbUrl);
+            if(pdfByPage==0){
+                File bgImgFile = new File(bjbUrlPng);
+                if (!bgImgFile.exists()) {
+                    int dataNum = savePdfAsImage(1, bjbUrl, bjbUrlPng);
+                }
+                String state = OcrTitle(bjbUrlPng, "3");
+                if (state.equals("1")) {
+                    saveDataToMysql(bjbUrl, "背脊表", taskSign.getId(), 1, 101, dutyUser, "");
+                }
+                bgImgFile.delete();
+            }
+            // 修改任务状态
+            String updateSql = "update u_archives_split_info set status=3 where id=" + taskSign.getId();
+            jdbcTemplate.execute(updateSql);
+            // 修改 u_archives_auto 为 已经分解
+            String updateSqlAuto = "update u_archives_auto set split_status=1 where id=" + taskSign.getArchiveId();
+            jdbcTemplate.execute(updateSqlAuto);
+
+            // 统计各个任务的结果
+            String taxkSql = "UPDATE u_task_split a set finished = (SELECT count(1) from u_archives_auto b where FIND_IN_SET(b.id,a.ids) and b.split_status=1) where FIND_IN_SET(" + taskSign.getArchiveId() + ",a.ids)  and a.type=3";
+            String taxkSql2 = "UPDATE u_task_split a set finished = (SELECT count(1) from u_archives_auto b where a.contract_id=b.contract_id) where a.id=" + taskSign.getTaskId() + " and a.type=2";
+            jdbcTemplate.execute(taxkSql);
+            jdbcTemplate.execute(taxkSql2);
+
+            // 删除html
+            File fileHtml = new File(fmlUrl);
+            fileHtml.delete();
+
+            // 修改完成情况
+            RedisTemplate.delete("splithtml-" + archiveId);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static String pngToHtml(String fileUrl, String pKeyId, String pageNum) {
+        String lasHhtmlUrl = "";
+        try {
+            // 定义Python解释器路径和脚本路径
+            String pythonScript = "/Users/hongchuangyanfa/Desktop/PycharmProjects/splitPngToHtml.py";
+            // 构建命令
+            ProcessBuilder pb = new ProcessBuilder("python3", pythonScript, fileUrl, pKeyId, pageNum);
+            Process process = pb.start();
+
+            // 读取Python脚本输出
+            BufferedReader reader = new BufferedReader(
+                    new InputStreamReader(process.getInputStream()));
+            String htmlUrl;
+            while ((htmlUrl = reader.readLine()) != null) {
+                System.out.println(htmlUrl);
+                if (htmlUrl.indexOf("html文件路径") >= 0 && htmlUrl.indexOf("_001.html") >= 0 && htmlUrl.indexOf("archiveSplit") >= 0) {
+                    lasHhtmlUrl = htmlUrl.replace("html文件路径", "");
+                }
+            }
+            // 等待进程结束
+            int exitCode = process.waitFor();
+            if (exitCode == 0) {
+                return lasHhtmlUrl;
+            } else {
+                return "1";
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "1";
+        }
+    }
+
+    public static String OcrTitle(String fileUrl, String type) {
+        String lasHhtmlUrl = "";
+        try {
+            // 定义Python解释器路径和脚本路径
+            String pythonScript = "/Users/hongchuangyanfa/Desktop/PycharmProjects/splitPngByTitle.py";
+            // 构建命令
+            ProcessBuilder pb = new ProcessBuilder("python3", pythonScript, fileUrl, type);
+            Process process = pb.start();
+
+            // 读取Python脚本输出
+            BufferedReader reader = new BufferedReader(
+                    new InputStreamReader(process.getInputStream()));
+            String htmlUrl;
+            while ((htmlUrl = reader.readLine()) != null) {
+                System.out.println("222" + htmlUrl);
+                if (htmlUrl.indexOf("图片中是否有卷内目录") >= 0 && htmlUrl.indexOf("True") >= 0) {
+                    return "1";
+                }
+            }
+            // 等待进程结束
+            int exitCode = process.waitFor();
+            if (exitCode == 0) {
+                return lasHhtmlUrl;
+            } else {
+                return "1";
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "1";
+        }
+    }
+
+
+    public static int getPdfByPage(int startPage, int endPage, String filePath, String savePath) {
+        try {
+            InputStream inputStreamByUrl = CommonUtil.getOSSInputStream3(filePath);
+            // 加载PDF文件
+            PDDocument document = PDDocument.load(inputStreamByUrl);
+            // 创建新文档
+            PDDocument newDocument = new PDDocument();
+
+            // 注意:PDFBox中的页面索引从0开始
+            int actualStart = Math.max(0, startPage - 1); // 将用户输入的1转换为0
+            int actualEnd = Math.min(document.getNumberOfPages() - 1, endPage - 1); // 将用户输入的10转换为9
+
+            // 添加指定范围的页面
+            for (int i = actualStart; i <= actualEnd; i++) {
+                PDPage page = document.getPage(i);
+                newDocument.addPage(page);
+            }
+
+            // 保存为新文件
+            newDocument.save(savePath);
+            newDocument.close();
+            document.close();
+            return 0;
+        } catch (Exception e) {
+            return 1;
+        }
+    }
+
+    public static int savePdfAsImage(int pageNum, String filePath, String outputPath) {
+        try (InputStream inputStream = FileUtils.getInputStreamByUrl(filePath);
+             PDDocument document = PDDocument.load(inputStream)) {
+
+            // 验证页码范围
+            if (pageNum < 1 || pageNum > document.getNumberOfPages()) {
+                return 1;
+            }
+
+            PDFRenderer renderer = new PDFRenderer(document);
+
+            // 设置DPI为300
+            final int DPI = 300;
+
+            // 渲染指定页面(注意PDFBox使用0-based索引)
+            //BufferedImage image = renderer.renderImage(pageNum - 1, DPI / 72f);
+            BufferedImage image = renderer.renderImageWithDPI(0, DPI); // 0 表示第一页
+            // 确保输出目录存在
+            File outputFile = new File(outputPath);
+            outputFile.getParentFile().mkdirs();
+
+            // 保存为PNG格式(可改为JPG等)
+            ImageIO.write(image, "PNG", outputFile);
+
+            log.info("PDF页面已成功保存为图片: {}", outputPath);
+            inputStream.close();
+            document.close();
+            return 0;
+        } catch (Exception e) {
+            log.error("PDF转图片失败", e);
+            return 1;
+        }
+    }
+
+    public int saveDataToMysql(String upFileUrl, String fileName, String fileId, int filePage, int sort, String dutyUser, String fileTime) {
+        // 获取封面信息
+        long newPkId = SnowFlakeUtil.getId(); //主键Id
+        File fmfile = new File(upFileUrl);
+        if (fmfile.exists()) {
+            BladeFile bladeFile = this.newIOSSClient.uploadFile(fileName + ".pdf", upFileUrl);
+            if (bladeFile != null && Func.isNotEmpty(bladeFile.getLink())) {
+                String FmPdfUrl = bladeFile.getLink();
+                String sql = " insert into u_archive_file( " +
+                        " id,project_id,contract_id,node_id,file_number,file_name,file_time,file_url,pdf_file_url,file_page,is_approval,is_certification,is_need_certification,duty_user,create_user,create_dept,create_time,update_user,update_time,status,is_deleted,sheet_type,sheet_source, " +
+                        " drawing_no,cite_change_number,certification_time,e_visa_file,node_ext_id,file_type,archive_id,origin_id,filming_time,filmingor_time,tag_id,pic_code,refer_code,film_code,width,height,ftime,utime,del_time,sort,box_name,box_number,is_auto_file,is_archive,page_num, " +
+                        " file_size,source_type,is_element,pdf_page_url,fid,rectification,classify,m_wbs_tree_contract_p_key_id,u_image_classification_file_id,archive_file_storage_type,node_tree_structure,date_name,archive_file_stroage_type,out_id,sort_num " +
+                        "   ) " +
+                        " SELECT " + newPkId + ",project_id,contract_id,node_id,file_number,'" + fileName + "','" + fileTime + "','" + FmPdfUrl + "','" + FmPdfUrl + "'," + filePage + ",is_approval,is_certification,is_need_certification,'" + dutyUser + "',create_user,create_dept,create_time,update_user,update_time,status,is_deleted,sheet_type,sheet_source, " +
+                        "        drawing_no,cite_change_number,certification_time,e_visa_file,node_ext_id,file_type,archive_id,origin_id,filming_time,filmingor_time,tag_id,pic_code,refer_code,film_code,width,height,ftime,utime,del_time," + sort + ",box_name,box_number,is_auto_file,is_archive,page_num, " +
+                        "        file_size,source_type,is_element,pdf_page_url,fid,rectification,classify,m_wbs_tree_contract_p_key_id,u_image_classification_file_id,archive_file_storage_type,node_tree_structure,date_name,archive_file_stroage_type,out_id,sort_num " +
+                        " from u_archive_file where id=" + fileId;
+                System.out.println(fileName + "----" + sql);
+                jdbcTemplate.execute(sql);
+
+            } else {
+                // 检查一下oss是否启动
+                System.out.println("oss服务未启动,无法上传文件到oss");
+                return 500;
+            }
+        } else {
+            return 404;
+        }
+        fmfile.delete();
+        return 200;
+    }
+}

+ 137 - 125
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/ArchiveController.java

@@ -2,6 +2,7 @@ package org.springblade.evisa.controller;
 
 import io.swagger.annotations.Api;
 import lombok.AllArgsConstructor;
+import lombok.Synchronized;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
@@ -9,6 +10,8 @@ import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
+import org.springblade.common.utils.CommonUtil;
+import org.springblade.common.utils.SafeURLEncoder;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tool.utils.Func;
@@ -52,53 +55,49 @@ import javax.imageio.ImageIO;
 @Slf4j
 public class ArchiveController {
 
-    @Autowired
-    StringRedisTemplate RedisTemplate;
-    // jdbc
+    private final StringRedisTemplate RedisTemplate;
+
     private final JdbcTemplate jdbcTemplate;
 
     private final NewIOSSClient newIOSSClient;
 
     // 线程池
-    @Resource(name = "taskExecutor1")
-    private ThreadPoolExecutor executor;
+    @Resource(name = "archivePoolExecutor")
+    private ThreadPoolExecutor archExecutor;
 
-//   @Scheduled(cron = "0 0/1 * * * ?")
-    public void SignInfo() {
+   // @Scheduled(cron = "0/30 * * * * ?")
+    public void SignTaskBatchPng() {
         //执行代码
-
         log.info("分解pdf专图片");
-        String sql = "SELECT distinct b.id,b.archive_id as archiveId ,b.file_url as fileUrl,c.id as taskId from u_archives_auto a , u_archive_file b ,u_task_split c  where a.id=b.archive_id and ((FIND_IN_SET(a.id,c.ids) and c.type=3) or (a.contract_id=c.contract_id and c.type=2)) and a.is_deleted=0 and b.is_deleted=0 and a.split_status not in(1,2) ";
+        String sql = "SELECT distinct b.id,b.archive_id as archiveId ,REPLACE(b.file_url,'https://xinan1.zos.ctyun.cn','http://100.86.2.1:80') as fileUrl,c.id as taskId from u_archives_auto a , u_archive_file b ,u_task_split c  where a.id=b.archive_id and ((FIND_IN_SET(a.id,c.ids) and c.type=3) or (a.contract_id=c.contract_id and c.type=2)) and a.is_deleted=0 and b.is_deleted=0 and a.split_status not in(1,2) LIMIT 20";
+      //  String sql = "SELECT distinct b.id,b.archive_id as archiveId ,b.file_url as fileUrl,c.id as taskId from u_archives_auto a , u_archive_file b ,u_task_split c  where a.id=b.archive_id and ((FIND_IN_SET(a.id,c.ids) and c.type=3) or (a.contract_id=c.contract_id and c.type=2)) and a.is_deleted=0 and b.is_deleted=0 and a.split_status not in(1,2) and a.id=1947207326716919808 LIMIT 20";
         List<TaskArchiveSplitVO> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TaskArchiveSplitVO.class));
 
         if (query != null && query.size() >= 1) {
             for (TaskArchiveSplitVO dataInfo : query) {
-                if (executor.getQueue().size() <= 10) {
+                if (archExecutor.getQueue().size() <= 20) {
                     Boolean aBoolean = RedisTemplate.hasKey("splitpng-" + dataInfo.getArchiveId());
                     if (!aBoolean) {
-
-                        if (!aBoolean) {
-                            RedisTemplate.opsForValue().set("splitpng-" + dataInfo.getArchiveId(), "1", 600, TimeUnit.SECONDS);
-                            CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
-                                try {
-                                    /*===============执行批量任务===============*/
-                                    signTaskBatchpngToHtml(dataInfo);
-                                } catch (Exception e) {
-                                    e.printStackTrace();
-                                }
-                            }, executor);
-                        }
+                        RedisTemplate.opsForValue().setIfAbsent("splitpng-" + dataInfo.getArchiveId(), "1", 600, TimeUnit.SECONDS);
+                        CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
+                            try {
+                                signTaskBatchpngToHtml(dataInfo);
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                            }
+                        }, archExecutor);
                     }
                 }
             }
         }
-        System.out.println("队列数量_img2" + executor.getQueue().size());
-        System.out.println("活跃数量_img2" + executor.getActiveCount());
-        System.out.println("总共数量_img2" + executor.getTaskCount());
-        System.out.println("完成数量_img2" + executor.getCompletedTaskCount());
+        System.out.println("队列数量_img" + archExecutor.getQueue().size());
+        System.out.println("活跃数量_img" + archExecutor.getActiveCount());
+        System.out.println("总共数量_img" + archExecutor.getTaskCount());
+        System.out.println("完成数量_img" + archExecutor.getCompletedTaskCount());
     }
 
     // 分解第一页的任务
+
     public void signTaskBatchpngToHtml(TaskArchiveSplitVO taskSign) {
         try {
             String fileUrl = taskSign.getFileUrl();
@@ -109,90 +108,100 @@ public class ArchiveController {
             int startPage = 0;
             for (int i = 2; i <= 10; i++) {
                 // 获取pdf第二页的数据
-                String firstUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/" + archiveId + "first__"+i+"__.pdf";
+                String firstUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/" + archiveId + "first__" + i + "__.pdf";
                 File file = new File(firstUrl);
                 if (!file.exists()) {
-                    getPdfByPage(i, i, fileUrl, firstUrl);
+                    int pdfByPage = getPdfByPage(i, i, fileUrl, firstUrl);
+                    if(pdfByPage==1){
+                        String sql22 = "INSERT INTO u_archives_split_info(id,status,file_url,first_file_url,task_id,archive_id,create_time) VALUES(?,?,?,?,?,?,SYSDATE())";
+                        int addCount = jdbcTemplate.update(sql22, id, 4, fileUrl, "获取数据源失败", taskId, archiveId);
+                        String updateSql = "UPDATE u_archives_auto SET split_status=? WHERE id=?";
+                        int delCount = jdbcTemplate.update(updateSql, 1, archiveId);
+                        return;
+                    }
                 }
 
                 // 保存第一页为300DPI图片
-                String imagePath = FileUtils.getSysLocalFileUrl() + "archiveSplit/" + archiveId + "first__"+i+"__.png";
+                String imagePath = FileUtils.getSysLocalFileUrl() + "archiveSplit/" + archiveId + "first__" + i + "__.png";
                 File imgfile = new File(imagePath);
                 if (!imgfile.exists()) {
-                    savePdfAsImage(1, firstUrl, imagePath);
+                    int dataNum = savePdfAsImage(1, firstUrl, imagePath);
                 }
                 // 删除pdf
                 file.delete();
-                String state = OcrTitle(imagePath,"1");
-                if(state.equals("1")){
-                    if(startPage<2){
-                        startPage = i ;
+                String state = OcrTitle(imagePath, "1");
+                if (state.equals("1")) {
+                    if (startPage < 2) {
+                        startPage = i;
                     }
                     listPdf.add(imagePath);
-                }else{
+                } else {
                     imgfile.delete();
                     break;
                 }
             }
             System.out.println(listPdf.size());
-            String filePath = startPage+"--"+(listPdf.size()+1);
+            String filePath = startPage + "--" + (listPdf.size() + 1);
             //判断
             List<Map<String, Object>> mapList = jdbcTemplate.queryForList("select * from u_archives_split_info where id=" + id + "");
             if (mapList != null && Func.isNotEmpty(mapList) && mapList.size() >= 1) {
                 String status = mapList.get(0).get("status") + "";
-                if (status.equals("3")) {
-                    String updateSql = "update u_archives_auto set split_status=1 where id=" + archiveId;
-                    jdbcTemplate.execute(updateSql);
-                }
-            } else {
-                String sql22 = "insert into u_archives_split_info(id,status,file_url,first_file_url,task_id,archive_id,create_time) VALUES(" + id + ",2,'" + fileUrl + "','" + filePath + "'," + taskId + "," + archiveId + ",SYSDATE())";
-                jdbcTemplate.execute(sql22);
-                String updateSql = "update u_archives_auto set split_status=2 where id=" + archiveId;
-                jdbcTemplate.execute(updateSql);
-            }
+               // if (status.equals("3")) {
+                    String updateSql = "update u_archives_split_info set status=2 ,file_url='"+fileUrl+"',first_file_url ='"+filePath+"' where id=" + id;
+                    jdbcTemplate.update(updateSql);
+                String uateSql = "UPDATE u_archives_auto SET split_status=? WHERE id=?";
+                int delCount = jdbcTemplate.update(uateSql, 2, archiveId);
+              //  }
 
-            String sql = "delete from u_archive_file where id<>'"+id+"' and archive_id='"+archiveId+"'";
-            jdbcTemplate.execute(sql);
+            } else {
+                // 所有SQL都改为参数化查询
+                String sql22 = "INSERT INTO u_archives_split_info(id,status,file_url,first_file_url,task_id,archive_id,create_time) VALUES(?,?,?,?,?,?,SYSDATE())";
+                int addCount = jdbcTemplate.update(sql22, id, 2, fileUrl, filePath, taskId, archiveId);
 
+                String updateSql = "UPDATE u_archives_auto SET split_status=? WHERE id=?";
+                int delCount = jdbcTemplate.update(updateSql, 2, archiveId);
+            }
+            String delSql = "DELETE FROM u_archive_file WHERE id<>? AND archive_id=?";
+            jdbcTemplate.update(delSql, id, archiveId);
             RedisTemplate.delete("splitpng-" + archiveId);
+
         } catch (Exception e) {
+            System.out.println("12321312");
             e.printStackTrace();
         }
     }
-
-//    @Scheduled(cron = "0/30 * * * * ?")
+   // @Scheduled(cron = "0/30 * * * * ?")
     public void SplitPdfInfo() {
         //执行代码
-
         log.info("分解html开始");
-        String sql = "select  * from u_archives_split_info where status =2 "; // and TIMESTAMPDIFF(MINUTE, create_time, NOW()) >=3";
+        String sql = "select  * from u_archives_split_info where status =2 LIMIT 20 "; // and TIMESTAMPDIFF(MINUTE, create_time, NOW()) >=3";
         List<ArchivesSplitInfoVO> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ArchivesSplitInfoVO.class));
-        log.info("分解html开始==="+query.size());
+        log.info("分解html开始===" + query.size());
         if (query != null && query.size() >= 1) {
             for (ArchivesSplitInfoVO dataInfo : query) {
-                if (executor.getQueue().size() <= 10) {
+                if (archExecutor.getQueue().size() <= 10) {
                     Boolean aBoolean = RedisTemplate.hasKey("splithtml-" + dataInfo.getArchiveId());
                     if (!aBoolean) {
 
                         if (!aBoolean) {
-                            RedisTemplate.opsForValue().set("splithtml-" + dataInfo.getArchiveId(), "1", 1200, TimeUnit.SECONDS);
+                            RedisTemplate.opsForValue().setIfAbsent("splithtml-" + dataInfo.getArchiveId(), "1", 1200, TimeUnit.SECONDS);
                             CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
                                 try {
                                     /*===============执行批量任务===============*/
                                     signTaskBatchpng(dataInfo);
-                                } catch (Exception e) {
-                                    e.printStackTrace();
+                                } finally {
+                                    RedisTemplate.delete("splithtml-" + dataInfo.getArchiveId());
                                 }
-                            }, executor);
+                            }, archExecutor);
                         }
                     }
                 }
             }
         }
-        System.out.println("队列数量_html" + executor.getQueue().size());
-        System.out.println("活跃数量_html" + executor.getActiveCount());
-        System.out.println("总共数量_html" + executor.getTaskCount());
-        System.out.println("完成数量_html" + executor.getCompletedTaskCount());
+        System.out.println("队列数量_html" + archExecutor.getQueue().size());
+        System.out.println("活跃数量_html" + archExecutor.getActiveCount());
+        System.out.println("总共数量_html" + archExecutor.getTaskCount());
+        System.out.println("完成数量_html" + archExecutor.getCompletedTaskCount());
     }
 
     public void signTaskBatchpng(ArchivesSplitInfoVO taskSign) {
@@ -206,10 +215,10 @@ public class ArchiveController {
             int basePage = Integer.parseInt(firstUrl[1]);
             int baseStart = Integer.parseInt(firstUrl[0]);
             String dutyUser = "";
-            int bkb = 0 ;
+            int bkb = 0;
             //将imagePath 的数据转成一个可解析的html
-            String htmlUrl = pngToHtml(firstPage, archiveId,taskSign.getFirstFileUrl());
-            System.out.println("分解002="+htmlUrl);
+            String htmlUrl = pngToHtml(firstPage, archiveId, taskSign.getFirstFileUrl());
+            System.out.println("分解002=" + htmlUrl);
 
             if (htmlUrl.indexOf("_001.html") >= 0 && htmlUrl.indexOf("archiveSplit") >= 0) {
                 String htmlString = IoUtil.readToString(new FileInputStream(htmlUrl));
@@ -217,8 +226,8 @@ public class ArchiveController {
                 Element table = doc.select("table").first();
                 Elements trs = table.select("tr");
                 //由于解析已经成功,可能数据已经分解过,需要删除
-                if(trs!=null && trs.size()>=1){
-                    String sql = "delete from u_archive_file where id<>'"+taskSign.getId()+"' and archive_id='"+archiveId+"'";
+                if (trs != null && trs.size() >= 1) {
+                    String sql = "delete from u_archive_file where id<>'" + taskSign.getId() + "' and archive_id='" + archiveId + "'";
                     jdbcTemplate.execute(sql);
                 }
 
@@ -228,78 +237,81 @@ public class ArchiveController {
                     String wjtm = tr.select("td").get(1).text();
                     String rq = tr.select("td").get(2).text();
                     String ym = tr.select("td").get(3).text();
-                   if(zrz.equals("责任者") && wjtm.equals("文件题名") && rq.equals("日期")){
+                    if (zrz.equals("责任者") && wjtm.equals("文件题名") && rq.equals("日期")) {
                         continue;
-                   }
+                    }
                     int startYm = 0;
                     int endYm = 0;
-                    if(i<trs.size()-1){
+                    if (i < trs.size() - 1) {
                         startYm = Func.toInt(ym);
-                        String enData = trs.get(i+1).select("td").get(3).text();
-                        if(enData.indexOf("页")>=0){
-                            enData = trs.get(i+2).select("td").get(3).text();
+                        String enData = trs.get(i + 1).select("td").get(3).text();
+                        if (enData.indexOf("页") >= 0) {
+                            enData = trs.get(i + 2).select("td").get(3).text();
                         }
 
                         String[] parts = enData.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
-                        if(parts!=null && parts.length>=1){
+                        if (parts != null && parts.length >= 1) {
                             endYm = Func.toInt(parts[0]);
                         }
-                    }else{
+                    } else {
                         String[] split = ym.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
-                        if(split!=null && split.length>=3){
+                        if (split != null && split.length >= 3) {
                             startYm = Func.toInt(split[0]);
                             endYm = Func.toInt(split[2]);
-                        }else{
+                        } else {
                             startYm = Func.toInt(split[0]);
                             endYm = Func.toInt(split[0]);
                         }
                     }
-                    startYm = basePage+startYm ;
-                    endYm = basePage+endYm ;
+                    startYm = basePage + startYm;
+                    endYm = basePage + endYm;
                     dutyUser = zrz;
-                    System.out.println("序号="+i+"--文件提名:"+wjtm +"--开始("+startYm+"-"+endYm+")---页数"+(endYm-startYm+1));
+                    System.out.println("序号=" + i + "--文件提名:" + wjtm + "--开始(" + startYm + "-" + endYm + ")---页数" + (endYm - startYm + 1));
                     // 分解文件
-                    String fmlUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/"+archiveId+"_cf_00"+i+".pdf";
-                    getPdfByPage(startYm,endYm,fileUlr,fmlUrl);
-                    saveDataToMysql(fmlUrl,wjtm,taskSign.getId(),endYm-startYm+1,i,zrz,rq);
-                    bkb =  endYm ;
+                    String fmlUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/" + archiveId + "_cf_00" + i + ".pdf";
+                    getPdfByPage(startYm, endYm, fileUlr, fmlUrl);
+                    saveDataToMysql(fmlUrl, wjtm, taskSign.getId(), endYm - startYm + 1, i, zrz, rq);
+                    bkb = endYm;
                 }
             } else {
                 return;
             }
 
             // 添加封面信息
-            String fmlUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/"+archiveId+"_fm_001.pdf";
-            getPdfByPage(1,1,fileUlr,fmlUrl);
-            saveDataToMysql(fmlUrl,"封面",taskSign.getId(),1,-4,dutyUser,"");
+            String fmlUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/" + archiveId + "_fm_001.pdf";
+            getPdfByPage(1, 1, fileUlr, fmlUrl);
+            saveDataToMysql(fmlUrl, "封面", taskSign.getId(), 1, -4, dutyUser, "");
 
             // 卷内目录
-            String jnmuUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/"+archiveId+"_jnml_001.pdf";
-            getPdfByPage(baseStart,basePage,fileUlr,jnmuUrl);
-            saveDataToMysql(jnmuUrl,"卷内目录",taskSign.getId(),1,-3,dutyUser,"");
+            String jnmuUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/" + archiveId + "_jnml_001.pdf";
+            getPdfByPage(baseStart, basePage, fileUlr, jnmuUrl);
+            saveDataToMysql(jnmuUrl, "卷内目录", taskSign.getId(), 1, -3, dutyUser, "");
 
             // 卷内备考表
-            String jnbkbUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/"+archiveId+"_jnbkb_001.pdf";
-            getPdfByPage(bkb+1,bkb+1,fileUlr,jnbkbUrl);
-            saveDataToMysql(jnbkbUrl,"卷内备考表",taskSign.getId(),1,100,dutyUser,"");
-
-            // 背脊表
-            String bjbUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/"+archiveId+"_beiji_001.pdf";
-            String bjbUrlPng = FileUtils.getSysLocalFileUrl() + "archiveSplit/"+archiveId+"_beiji_001.png";
-
-            getPdfByPage(bkb+2,bkb+2,fileUlr,bjbUrl);
+            String jnbkbUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/" + archiveId + "_jnbkb_001.pdf";
+            getPdfByPage(bkb + 1, bkb + 1, fileUlr, jnbkbUrl);
 
-            File bgImgFile = new File(bjbUrlPng);
-            if (!bgImgFile.exists()) {
-                savePdfAsImage(1, bjbUrl, bjbUrlPng);
+            File jlPdfFile = new File(jnbkbUrl);
+            if (jlPdfFile.exists()) {
+                saveDataToMysql(jnbkbUrl, "卷内备考表", taskSign.getId(), 1, 100, dutyUser, "");
             }
-            String state = OcrTitle(bjbUrlPng,"3");
-            if(state.equals("1")){
-                saveDataToMysql(bjbUrl,"背脊表",taskSign.getId(),1,101,dutyUser,"");
-            }
-            bgImgFile.delete();
-
 
+            // 背脊表
+            String bjbUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/" + archiveId + "_beiji_001.pdf";
+            String bjbUrlPng = FileUtils.getSysLocalFileUrl() + "archiveSplit/" + archiveId + "_beiji_001.png";
+
+            int pdfByPage = getPdfByPage(bkb + 2, bkb + 2, fileUlr, bjbUrl);
+            if(pdfByPage==0){
+                File bgImgFile = new File(bjbUrlPng);
+                if (!bgImgFile.exists()) {
+                    int dataNum = savePdfAsImage(1, bjbUrl, bjbUrlPng);
+                }
+                String state = OcrTitle(bjbUrlPng, "3");
+                if (state.equals("1")) {
+                    saveDataToMysql(bjbUrl, "背脊表", taskSign.getId(), 1, 101, dutyUser, "");
+                }
+                bgImgFile.delete();
+            }
             // 修改任务状态
             String updateSql = "update u_archives_split_info set status=3 where id=" + taskSign.getId();
             jdbcTemplate.execute(updateSql);
@@ -308,8 +320,8 @@ public class ArchiveController {
             jdbcTemplate.execute(updateSqlAuto);
 
             // 统计各个任务的结果
-            String taxkSql = "UPDATE u_task_split a set finished = (SELECT count(1) from u_archives_auto b where FIND_IN_SET(b.id,a.ids) and b.split_status=1) where FIND_IN_SET("+taskSign.getArchiveId()+",a.ids)  and a.type=3";
-            String taxkSql2 = "UPDATE u_task_split a set finished = (SELECT count(1) from u_archives_auto b where a.contract_id=b.contract_id) where a.id="+taskSign.getTaskId()+" and a.type=2";
+            String taxkSql = "UPDATE u_task_split a set finished = (SELECT count(1) from u_archives_auto b where FIND_IN_SET(b.id,a.ids) and b.split_status=1) where FIND_IN_SET(" + taskSign.getArchiveId() + ",a.ids)  and a.type=3";
+            String taxkSql2 = "UPDATE u_task_split a set finished = (SELECT count(1) from u_archives_auto b where a.contract_id=b.contract_id) where a.id=" + taskSign.getTaskId() + " and a.type=2";
             jdbcTemplate.execute(taxkSql);
             jdbcTemplate.execute(taxkSql2);
 
@@ -324,7 +336,7 @@ public class ArchiveController {
         }
     }
 
-    public static String pngToHtml(String fileUrl, String pKeyId,String pageNum) {
+    public static String pngToHtml(String fileUrl, String pKeyId, String pageNum) {
         String lasHhtmlUrl = "";
         try {
             // 定义Python解释器路径和脚本路径
@@ -371,7 +383,7 @@ public class ArchiveController {
             String htmlUrl;
             while ((htmlUrl = reader.readLine()) != null) {
                 System.out.println("222" + htmlUrl);
-                if (htmlUrl.indexOf("图片中是否有卷内目录") >= 0 && htmlUrl.indexOf("True") >=0) {
+                if (htmlUrl.indexOf("图片中是否有卷内目录") >= 0 && htmlUrl.indexOf("True") >= 0) {
                     return "1";
                 }
             }
@@ -389,12 +401,11 @@ public class ArchiveController {
     }
 
 
-    public static void getPdfByPage(int startPage, int endPage, String filePath, String savePath) {
+    public static int getPdfByPage(int startPage, int endPage, String filePath, String savePath) {
         try {
-            InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(filePath);
+            InputStream inputStreamByUrl = CommonUtil.getOSSInputStream3(filePath);
             // 加载PDF文件
             PDDocument document = PDDocument.load(inputStreamByUrl);
-
             // 创建新文档
             PDDocument newDocument = new PDDocument();
 
@@ -412,19 +423,19 @@ public class ArchiveController {
             newDocument.save(savePath);
             newDocument.close();
             document.close();
+            return 0;
         } catch (Exception e) {
-            log.error("提取PDF页面失败", e);
-            throw new RuntimeException("提取PDF页面失败", e);
+            return 1;
         }
     }
 
-    public static void savePdfAsImage(int pageNum, String filePath, String outputPath) {
+    public static int savePdfAsImage(int pageNum, String filePath, String outputPath) {
         try (InputStream inputStream = FileUtils.getInputStreamByUrl(filePath);
              PDDocument document = PDDocument.load(inputStream)) {
 
             // 验证页码范围
             if (pageNum < 1 || pageNum > document.getNumberOfPages()) {
-                throw new IllegalArgumentException("无效的页码");
+                return 1;
             }
 
             PDFRenderer renderer = new PDFRenderer(document);
@@ -445,18 +456,19 @@ public class ArchiveController {
             log.info("PDF页面已成功保存为图片: {}", outputPath);
             inputStream.close();
             document.close();
+            return 0;
         } catch (Exception e) {
             log.error("PDF转图片失败", e);
-            throw new RuntimeException("PDF转图片失败", e);
+            return 1;
         }
     }
 
-    public int saveDataToMysql(String upFileUrl,String fileName,String fileId,int filePage,int sort,String dutyUser,String fileTime) {
+    public int saveDataToMysql(String upFileUrl, String fileName, String fileId, int filePage, int sort, String dutyUser, String fileTime) {
         // 获取封面信息
         long newPkId = SnowFlakeUtil.getId(); //主键Id
         File fmfile = new File(upFileUrl);
         if (fmfile.exists()) {
-            BladeFile bladeFile = this.newIOSSClient.uploadFile(fileName+".pdf", upFileUrl);
+            BladeFile bladeFile = this.newIOSSClient.uploadFile(fileName + ".pdf", upFileUrl);
             if (bladeFile != null && Func.isNotEmpty(bladeFile.getLink())) {
                 String FmPdfUrl = bladeFile.getLink();
                 String sql = " insert into u_archive_file( " +
@@ -464,8 +476,8 @@ public class ArchiveController {
                         " drawing_no,cite_change_number,certification_time,e_visa_file,node_ext_id,file_type,archive_id,origin_id,filming_time,filmingor_time,tag_id,pic_code,refer_code,film_code,width,height,ftime,utime,del_time,sort,box_name,box_number,is_auto_file,is_archive,page_num, " +
                         " file_size,source_type,is_element,pdf_page_url,fid,rectification,classify,m_wbs_tree_contract_p_key_id,u_image_classification_file_id,archive_file_storage_type,node_tree_structure,date_name,archive_file_stroage_type,out_id,sort_num " +
                         "   ) " +
-                        " SELECT "+newPkId+",project_id,contract_id,node_id,file_number,'" + fileName + "','"+fileTime+"','" + FmPdfUrl + "','" + FmPdfUrl + "',"+filePage+",is_approval,is_certification,is_need_certification,'"+dutyUser+"',create_user,create_dept,create_time,update_user,update_time,status,is_deleted,sheet_type,sheet_source, " +
-                        "        drawing_no,cite_change_number,certification_time,e_visa_file,node_ext_id,file_type,archive_id,origin_id,filming_time,filmingor_time,tag_id,pic_code,refer_code,film_code,width,height,ftime,utime,del_time,"+sort+",box_name,box_number,is_auto_file,is_archive,page_num, " +
+                        " SELECT " + newPkId + ",project_id,contract_id,node_id,file_number,'" + fileName + "','" + fileTime + "','" + FmPdfUrl + "','" + FmPdfUrl + "'," + filePage + ",is_approval,is_certification,is_need_certification,'" + dutyUser + "',create_user,create_dept,create_time,update_user,update_time,status,is_deleted,sheet_type,sheet_source, " +
+                        "        drawing_no,cite_change_number,certification_time,e_visa_file,node_ext_id,file_type,archive_id,origin_id,filming_time,filmingor_time,tag_id,pic_code,refer_code,film_code,width,height,ftime,utime,del_time," + sort + ",box_name,box_number,is_auto_file,is_archive,page_num, " +
                         "        file_size,source_type,is_element,pdf_page_url,fid,rectification,classify,m_wbs_tree_contract_p_key_id,u_image_classification_file_id,archive_file_storage_type,node_tree_structure,date_name,archive_file_stroage_type,out_id,sort_num " +
                         " from u_archive_file where id=" + fileId;
                 System.out.println(fileName + "----" + sql);
@@ -476,7 +488,7 @@ public class ArchiveController {
                 System.out.println("oss服务未启动,无法上传文件到oss");
                 return 500;
             }
-        }else{
+        } else {
             return 404;
         }
         fmfile.delete();

+ 5 - 4
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/Chek.java

@@ -46,10 +46,11 @@ import java.util.concurrent.TimeUnit;
 public class  Chek {
 
     @Autowired
-    StringRedisTemplate RedisTemplate;
-    // jdbc
-    private final JdbcTemplate jdbcTemplate;
-    private final NewIOSSClient newIOSSClient;
+    private StringRedisTemplate RedisTemplate;
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+    @Autowired
+    private NewIOSSClient newIOSSClient;
     // 线程池
     @Resource(name = "taskExecutor1")
     private ThreadPoolExecutor executor;

+ 8 - 3
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/ChekSignData.java

@@ -31,11 +31,16 @@ import java.util.concurrent.TimeUnit;
 public class ChekSignData {
 
     @Autowired
-    StringRedisTemplate RedisTemplate;
+    private StringRedisTemplate RedisTemplate;
+
     // jdbc
-    private final JdbcTemplate jdbcTemplate;
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
     //电签服务类
-    private final ScrDataService scrDataService;
+    @Autowired
+    private ScrDataService scrDataService;
+
     // 线程池
     @Resource(name = "taskExecutor1")
     private ThreadPoolExecutor executor;

+ 1 - 1
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVController.java

@@ -58,7 +58,7 @@ public class EVController {
     @Resource(name = "taskExecutor1")
     private ThreadPoolExecutor executor;
 
-//    @Scheduled(cron = "0/10 * * * * ?")
+   // @Scheduled(cron = "0/10 * * * * ?")
     public void SignInfo() {
         //执行代码
 

+ 35 - 0
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/ArchivePoolExecutorConfig.java

@@ -0,0 +1,35 @@
+package org.springblade.evisa.utils;
+
+import org.springblade.common.utils.ThreadPoolMonitor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+@Configuration
+public class ArchivePoolExecutorConfig {
+
+    /**
+     * cpu 核心数量
+     */
+    public static final int cpuNum = 5 ;//Runtime.getRuntime().availableProcessors();
+
+    /**
+     * 线程池配置
+     * @return
+     */
+    @Bean("archivePoolExecutor")
+    @Primary
+    public ThreadPoolExecutor gerArchivePoolExecutor() {
+        return new ThreadPoolMonitor(cpuNum
+                , 10
+                , 180
+                , TimeUnit.SECONDS
+                , new LinkedBlockingQueue<>(200)
+                , new ThreadPoolExecutor.DiscardOldestPolicy(), "ArchivePoolExecutor-pool");
+    }
+
+}