Browse Source

oss文件上传

zhuwei 2 tháng trước cách đây
mục cha
commit
486aba3c98
27 tập tin đã thay đổi với 1084 bổ sung274 xóa
  1. 1 1
      blade-common/src/main/java/org/springblade/common/utils/AsyncConfigurer.java
  2. 90 76
      blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java
  3. 34 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/dto/TaskSplitDTO.java
  4. 4 1
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchivesAuto.java
  5. 73 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/TaskSplit.java
  6. 34 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/TaskSplitVO.java
  7. 18 0
      blade-service-api/blade-e-visa-api/src/main/java/org/springblade/evisa/vo/TaskArchiveSplitVO.java
  8. 135 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/TaskSplitController.java
  9. 43 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/TaskSplitMapper.java
  10. 32 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/TaskSplitMapper.xml
  11. 44 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/ITaskSplitService.java
  12. 78 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/TaskSplitServiceImpl.java
  13. 0 104
      blade-service/blade-archive/src/main/java/org/springblade/archive/utils/SpeechRecognizerRESTfulDemo.java
  14. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ChekSignData.java
  15. 9 6
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  16. 2 5
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  17. 169 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/ArchiveController.java
  18. 1 1
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/Chek.java
  19. 1 1
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVController.java
  20. 0 1
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java
  21. 0 2
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/PDFUtils.java
  22. 309 25
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java
  23. 4 18
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java
  24. 0 30
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ExcelInfoUtils2.java
  25. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/PdfAddContextUtils.java
  26. 1 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java
  27. BIN
      doc/lib/pdfLib/spire.ocr-1.9.22.jar

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

@@ -15,7 +15,7 @@ public class AsyncConfigurer {
     /**
      * cpu 核心数量
      */
-    public static final int cpuNum = 5 ;//Runtime.getRuntime().availableProcessors();
+    public static final int cpuNum = 3 ;//Runtime.getRuntime().availableProcessors();
 
     /**
      * 线程池配置

+ 90 - 76
blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java

@@ -18,7 +18,6 @@ import org.apache.commons.imaging.Imaging;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.util.CollectionUtils;
 
-import javax.imageio.*;
 import java.awt.*;
 import java.awt.color.ColorSpace;
 import java.awt.color.ICC_ColorSpace;
@@ -40,8 +39,12 @@ import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
 import com.drew.metadata.MetadataException;
-import org.springframework.util.ResourceUtils;
-import org.springframework.web.util.UriUtils;
+
+import javax.imageio.IIOImage;
+import javax.imageio.ImageIO;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.ImageWriter;
+
 import net.coobird.thumbnailator.Thumbnails;
 /**
  * 通用工具类
@@ -140,7 +143,7 @@ public class CommonUtil {
     /**
      * 根据OSS文件路径获取文件输入流
      */
-    public static  InputStream getOSSInputStream(String urlStr) {
+    public static InputStream getOSSInputStream(String urlStr) {
         try {
             System.out.println("----前-------"+urlStr);
             urlStr = replaceOssUrl(urlStr);
@@ -183,7 +186,7 @@ public class CommonUtil {
     /**
      * 获取字节数组
      */
-    public static  byte[] InputStreamToBytes(InputStream is) {
+    public static synchronized byte[] InputStreamToBytes(InputStream is) {
         BufferedInputStream bis = new BufferedInputStream(is);
         ByteArrayOutputStream os = new ByteArrayOutputStream();
         int date = -1;
@@ -580,93 +583,104 @@ public class CommonUtil {
         System.out.println("图片转换并保存成功!");
     }*/
 
-    public static byte[] compressImage(String url) throws IOException, ImageProcessingException, MetadataException{
+    public static byte[] compressImage(String url) {
         // 读取原始图像(处理旋转问题)
         InputStream file = CommonUtil.getOSSInputStream(url);
         InputStream file2 = CommonUtil.getOSSInputStream(url);
+        InputStream file3 = CommonUtil.getOSSInputStream(url);
         byte[] imageData = InputStreamToBytes(file);
-
-        Metadata metadata = ImageMetadataReader.readMetadata(new ByteArrayInputStream(imageData));
-        if (metadata.containsDirectoryOfType(ExifIFD0Directory.class)) {
-            ExifIFD0Directory exifIFD0Directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
-            if (exifIFD0Directory.containsTag(ExifIFD0Directory.TAG_ORIENTATION)) {
-                // 获取 Orientation 标签的值
-                int orientation = exifIFD0Directory.getInt(ExifIFD0Directory.TAG_ORIENTATION);
-                // 需要旋转图片
-                // 1 无需纠正 2 水平翻转(镜像)3 垂直翻转(旋转180°) 4 水平翻转+垂直翻转 5 水平翻转+旋转90°
-                // 6 旋转90° 7 水平翻转+旋转270° 8 +旋转270°
-                if (orientation > 1) {
-                    BufferedImage originalImage = ImageIO.read(new ByteArrayInputStream(imageData));
-                    AffineTransform transform = new AffineTransform();
-                    if (orientation == 3) {
-                        transform.rotate(Math.PI, originalImage.getWidth() / 2, originalImage.getHeight() / 2);
-                    } else if (orientation == 6) {
-                        transform.rotate(Math.PI / 2, originalImage.getWidth() / 2, originalImage.getHeight() / 2);
-                    } else if (orientation == 8) {
-                        transform.rotate(-Math.PI / 2, originalImage.getWidth() / 2, originalImage.getHeight() / 2);
+        long sizeLimit = 1024 * 1024 * 5; //5M 1920 ×1080
+        if (imageData.length <= sizeLimit) {
+            return imageData;
+        }
+        try {
+            Metadata metadata = ImageMetadataReader.readMetadata(new ByteArrayInputStream(imageData));
+            if (metadata.containsDirectoryOfType(ExifIFD0Directory.class)) {
+                ExifIFD0Directory exifIFD0Directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
+                if (exifIFD0Directory.containsTag(ExifIFD0Directory.TAG_ORIENTATION)) {
+                    // 获取 Orientation 标签的值
+                    int orientation = exifIFD0Directory.getInt(ExifIFD0Directory.TAG_ORIENTATION);
+                    // 需要旋转图片
+                    // 1 无需纠正 2 水平翻转(镜像)3 垂直翻转(旋转180°) 4 水平翻转+垂直翻转 5 水平翻转+旋转90°
+                    // 6 旋转90° 7 水平翻转+旋转270° 8 +旋转270°
+                    if (orientation > 1) {
+                        ImageIO.scanForPlugins();
+                        BufferedImage originalImage = Imaging.getBufferedImage(file2);
+                        AffineTransform transform = new AffineTransform();
+                        if (orientation == 3) {
+                            transform.rotate(Math.PI, originalImage.getWidth() / 2, originalImage.getHeight() / 2);
+                        } else if (orientation == 6) {
+                            transform.rotate(Math.PI / 2, originalImage.getWidth() / 2, originalImage.getHeight() / 2);
+                        } else if (orientation == 8) {
+                            transform.rotate(-Math.PI / 2, originalImage.getWidth() / 2, originalImage.getHeight() / 2);
+                        }
+                        AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);
+                        originalImage = op.filter(originalImage, null);
+                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                        ImageIO.write(originalImage, "jpg", baos);
+                        imageData = baos.toByteArray();
                     }
-                    AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);
-                    originalImage = op.filter(originalImage, null);
-                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-                    ImageIO.write(originalImage, "jpg", baos);
-                    imageData = baos.toByteArray();
                 }
             }
-        }
 
-        // 缩放图像
-        String formatName = "JPEG";
-        ByteArrayInputStream bais = new ByteArrayInputStream(imageData);
-        BufferedImage   originalImage =ImageIO.read(file2);
+            // 缩放图像
+            String formatName = "JPEG";
+            ByteArrayInputStream bais = new ByteArrayInputStream(imageData);
+            String[] formats = ImageIO.getReaderFormatNames();
+            System.out.println("----支持的格式-----: " + Arrays.toString(formats));
+            // BufferedImage originalImage = ImageIO.read(file2);
+            BufferedImage originalImage = Imaging.getBufferedImage(imageData); //.getBufferedImage(file3);
+
+            int width = 1080;
+            int height = 1920;
+            Image scaledImage = originalImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
+            BufferedImage resizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
+            resizedImage.getGraphics().drawImage(scaledImage, 0, 0, null);
 
-        long sizeLimit = 1024*1024*5; //5M 1920 ×1080
-        int width = 1080;
-        int height = 1920;
-        Image scaledImage = originalImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
-        BufferedImage resizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
-        resizedImage.getGraphics().drawImage(scaledImage, 0, 0, null);
+            // 压缩图像
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            ImageIO.write(resizedImage, formatName, baos);
 
-        // 压缩图像
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        ImageIO.write(resizedImage, formatName, baos);
+            if (baos.size() <= sizeLimit) {
+                // 图片大小已经小于等于目标大小,直接返回原始数据
+                return baos.toByteArray();
+            }
 
-        if (baos.size() <= sizeLimit) {
-            // 图片大小已经小于等于目标大小,直接返回原始数据
-            return baos.toByteArray();
-        }
+            float quality = 0.9f; // 初始化压缩质量
+            int retries = 10; // 最多尝试 10 次
 
-        float quality = 0.9f; // 初始化压缩质量
-        int retries = 10; // 最多尝试 10 次
+            while (baos.size() > sizeLimit && retries > 0) {
+                // 压缩图像并重新计算压缩质量
+                byte[] data = baos.toByteArray();
+                bais = new ByteArrayInputStream(data);
+                BufferedImage compressedImage = ImageIO.read(bais);
+                baos.reset();
 
-        while (baos.size() > sizeLimit && retries > 0) {
-            // 压缩图像并重新计算压缩质量
-            byte[] data = baos.toByteArray();
-            bais = new ByteArrayInputStream(data);
-            BufferedImage compressedImage = ImageIO.read(bais);
-            baos.reset();
+                ImageWriter writer = null;
+                Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName(formatName);
+                if (writers.hasNext()) {
+                    writer = writers.next();
+                } else {
+                    throw new IllegalArgumentException("Unsupported image format: " + formatName);
+                }
 
-            ImageWriter writer = null;
-            Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName(formatName);
-            if (writers.hasNext()) {
-                writer = writers.next();
-            } else {
-                throw new IllegalArgumentException("Unsupported image format: " + formatName);
-            }
+                ImageWriteParam writeParam = writer.getDefaultWriteParam();
+                writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
+                writeParam.setCompressionQuality(1);
 
-            ImageWriteParam writeParam = writer.getDefaultWriteParam();
-            writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
-            writeParam.setCompressionQuality(1);
+                writer.setOutput(ImageIO.createImageOutputStream(baos));
+                writer.write(null, new IIOImage(compressedImage, null, null), writeParam);
+                writer.dispose();
 
-            writer.setOutput(ImageIO.createImageOutputStream(baos));
-            writer.write(null, new IIOImage(compressedImage, null, null), writeParam);
-            writer.dispose();
+                float ratio = sizeLimit * 1.0f / baos.size();
+                quality *= Math.sqrt(ratio);
+                retries--;
+            }
 
-            float ratio = sizeLimit * 1.0f / baos.size();
-            quality *= Math.sqrt(ratio);
-            retries--;
+            return baos.toByteArray();
+        } catch (Exception e) {
+            return imageData;
         }
-
-        return baos.toByteArray();
     }
 
     public static byte[] compressImage(byte[] imageData) throws IOException, ImageProcessingException, MetadataException{
@@ -706,7 +720,7 @@ public class CommonUtil {
         try {
             originalImage = Imaging.getBufferedImage(imageData);
         } catch (ImageReadException e) {
-
+            e.printStackTrace();
         }
 
         long sizeLimit = 1024*1024*5; //5M 1920 ×1080
@@ -995,4 +1009,4 @@ public class CommonUtil {
         //保留两位小数
         return Math.round(px * cmPerPixel * 100) / 100.0;
     }
-}
+}

+ 34 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/dto/TaskSplitDTO.java

@@ -0,0 +1,34 @@
+/*
+ *      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.archive.dto;
+
+import org.springblade.archive.entity.TaskSplit;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 解析主标任务数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2025-05-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class TaskSplitDTO extends TaskSplit {
+	private static final long serialVersionUID = 1L;
+
+}

+ 4 - 1
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchivesAuto.java

@@ -32,7 +32,7 @@ import lombok.EqualsAndHashCode;
 import org.springframework.beans.BeanUtils;
 
 /**
- * 实体类
+ * 案卷主题信息
  *
  * @author BladeX
  * @since 2023-02-17
@@ -183,6 +183,9 @@ public class ArchivesAuto extends BaseEntity {
     @ApiModelProperty("是否抽检,0未抽检1已抽检")
     private Integer isInspect;
 
+    @ApiModelProperty("是否解析,其他=未解析 1=已解析")
+    private Integer splitStatus;
+
     //是否是影音
     public boolean isMedia() {
         return (this.getCarrierType() != null &&

+ 73 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/TaskSplit.java

@@ -0,0 +1,73 @@
+/*
+ *      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.archive.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.springblade.core.mp.base.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 解析主标任务实体类
+ *
+ * @author BladeX
+ * @since 2025-05-23
+ */
+@Data
+@TableName("u_task_split")
+@EqualsAndHashCode(callSuper = true)
+public class TaskSplit extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	* 项目ID
+	*/
+	@ApiModelProperty("项目ID")
+		private String projectId;
+	/**
+	* 合同段ID
+	*/
+	@ApiModelProperty("合同段ID")
+		private String contractId;
+	/**
+	* 解析id字符串
+	*/
+
+	@ApiModelProperty("解析id字符串")
+		private String ids;
+	/**
+	* 类型 1:项目 2:合同段 3:id解析
+	*/
+	@ApiModelProperty("1:项目 2:合同段 3:id解析")
+		private Integer type;
+	/**
+	* 总条数
+	*/
+	@ApiModelProperty("总条数")
+		private Integer toolCount;
+	/**
+	* 完成数量
+	*/
+	@ApiModelProperty("完成数量")
+		private Integer finished;
+
+
+}

+ 34 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/TaskSplitVO.java

@@ -0,0 +1,34 @@
+/*
+ *      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.archive.vo;
+
+import org.springblade.archive.entity.TaskSplit;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 解析主标任务视图实体类
+ *
+ * @author BladeX
+ * @since 2025-05-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class TaskSplitVO extends TaskSplit {
+	private static final long serialVersionUID = 1L;
+
+}

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

@@ -0,0 +1,18 @@
+package org.springblade.evisa.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class TaskArchiveSplitVO {
+
+    @ApiModelProperty("id")
+    private String id;
+
+    @ApiModelProperty("archiveId")
+    private String archiveId;
+
+    @ApiModelProperty("fileUrl")
+    private String fileUrl;
+
+}

+ 135 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/TaskSplitController.java

@@ -0,0 +1,135 @@
+/**
+ * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * <p>
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.gnu.org/licenses/lgpl.html
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.archive.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.archive.entity.TaskSplit;
+import org.springblade.archive.vo.TaskSplitVO;
+import org.springblade.archive.service.ITaskSplitService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 解析主标任务 控制器
+ *
+ * @author BladeX
+ * @since 2025-05-23
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/tasksplit")
+@Api(value = "解析主标任务", tags = "解析主标任务接口")
+public class TaskSplitController extends BladeController {
+
+	private final ITaskSplitService taskSplitService;
+
+
+/*	*//**
+	 * 详情
+	 *//*
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入taskSplit")
+	public R<TaskSplit> detail(TaskSplit taskSplit) {
+		TaskSplit detail = taskSplitService.getOne(Condition.getQueryWrapper(taskSplit));
+		return R.data(detail);
+	}
+
+	*//**
+	 * 分页 解析主标任务
+	 *//*
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入taskSplit")
+	public R<IPage<TaskSplit>> list(TaskSplit taskSplit, Query query) {
+		IPage<TaskSplit> pages = taskSplitService.page(Condition.getPage(query), Condition.getQueryWrapper(taskSplit));
+		return R.data(pages);
+	}*/
+
+	/**
+	 * 查询任务任务信息
+	 */
+	@GetMapping("/selectTaskSplit")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "查询任务任务信息", notes = "传入taskSplit")
+	public R<IPage<TaskSplitVO>> page(TaskSplitVO taskSplit, Query query) {
+		IPage<TaskSplitVO> pages = taskSplitService.selectTaskSplitPage(Condition.getPage(query), taskSplit);
+		return R.data(pages);
+	}
+
+	/**
+	 * 新增 解析主标任务
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "新增", notes = "传入taskSplit")
+	public R save(@Valid @RequestBody TaskSplit taskSplit) {
+		return taskSplitService.saveTaskSplit(taskSplit);
+	}
+
+/*
+	*/
+/**
+	 * 修改 解析主标任务
+	 *//*
+
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入taskSplit")
+	public R update(@Valid @RequestBody TaskSplit taskSplit) {
+		return R.status(taskSplitService.updateById(taskSplit));
+	}
+
+	*/
+/**
+	 * 新增或修改 解析主标任务
+	 *//*
+
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入taskSplit")
+	public R submit(@Valid @RequestBody TaskSplit taskSplit) {
+		return R.status(taskSplitService.saveOrUpdate(taskSplit));
+	}
+
+	
+	*/
+/**
+	 * 删除 解析主标任务
+	 *//*
+
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(taskSplitService.deleteLogic(Func.toLongList(ids)));
+	}
+*/
+
+	
+}

+ 43 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/TaskSplitMapper.java

@@ -0,0 +1,43 @@
+/*
+ *      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.archive.mapper;
+
+import org.springblade.archive.entity.TaskSplit;
+import org.springblade.archive.vo.TaskSplitVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 解析主标任务 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2025-05-23
+ */
+public interface TaskSplitMapper extends BaseMapper<TaskSplit> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param taskSplit
+	 * @return
+	 */
+	List<TaskSplitVO> selectTaskSplitPage(IPage page, TaskSplitVO taskSplit);
+
+	Integer getArchiveCount(String contractId);
+}

+ 32 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/TaskSplitMapper.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.archive.mapper.TaskSplitMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="taskSplitResultMap" type="org.springblade.archive.entity.TaskSplit">
+        <result column="id" property="id"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_dept" property="createDept"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="status" property="status"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="project_id" property="projectId"/>
+        <result column="contract_id" property="contractId"/>
+        <result column="ids" property="ids"/>
+        <result column="type" property="type"/>
+        <result column="tool_count" property="toolCount"/>
+        <result column="finished" property="finished"/>
+    </resultMap>
+
+
+    <select id="selectTaskSplitPage" resultMap="taskSplitResultMap">
+        select * from u_task_split where is_deleted = 0
+    </select>
+
+    <select id="getArchiveCount" resultType="java.lang.Integer">
+        select count(1) from u_archives_auto where contract_id = #{contractId}
+    </select>
+
+</mapper>

+ 44 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/ITaskSplitService.java

@@ -0,0 +1,44 @@
+/*
+ *      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.archive.service;
+
+import org.springblade.archive.entity.TaskSplit;
+import org.springblade.archive.vo.TaskSplitVO;
+import org.springblade.core.mp.base.BaseService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.core.tool.api.R;
+
+/**
+ * 解析主标任务 服务类
+ *
+ * @author BladeX
+ * @since 2025-05-23
+ */
+public interface ITaskSplitService extends BaseService<TaskSplit> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param taskSplit
+	 * @return
+	 */
+	IPage<TaskSplitVO> selectTaskSplitPage(IPage<TaskSplitVO> page, TaskSplitVO taskSplit);
+
+	R saveTaskSplit(TaskSplit taskSplit);
+
+}

+ 78 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/TaskSplitServiceImpl.java

@@ -0,0 +1,78 @@
+/*
+ *      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.archive.service.impl;
+
+import org.springblade.archive.entity.TaskSplit;
+import org.springblade.archive.mapper.ArchivesAutoMapper;
+import org.springblade.archive.vo.TaskSplitVO;
+import org.springblade.archive.mapper.TaskSplitMapper;
+import org.springblade.archive.service.ITaskSplitService;
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import javax.annotation.Resource;
+
+/**
+ * 解析主标任务 服务实现类
+ *
+ * @author BladeX
+ * @since 2025-05-23
+ */
+@Service
+public class TaskSplitServiceImpl extends BaseServiceImpl<TaskSplitMapper, TaskSplit> implements ITaskSplitService {
+
+	//  注入mapper
+	@Resource
+    ArchivesAutoMapper autoMapper;
+
+	@Override
+	public IPage<TaskSplitVO> selectTaskSplitPage(IPage<TaskSplitVO> page, TaskSplitVO taskSplit) {
+		return page.setRecords(baseMapper.selectTaskSplitPage(page, taskSplit));
+	}
+
+	@Override
+	public R saveTaskSplit(TaskSplit taskSplit) {
+		// 数据校验区
+		String contractId = taskSplit.getContractId();
+		String splitIds = taskSplit.getIds();
+		if (contractId=="" || contractId==null || contractId.length()==0 || Func.isEmpty(contractId)){
+			return R.fail("合同段Id为空");
+		}
+
+		if (splitIds=="" || splitIds==null || splitIds.length()==0 || Func.isEmpty(splitIds)){ // 代表整个合同解析
+			taskSplit.setType(2);
+			// 查询整个合同段下的所有文件
+			Integer archiveCount = baseMapper.getArchiveCount(contractId);
+			taskSplit.setToolCount(archiveCount);
+			taskSplit.setFinished(0);
+
+		}else{ // 指定文件解析
+			taskSplit.setType(3);
+			String[] split = splitIds.split(",");
+			taskSplit.setToolCount(split.length);
+			taskSplit.setFinished(0);
+		}
+
+		int insert = baseMapper.insert(taskSplit);
+		return R.success("dddd");
+	}
+
+}

+ 0 - 104
blade-service/blade-archive/src/main/java/org/springblade/archive/utils/SpeechRecognizerRESTfulDemo.java

@@ -1,104 +0,0 @@
-/*
-package org.springblade.archive.utils;
-
-import com.alibaba.fastjson.JSONPath;
-
-import java.io.File;
-import java.util.HashMap;
-public class SpeechRecognizerRESTfulDemo {
-    private String accessToken;
-    private String appkey;
-
-    public SpeechRecognizerRESTfulDemo(String appkey, String token) {
-        this.appkey = appkey;
-        this.accessToken = token;
-    }
-
-    public String process(File fileName, String format, int sampleRate,
-                          boolean enablePunctuationPrediction,
-                          boolean enableInverseTextNormalization,
-                          boolean enableVoiceDetection) {
-
-        */
-/**
- * 设置HTTPS RESTful POST请求:
- * 1.使用HTTPS协议。
- * 2.语音识别服务域名:nls-gateway-cn-shanghai.aliyuncs.com。
- * 3.语音识别接口请求路径:/stream/v1/asr。
- * 4.设置必选请求参数:appkey、format、sample_rate。
- * 5.设置可选请求参数:enable_punctuation_prediction、enable_inverse_text_normalization、enable_voice_detection。
- * <p>
- * 设置HTTPS头部字段:
- * 1.鉴权参数。
- * 2.Content-Type:application/octet-stream。
- * <p>
- * 发送HTTPS POST请求,返回服务端的响应。
- *//*
-
-        String url = "https://nls-gateway-cn-shanghai.aliyuncs.com/stream/v1/asr";
-        String request = url;
-        request = request + "?appkey=" + appkey;
-        request = request + "&format=" + format;
-        request = request + "&sample_rate=" + sampleRate;
-        if (enablePunctuationPrediction) {
-            request = request + "&enable_punctuation_prediction=" + true;
-        }
-        if (enableInverseTextNormalization) {
-            request = request + "&enable_inverse_text_normalization=" + true;
-        }
-        if (enableVoiceDetection) {
-            request = request + "&enable_voice_detection=" + true;
-        }
-
-        System.out.println("Request: " + request);
-
-        */
-/**
- * 设置HTTPS头部字段:
- * 1.鉴权参数。
- * 2.Content-Type:application/octet-stream。
- *//*
-
-        HashMap<String, String> headers = new HashMap<String, String>();
-        headers.put("X-NLS-Token", this.accessToken);
-        headers.put("Content-Type", "application/octet-stream");
-
-        */
-/**
- * 发送HTTPS POST请求,返回服务端的响应。
- *//*
-
-        String response = HttpUtil.sendPostFile(request, headers, fileName);
-
-        if (response != null) {
-            System.out.println("Response: " + response);
-            String result = JSONPath.read(response, "result").toString();
-            System.out.println("识别结果:" + result);
-            return result;
-        }
-        else {
-            System.err.println("识别失败!");
-        }
-
-        return "1";
-    }
-
-    public static void main(String[] args) {
-
-
-        String token = "cc96fcdce38f49f1af2298a949d39800";
-        String appkey = "7T7TkowOxND01n1y";
-
-        SpeechRecognizerRESTfulDemo demo = new SpeechRecognizerRESTfulDemo(appkey, token);
-
-        String fileName = "/Users/hongchuangyanfa/Downloads/nls-sample-16k.wav" ;//SpeechRecognizerRESTfulDemo.class.getClassLoader().getResource("/Users/hongchuangyanfa/Downloads/nls-sample-16k.wav").getPath();
-        String format = "pcm";
-        int sampleRate = 16000;
-        boolean enablePunctuationPrediction = true;
-        boolean enableInverseTextNormalization = true;
-        boolean enableVoiceDetection = false;
-   //     String dataInfo = demo.process(fileName, format, sampleRate, enablePunctuationPrediction, enableInverseTextNormalization, enableVoiceDetection);
-        System.out.println("123");
-        //System.out.println(dataInfo);
-    }
-}*/

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/controller/ChekSignData.java

@@ -142,7 +142,7 @@ public class ChekSignData {
         if(maps!=null & maps.size()==0 && mapList.size()>=4 ){
 
             String header = "bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0ZW5hbnRfaWQiOiIwMDAwMDAiLCJ1c2VyX25hbWUiOiJ6aHV3ZWkiLCJyZWFsX25hbWUiOiLnpZ3ngpwiLCJhdmF0YXIiOiIiLCJhdXRob3JpdGllcyI6WyJhZG1pbmlzdHJhdG9yIl0sImNsaWVudF9pZCI6ImNsaWVudCIsInJvbGVfbmFtZSI6ImFkbWluaXN0cmF0b3IiLCJsaWNlbnNlIjoicG93ZXJlZCBieSBibGFkZXgiLCJwb3N0X2lkIjoiIiwidXNlcl9pZCI6IjE3Mzk5NDQ2MTMyNjUxODY4MTgiLCJyb2xlX2lkIjoiMTEyMzU5ODgxNjczODY3NTIwMSIsInBob25lIjoiMTg5ODI4Nzc2MDciLCJzY29wZSI6WyJhbGwiXSwibmlja19uYW1lIjoi56Wd54KcIiwib2F1dGhfaWQiOiIiLCJkZXRhaWwiOnsidHlwZSI6IndlYiJ9LCJleHAiOjE3NDU1OTU2MDksImRlcHRfaWQiOiIxNTkyMzk0MTMxMTc3ODczNDEwIiwianRpIjoiZTMzN2QyNGMtNzkzZC00OTIwLTliMzEtZTU3MDYyNTIyZTBlIiwiYWNjb3VudCI6InpodXdlaSJ9.jihRZbcZrrCArbMcp6ON9H-1uCDn07juxlXPcHLU07A";
-            taskService.reSigningEVisa("1", taskApp.getTaskId(), taskApp.getContractId(), taskApp.getProjectId(), 1, header);
+          //  taskService.reSigningEVisa("1", taskApp.getTaskId(), taskApp.getContractId(), taskApp.getProjectId(), 1, header);
             String sql2 = "update u_task set batch=10 where id="+taskApp.getTaskId();
             jdbcTemplate.execute(sql2);
         }

+ 9 - 6
blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java

@@ -42,9 +42,7 @@ import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.sms.model.SmsResponse;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.jackson.JsonUtil;
-import org.springblade.core.tool.utils.DateUtil;
-import org.springblade.core.tool.utils.Func;
-import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.core.tool.utils.*;
 import org.springblade.evisa.feign.EVisaClient;
 import org.springblade.feign.ArchiveFileTaskClient;
 import org.springblade.flow.core.entity.BladeFlow;
@@ -114,14 +112,16 @@ public class TaskController extends BladeController {
     @ApiOperation(value = "记录短信验证码超时时间")
     public void saveSmsTimeout(@RequestParam String code) {
         //获取账户记录
+     ///   String aesKey = "O2BEeIv399qHQNhD6aGW8R8DEj4bqHXm";
+     //   String accode = AesUtil.decryptFormBase64ToString(code, aesKey);
         DefaultConfig config = this.defaultConfigService.getOne(Wrappers.<DefaultConfig>lambdaQuery()
                 .eq(DefaultConfig::getCreateUser, AuthUtil.getUserId())
                 .isNotNull(DefaultConfig::getSmsCode));
         if (config != null) {
             //获取当前时间
             Date now = DateUtil.now();
-            //默认16小时后超时
-            now = DateUtil.plusHours(now, 16);
+            // 16 改为 1小时后超时
+            now = DateUtil.plusHours(now, 1);
 
             LambdaUpdateWrapper<DefaultConfig> wrapper = new LambdaUpdateWrapper<>();
             wrapper.set(DefaultConfig::getSmsTimeOut, DateUtil.format(now, "yyyy-MM-dd HH:mm:ss"));
@@ -191,7 +191,7 @@ public class TaskController extends BladeController {
     @ApiOperationSupport(order = 10)
     @ApiOperation(value = "短信验证")
     public R<Boolean> sendNotice(BladeUser user,@RequestParam String phone) {
-//        String code = CommonUtil.getCharAndNumber(4);
+      //  String code = CommonUtil.getCharAndNumber(4);
         String code = String.valueOf((int) (Math.random() * 9000 + 1000));
         Map<String, String> params = new HashMap<>(3);
         params.put("code", code);
@@ -214,6 +214,9 @@ public class TaskController extends BladeController {
                 this.defaultConfigService.save(config);
             }
         }
+        // 加密处理
+       // String aesKey = "O2BEeIv399qHQNhD6aGW8R8DEj4bqHXm";
+      //  String codeInfo= AesUtil.encryptToBase64(code,aesKey);
         return result.getData().isSuccess() ? R.data(200, true, code) : R.data(499, false, String.valueOf(JSONObject.parseObject(result.getData().getMsg(), Map.class).get("Message")));
     }
 

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

@@ -25,12 +25,11 @@ import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
-import org.springblade.core.mp.support.Query;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
-import org.springblade.core.tool.support.Kv;
+
 import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
@@ -38,12 +37,10 @@ import org.springblade.core.tool.utils.ResourceUtil;
 import org.springblade.evisa.feign.EVisaClient;
 import org.springblade.evisa.vo.EVisaTaskApprovalVO;
 import org.springblade.flow.core.constant.ProcessConstant;
-import org.springblade.flow.core.entity.BladeFlow;
 import org.springblade.flow.core.feign.IFlowClient;
 import org.springblade.flow.core.feign.NewFlowClient;
 import org.springblade.flow.core.utils.FlowUtil;
-import org.springblade.flow.core.utils.TaskUtil;
-import org.springblade.flow.core.vo.FlowProcessVO;
+
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.ProjectInfo;
 import org.springblade.manager.entity.TabBusstimeInfo;

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

@@ -0,0 +1,169 @@
+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.springblade.business.vo.TaskSignInfoVO;
+import org.springblade.evisa.service.EVDataService;
+import org.springblade.evisa.utils.FileUtils;
+import org.springblade.evisa.vo.TaskArchiveSplitVO;
+import org.springframework.beans.factory.annotation.Autowired;
+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 java.io.File;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+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;
+
+
+/**
+ * 清表基础数据表 控制器
+ *
+ * @author BladeX
+ * @since 2022-05-18
+ */
+@RestController
+@AllArgsConstructor
+@Api(value = "电签类", tags = "电签类接口")
+@Slf4j
+public class ArchiveController {
+
+    @Autowired
+    StringRedisTemplate RedisTemplate;
+    // jdbc
+    private final JdbcTemplate jdbcTemplate;
+
+    //电签服务类
+    private final EVDataService evDataService;
+
+    // 线程池
+    @Resource(name = "taskExecutor1")
+    private ThreadPoolExecutor executor;
+
+    @Scheduled(cron = "0/10 * * * * ?")
+    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 ";
+        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());
+                    if (!aBoolean) {
+
+                        if(!aBoolean){
+                            RedisTemplate.opsForValue().set("sign-" + dataInfo.getArchiveId(), "1", 7200, TimeUnit.SECONDS);
+                            CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
+                                try {
+                                    /*===============执行批量任务===============*/
+                                    signTaskBatch(dataInfo);
+                                } catch (Exception e) {
+                                    e.printStackTrace();
+                                }
+                            }, executor);
+                        }
+                    }
+                }
+            }
+        }
+
+        System.out.println("队列数量" + executor.getQueue().size());
+        System.out.println("活跃数量" + executor.getActiveCount());
+        System.out.println("总共数量" + executor.getTaskCount());
+        System.out.println("完成数量" + executor.getCompletedTaskCount());
+    }
+
+    public void signTaskBatch(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);
+            // 保存第一页为300DPI图片
+            String imagePath = FileUtils.getSysLocalFileUrl() + "archiveSplit/" + archiveId + "_001.png";
+            savePdfAsImage(1, firstUrl, imagePath);
+
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public void getPdfByPage(int startPage, int endPage, String filePath, String savePath) {
+        try {
+            InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(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();
+        } catch (Exception e) {
+            log.error("提取PDF页面失败", e);
+            throw new RuntimeException("提取PDF页面失败", e);
+        }
+    }
+
+    public void 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("无效的页码");
+            }
+
+            PDFRenderer renderer = new PDFRenderer(document);
+
+            // 设置DPI为300
+            final int DPI = 300;
+
+            // 渲染指定页面(注意PDFBox使用0-based索引)
+            BufferedImage image = renderer.renderImage(pageNum - 1, DPI / 72f);
+
+            // 确保输出目录存在
+            File outputFile = new File(outputPath);
+            outputFile.getParentFile().mkdirs();
+
+            // 保存为PNG格式(可改为JPG等)
+            ImageIO.write(image, "PNG", outputFile);
+            log.info("PDF页面已成功保存为图片: {}", outputPath);
+        } catch (Exception e) {
+            log.error("PDF转图片失败", e);
+            throw new RuntimeException("PDF转图片失败", e);
+        }
+    }
+}

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

@@ -56,7 +56,7 @@ public class  Chek {
 
 
 
-    @Scheduled(cron = "0/10 * * * * ?")
+   // @Scheduled(cron = "0/10 * * * * ?")
     public void SignInfo() {
         // 质检SQL
        // String sql = "select id,file_url as eVisaPdfUrl from u_archive_file where length(file_url)!=char_length(file_url) and file_name not in('封面.pdf','封面1.pdf','卷内目录.pdf','卷内目录1.pdf','背脊.pdf','背脊1.pdf','备考表.pdf','备考表1.pdf') and is_deleted<>10  and  contract_id in(1890322575534399490,1890328157624541186,1887771910584999937) and file_url is not null and file_url like '%.pdf%' LIMIT 30  ";

+ 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() {
         //执行代码
 

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

@@ -794,7 +794,6 @@ public class EVisaServiceImpl implements EVisaService {
         if ("20".equals(sys_isonline) || SystemUtils.isWindows() || SystemUtils.isMacOs()) {
             url = "http://219.151.181.73:9125/FrontSys/SealServicezx/FileSignByKeyWord";
         }
-
         String sysLocalFileUrl = FileUtils.getSysLocalFileUrl();
         String filecode = SnowFlakeUtil.getId() + "";
         String dataFileUrl = sysLocalFileUrl + "/pdf/" + filecode + ".pdf";

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

@@ -10,8 +10,6 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.InputStream;
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
 import java.util.List;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;

+ 309 - 25
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java

@@ -26,6 +26,7 @@ import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.log.exception.ServiceException;
@@ -345,18 +346,10 @@ public class WbsTreeContractController extends BladeController {
                 WbsTreePrivate treePrivateTab = jdbcTemplate.query("select * from m_wbs_tree_private where p_key_id = " + pKeyId, new BeanPropertyRowMapper<>(WbsTreePrivate.class)).stream().findAny().orElse(null);
                 if (treePrivateTab != null && treePrivateTab.getHtmlUrl() != null) {
                     htmlUrl = treePrivateTab.getHtmlUrl();
-                    //<开始>-----------本地测试  下载html到本地
-//                    htmlUrl = FileUtils.getNetUrl(htmlUrl);
-//                    String localFilePath = "D:\\file\\downfile\\1792757075013533696.html";
-//                    downloadHtmlAndSave(htmlUrl, localFilePath);
-//                    htmlUrl =localFilePath;
-                    //本地测试  下载html到本地-----------<结束>
                     fileName = ObjectUtil.isNotEmpty(treePrivateTab.getFullName()) ? treePrivateTab.getFullName() : treePrivateTab.getNodeName();
                 }
             } else {
                 htmlUrl = tab.getHtmlUrl();
-//                htmlUrl = "C:\\Users\\泓创研发01\\Desktop\\fsdownload\\1783774897227431936.html";
-//                htmlUrl="D:\\web\\html\\1848904722870697984.html";
                 fileName = ObjectUtil.isNotEmpty(tab.getFullName()) ? tab.getFullName() : tab.getNodeName();
             }
 
@@ -364,14 +357,14 @@ public class WbsTreeContractController extends BladeController {
                 throw new ServiceException("未获取到对应的表的html信息");
             }
 
-            //将html转换为excel
+            //将html转换为excel]
+
+            htmlUrl = CommonUtil.replaceOssUrl(htmlUrl);
+            InputStream htmlInputStream = FileUtils.getInputStreamByUrl(htmlUrl);
             ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
             LoadOptions lo = new LoadOptions(LoadFormat.HTML);
-            workbook = new Workbook(htmlUrl,lo);
-//            InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(htmlUrl);
-//            workbook = new com.spire.xls.Workbook();
-//            workbook.loadFromHtml(inputStreamByUrl);
-//            workbook.loadFromHtml("D:\\BaiduNetdiskDownload\\1783381225877012480.html");
+            workbook = new Workbook(htmlInputStream,lo);
+
             workbook.save(byteArrayOutputStream, SaveFormat.XLSX);
 
             //将转换的spireExcel存储到流中
@@ -384,7 +377,7 @@ public class WbsTreeContractController extends BladeController {
                 //存储需要修改的单元格和相关信息的列表
                 List<CellModificationInfo> cellsToModify = new ArrayList<>();
                 //解析html 获取合并单元格
-                InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(tab.getHtmlUrl());
+                InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(htmlUrl);
                 String htmlString = IoUtil.readToString(inputStreamByUrl);
                 Document doc = Jsoup.parse(htmlString);
                 Element table = doc.select("table").first();
@@ -394,25 +387,84 @@ public class WbsTreeContractController extends BladeController {
                 List<CellRangeAddress> mergedRegions = new ArrayList<>();
                 // 保存需要保留的单元格内容和样式
                 Map<CellRangeAddress, String> data = new HashMap<>();
+                Map<Integer,Integer> rowHeight = new HashMap<>();
                 // 记录每个单元格的位置和合并信息
-                for (Element row1 : rows) {
+                for (int i=0;i<rows.size();i++) {
+                    Element row1 = rows.get(i);
                     Elements cells = row1.select("td, th");
-                    for (Element cell : cells) {
-
-                        int rowspan = cell.hasAttr("rowspan") ? Integer.parseInt(cell.attr("rowspan")) : -1;
-                        int colspan = cell.hasAttr("colspan") ? Integer.parseInt(cell.attr("colspan")) : -1;
-                        int x1 = cell.hasAttr("x1") ? Integer.parseInt(cell.attr("x1")) - 1 : -1;//起始列
-                        int x2 = cell.hasAttr("x2") ? Integer.parseInt(cell.attr("x2")) - 1 : -1;//结束列
-                        int y1 = cell.hasAttr("y1") ? Integer.parseInt(cell.attr("y1")) - 1 : -1;//起始行
-                        int y2 = cell.hasAttr("y2") ? Integer.parseInt(cell.attr("y2")) - 1 : -1;//结束行
+                    int colVal = 0;
+                    int index = 0;
+                    for (int j=0;j<cells.size();j++) {
+                        Element cell = cells.get(j);
+                        // 获取html每行的高度
+                        String style = cell.attr("style");
+                        Pattern pattern = Pattern.compile("height:\\s*(\\d+)px");
+                        Matcher matcher = pattern.matcher(style);
+                        if (matcher.find()) {
+                            int height = Integer.parseInt(matcher.group(1));
+                            if(height>0){
+                                rowHeight.put(i, height);  // 记录行高
+                            }
+                        }
+
+                        int rowspan = cell.hasAttr("rowspan") ? Integer.parseInt(cell.attr("rowspan")) : 1; //
+                        int colspan = cell.hasAttr("colspan") ? Integer.parseInt(cell.attr("colspan")) : 1;
+                        int x1 =-1;
+                        int x2 =-1;
+                        int y1 =-1;
+                        int y2 =-1;
+
+                        if(cell.hasAttr("x1") && cell.hasAttr("y1")){ //直接获取
+                            x1 = Integer.parseInt(cell.attr("x1")) - 1; //: -1;//起始列
+                            x2 = Integer.parseInt(cell.attr("x2")) - 1; //: -1;//结束列
+                            y1 = Integer.parseInt(cell.attr("y1")) - 1; //: -1;//起始行
+                            y2 = Integer.parseInt(cell.attr("y2")) - 1; //: -1;//结束行
+                            colVal=x2+1;
+                        }else{
+                            Elements ids = cell.getElementsByAttribute("id");
+                            if(ids.size()==1){
+                                Element cell2 = ids.get(0);
+                                x1 = Integer.parseInt(cell2.attr("x1")) - 1; //: -1;//起始列
+                                x2 = Integer.parseInt(cell2.attr("x2")) - 1; //: -1;//结束列
+                                y1 = Integer.parseInt(cell2.attr("y1")) - 1; //: -1;//起始行
+                                y2 = Integer.parseInt(cell2.attr("y2")) - 1; //: -1;//结束行
+                                colVal=x2+1;
+                            }else{
+                                System.out.println(cell.text());
+
+                                if(i <=80) {
+                                    if (j == 0) {
+                                        x1 = 0;
+                                        x2 = colspan - 1;
+                                        y1 = i;
+                                        y2 = i + rowspan - 1;
+                                        colVal = x2 + 1;
+                                    } else {
+                                        if(colspan>=2){
+                                            x1 = colVal;
+                                            x2 = colVal + colspan - 1;
+                                        }else{
+                                            x1 = colVal;
+                                            x2 = colVal ;
+                                        }
+
+                                        y1 = i;
+                                        y2 = i + rowspan - 1;
+                                        colVal = x2 + 1;
+                                    }
+                                }
+                            }
+                        }
+
                         // 记录合并区域
                         if (x1 != -1 && x2 != -1 && y1 != -1 && y2 != -1) {
-                            if(rowspan != -1 || colspan != -1){
+                            if(rowspan >=2 || colspan >=2){
                                 CellRangeAddress region = new CellRangeAddress(y1, y2, x1, x2);
                                 mergedRegions.add(region);
                                 data.put(region, cell.text());
                             }
                         }
+                        index ++;
                     }
                 }
                 // 按顺序合并单元格(从上到下、从左到右)
@@ -426,6 +478,13 @@ public class WbsTreeContractController extends BladeController {
                 for (Row row : poiSheet) {
                     //判断当前行是否是最大列 如果不是 就补充到最大列
                     short lastCellNum = row.getLastCellNum();
+
+                    int rowIndex = row.getRowNum();
+                    if (rowHeight.containsKey(rowIndex)) {
+                        // 将像素转换为POI的行高单位(1px ≈ 0.75 points)
+                        row.setHeightInPoints(rowHeight.get(rowIndex) * 0.75f);
+                    }
+
                     if(maxColumns > lastCellNum){
                         for (int i = maxColumns - 1; i > lastCellNum; i--) {
                             row.createCell(i);
@@ -505,6 +564,231 @@ public class WbsTreeContractController extends BladeController {
             }
         }
     }
+
+
+    public static void maiqqn(String[] args) throws Exception {
+        String htmlUrl = "/Users/hongchuangyanfa/fsdownload/1892816666778140672.html";
+
+        InputStream htmlInputStream = new FileInputStream(new File(htmlUrl));
+        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+        LoadOptions lo = new LoadOptions(LoadFormat.HTML);
+        Workbook workbook = new Workbook(htmlInputStream,lo);
+
+        workbook.save(byteArrayOutputStream, SaveFormat.XLSX);
+
+        //将转换的spireExcel存储到流中
+        byte[] excelBytes = byteArrayOutputStream.toByteArray();
+
+        //把spireExcel转为poiExcel
+        try (InputStream inputStream = new ByteArrayInputStream(excelBytes)) {
+            org.apache.poi.ss.usermodel.Workbook poiWorkbook = new XSSFWorkbook(inputStream);
+            Sheet poiSheet = poiWorkbook.getSheetAt(0); //获取第一个工作表
+            //存储需要修改的单元格和相关信息的列表
+            List<CellModificationInfo> cellsToModify = new ArrayList<>();
+            //解析html 获取合并单元格
+            InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(htmlUrl);
+            String htmlString = IoUtil.readToString(inputStreamByUrl);
+            Document doc = Jsoup.parse(htmlString);
+            Element table = doc.select("table").first();
+            Elements rows = table.select("tr");
+            //最大列数
+            int maxColumns = calculateMaxColumns(rows);
+            List<CellRangeAddress> mergedRegions = new ArrayList<>();
+            // 保存需要保留的单元格内容和样式
+            Map<CellRangeAddress, String> data = new HashMap<>();
+            Map<Integer,Integer> rowHeight = new HashMap<>();
+            // 记录每个单元格的位置和合并信息
+
+            for (int i=0;i<rows.size();i++) {
+                Element row1 = rows.get(i);
+                Elements cells = row1.select("td, th");
+                for (int j=0;j<cells.size();j++) {
+                    Element cell = cells.get(j);
+                    int rowspan = cell.hasAttr("rowspan") ? Integer.parseInt(cell.attr("rowspan")) : 1;
+                    int colspan = cell.hasAttr("colspan") ? Integer.parseInt(cell.attr("colspan")) : 1;
+                    int x1 =-1;
+                    int x2 =-1;
+                    int y1 =-1;
+                    int y2 =-1;
+                    if(cell.hasAttr("x1") && cell.hasAttr("y1")){ //直接获取
+                        x1 = Integer.parseInt(cell.attr("x1")) - 1; //: -1;//起始列
+                        x2 = Integer.parseInt(cell.attr("x2")) - 1; //: -1;//结束列
+                        y1 = Integer.parseInt(cell.attr("y1")) - 1; //: -1;//起始行
+                        y2 = Integer.parseInt(cell.attr("y2")) - 1; //: -1;//结束行
+                    }else{
+                        Elements ids = cell.getElementsByAttribute("id");
+                        if(ids.size()==1){
+                            Element cell2 = ids.get(0);
+                            x1 = Integer.parseInt(cell2.attr("x1")) - 1; //: -1;//起始列
+                            x2 = Integer.parseInt(cell2.attr("x2")) - 1; //: -1;//结束列
+                            y1 = Integer.parseInt(cell2.attr("y1")) - 1; //: -1;//起始行
+                            y2 = Integer.parseInt(cell2.attr("y2")) - 1; //: -1;//结束行
+                        }
+                    }
+                }
+            }
+
+
+
+
+            /*
+            for (int i=0;i<rows.size();i++) {
+                Element row1 = rows.get(i);
+                Elements cells = row1.select("td, th");
+                int rowVal = 0;
+                int colVal = 0;
+                int index = 0;
+                for (int j=0;j<cells.size();j++) {
+                    Element cell = cells.get(j);
+                    // 获取html每行的高度
+                    String style = cell.attr("style");
+                    Pattern pattern = Pattern.compile("height:\\s*(\\d+)px");
+                    Matcher matcher = pattern.matcher(style);
+                    if (matcher.find()) {
+                        int height = Integer.parseInt(matcher.group(1));
+                        if(height>0){
+                            rowHeight.put(i, height);  // 记录行高
+                        }
+                    }
+
+                    int rowspan = cell.hasAttr("rowspan") ? Integer.parseInt(cell.attr("rowspan")) : 1;
+                    int colspan = cell.hasAttr("colspan") ? Integer.parseInt(cell.attr("colspan")) : 1;
+                    int x1 =-1;
+                    int x2 =-1;
+                    int y1 =-1;
+                    int y2 =-1;
+
+                    if(cell.hasAttr("x1") && cell.hasAttr("y1")){ //直接获取
+                        x1 = Integer.parseInt(cell.attr("x1")) - 1; //: -1;//起始列
+                        x2 = Integer.parseInt(cell.attr("x2")) - 1; //: -1;//结束列
+                        y1 = Integer.parseInt(cell.attr("y1")) - 1; //: -1;//起始行
+                        y2 = Integer.parseInt(cell.attr("y2")) - 1; //: -1;//结束行
+                        colVal=x2+1;
+                    }else{
+                        Elements ids = cell.getElementsByAttribute("id");
+                        if(ids.size()==1){
+                            Element cell2 = ids.get(0);
+                            x1 = Integer.parseInt(cell2.attr("x1")) - 1; //: -1;//起始列
+                            x2 = Integer.parseInt(cell2.attr("x2")) - 1; //: -1;//结束列
+                            y1 = Integer.parseInt(cell2.attr("y1")) - 1; //: -1;//起始行
+                            y2 = Integer.parseInt(cell2.attr("y2")) - 1; //: -1;//结束行
+                            colVal=x2+1;
+                        }else{
+                            System.out.println(cell.text());
+
+                            if(i ==9 ) {
+                                if (j == 0) {
+                                    x1 = 0;
+                                    x2 = colspan - 1;
+                                    y1 = i;
+                                    y2 = i + rowspan - 1;
+                                    colVal = x2 + 1;
+                                } else {
+                                    if(colspan>=2){
+                                       x1 = colVal;
+                                       x2 = colVal + colspan - 1;
+                                    }else{
+                                        x1 = colVal;
+                                        x2 = colVal ;
+                                    }
+
+                                    if(rowspan>=2){
+                                        y1 = i;
+                                        y2 = i + rowspan - 1;
+                                    }else{
+                                        y1 = i;
+                                        y2 = i ;
+                                    }
+                                    colVal = x2 + 1;
+                                }
+                            }
+                        }
+                    }
+
+                    // 记录合并区域
+                    if (x1 != -1 && x2 != -1 && y1 != -1 && y2 != -1) {
+                        if(rowspan >=2 || colspan >=2){
+                            CellRangeAddress region = new CellRangeAddress(y1, y2, x1, x2);
+                            mergedRegions.add(region);
+                            data.put(region, cell.text());
+                        }
+                    }
+                    index ++;
+                }
+            }*/
+            // 按顺序合并单元格(从上到下、从左到右)
+            for (int i = poiSheet.getNumMergedRegions() - 1; i >= 0; i--) {
+                poiSheet.removeMergedRegion(i);
+            }
+            for (CellRangeAddress region : mergedRegions) {
+                poiSheet.addMergedRegion(region);
+            }
+
+            for (Row row : poiSheet) {
+                //判断当前行是否是最大列 如果不是 就补充到最大列
+                short lastCellNum = row.getLastCellNum();
+
+                int rowIndex = row.getRowNum();
+                if (rowHeight.containsKey(rowIndex)) {
+                    // 将像素转换为POI的行高单位(1px ≈ 0.75 points)
+                    row.setHeightInPoints(rowHeight.get(rowIndex) * 0.75f);
+                }
+
+                if(maxColumns > lastCellNum){
+                    for (int i = maxColumns - 1; i > lastCellNum; i--) {
+                        row.createCell(i);
+                        Cell cell = row.getCell(i);
+                        //设置新单元格的样式为第一个单元格的样式
+                        cell.setCellStyle(row.getCell(0).getCellStyle());
+                    }
+                }
+                for (Cell cell : row) {
+                    int cellType = cell.getCellType();
+                    if (cellType == CellType.STRING.getCode() && ObjectUtil.isNotEmpty(cell.getStringCellValue())) {
+                        //存储需要修改的单元格信息
+                        cellsToModify.add(new CellModificationInfo(cell, cell.getStringCellValue().trim()));
+                    }
+                    //获取单元格所属的合并单元格区域
+                    CellRangeAddress mergedRegion = findMergedRegion(poiSheet, cell.getRowIndex(), cell.getColumnIndex());
+                    if (mergedRegion != null) {
+                        //合并单元格的数据 为之前记录的数据
+                        cell.setCellValue(data.get(mergedRegion));
+
+                        //存储需要修改的合并单元格信息
+                        cellsToModify.add(new CellModificationInfo(cell, mergedRegion));
+                    }
+                }
+            }
+
+            //遍历结束后,实际修改单元格样式和内容
+            for (CellModificationInfo info : cellsToModify) {
+                Cell cell = info.getCell();
+                //只更新非合并单元格的数据
+                if (info.getMergedRegion() == null && info.hasStringContent()) {
+                    cell.setCellValue(info.getStringContent());
+                }
+                //复制单元格样式
+                CellStyle cellStyle = poiWorkbook.createCellStyle();
+
+                CellStyle sourceCellStyle = cell.getCellStyle(); //获取原单元格的样式
+                cellStyle.cloneStyleFrom(sourceCellStyle); //复制样式
+                setBlackBorder(cellStyle); //设置边框
+                cell.setCellStyle(cellStyle);
+            }
+
+            //返回响应
+            FileOutputStream outputStream = new FileOutputStream("/Users/hongchuangyanfa/Desktop/22222/123.xlsx");
+            poiWorkbook.write(outputStream);
+
+        } catch (IOException e) {
+            logger.error("下载excel时出现异常:" + e.getMessage(), e);
+            e.printStackTrace();
+        }
+
+    }
+
+
+
     // 计算最大列数以对齐所有行
     private static int calculateMaxColumns(Elements rows) {
         return rows.stream()

+ 4 - 18
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java

@@ -1065,34 +1065,20 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
                 position = BaiduApiUtil.getPosition(addressInfo.get("lat").toString()
                         + "," + addressInfo.get("lng").toString());
             } catch (Exception e) {
-                throw new ServiceException("施工台账初始化失败: 百度地理编码API配额超限,今日限制访问");
+                return true;
+             //   throw new ServiceException("施工台账初始化失败: 百度地理编码API配额超限,今日限制访问");
+
             }
             ProjectContractArea projectContractArea = new ProjectContractArea();
             projectContractArea.setProvince(position.get("province"));
             projectContractArea.setCity(position.get("city"));
             projectContractArea.setCounty(position.get("district"));
             projectContractArea.setCity_code(position.get("adcode"));
-//            projectContractArea.setProvince("重庆");
-//            projectContractArea.setCity("重庆市");
-//            projectContractArea.setCounty("永川区");
-//            projectContractArea.setCity_code("500118");
             projectContractArea.setProjectId(contractInfo.getPId());
             projectContractArea.setIsDeleted(0);
             projectContractArea.setContractId(String.valueOf(contractInfo.getId()));
             projectContractArea.setProjectId(contractInfo.getPId());
-//                QueryWrapper<ProjectContractArea> queryWrapper = new QueryWrapper<>();
-//                queryWrapper.eq("project_id", contractInfo.getPId());
-//                queryWrapper.eq("contract_id", contractInfo.getId());
-//                queryWrapper.eq("province", position.get("province"));
-//                queryWrapper.eq("city", position.get("city"));
-//                queryWrapper.eq("county", position.get("district"));
-//                queryWrapper.eq("city_code", position.get("adcode"));
-//                queryWrapper.eq("is_deleted", contractInfo.getIsDeleted());
-//                ProjectContractArea projectContractArea1 = projectContractAreaMapper.selectOne(queryWrapper);
-//                if (projectContractArea1 == null) {
-//                    int res = projectContractAreaMapper.insert(projectContractArea);
-//                    return res > 0;
-//                }
+
             //删除之前所有的地址,再新增
             projectContractAreaMapper.delete(new LambdaQueryWrapper<ProjectContractArea>()
                     .eq(ProjectContractArea::getContractId, projectContractArea.getContractId()));

+ 0 - 30
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ExcelInfoUtils2.java

@@ -269,34 +269,4 @@ public class ExcelInfoUtils2 {
         return 1;
     }
 
-
-/*            6pt     8px
-            7pt     9px
-            7.5pt   10px
-            8pt     11px
-            9pt     12px
-            10pt     13px
-            10.5pt   14px
-            11pt     15px
-            12pt     16px
-            13pt     17px
-            13.5pt   18px
-            14pt     19px
-            14.5pt   20px
-            15pt     21px
-            16pt     22px
-            17pt     23px
-            18pt     24px
-            20pt     26px
-            22pt     29px
-            24pt     32px
-            26pt     35px
-            27pt     36px
-            28pt     37px
-            29pt     38px
-            30pt     40px
-            32pt     42px
-            34pt     45px
-            36pt     48px */
-
 }

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/PdfAddContextUtils.java

@@ -67,7 +67,7 @@ public class PdfAddContextUtils {
         Sheet sheet = workbook.getSheetAt(0);
         sheet.setForceFormulaRecalculation(true);
         int rowNum = sheet.getLastRowNum();
-        for (int i = 0; i < rowNum; i++) {
+        for (int i = 0; i < 6; i++) {
             Row row = sheet.getRow(i);
             if (row != null) {
                 short cellNum = row.getLastCellNum();

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

@@ -5089,7 +5089,7 @@ public class TaskController extends BladeController {
         strings.add("造价机构现场咨询意见_现场造价人员");
         strings.add("造价机构现场咨询意见_现场造价人员_负责人");
         strings.add("建设单位签收");
-        strings.add("建设单位签收_日期");
+      //  strings.add("建设单位签收_日期");
         WbsTreePrivate aPrivate = r.getData();
         String fileUrl = null;
         String os = System.getProperty("os.name").toLowerCase();

BIN
doc/lib/pdfLib/spire.ocr-1.9.22.jar