Browse Source

扫描档案文件

cr 2 weeks ago
parent
commit
1d57da94b2

+ 3 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ScanFolderVO.java

@@ -1,5 +1,6 @@
 package org.springblade.archive.vo;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -10,6 +11,8 @@ import java.util.List;
 @AllArgsConstructor
 @NoArgsConstructor
 public class ScanFolderVO extends ScanFolder {
+    @ApiModelProperty(value = "是否有子级")
     private Boolean hasChildren;
+    @ApiModelProperty(value = "子级节点")
     private List<ScanFolderVO> childs;
 }

+ 40 - 22
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ScanFileController.java

@@ -2,6 +2,8 @@ package org.springblade.archive.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springblade.archive.entity.ScanFile;
@@ -17,10 +19,7 @@ import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import java.util.List;
@@ -47,28 +46,16 @@ public class ScanFileController {
 
 
     @GetMapping("/startOrEndScan")
+    @ApiOperation("开始或结束扫描")
+    @ApiImplicitParams({@ApiImplicitParam(name = "contractId", value = "合同ID"),@ApiImplicitParam(name = "type", value = "1:开始扫描 0:结束扫描")})
     public R startOrEndScan(Long contractId,Integer type){
         String sql="update m_contract_info set is_scan="+type+" where id="+contractId;
         jdbcTemplate.update(sql);
         return R.success("操作成功"+ (type==1?",正在扫描中":",已结束扫描"));
     }
 
-
+    @Scheduled(fixedDelay = 120000)
     public void scan (){
-//        String sql="select * from m_contract_info where is_scan=1 and is_deleted=0";
-//        List<ContractInfo> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ContractInfo.class));
-//        if(!list.isEmpty()){
-//            for (ContractInfo contractInfo : list){
-//                CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
-//                    try {
-//                        /*===============执行批量任务===============*/
-//                        scanFileService.scanAndSave(contractInfo.getId(), Long.parseLong(contractInfo.getPId()));
-//                    } catch (Exception e) {
-//                        e.printStackTrace();
-//                    }
-//                }, executor);
-//            }
-//        }
         String sql = "select * from m_contract_info where is_scan=1 and is_deleted=0";
         List<ContractInfo> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ContractInfo.class));
         if (!list.isEmpty()) {
@@ -120,6 +107,7 @@ public class ScanFileController {
 
     @GetMapping("/getScanFolder")
     @ApiOperation("获取扫描文件夹")
+    @ApiImplicitParams({@ApiImplicitParam(name = "contractId", value = "合同ID"),@ApiImplicitParam(name = "projectId", value = "项目ID")})
     public R<List<ScanFolderVO>> getScanFolder(Long contractId, Long projectId){
         List<ScanFolderVO> list = scanFileService.getScanFolder(contractId,projectId);
         return R.data( list);
@@ -127,26 +115,56 @@ public class ScanFileController {
 
     @GetMapping("/getScanFile")
     @ApiOperation("获取扫描文件")
+    @ApiImplicitParams({@ApiImplicitParam(name = "contractId", value = "合同ID"),@ApiImplicitParam(name = "projectId", value = "项目ID"),@ApiImplicitParam(name = "folderId", value = "文件夹ID"),@ApiImplicitParam(name = "query", value = "查询参数")})
     public R<IPage<ScanFile>> getScanFile(Long contractId, Long projectId, Long folderId, Query query){
         IPage<ScanFile> page=scanFileService.getScanFile(contractId,projectId,folderId,query);
         return R.data(page);
     }
     @GetMapping("/getDetil")
     @ApiOperation("获取扫描文件详情")
+    @ApiImplicitParam(name = "id", value = "文件ID")
     public R<ScanFile> getDetil(Long id){
         return R.data(scanFileService.getById(id));
     }
     @PostMapping("/updateScanFile")
     @ApiOperation("更新扫描文件")
-    public R updateScanFile(List<ScanFile> scanFiles){
+    @ApiImplicitParam(name = "scanFiles", value = "扫描文件")
+    public R updateScanFile(@RequestBody List<ScanFile> scanFiles){
         return R.data(scanFileService.updateBatchById(scanFiles));
     }
 
     @GetMapping("/deleteScanFile")
     @ApiOperation("删除扫描文件")
-    public R deleteScanFile(List<String> fileNames){
-        return R.success(scanFileService.deleteScanFile(fileNames));
+    @ApiImplicitParam(name = "fileNames", value = "文件名称")
+    public R deleteScanFile(String ids){
+        return R.success(scanFileService.deleteScanFile(ids));
+    }
+
+    @GetMapping("/getContractStatus")
+    @ApiOperation("获取合同状态")
+    @ApiImplicitParam(name = "contractId", value = "合同ID")
+    public R<Integer> getContractStatus(Long contractId){
+        if (contractId == null) {
+            return R.data(2);
+        }
+        String sql = "SELECT is_scan FROM m_contract_info WHERE id = ?";
+        try {
+            Integer result = jdbcTemplate.queryForObject(sql, Integer.class, contractId);
+            return R.data(result != null ? result : 2);
+        } catch (Exception e) {
+            // 记录异常日志(可选)
+            System.err.println("查询合同扫描状态出错: " + e.getMessage());
+            return R.data(2);
+        }
+    }
+
+    @PostMapping("/autoRecognize")
+    @ApiOperation("自动识别")
+    @ApiImplicitParam(name = "ids", value = "文件IDs")
+    public R autoRecognize(String ids){
+       return R.status(scanFileService.autoRecognize(ids));
     }
 
 
+
 }

+ 2 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ScanFileMapper.java

@@ -21,4 +21,6 @@ public interface ScanFileMapper extends BaseMapper<ScanFile> {
     List<ScanFolder> getScanFolder(@Param("contractId") Long contractId, @Param("projectId") Long projectId);
 
     IPage<ScanFile> getScanFile(IPage<ScanFile> page, @Param("contractId") Long contractId, @Param("projectId") Long projectId, @Param("folderId") Long folderId);
+
+    void removeScan(@Param("longList") List<Long> longList);
 }

+ 7 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ScanFileMapper.xml

@@ -1,6 +1,13 @@
 <?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.ScanFileMapper">
+    <update id="removeScan">
+        update scan_file set is_deleted = 1 where project_id = #{projectId} and contract_id = #{contractId}
+        and id in
+        <foreach collection="longList" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
     <select id="exists" resultType="java.lang.Integer">
         select COUNT(*) FROM scan_file WHERE project_id = #{projectId} AND contract_id = #{contractId}  AND file_name = #{fileName}
     </select>

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

@@ -23,5 +23,7 @@ public interface ScanFileService extends IService<ScanFile> {
 
     IPage<ScanFile> getScanFile(Long contractId, Long projectId, Long folderId, Query query);
 
-    String deleteScanFile(List<String> fileNames);
+    String deleteScanFile(String ids);
+
+    Boolean autoRecognize(String ids);
 }

+ 25 - 3
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ScanFileServiceImpl.java

@@ -16,6 +16,8 @@ import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
@@ -36,10 +38,14 @@ import java.util.stream.Collectors;
 @Service
 @AllArgsConstructor
 public class ScanFileServiceImpl  extends ServiceImpl<ScanFileMapper, ScanFile> implements ScanFileService {
+//    //文件根目录
+//    private static final String ROOT_PREFIX = "D:" + File.separator + "ScanPDF";
+//    //备份文件根目录
+//    private static final String ROOT_PREFIX_back = "D:" + File.separator + "ScanBackPDF";
     //文件根目录
-    private static final String ROOT_PREFIX = "D:" + File.separator + "ScanPDF";
+    private static final String ROOT_PREFIX = "/mnt/sdc/ScanPDF";
     //备份文件根目录
-    private static final String ROOT_PREFIX_back = "D:" + File.separator + "ScanBackPDF";
+    private static final String ROOT_PREFIX_back = "/mnt/sdc/ScanBackPDF";
 
     private final ScanFolderMapper scanFolderMapper;
     private final ScanFileMapper scanFileMapper;
@@ -105,11 +111,23 @@ public class ScanFileServiceImpl  extends ServiceImpl<ScanFileMapper, ScanFile>
     }
 
     @Override
-    public String deleteScanFile(List<String>fileNames) {
+    public String deleteScanFile(String ids) {
+        List<Long> longList = Func.toLongList(ids);
+        List<ScanFile> scanFiles = baseMapper.selectList(new LambdaQueryWrapper<>(ScanFile.class).in(ScanFile::getId, longList));
+        List<String> fileNames = scanFiles.stream().filter(o-> !StringUtil.isBlank(o.getFileName())).map(o -> o.getFileName()).collect(Collectors.toList());
+        baseMapper.removeScan(longList);
         newIOSSClient.removeFiles(fileNames);
         return "";
     }
 
+    @Override
+    public Boolean autoRecognize(String ids) {
+        List<Long> longList = Func.toLongList(ids);
+        List<ScanFile> scanFiles = baseMapper.selectList(new LambdaQueryWrapper<>(ScanFile.class).in(ScanFile::getId, longList));
+
+        return true;
+    }
+
     /**
      * 入口方法:扫描并入库指定contractId的所有文件夹
      * @param contractId 传入的合同ID(对应D:\PDF下的文件夹名)
@@ -118,6 +136,7 @@ public class ScanFileServiceImpl  extends ServiceImpl<ScanFileMapper, ScanFile>
     public R scanAndSaveFolder(Long contractId, Long projectId) {
         // 1. 构建合同对应的根文件夹路径(D:\PDF\${contractId})
         String contractFolderPath = ROOT_PREFIX + File.separator + contractId;
+        System.out.println("contractFolderPath=" + contractFolderPath);
         File contractFolder = new File(contractFolderPath);
 
         // 校验根文件夹是否存在且为目录
@@ -223,6 +242,7 @@ public class ScanFileServiceImpl  extends ServiceImpl<ScanFileMapper, ScanFile>
     public R scanAndSaveFiles(Long contractId, Long projectId) {
         // 1. 构建合同对应的根文件夹路径(D:\PDF\${contractId})
         String contractFolderPath = ROOT_PREFIX + File.separator + contractId;
+        System.out.println("contractFolderPath=" + contractFolderPath);
         File contractFolder = new File(contractFolderPath);
 
         // 校验根文件夹是否存在且为目录
@@ -348,8 +368,10 @@ public class ScanFileServiceImpl  extends ServiceImpl<ScanFileMapper, ScanFile>
                     if (filePath.startsWith(ROOT_PREFIX)) {
                         // 截取原始路径中除根目录外的部分
                         String relativePath = filePath.substring(ROOT_PREFIX.length());
+                        System.out.println("relativePath: " + relativePath);
                         // 构建备份文件完整路径
                         String backupFilePath = ROOT_PREFIX_back + relativePath;
+                        System.out.println("backupFilePath: " + backupFilePath);
                         File backupFile = new File(backupFilePath);
                         // 创建备份文件所在的目录
                         File backupDir = backupFile.getParentFile();