Bläddra i källkod

Merge branch 'dev' of http://219.151.181.73:3000/zhuwei/bladex into dev

laibulaizheli 2 månader sedan
förälder
incheckning
0e9ae5c8f2
16 ändrade filer med 415 tillägg och 58 borttagningar
  1. 2 2
      blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/LargeFileEndpoint.java
  2. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/FixedFlowVO.java
  3. 51 0
      blade-service-api/blade-e-visa-api/src/main/java/org/springblade/evisa/vo/ArchivesSplitInfoVO.java
  4. 8 0
      blade-service-api/blade-e-visa-api/src/main/java/org/springblade/evisa/vo/TaskArchiveSplitVO.java
  5. 1 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/FixedFlowLinkMapper.java
  6. 3 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/FixedFlowLinkMapper.xml
  7. 1 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/IFixedFlowLinkService.java
  8. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/FixedFlowLinkServiceImpl.java
  9. 6 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/FixedFlowServiceImpl.java
  10. 252 27
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/ArchiveController.java
  11. 17 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java
  12. 57 21
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  13. 6 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/job/SystemMsgJob.java
  14. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.xml
  15. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java
  16. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

+ 2 - 2
blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/LargeFileEndpoint.java

@@ -486,7 +486,7 @@ public class LargeFileEndpoint {
      *
      * @param mappedByteBuffer
      */
-    private static void freeMappedByteBuffer(final MappedByteBuffer mappedByteBuffer) {
+/*    private static void freeMappedByteBuffer(final MappedByteBuffer mappedByteBuffer) {
         try {
             if (mappedByteBuffer == null) {
                 return;
@@ -512,7 +512,7 @@ public class LargeFileEndpoint {
         } catch (Exception e) {
             e.printStackTrace();
         }
-    }
+    }*/
 
     private static String getFileName(MultipartFileParam param) {
         String extension;

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/FixedFlowVO.java

@@ -55,6 +55,9 @@ public class FixedFlowVO extends FixedFlow {
     @ApiModelProperty("提示信息")
     private String tips;
 
+    @ApiModelProperty("是否删除")
+    private boolean deletedIs;
+
     private Query query;
 
     public Query getQuery(Integer current, Integer size) {

+ 51 - 0
blade-service-api/blade-e-visa-api/src/main/java/org/springblade/evisa/vo/ArchivesSplitInfoVO.java

@@ -0,0 +1,51 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.evisa.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+/**
+ * 视图实体类
+ *
+ * @author BladeX
+ * @since 2025-06-10
+ */
+@Data
+public class ArchivesSplitInfoVO {
+	// u_archv_file 主键id
+	@ApiModelProperty("id")
+	private String id;
+
+	// 文件Id
+	@ApiModelProperty("first_file_url")
+	private String firstFileUrl;
+
+	//需要分解的文件url
+	@ApiModelProperty("file_url")
+	private String fileUrl;
+
+	//需要分解的文件url
+	@ApiModelProperty("status")
+	private String status;
+
+	//分解任务主键ID
+	@ApiModelProperty("task_id")
+	private String taskId;
+
+	@ApiModelProperty("archive_id")
+	private String archiveId;
+}

+ 8 - 0
blade-service-api/blade-e-visa-api/src/main/java/org/springblade/evisa/vo/TaskArchiveSplitVO.java

@@ -6,13 +6,21 @@ import lombok.Data;
 @Data
 public class TaskArchiveSplitVO {
 
+    // u_archv_file 主键id
     @ApiModelProperty("id")
     private String id;
 
+    // u_archv_auto 主键id
     @ApiModelProperty("archiveId")
     private String archiveId;
 
+    //需要分解的文件url
     @ApiModelProperty("fileUrl")
     private String fileUrl;
 
+    //分解任务主键ID
+    @ApiModelProperty("taskId")
+    private String taskId;
+
+
 }

+ 1 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/FixedFlowLinkMapper.java

@@ -36,4 +36,5 @@ public interface FixedFlowLinkMapper extends BaseMapper<FixedFlowLink> {
 
     List<FixedFlowLink> selectFixedFlowLink(@Param("fixedFlowId") String fixedFlowId);
 
+    Integer selectIsDeleted(@Param("fixedFlowId") Long fixedFlowId);
 }

+ 3 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/FixedFlowLinkMapper.xml

@@ -37,5 +37,8 @@
           and fixed_flow_id = #{fixedFlowId}
         order by fixed_flow_link_sort ASC
     </select>
+    <select id="selectIsDeleted" resultType="java.lang.Integer">
+        SELECT COUNT(*) FROM u_task WHERE fixed_flow_id = #{fixedFlowId} AND is_deleted = 0 And status !=3
+    </select>
 
 </mapper>

+ 1 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/IFixedFlowLinkService.java

@@ -35,4 +35,5 @@ public interface IFixedFlowLinkService extends BaseService<FixedFlowLink> {
 
     List<FixedFlowLink> selectFixedFlowLink(String fixedFlowId);
 
+    Integer selectIsDeleted(Long fixedFlowId);
 }

+ 5 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/FixedFlowLinkServiceImpl.java

@@ -46,4 +46,9 @@ public class FixedFlowLinkServiceImpl extends BaseServiceImpl<FixedFlowLinkMappe
         return this.baseMapper.selectFixedFlowLink(fixedFlowId);
     }
 
+    @Override
+    public Integer selectIsDeleted(Long fixedFlowId) {
+        return this.baseMapper.selectIsDeleted(fixedFlowId);
+    }
+
 }

+ 6 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/FixedFlowServiceImpl.java

@@ -64,6 +64,12 @@ public class FixedFlowServiceImpl extends BaseServiceImpl<FixedFlowMapper, Fixed
                 vos.setLinkUserJoinString(linkJoin.substring(1));
                 vos.setFixedFlowLinkList(links);
             }
+             Integer size=this.fixedFlowLinkService.selectIsDeleted(vos.getId());
+            if(size>0){
+                vos.setDeletedIs(false);
+            }else {
+                vos.setDeletedIs(true);
+            }
         });
         //设置总数
         iPage.setTotal(count);

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

@@ -5,10 +5,18 @@ import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
-import org.springblade.business.vo.TaskSignInfoVO;
-import org.springblade.evisa.service.EVDataService;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+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.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
@@ -17,8 +25,7 @@ import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
-import java.io.File;
-import java.io.InputStream;
+import java.io.*;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
@@ -26,6 +33,7 @@ import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.pdfbox.rendering.PDFRenderer;
+
 import java.awt.image.BufferedImage;
 import javax.imageio.ImageIO;
 
@@ -47,34 +55,32 @@ public class ArchiveController {
     // jdbc
     private final JdbcTemplate jdbcTemplate;
 
-    //电签服务类
-    private final EVDataService evDataService;
+    private final NewIOSSClient newIOSSClient;
 
     // 线程池
     @Resource(name = "taskExecutor1")
     private ThreadPoolExecutor executor;
 
-    @Scheduled(cron = "0/10 * * * * ?")
+   @Scheduled(cron = "0 0/1 * * * ?")
     public void SignInfo() {
         //执行代码
 
-        log.info("扫描开始");
-
-        String sql = "SELECT a.id,a.archive_id as archiveId,a.file_url as fileUrl from u_archive_file a, u_task_split b where FIND_IN_SET(a.archive_id,b.ids) and b.type=3 ";
+        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) ";
         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) {
-                    Boolean aBoolean = RedisTemplate.hasKey("sign-" + dataInfo.getArchiveId());
+                    Boolean aBoolean = RedisTemplate.hasKey("splitpng-" + dataInfo.getArchiveId());
                     if (!aBoolean) {
 
-                        if(!aBoolean){
-                            RedisTemplate.opsForValue().set("sign-" + dataInfo.getArchiveId(), "1", 7200, TimeUnit.SECONDS);
+                        if (!aBoolean) {
+                            RedisTemplate.opsForValue().set("splitpng-" + dataInfo.getArchiveId(), "1", 7200, TimeUnit.SECONDS);
                             CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
                                 try {
                                     /*===============执行批量任务===============*/
-                                    signTaskBatch(dataInfo);
+                                    signTaskBatchpngToHtml(dataInfo);
                                 } catch (Exception e) {
                                     e.printStackTrace();
                                 }
@@ -84,31 +90,217 @@ public class ArchiveController {
                 }
             }
         }
-
-        System.out.println("队列数量" + executor.getQueue().size());
-        System.out.println("活跃数量" + executor.getActiveCount());
-        System.out.println("总共数量" + executor.getTaskCount());
-        System.out.println("完成数量" + executor.getCompletedTaskCount());
+        System.out.println("队列数量_img" + executor.getQueue().size());
+        System.out.println("活跃数量_img" + executor.getActiveCount());
+        System.out.println("总共数量_img" + executor.getTaskCount());
+        System.out.println("完成数量_img" + executor.getCompletedTaskCount());
     }
 
-    public void signTaskBatch(TaskArchiveSplitVO taskSign) {
+    // 分解第一页的任务
+    public void signTaskBatchpngToHtml(TaskArchiveSplitVO taskSign) {
         try {
             String fileUrl = taskSign.getFileUrl();
             String archiveId = taskSign.getArchiveId();
             String id = taskSign.getId();
-            // 获取pdf第一页的数据
-            String firstUrl = FileUtils.getSysLocalFileUrl()+"archiveSplit/"+archiveId+"_001.pdf";
-            getPdfByPage(2,2,fileUrl,firstUrl);
+            String taskId = taskSign.getTaskId();
+
+            // 获取pdf第二页的数据
+            String firstUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/" + archiveId + "_001.pdf";
+            File file = new File(firstUrl);
+            if (!file.exists()) {
+                getPdfByPage(2, 2, fileUrl, firstUrl);
+            }
+
             // 保存第一页为300DPI图片
             String imagePath = FileUtils.getSysLocalFileUrl() + "archiveSplit/" + archiveId + "_001.png";
-            savePdfAsImage(1, firstUrl, imagePath);
+            File imgfile = new File(imagePath);
+            if (!imgfile.exists()) {
+                savePdfAsImage(1, firstUrl, imagePath);
+            }
 
+            //判断
+            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=" + id;
+                    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 + "','" + imagePath + "'," + taskId + "," + archiveId + ",SYSDATE())";
+                jdbcTemplate.execute(sql22);
+                String updateSql = "update u_archives_auto set split_status=2 where id=" + id;
+                jdbcTemplate.execute(updateSql);
+            }
+            RedisTemplate.delete("splitpng-" + archiveId);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    @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";
+        List<ArchivesSplitInfoVO> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ArchivesSplitInfoVO.class));
+
+        if (query != null && query.size() >= 1) {
+            for (ArchivesSplitInfoVO dataInfo : query) {
+                if (executor.getQueue().size() <= 10) {
+                    Boolean aBoolean = RedisTemplate.hasKey("splithtml-" + dataInfo.getArchiveId());
+                    if (!aBoolean) {
+
+                        if (!aBoolean) {
+                            RedisTemplate.opsForValue().set("splithtml-" + dataInfo.getArchiveId(), "1", 600, TimeUnit.SECONDS);
+                            CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
+                                try {
+                                    /*===============执行批量任务===============*/
+                                    signTaskBatchpng(dataInfo);
+                                } catch (Exception e) {
+                                    e.printStackTrace();
+                                }
+                            }, executor);
+                        }
+                    }
+                }
+            }
+        }
+        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());
+    }
+
+    public void signTaskBatchpng(ArchivesSplitInfoVO taskSign) {
+        try {
+            String archiveId = taskSign.getArchiveId();
+            String fileUlr = taskSign.getFileUrl();
+            String firstPage = FileUtils.getSysLocalFileUrl() + "archiveSplit/";
+            int bkb = 0 ;
+            //将imagePath 的数据转成一个可解析的html
+            String htmlUrl1 = pngToHtml(firstPage, archiveId);
+            String htmlUrl2 = pngToHtml(firstPage, archiveId);
+            String htmlUrl = "";
+            if (htmlUrl1.equals(htmlUrl2) && htmlUrl1.indexOf("_001.html") >= 0 && htmlUrl1.indexOf("archiveSplit") >= 0) {
+                htmlUrl = htmlUrl2;
+            }
+
+            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");
+
+                for (int i = 1; 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();
+                    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){
+                            endYm = Func.toInt(enData.split("-")[0])-1;
+                        }else{
+                            endYm = Func.toInt(enData)-1;
+                        }
+                    }else{
+                        if(ym.indexOf("-")>=0){
+                            String[] split = ym.split("-");
+                            startYm = Func.toInt(split[0]);
+                            endYm = Func.toInt(split[1]);
+                        }
+                    }
+                    startYm = startYm + 2 ;
+                    endYm = endYm + 2 ;
+                    System.out.println(zrz + " " + wjtm + " " + rq + " " + ym);
+                    // 分解文件
+                    String fmlUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/"+archiveId+"_cf_00"+i+".pdf";
+                    getPdfByPage(startYm,endYm,fileUlr,fmlUrl);
+                    saveDataToMysql(fmlUrl,wjtm,taskSign.getId(),endYm-startYm+1);
+                    bkb =  endYm ;
+                }
+
+            } else {
+
+            }
+
+            // 添加封面信息
+            String fmlUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/"+archiveId+"_fm_001.pdf";
+            getPdfByPage(1,1,fileUlr,fmlUrl);
+            saveDataToMysql(fmlUrl,"封面",taskSign.getId(),1);
+
+            // 卷内目录
+            String jnmuUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/"+archiveId+"_jnml_001.pdf";
+            getPdfByPage(2,2,fileUlr,jnmuUrl);
+            saveDataToMysql(jnmuUrl,"卷内目录",taskSign.getId(),1);
+
+            // 卷内备考表
+            String jnbkbUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/"+archiveId+"_jnbkb_001.pdf";
+            getPdfByPage(bkb+1,bkb+1,fileUlr,jnbkbUrl);
+            saveDataToMysql(jnbkbUrl,"卷内备考表",taskSign.getId(),1);
+
+            // 修改任务状态
+            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);
+
+            // 修改完成情况
+
+            RedisTemplate.delete("splithtml-" + archiveId);
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
     }
 
-    public void getPdfByPage(int startPage, int endPage, String filePath, String savePath) {
+    public static String pngToHtml(String fileUrl, String pKeyId) {
+        String lasHhtmlUrl = "";
+        try {
+            // 定义Python解释器路径和脚本路径
+            String pythonScript = "/Users/hongchuangyanfa/Desktop/PycharmProjects/splitPngToHtml.py";
+            // 构建命令
+            ProcessBuilder pb = new ProcessBuilder("python3", pythonScript, fileUrl, pKeyId);
+            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("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 void getPdfByPage(int startPage, int endPage, String filePath, String savePath) {
         try {
             InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(filePath);
             // 加载PDF文件
@@ -152,18 +344,51 @@ public class ArchiveController {
             final int DPI = 300;
 
             // 渲染指定页面(注意PDFBox使用0-based索引)
-            BufferedImage image = renderer.renderImage(pageNum - 1, DPI / 72f);
-
+            //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();
         } catch (Exception e) {
             log.error("PDF转图片失败", e);
             throw new RuntimeException("PDF转图片失败", e);
         }
     }
+
+    public int saveDataToMysql(String upFileUrl,String fileName,String fileId,int filePage) {
+        // 获取封面信息
+        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 + "',file_time,'" + FmPdfUrl + "','" + FmPdfUrl + "',"+filePage+",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 " +
+                        " from u_archive_file where id=" + fileId;
+                System.out.println(fileName + "----" + sql);
+                jdbcTemplate.execute(sql);
+                return 200;
+            } else {
+                // 检查一下oss是否启动
+                System.out.println("oss服务未启动,无法上传文件到oss");
+                return 500;
+            }
+        }else{
+            return 404;
+        }
+    }
 }

+ 17 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.manager.controller;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.mixsmart.utils.StringUtils;
 import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
@@ -47,6 +48,8 @@ import org.springblade.manager.service.IContractInfoService;
 import org.springblade.manager.service.impl.ArchiveTreeContractSyncImpl;
 import org.springblade.manager.vo.*;
 
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -82,6 +85,7 @@ public class ArchiveTreeContractController extends BladeController {
     private final ArchiveTreeContractSyncImpl archiveTreeContractSync;
 
     private final IContractInfoService contractInfoService;
+    private final JdbcTemplate jdbcTemplate;
 
     /**
      * 详情
@@ -90,7 +94,19 @@ public class ArchiveTreeContractController extends BladeController {
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "详情", notes = "传入archiveTreeContract")
     public R<ArchiveTreeContract> detail(ArchiveTreeContract archiveTreeContract) {
-        ArchiveTreeContract detail = archiveTreeContractService.getOne(Condition.getQueryWrapper(archiveTreeContract));
+        ArchiveTreeContract detail = archiveTreeContractService.getOne(Wrappers.lambdaQuery(ArchiveTreeContract.class).eq(ArchiveTreeContract::getId,archiveTreeContract.getId()));
+        Long contractId1 = detail.getContractId();
+        if(contractId1==null){
+            contractId1=archiveTreeContract.getContractId();
+        }
+        String sql="select * from m_contract_info where id="+contractId1;
+        ContractInfo info = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(ContractInfo.class));
+        if(detail.getRollor()==null&&info!=null&&info.getFiler()!=null){
+            detail.setRollor(info.getFiler());
+        }
+        if(detail.getReviewer()==null&&info!=null&&info.getReviewer()!=null){
+            detail.setReviewer(info.getReviewer());
+        }
         return R.data(detail);
     }
 

+ 57 - 21
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -3087,25 +3087,7 @@ public class ExcelTabController extends BladeController {
                         InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(tableNode2.getHtmlUrl());
                         String htmlString = IoUtil.readToString(inputStreamByUrl);
                         Document doc = Jsoup.parse(htmlString);
-                        // 模糊匹配
-                        Elements cbdw = doc.select("el-select[placeholder*=承包单位]");
-                        Elements htd = doc.select("el-select[placeholder*=合同段]");
-                        Elements jldw = doc.select("el-input[placeholder*=监理单位]");
-                        Elements jljg = doc.select("el-select[placeholder*=监理机构]");
-                        Elements jlr = doc.select("el-input[placeholder*=记录人]");
-                        Elements rq = doc.select("el-date-picker[placeholder*=日期]");
-                        Elements shr = doc.select("el-input[placeholder*=审核人]");
-                        Elements tqqk = doc.select("el-input[placeholder*=天气情况]");
-                        List<Elements> allElements=new ArrayList<>();
-                        allElements.add(cbdw);
-                        allElements.add(htd);
-                        allElements.add(jldw);
-                        allElements.add(jljg);
-                        allElements.add(jlr);
-                        allElements.add(rq);
-                        allElements.add(shr);
-                        allElements.add(tqqk);
-                        allElements=allElements.stream().filter(o->o!=null&&o.size()>0).collect(Collectors.toList());
+                        List<Elements> allElements = getBiaoTou(doc);
                         if(allElements.size()>0){
                             for (String key : businessDataMap.get(0).keySet()) {
                                 String tabVal = businessDataMap.get(0).get(key) + "";
@@ -3160,8 +3142,10 @@ public class ExcelTabController extends BladeController {
                                 }
                             }
                             for (Elements element : allElements) {
-                                if(reData.containsKey(element.attr("keyname"))){
-                                    resultMapList.put(element.attr("keyname"),reData.get(element.attr("keyname")));
+                                for (Element element1 : element) {
+                                    if(reData.containsKey(element1.attr("keyname"))){
+                                        resultMapList.put(element1.attr("keyname"),reData.get(element1.attr("keyname")));
+                                    }
                                 }
                             }
                         }
@@ -3174,6 +3158,58 @@ public class ExcelTabController extends BladeController {
         return R.data(resultMapList);
     }
 
+    public List<Elements> getBiaoTou(Document doc){
+        // 模糊匹配
+        Elements cbdw = doc.select("el-select[placeholder*=承包单位]");
+        Elements cbdw1 = doc.select("el-input[placeholder*=承包单位]");
+        Elements htd = doc.select("el-select[placeholder*=合同段]");
+        Elements htd1 = doc.select("el-input[placeholder*=合同段]");
+        Elements jldw = doc.select("el-input[placeholder*=监理单位]");
+        Elements jljg = doc.select("el-select[placeholder*=监理机构]");
+        Elements jljg1 = doc.select("el-input[placeholder*=监理机构]");
+        Elements jlr = doc.select("el-input[placeholder*=记录人]");
+        Elements rq = doc.select("el-date-picker[placeholder*=日期]");
+        Elements shr = doc.select("el-input[placeholder*=审核人]");
+        Elements tqqk = doc.select("el-input[placeholder*=天气情况]");
+        Elements dwgc = doc.select("el-input[placeholder*=单位工程]");
+        Elements fxgc = doc.select("el-input[placeholder*=分项工程]");
+        Elements fbgc = doc.select("el-input[placeholder*=分部工程]");
+        Elements zh = doc.select("el-input[placeholder*=桩号]");
+        Elements bw = doc.select("el-input[placeholder*=部位]");
+        Elements xq = doc.select("el-select[placeholder*=星期]");
+        Elements tq = doc.select("el-input[placeholder*=天气]");
+        Elements qw = doc.select("el-input[placeholder*=气温_最高]");
+        Elements qw1 = doc.select("el-input[placeholder*=气温_最低]");
+        Elements sgdw = doc.select("el-input[placeholder*=施工单位]");
+        Elements hth = doc.select("el-input[placeholder*=合同号]");
+        Elements bh = doc.select("el-input[placeholder*=编号]");
+        List<Elements> allElements=new ArrayList<>();
+        allElements.add(cbdw);
+        allElements.add(cbdw1);
+        allElements.add(htd);
+        allElements.add(htd1);
+        allElements.add(jldw);
+        allElements.add(jljg);
+        allElements.add(jljg1);
+        allElements.add(jlr);
+        allElements.add(rq);
+        allElements.add(shr);
+        allElements.add(tqqk);
+        allElements.add(dwgc);
+        allElements.add(fxgc);
+        allElements.add(fbgc);
+        allElements.add(zh);
+        allElements.add(bw);
+        allElements.add(xq);
+        allElements.add(tq);
+        allElements.add(qw);
+        allElements.add(qw1);
+        allElements.add(sgdw);
+        allElements.add(hth);
+        allElements.add(bh);
+        return allElements.stream().filter(o->o!=null&&o.size()>0).distinct().collect(Collectors.toList());
+    }
+
 
 
     /**

+ 6 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/job/SystemMsgJob.java

@@ -37,10 +37,10 @@ public class SystemMsgJob {
     /**
      *  定时推送公告-取消公告-修改公告状态,不想污染日志,使用jdbc
      */
-    @Scheduled(cron = "0 */1 * * * ?")
+    @Scheduled(cron = "0/10 * * * * ?")
     public void autoUpdateMsgStatus(){
         /** 普通公告推送*/
-        String sql1 = "select * from m_system_msg where is_deleted = 0 and msg_type = 2 and push_status = 1 and push_date_time <= TIMESTAMPADD(SECOND, 1, NOW()) and push_end_date_time >= now()";
+        String sql1 = "select * from m_system_msg where is_deleted = 0 and msg_type = 2 and push_status = 1 and push_end_date_time >= now()";
         List<SystemMsg> list1 = jdbcTemplate.query(sql1,new BeanPropertyRowMapper<>(SystemMsg.class));
         if (list1.size() > 0){
             for (SystemMsg msg : list1) {
@@ -51,7 +51,8 @@ public class SystemMsgJob {
                     .in(SystemMsg::getId,list1.stream().map(SystemMsg::getId).collect(Collectors.toList())));
         }
         /** 维护公告推送*/
-        String sql2 = "select * from m_system_msg where is_deleted = 0 and msg_type = 1 and status = 1 and push_status = 1 and push_date_time >= now() and push_warn_date_time <= TIMESTAMPADD(SECOND, 1, NOW())";
+        //String sql2 = "select * from m_system_msg where is_deleted = 0 and msg_type = 1 and status = 1 and push_status = 1 and push_date_time >= now() and push_warn_date_time <= TIMESTAMPADD(SECOND, 1, NOW())";
+        String sql2 = "select * from m_system_msg where is_deleted = 0 and msg_type = 1 and status = 1 and push_status = 1 and push_warn_date_time>=NOW() ";
         List<SystemMsg> list2 = jdbcTemplate.query(sql2,new BeanPropertyRowMapper<>(SystemMsg.class));
         if (list2.size() > 0){
             for (SystemMsg msg : list2) {
@@ -62,7 +63,8 @@ public class SystemMsgJob {
                     .in(SystemMsg::getId,list2.stream().map(SystemMsg::getId).collect(Collectors.toList())));
         }
         /** 维护倒计时*/
-        String sql3 = "select * from m_system_msg where is_deleted = 0 and msg_type = 1 and status != 3 and TIMESTAMPADD(SECOND, 1, NOW()) >= push_count_down_date_time and now() < push_date_time ";
+      //  String sql3 = "select * from m_system_msg where is_deleted = 0 and msg_type = 1 and status != 3 and TIMESTAMPADD(SECOND, 1, NOW()) >= push_count_down_date_time and now() < push_date_time ";
+        String sql3 = "select * from m_system_msg where is_deleted = 0 and msg_type = 1 and status != 3 and push_count_down_date_time >=NOW() ";
         List<SystemMsg> list3 = jdbcTemplate.query(sql3,new BeanPropertyRowMapper<>(SystemMsg.class));
         if (list3.size() > 0){
             SystemMsg msg = list3.get(0);

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

@@ -468,7 +468,7 @@
             and e_name like concat('%',#{eName},'%')
         </if>
         <if test="eType != null and eType != '' ">
-            and e_type like concat('%',#{eType},'%')
+            and e_type = #{eType}
         </if>
 
     </select>

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

@@ -43,7 +43,7 @@ public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
 
     List<TreeNodeVOByTabType> tabTypeLazyTree(IPage page, Long parentId, String projectId, String titleName);
 
-    List<TreeNodeVOByTabType> tabTypeLazyTreeAll(IPage page, Long parentId, String titleName);
+    List<TreeNodeVOByTabType> tabTypeLazyTreeAll(Long parentId, String titleName);
 
     int updateByPKeyId(@Param("pKeyId") Long pKeyId, @Param("wbsTP") WbsTreePrivate wbsTP);
 

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

@@ -310,7 +310,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         if (SelectorModel.ID <= parentId && parentId <= SelectorModel.MAX_ID) {
             data = this.baseList(titleName);
         } else {
-            data = baseMapper.tabTypeLazyTreeAll(page, parentId, titleName);
+            data = baseMapper.tabTypeLazyTreeAll(parentId, titleName);
         }
         addBase(data, base);
      /*   if (base && hasPartFormula != null) {