Przeglądaj źródła

扫描仓库新增上传

cr 1 tydzień temu
rodzic
commit
8dba2721cf

+ 15 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/dto/AddScanFileDto.java

@@ -0,0 +1,15 @@
+package org.springblade.archive.dto;
+
+import lombok.Data;
+
+@Data
+public class AddScanFileDto {
+    private Long projectId;
+    private Long contractId;
+    private String fileName;
+    private Long forderId;
+    private Integer fileSize;
+    private String ossUrl;
+    private String responsible;
+    private String fileDate;
+}

+ 2 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ScanFile.java

@@ -33,6 +33,8 @@ public class ScanFile {
     private String fileNum;
     @ApiModelProperty(value = "文件题名")
     private String fileName;
+    @ApiModelProperty(value = "文件名")
+    private String fileNameSuffix;
     @ApiModelProperty(value = "文件页数")
     private String fileSize;
     @ApiModelProperty(value = "文件日期")

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

@@ -15,4 +15,6 @@ public class ScanFolderVO extends ScanFolder {
     private Boolean hasChildren;
     @ApiModelProperty(value = "子级节点")
     private List<ScanFolderVO> childs;
+    @ApiModelProperty(value = "是否可以删除")
+    private Boolean isRemove;
 }

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

@@ -1,17 +1,25 @@
 package org.springblade.archive.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.itextpdf.text.pdf.PdfDictionary;
+import com.itextpdf.text.pdf.PdfReader;
 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.apache.pdfbox.io.MemoryUsageSetting;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
+import org.springblade.archive.dto.AddScanFileDto;
 import org.springblade.archive.dto.ScanFileMoveDTO;
 import org.springblade.archive.entity.ScanFile;
 import org.springblade.archive.entity.ScanFolder;
 import org.springblade.archive.service.ScanFileService;
 import org.springblade.archive.service.ScanFolderService;
 import org.springblade.archive.vo.ScanFolderVO;
+import org.springblade.business.entity.ArchiveFile;
+import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.manager.entity.ContractInfo;
@@ -23,6 +31,11 @@ import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.io.InputStream;
+import java.net.URLEncoder;
+import java.time.LocalTime;
+import java.util.Collection;
+import java.util.Date;
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ThreadPoolExecutor;
@@ -32,6 +45,8 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 @RestController
 @AllArgsConstructor
@@ -121,6 +136,22 @@ public class ScanFileController {
         IPage<ScanFile> page=scanFileService.getScanFile(contractId,projectId,folderId,query,move);
         return R.data(page);
     }
+    @PostMapping("/addScanFolder")
+    @ApiOperation("新增节点扫描文件夹")
+    public R addScanFolder(Long projectId,Long contractId,Long parentId,String forderName){
+        return R.status(scanFileService.addScanFolder(projectId,contractId,parentId,forderName));
+    }
+    @PostMapping("/addScanFile")
+    @ApiOperation("新增节点扫描文件")
+    public R addScanFile(@RequestBody List<AddScanFileDto>list){
+        return R.status(scanFileService.addScanFile(list));
+    }
+    @GetMapping("/deleteScanFolder")
+    @ApiOperation("删除扫描文件夹")
+    @ApiImplicitParam(name = "id", value = "文件夹ID")
+    public R deleteScanFolder(@RequestParam Long id){
+        return R.status(scanFileService.deleteScanFolder(id));
+    }
     @GetMapping("/getDetil")
     @ApiOperation("获取扫描文件详情")
     @ApiImplicitParam(name = "id", value = "文件ID")

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

@@ -22,5 +22,5 @@ public interface ScanFileMapper extends BaseMapper<ScanFile> {
 
     IPage<ScanFile> getScanFile(IPage<ScanFile> page, @Param("contractId") Long contractId, @Param("projectId") Long projectId, @Param("folderId") Long folderId,@Param("move")Integer  move);
 
-    void removeScan(@Param("longList") List<Long> longList);
+    void removeScan(@Param("longList") List<Long> longList, @Param("projectId")Long projectId, @Param("contractId")Long contractId);
 }

+ 4 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ScanFolderMapper.java

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.archive.entity.ScanFolder;
 
+import java.util.List;
+
 public interface ScanFolderMapper extends BaseMapper<ScanFolder> {
 
     int exists(@Param("projectId") Long projectId, @Param("contractId") Long contractId, @Param("folderName") String folderName);
@@ -12,4 +14,6 @@ public interface ScanFolderMapper extends BaseMapper<ScanFolder> {
 
 
     Long getId(@Param("folderName") String folderName, @Param("contractId") Long contractId, @Param("projectId") Long projectId);
+
+    List<ScanFolder> selectAllChildren(@Param("id") Long id);
 }

+ 3 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ScanFolderMapper.xml

@@ -9,4 +9,7 @@
     <select id="getId" resultType="java.lang.Long">
         select id from scan_folder where project_id = #{projectId} AND contract_id = #{contractId} AND folder_name = #{folderName}
     </select>
+    <select id="selectAllChildren" resultType="org.springblade.archive.entity.ScanFolder">
+        CALL GetScanFolderChildren(#{id})
+    </select>
 </mapper>

+ 7 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/ScanFileService.java

@@ -2,6 +2,7 @@ package org.springblade.archive.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.archive.dto.AddScanFileDto;
 import org.springblade.archive.entity.ScanFile;
 import org.springblade.archive.vo.ScanFolderVO;
 import org.springblade.core.mp.support.Query;
@@ -28,4 +29,10 @@ public interface ScanFileService extends IService<ScanFile> {
     Boolean autoRecognize(String ids);
 
     boolean moveScanFile(List<Long> ids, Long nodeId);
+
+    boolean addScanFolder(Long projectId, Long contractId ,Long parentId, String forderName);
+
+    boolean addScanFile(List<AddScanFileDto>list);
+
+    boolean deleteScanFolder(Long id);
 }

+ 100 - 7
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ScanFileServiceImpl.java

@@ -6,17 +6,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
+import org.springblade.archive.dto.AddScanFileDto;
 import org.springblade.archive.entity.ArchivesAuto;
 import org.springblade.archive.entity.ScanFile;
 import org.springblade.archive.entity.ScanFolder;
 import org.springblade.archive.mapper.ScanFileMapper;
 import org.springblade.archive.mapper.ScanFolderMapper;
 import org.springblade.archive.service.ScanFileService;
+import org.springblade.archive.service.ScanFolderService;
 import org.springblade.archive.utils.FileUtils;
 import org.springblade.archive.vo.ScanFolderVO;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.feign.ArchiveFileClient;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tool.api.R;
@@ -61,8 +64,7 @@ public class ScanFileServiceImpl  extends ServiceImpl<ScanFileMapper, ScanFile>
     private final ArchiveTreeContractClient archiveTreeContractClient;
     private final JdbcTemplate jdbcTemplate;
     private final ArchiveFileClient archiveFileClient;
-
-
+    private final ScanFolderService scanFolderService;
 
 
     @Override
@@ -97,6 +99,8 @@ public class ScanFileServiceImpl  extends ServiceImpl<ScanFileMapper, ScanFile>
         List<ScanFolderVO> result = new ArrayList<>();
 
         for (ScanFolderVO vo : voList) {
+            List<ScanFolder> scanFolders = scanFolderMapper.selectAllChildren(vo.getId());
+            vo.setIsRemove(scanFolders.isEmpty());
             Long parentId = vo.getParentId();
             if (parentId == null || parentId == 0) {
                 // 没有父节点的作为根节点
@@ -110,7 +114,6 @@ public class ScanFileServiceImpl  extends ServiceImpl<ScanFileMapper, ScanFile>
                 }
             }
         }
-
         return result;
 
     }
@@ -126,10 +129,10 @@ public class ScanFileServiceImpl  extends ServiceImpl<ScanFileMapper, ScanFile>
     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);
+        List<String> fileNames = scanFiles.stream().filter(o-> !StringUtil.isBlank(o.getOssUrl())).map(o -> (FileUtils.getAliYunSubUrl(o.getOssUrl()))).collect(Collectors.toList());
+        baseMapper.removeScan(longList,scanFiles.get(0).getProjectId(),scanFiles.get(0).getContractId());
         newIOSSClient.removeFiles(fileNames);
-        return "";
+        return "删除成功";
     }
 
     @Override
@@ -185,6 +188,95 @@ public class ScanFileServiceImpl  extends ServiceImpl<ScanFileMapper, ScanFile>
         }
     }
 
+    @Override
+    public boolean addScanFolder(Long projectId, Long contractId, Long parentId, String forderName) {
+            ScanFolder scanFolder = new ScanFolder();
+            scanFolder.setId(SnowFlakeUtil.getId());
+            scanFolder.setProjectId(projectId);
+            scanFolder.setContractId(contractId);
+            scanFolder.setFolderName(forderName);
+            scanFolder.setParentId(parentId);
+            scanFolder.setIsDeleted(0);
+//            String folderPath="";
+//            if(parentId!=0){
+//                ScanFolder fatherFolder = scanFolderMapper.selectById(parentId);
+//                if (fatherFolder!=null){
+//                    String fatherPath = fatherFolder.getFolderPath();
+//                    folderPath=fatherPath+"/"+forderName;
+//                }
+//            }else {
+//                 folderPath=ROOT_PREFIX+"/"+contractId+"/"+forderName;
+//            }
+//            File folder = new File(folderPath);
+//           if (!folder.exists()) {
+//             boolean created = folder.mkdirs();
+//             if (!created) {
+//                throw new ServiceException("创建文件夹失败");
+//             }
+//           }
+//          scanFolder.setFolderPath(folderPath);
+          int insert = scanFolderMapper.insert(scanFolder);
+          return insert == 1;
+    }
+
+    @Override
+    public boolean addScanFile(List<AddScanFileDto>list) {
+        List<ScanFile>fileList=new ArrayList<>();
+        Integer digitalNum = baseMapper.selectMaxDigitalNum(list.get(0).getContractId(), list.get(0).getProjectId());
+        if(digitalNum==null||digitalNum<1){
+            digitalNum=0;
+        }
+        Integer sort = baseMapper.selectMaxSort(list.get(0).getContractId(), list.get(0).getProjectId(), list.get(0).getForderId());
+        if(sort==null||sort<1){
+            sort=0;
+        }
+        for (AddScanFileDto dto : list) {
+            ScanFile file = new ScanFile();
+            BeanUtils.copyProperties(dto,file);
+            if(dto.getFileName().indexOf(".")>0&&dto.getFileName().indexOf("pdf")>0){
+                file.setFileName(dto.getFileName().substring(0,dto.getFileName().lastIndexOf(".")));
+            }else {
+                file.setFileName(dto.getFileName());
+            }
+            file.setFileNameSuffix(dto.getFileName());
+            file.setId(SnowFlakeUtil.getId());
+            file.setDigitalNum(++digitalNum);
+            file.setSort(++sort);
+            file.setIsDeleted(0);
+            file.setIsMove(0);
+            fileList.add(file);
+        }
+        return this.saveBatch(fileList);
+    }
+
+    @Override
+    public boolean deleteScanFolder(Long id) {
+        List<ScanFolder> scanFolders = scanFolderMapper.selectAllChildren(id);
+        List<Long> longList = scanFolders.stream().map(ScanFolder::getId).collect(Collectors.toList());
+        List<ScanFile> scanFiles = baseMapper.selectList(new LambdaQueryWrapper<>(ScanFile.class).in(ScanFile::getFolderId, longList));
+        if(!scanFiles.isEmpty()){
+            throw new ServiceException("当前节点或子节点存在文件,无法删除");
+        }
+        for (ScanFolder folder : scanFolders) {
+            scanFolderMapper.deleteById(folder.getId());
+            //this.deleteScanFolderLinux(folder.getId());
+        }
+        return true;
+    }
+
+    private void deleteScanFolderLinux(Long id) {
+        ScanFolder scanFolder = scanFolderMapper.selectById(id);
+        if (scanFolder != null&&scanFolder.getFolderPath()!=null){
+            File folder = new File(scanFolder.getFolderPath());
+            if (folder.exists()) {
+                boolean deleted = folder.delete();
+                if (!deleted) {
+                    throw new ServiceException("删除文件夹失败");
+                }
+            }
+        }
+    }
+
     /**
      * 入口方法:扫描并入库指定contractId的所有文件夹
      * @param contractId 传入的合同ID(对应D:\PDF下的文件夹名)
@@ -409,7 +501,8 @@ public class ScanFileServiceImpl  extends ServiceImpl<ScanFileMapper, ScanFile>
                     null,//序号
                     null,//数字编号
                     null,//文件编号
-                    fileName,
+                    fileName.substring(0,fileName.lastIndexOf(".")),//文件题名
+                    fileName,//文件名
                     pdfNum,//文件页数
                     null,//文件日期
                     createTime,