Эх сурвалжийг харах

优化档案文件检测功能

lvy 3 өдөр өмнө
parent
commit
237383cebc

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

@@ -128,6 +128,7 @@ public class ArchiveFileController extends BladeController {
                 for (ArchiveFileVO saveVo : saveList) {
                     metadataClassificationClient.createMetadataFile(saveVo.getId(), 0);
                 }
+                autoService.checkFileInfo(saveList.stream().map(item -> item.getId() + "").collect(Collectors.toList()));
             } catch (Exception e) {
                 e.printStackTrace();
             }
@@ -192,6 +193,7 @@ public class ArchiveFileController extends BladeController {
                     //获取源信息
                     metadataClassificationClient.createMetadataFile(saveVo.getId(), 0);
                 }
+                autoService.checkFileInfo(vo.getList().stream().map(item -> item.getId() + "").collect(Collectors.toList()));
             } catch (Exception e) {
                 e.printStackTrace();
             }

+ 0 - 75
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ScanFileController.java

@@ -188,80 +188,5 @@ public class ScanFileController {
     }
 
 
-    /**
-     * 每天3点执行一次
-     *  检测文件完整性,包括:日期、责任者、PDF是否有污渍、PDF分辨率是否大于等于300DPI
-     */
-    @Scheduled(cron = "0 0 3 * * ?")
-    public void checkFileInfo(){
-        System.out.println("开始执行文件完整性检测");
-        String sql = "select id,node_id,duty_user,file_time,file_url,pdf_file_url from u_archive_file where is_deleted = 0 and check_status >= 0 and node_id is not null and project_id is not null limit %d offset %d";
-        int size = 10000;
-        int offset = 0;
-        Pattern datePattern = Pattern.compile("[0-9]{4}.?[0-9]{2}.?[0-9]{2}");
-        while (true) {
-            List<ArchiveFile> query = jdbcTemplate.query(String.format(sql, size, offset), new BeanPropertyRowMapper<>(ArchiveFile.class));
-            if (query.isEmpty()) {
-                break;
-            }
-            offset += size;
-            for (ArchiveFile file : query) {
-                String status = "";
-                if (file.getFileTime() == null || !datePattern.matcher(file.getFileTime()).find()) {
-                    status += "1";
-                }
-                if (file.getDutyUser() ==  null || file.getDutyUser().trim().isEmpty() || file.getDutyUser().trim().equals("null")) {
-                    status += "2";
-                }
-                String url = "";
-                if (file.getPdfFileUrl() != null && file.getPdfFileUrl().contains("http")) {
-                    url = file.getFileUrl();
-                } else if (file.getFileUrl() != null && file.getFileUrl().contains("http")) {
-                    url = file.getPdfFileUrl();
-                }
-                if (url == null || !url.endsWith(".pdf")) {
-                    status += "3";
-                    file.setCheckStatus(Integer.parseInt(status));
-                    continue;
-                }
-                int lastIndexOf = url.lastIndexOf("/");
-                String prefix = url.substring(0, lastIndexOf + 1);
-                String suffix = url.substring(lastIndexOf + 1);
-                try {
-                    url = prefix + URLEncoder.encode(suffix, "UTF-8");
-                    // 使用内存限制设置 10MB 主内存
-                    MemoryUsageSetting memUsage = MemoryUsageSetting.setupMainMemoryOnly(10_000_000);
-                    try (InputStream ossIs = CommonUtil.getOSSInputStream(url);PDDocument document = PDDocument.load(ossIs, memUsage);) {
-                        PDPage page = document.getPage(0);
-                        // 获取pdf 的dpi信息
-                        int dpi = (int) (page.getCropBox().getWidth() / page.getTrimBox().getWidth() * 72);
-                        if (dpi < 300) {
-                            status += "3";
-                        }
-                        // todo 检测pdf是否有遮挡或者污渍
-                        if (status.isEmpty()) {
-                            file.setCheckStatus(-1);
-                        } else {
-                            file.setCheckStatus(Integer.parseInt( status));
-                        }
-                    }
-                } catch (Exception e) {
-                    status += "3";
-                    file.setCheckStatus(Integer.parseInt( status));
-                }
-            }
-            Date date = new Date();
-            List<Object[]> params = query.stream().map(entry -> new Object[]{entry.getCheckStatus(), date, entry.getId()}).collect(Collectors.toList());
-            jdbcTemplate.batchUpdate("update u_archive_file set check_status = ?, update_time = ? where id = ?", params);
-            System.out.println("已检测了" + (query.size() < size ? offset - size + query.size() : offset) + "条数据");
-            if (LocalTime.now().isBefore(LocalTime.of(6,30))) {
-                System.out.println("时间超过6:30, 停止检测");
-                break;
-            }
-        }
-        System.out.println("文件完整性检测执行完毕");
-
-
-    }
 
 }

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

@@ -191,4 +191,5 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 	Boolean atuoOCR(List<Long> ids) throws Exception;
 
 	void reCreateArchiveAuto2(List<ArchivesAuto> archivesAutoList, String ids, String name);
+	void checkFileInfo(List<String> ids);
 }

+ 74 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -39,6 +39,9 @@ import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 
+import org.apache.pdfbox.io.MemoryUsageSetting;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
 import org.springblade.archive.dto.*;
 import org.springblade.archive.entity.*;
 import org.springblade.archive.mapper.ArchiveConclusionMapper;
@@ -101,6 +104,7 @@ import java.nio.file.Paths;
 import java.rmi.ServerException;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.List;
@@ -5532,6 +5536,76 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			}
 		});
 	}
+
+	@Async
+	public void checkFileInfo(List<String> ids){
+		if (ids == null || ids.isEmpty()) {
+			return;
+		}
+		List<ArchiveFile> query = jdbcTemplate.query("select id,node_id,duty_user,file_time,file_url,pdf_file_url from u_archive_file where is_deleted = 0 and id in (" + String.join(",", ids) + ")",
+				new BeanPropertyRowMapper<>(ArchiveFile.class));
+		if (query.isEmpty()) {
+			return;
+		}
+		checkArchiveFile( query);
+		List<Object[]> params = query.stream().map(entry -> new Object[]{entry.getCheckStatus(), entry.getId()}).collect(Collectors.toList());
+		jdbcTemplate.batchUpdate("update u_archive_file set check_status = ? where id = ?", params);
+	}
+
+	/**
+	 *  检测文件完整性,包括:日期、责任者、PDF是否有污渍、PDF分辨率是否大于等于300DPI
+	 */
+	private void checkArchiveFile(List<ArchiveFile> list) {
+		Pattern datePattern = Pattern.compile("[0-9]{4}.?[0-9]{2}.?[0-9]{2}");
+		for (ArchiveFile file : list) {
+			String status = "";
+			if (file.getFileTime() == null || !datePattern.matcher(file.getFileTime()).find()) {
+				status += "1";
+			}
+			if (file.getDutyUser() ==  null || file.getDutyUser().trim().isEmpty() || file.getDutyUser().trim().equals("null")) {
+				status += "2";
+			}
+			String url = "";
+			if (file.getPdfFileUrl() != null && file.getPdfFileUrl().contains("http")) {
+				url = file.getFileUrl();
+			} else if (file.getFileUrl() != null && file.getFileUrl().contains("http")) {
+				url = file.getPdfFileUrl();
+			}
+			if (url == null || !url.endsWith(".pdf")) {
+				status += "3";
+				file.setCheckStatus(Integer.parseInt(status));
+				continue;
+			}
+			if (!status.isEmpty()) {
+				continue;
+			}
+			int lastIndexOf = url.lastIndexOf("/");
+			String prefix = url.substring(0, lastIndexOf + 1);
+			String suffix = url.substring(lastIndexOf + 1);
+			try {
+				url = prefix + URLEncoder.encode(suffix, "UTF-8");
+				// 使用内存限制设置 10MB 主内存
+				MemoryUsageSetting memUsage = MemoryUsageSetting.setupMainMemoryOnly(10_000_000);
+				try (InputStream ossIs = CommonUtil.getOSSInputStream(url); PDDocument document = PDDocument.load(ossIs, memUsage);) {
+					PDPage page = document.getPage(0);
+					// 获取pdf 的dpi信息
+					int dpi = (int) (page.getCropBox().getWidth() / page.getTrimBox().getWidth() * 72);
+					if (dpi < 300) {
+						status += "3";
+					}
+					// todo 检测pdf是否有遮挡或者污渍
+					if (status.isEmpty()) {
+						file.setCheckStatus(-1);
+					} else {
+						file.setCheckStatus(Integer.parseInt( status));
+					}
+				}
+			} catch (Exception e) {
+				status += "3";
+				file.setCheckStatus(Integer.parseInt(status));
+			}
+		}
+	}
 }
 
 

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

@@ -59,6 +59,7 @@
         <result column="fid" property="fid"/>
         <result column="archive_sort" property="archiveSort"/>
         <result column="rectification" property="rectification"/>
+        <result column="check_status" property="checkStatus"/>
         <result column="m_wbs_tree_contract_p_key_id" property="mWbsTreeContractPKeyId"/>
         <result column="u_image_classification_file_id" property="uImageClassificationFileId"/>
     </resultMap>
@@ -156,7 +157,7 @@
     </select>
 
     <select id="selectArchiveFilePage" resultMap="archiveFileResultMap">
-        select u.id,u.project_id,u.contract_id,u.node_id,u.file_number,u.file_name,u.file_time,u.file_url,u.pdf_file_url,u.file_page,u.is_approval,u.is_certification,u.is_need_certification,u.duty_user,u.create_user,u.create_dept,u.create_time,u.update_user,u.update_time,u.status,u.is_deleted,u.sheet_type,u.sheet_source,u.drawing_no,u.cite_change_number,u.certification_time,u.e_visa_file,u.node_ext_id,u.file_type,u.archive_id,u.origin_id,u.tag_id,u.pic_code,u.refer_code,u.film_code,u.width,u.height,u.sort,u.box_name,u.box_number,u.is_auto_file,u.is_archive,u.page_num,u.file_size,u.source_type,u.is_element,u.pdf_page_url,u.fid,u.rectification,u.classify,u.m_wbs_tree_contract_p_key_id,u.u_image_classification_file_id,u.archive_file_storage_type,u.node_tree_structure,u.date_name,u.archive_file_stroage_type,u.out_id,u.sort_num,u.is_lock,u.archive_sort,u.remark,u.m_album_id
+        select u.id,u.project_id,u.contract_id,u.node_id,u.file_number,u.file_name,u.file_time,u.file_url,u.pdf_file_url,u.file_page,u.is_approval,u.is_certification,u.is_need_certification,u.duty_user,u.create_user,u.create_dept,u.create_time,u.update_user,u.update_time,u.status,u.is_deleted,u.sheet_type,u.sheet_source,u.drawing_no,u.cite_change_number,u.certification_time,u.e_visa_file,u.node_ext_id,u.file_type,u.archive_id,u.origin_id,u.tag_id,u.pic_code,u.refer_code,u.film_code,u.width,u.height,u.sort,u.box_name,u.box_number,u.is_auto_file,u.is_archive,u.page_num,u.file_size,u.source_type,u.is_element,u.pdf_page_url,u.fid,u.rectification,u.classify,u.m_wbs_tree_contract_p_key_id,u.u_image_classification_file_id,u.archive_file_storage_type,u.node_tree_structure,u.date_name,u.archive_file_stroage_type,u.out_id,u.sort_num,u.is_lock,u.archive_sort,u.remark,u.m_album_id,u_check_status
         from u_archive_file u
         <if test="vo.nodeIds != null and vo.nodeIds != ''">
             left join m_archive_tree_contract t on t.id = u.node_id and t.is_deleted= 0