Explorar el Código

完成一键扫描相关功能

wukai hace 2 años
padre
commit
b9e7c9d9c5
Se han modificado 22 ficheros con 1238 adiciones y 55 borrados
  1. 2 2
      doc-admin/src/main/resources/application-dev.yml
  2. 5 7
      doc-admin/src/test/java/Test.java
  3. 8 27
      doc-biz/src/main/java/com/doc/biz/controller/DocInfoController.java
  4. 10 0
      doc-biz/src/main/java/com/doc/biz/service/IDocInfoService.java
  5. 23 0
      doc-biz/src/main/java/com/doc/biz/service/impl/DocInfoServiceImpl.java
  6. 6 2
      doc-biz/src/main/java/com/doc/biz/service/impl/ElasticSearchServiceImpl.java
  7. 4 16
      doc-biz/src/main/java/com/doc/biz/service/impl/MongoServiceImpl.java
  8. 1 1
      doc-biz/src/main/java/com/doc/ftp/Sm2Ftp.java
  9. 253 0
      doc-biz/src/main/java/com/doc/scanner/controller/ScannerInfoController.java
  10. 169 0
      doc-biz/src/main/java/com/doc/scanner/domain/ScannerFtp.java
  11. 76 0
      doc-biz/src/main/java/com/doc/scanner/domain/ScannerInfo.java
  12. 62 0
      doc-biz/src/main/java/com/doc/scanner/mapper/ScannerFtpMapper.java
  13. 62 0
      doc-biz/src/main/java/com/doc/scanner/mapper/ScannerInfoMapper.java
  14. 61 0
      doc-biz/src/main/java/com/doc/scanner/service/IScannerFtpService.java
  15. 61 0
      doc-biz/src/main/java/com/doc/scanner/service/IScannerInfoService.java
  16. 86 0
      doc-biz/src/main/java/com/doc/scanner/service/impl/ScannerFtpServiceImpl.java
  17. 89 0
      doc-biz/src/main/java/com/doc/scanner/service/impl/ScannerInfoServiceImpl.java
  18. 28 0
      doc-biz/src/main/java/com/doc/vo/ScannerVO.java
  19. 90 0
      doc-biz/src/main/resources/mapper/scanner/ScannerFtpMapper.xml
  20. 122 0
      doc-biz/src/main/resources/mapper/scanner/ScannerInfoMapper.xml
  21. 5 0
      doc-common/src/main/java/com/doc/common/utils/encrypt/Sm3Util.java
  22. 15 0
      doc-common/src/main/java/com/doc/common/utils/file/FileUtils.java

+ 2 - 2
doc-admin/src/main/resources/application-dev.yml

@@ -105,5 +105,5 @@ spring:
 # 日志配置
 logging:
   level:
-    com.doc: info
-    org.springframework: info
+    com.doc: debug
+    org.springframework: warn

+ 5 - 7
doc-admin/src/test/java/Test.java

@@ -1,3 +1,5 @@
+import java.io.File;
+
 /**
  * Test$
  *
@@ -7,13 +9,9 @@
 public class Test {
     public static void main(String[] args) {
         try {
-            String cmd = " /usr/local/mysql/bin/mysqldump -h192.168.1.28 -P3306 -uroot -p123456 --default-character-set=utf8 doc >/tmp/test.sql";
-            Process exec = Runtime.getRuntime().exec(cmd);
-            if (exec.waitFor() == 0) {
-                System.out.println("数据库备份成功");
-            } else {
-                System.out.println("process.waitFor()=" + exec.waitFor());
-            }
+            File f = new File("D:\\ruoyi\\uploadPath\\scanner\\user16\\test3.png");
+            System.err.println(f.getName());
+            System.err.println(f.getPath());
         } catch (Exception e) {
             e.printStackTrace();
         }

+ 8 - 27
doc-biz/src/main/java/com/doc/biz/controller/DocInfoController.java

@@ -60,8 +60,8 @@ public class DocInfoController extends BaseController {
     /**
      * 文件上传
      *
-     * @param file
-     * @return
+     * @param file 文件
+     * @return 上传结果
      */
     @ApiOperation("文件上传-单文件")
     @Log(title = "文件基本信息表", businessType = BusinessType.INSERT, eventLevel = EventLevel.MIDDLE)
@@ -69,7 +69,7 @@ public class DocInfoController extends BaseController {
     public AjaxResult uploadFile(@ApiParam(value = "文件", required = true) @RequestPart(value = "file") MultipartFile file, @ApiParam(value = "空间ID", required = true) @RequestParam Long spaceId, @ApiParam(value = "目录ID", required = true) @RequestParam Long dirId) {
         try {
             DocumentVO vo = mongoService.uploadFile(file);
-            process(vo, spaceId, dirId);
+            docInfoService.upload(vo, spaceId, dirId);
             return success();
         } catch (Exception e) {
             log.error("文件上传失败:", e);
@@ -80,16 +80,16 @@ public class DocInfoController extends BaseController {
     /**
      * 多文件上传
      *
-     * @param files
-     * @return
+     * @param files 文件列表
+     * @return 返回
      */
     @ApiOperation("文件上传-多文件")
     @PostMapping("/uploadFiles")
     @Log(title = "文件基本信息表", businessType = BusinessType.INSERT, eventLevel = EventLevel.MIDDLE)
     public AjaxResult uploadFile(@ApiParam(value = "文件", required = true) @RequestPart(value = "files") List<MultipartFile> files, @ApiParam(value = "空间ID", required = true) @RequestParam Long spaceId, @ApiParam(value = "目录ID", required = true) @RequestParam Long dirId) {
         try {
-            mongoService.uploadFiles(files).stream().forEach(vo -> {
-                process(vo, spaceId, dirId);
+            mongoService.uploadFiles(files).forEach(vo -> {
+                docInfoService.upload(vo, spaceId, dirId);
             });
             return success();
         } catch (Exception e) {
@@ -97,25 +97,6 @@ public class DocInfoController extends BaseController {
         }
     }
 
-    /**
-     * 文件上传之后的操作
-     *
-     * @param vo      上传对象
-     * @param spaceId 空间ID
-     * @param dirId   目录ID
-     */
-    private DocInfo process(DocumentVO vo, Long spaceId, Long dirId) {
-        DocInfo docInfo = new DocInfo();
-        docInfo.setSpaceId(spaceId);
-        docInfo.setDirId(dirId);
-        docInfo.setFileId(vo.getFileId());
-        docInfo.setFileName(vo.getFileName());
-        docInfo.setFileSize(vo.getFileSize());
-        docInfo.setFileType(vo.getSuffix());
-        docInfo.setCreateBy(SecurityUtils.getUsername());
-        docInfoService.insertDocInfo(docInfo);
-        return docInfo;
-    }
 
     /**
      * 新建文件
@@ -155,7 +136,7 @@ public class DocInfoController extends BaseController {
             InputStream is = this.getClass().getResourceAsStream("/" + filePath);
             MultipartFile multipartFile = FileUtils.getMultipartFile(is, fileName);
             DocumentVO vo = mongoService.uploadFile(multipartFile);
-            DocInfo docInfo = process(vo, spaceId, dirId);
+            DocInfo docInfo = docInfoService.upload(vo, spaceId, dirId);
             return success(docInfo);
         } catch (Exception e) {
             log.error("新建文件出错啦:{}", e.getMessage());

+ 10 - 0
doc-biz/src/main/java/com/doc/biz/service/IDocInfoService.java

@@ -1,6 +1,7 @@
 package com.doc.biz.service;
 
 import com.doc.biz.domain.DocInfo;
+import com.doc.biz.vo.DocumentVO;
 
 import java.util.List;
 
@@ -74,4 +75,13 @@ public interface IDocInfoService {
      */
     void updateDocInfoByOnlyOffice(DocInfo info);
 
+    /**
+     * 文件上传之后的操作
+     *
+     * @param vo      上传对象
+     * @param spaceId 空间ID
+     * @param dirId   目录ID
+     * @return 对象
+     */
+    DocInfo upload(DocumentVO vo, Long spaceId, Long dirId);
 }

+ 23 - 0
doc-biz/src/main/java/com/doc/biz/service/impl/DocInfoServiceImpl.java

@@ -7,6 +7,7 @@ import com.doc.biz.service.IDocFavoriteService;
 import com.doc.biz.service.IDocInfoService;
 import com.doc.biz.service.IDocSpaceService;
 import com.doc.biz.service.IElasticSearchService;
+import com.doc.biz.vo.DocumentVO;
 import com.doc.common.utils.DateUtils;
 import com.doc.common.utils.SecurityUtils;
 import com.doc.common.utils.StringUtils;
@@ -72,6 +73,28 @@ public class DocInfoServiceImpl implements IDocInfoService {
     }
 
     /**
+     * 文件上传之后的操作
+     *
+     * @param vo      上传对象
+     * @param spaceId 空间ID
+     * @param dirId   目录ID
+     * @return 对象
+     */
+    @Override
+    public DocInfo upload(DocumentVO vo, Long spaceId, Long dirId) {
+        DocInfo docInfo = new DocInfo();
+        docInfo.setSpaceId(spaceId);
+        docInfo.setDirId(dirId);
+        docInfo.setFileId(vo.getFileId());
+        docInfo.setFileName(vo.getFileName());
+        docInfo.setFileSize(vo.getFileSize());
+        docInfo.setFileType(vo.getSuffix());
+        docInfo.setCreateBy(SecurityUtils.getUsername());
+        insertDocInfo(docInfo);
+        return docInfo;
+    }
+
+    /**
      * 查询文件基本信息表列表
      *
      * @param docInfo 文件基本信息表

+ 6 - 2
doc-biz/src/main/java/com/doc/biz/service/impl/ElasticSearchServiceImpl.java

@@ -54,8 +54,12 @@ public class ElasticSearchServiceImpl implements IElasticSearchService {
         String content = getContent(handlerMap, fileType, info.getFileId());
         if (StringUtils.isNotEmpty(content)) {
             comboIndex(info.getSpaceId());
-            EsDocInfo esDocInfo = new EsDocInfo(info.getDocId(), content);
-            esDocInfoService.save(esDocInfo);
+            try {
+                EsDocInfo esDocInfo = new EsDocInfo(info.getDocId(), content);
+                esDocInfoService.save(esDocInfo);
+            } catch (Exception e) {
+                log.error("解析文件错误???{}", e.getMessage());
+            }
         }
     }
 

+ 4 - 16
doc-biz/src/main/java/com/doc/biz/service/impl/MongoServiceImpl.java

@@ -6,6 +6,7 @@ import com.doc.biz.mapper.MongoFileRepository;
 import com.doc.biz.service.IMongoService;
 import com.doc.biz.vo.DocumentVO;
 import com.doc.common.constant.Constants;
+import com.doc.common.utils.file.FileUtils;
 import com.doc.common.utils.sign.Md5Utils;
 import com.mongodb.client.gridfs.GridFSBucket;
 import com.mongodb.client.gridfs.GridFSDownloadStream;
@@ -180,7 +181,7 @@ public class MongoServiceImpl implements IMongoService {
      * @throws Exception
      */
     public DocumentVO saveBinaryFile(MultipartFile file) throws Exception {
-        String suffix = getFileSuffix(file);
+        String suffix = FileUtils.getFileSuffix(file);
         try (InputStream in = file.getInputStream()) {
             DocumentFile documentFile = mongoFileRepository.save(
                     DocumentFile.builder()
@@ -210,7 +211,7 @@ public class MongoServiceImpl implements IMongoService {
      * @throws Exception
      */
     public DocumentVO saveGridFsFile(MultipartFile file) throws Exception {
-        String suffix = getFileSuffix(file);
+        String suffix = FileUtils.getFileSuffix(file);
         try (InputStream in = file.getInputStream()) {
             String gridFsId = this.storeFileToGridFS(in, file.getOriginalFilename(), file.getContentType());
             DocumentFile documentFile = mongoFileRepository.save(
@@ -261,6 +262,7 @@ public class MongoServiceImpl implements IMongoService {
      * @param id 文件id
      * @return 对象
      */
+    @Override
     public DocumentVO copy(String id) {
         Optional<DocumentFile> optional = mongoFileRepository.findById(id);
         DocumentFile file = optional.get();
@@ -288,18 +290,4 @@ public class MongoServiceImpl implements IMongoService {
 
         return Optional.empty();
     }
-
-    /**
-     * 获取文件后缀
-     *
-     * @param file
-     * @return
-     */
-    private String getFileSuffix(MultipartFile file) {
-        String suffix = "";
-        if (Objects.requireNonNull(file.getOriginalFilename()).contains(".")) {
-            suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
-        }
-        return suffix;
-    }
 }

+ 1 - 1
doc-biz/src/main/java/com/doc/ftp/Sm2Ftp.java

@@ -18,7 +18,7 @@ public class Sm2Ftp implements PasswordEncryptor {
 
     @Override
     public boolean matches(String passwordToCheck, String storedPassword) {
-        return storedPassword.equals(Sm2Util.encrypt(passwordToCheck));
+        return passwordToCheck.equals(Sm2Util.decrypt(storedPassword));
     }
 
     public static void main(String[] args) {

+ 253 - 0
doc-biz/src/main/java/com/doc/scanner/controller/ScannerInfoController.java

@@ -0,0 +1,253 @@
+package com.doc.scanner.controller;
+
+import com.doc.biz.service.IDocInfoService;
+import com.doc.biz.service.IMongoService;
+import com.doc.biz.vo.DocumentVO;
+import com.doc.common.annotation.Log;
+import com.doc.common.config.RuoYiConfig;
+import com.doc.common.core.controller.BaseController;
+import com.doc.common.core.domain.AjaxResult;
+import com.doc.common.core.page.TableDataInfo;
+import com.doc.common.enums.BusinessType;
+import com.doc.common.enums.EventLevel;
+import com.doc.common.utils.SecurityUtils;
+import com.doc.common.utils.encrypt.Sm2Util;
+import com.doc.common.utils.file.FileUtils;
+import com.doc.common.utils.poi.ExcelUtil;
+import com.doc.scanner.domain.ScannerFtp;
+import com.doc.scanner.domain.ScannerInfo;
+import com.doc.scanner.service.IScannerFtpService;
+import com.doc.scanner.service.IScannerInfoService;
+import com.doc.vo.ScannerVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * 扫描仪管理Controller
+ *
+ * @author wukai
+ * @date 2023-11-28
+ */
+@Api(tags = "扫描仪管理")
+@RestController
+@RequestMapping("/scanner/info")
+public class ScannerInfoController extends BaseController {
+    @Resource
+    private IScannerInfoService scannerInfoService;
+    @Resource
+    private IScannerFtpService scannerFtpService;
+    @Resource
+    private IDocInfoService docInfoService;
+    @Resource
+    private IMongoService mongoService;
+    @Value("${ftp.port}")
+    private int port;
+
+    /**
+     * 查询扫描仪管理列表
+     */
+    @ApiOperation("查询扫描仪管理列表")
+    @PreAuthorize("@ss.hasPermi('scanner:info:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(ScannerInfo scannerInfo) {
+        startPage();
+        List<ScannerInfo> list = scannerInfoService.selectScannerInfoList(scannerInfo);
+        list.forEach(info -> {
+            info.setPort(port);
+        });
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询扫描仪管理列表
+     */
+    @ApiOperation("查询可用扫描仪")
+    @GetMapping("/select")
+    public TableDataInfo select(ScannerInfo scannerInfo) {
+        startPage();
+        Map<String, Object> params = new HashMap<>(3);
+        params.put("select", "1");
+        params.put("deptId", SecurityUtils.getDeptId());
+        scannerInfo.setParams(params);
+        List<ScannerInfo> list = scannerInfoService.selectScannerInfoList(scannerInfo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 读取目录下的所有文件
+     *
+     * @param dir   目录
+     * @param files 文件列表
+     * @return
+     */
+    private void findFileList(File dir, List<File> files) {
+        if (!dir.exists() || !dir.isDirectory()) {
+            // 判断是否存在目录
+            return;
+        }
+        File[] fileList = dir.listFiles();
+        for (File file : fileList) {
+            if (file.isFile()) {
+                // 如果文件
+                // 添加文件全路径名
+                files.add(file);
+            } else {
+                // 如果是目录
+                // 回调自身继续查询
+                findFileList(file, files);
+            }
+        }
+    }
+
+    @ApiOperation("根据扫描仪ID获取文件")
+    @GetMapping(value = "/files/{scannerId}")
+    public AjaxResult files(@PathVariable("scannerId") Long scannerId) {
+        ScannerFtp ftp = scannerFtpService.selectScannerFtpByUserid("user" + scannerId);
+        List<File> files = new ArrayList<>();
+        findFileList(new File(ftp.getHomedirectory()), files);
+        List<Map<String, String>> list = new ArrayList<>();
+        for (File f : files) {
+            File base = new File(RuoYiConfig.getProfile());
+            String path = f.getPath().replace(base.getPath(), "/profile");
+            Map<String, String> map = new HashMap<>(16);
+            map.put("name", f.getName());
+            map.put("path", path);
+            map.put("q", Sm2Util.encrypt(f.getPath()));
+            list.add(map);
+        }
+
+        return success(list);
+    }
+
+    @ApiOperation("认领扫描文件")
+    @PostMapping(value = "/claim")
+    @Log(title = "扫描仪管理", businessType = BusinessType.INSERT, eventLevel = EventLevel.MIDDLE)
+    public AjaxResult claim(@RequestBody ScannerVO obj) {
+        AtomicInteger index = new AtomicInteger(1);
+        obj.getQ().forEach(q -> {
+            String path = Sm2Util.decrypt(q);
+            File f = new File(path);
+            try (FileInputStream input = new FileInputStream(f);) {
+                String name = index.get() == 1 ? obj.getName() : obj.getName() + index;
+                index.getAndIncrement();
+                name += path.substring(path.lastIndexOf("."));
+                MultipartFile file = FileUtils.getMultipartFile(input, name);
+
+                DocumentVO vo = mongoService.uploadFile(file);
+                docInfoService.upload(vo, obj.getSpaceId(), obj.getDirId());
+
+                FileUtils.deleteFile(path);
+            } catch (Exception e) {
+                logger.error("认领出错啦:{}", e.getMessage());
+            }
+
+        });
+        return success(1);
+    }
+
+
+    /**
+     * 导出扫描仪管理列表
+     */
+    @ApiOperation("导出扫描仪管理列表")
+    @PreAuthorize("@ss.hasPermi('scanner:info:export')")
+    @Log(title = "扫描仪管理", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ScannerInfo scannerInfo) {
+        List<ScannerInfo> list = scannerInfoService.selectScannerInfoList(scannerInfo);
+        ExcelUtil<ScannerInfo> util = new ExcelUtil<ScannerInfo>(ScannerInfo.class);
+        util.exportExcel(response, list, "扫描仪管理数据");
+    }
+
+    /**
+     * 获取扫描仪管理详细信息
+     */
+    @ApiOperation("获取扫描仪管理详细信息")
+    @PreAuthorize("@ss.hasPermi('scanner:info:query')")
+    @GetMapping(value = "/{scannerId}")
+    public AjaxResult getInfo(@PathVariable("scannerId") Long scannerId) {
+        return success(scannerInfoService.selectScannerInfoByScannerId(scannerId));
+    }
+
+    /**
+     * 新增扫描仪管理
+     */
+    @ApiOperation("新增扫描仪管理")
+    @PreAuthorize("@ss.hasPermi('scanner:info:add')")
+    @Log(title = "扫描仪管理", businessType = BusinessType.INSERT, eventLevel = EventLevel.MIDDLE)
+    @PostMapping
+    public AjaxResult add(@RequestBody ScannerInfo scannerInfo) throws IOException {
+        String y = "Y";
+        if (!y.equals(scannerInfo.getIsPublic())) {
+            scannerInfo.setDeptId(SecurityUtils.getDeptId());
+        }
+        scannerInfo.setCreateBy(SecurityUtils.getUsername());
+        scannerInfoService.insertScannerInfo(scannerInfo);
+
+        //4位随机密码
+        String name = "user" + scannerInfo.getScannerId();
+        String pass = new Random().nextInt(9000) + 1000 + "";
+        ScannerFtp ftp = new ScannerFtp();
+        ftp.setUserid(name);
+        ftp.setUserpassword(Sm2Util.encrypt(pass));
+        ftp.setEnableflag("true");
+        ftp.setWritepermission("true");
+        String dir = RuoYiConfig.getProfile() + File.separator + "scanner" + File.separator + name;
+        ftp.setHomedirectory(dir);
+        scannerFtpService.insertScannerFtp(ftp);
+
+        try {
+            //创建目录
+            Files.createDirectories(Paths.get(dir));
+        } catch (IOException ignored) {
+            //不用管,表示已经有该目录
+        }
+        scannerInfo.setUser(name);
+        scannerInfo.setPass(ftp.getUserpassword());
+        scannerInfo.setPort(port);
+        return AjaxResult.success(scannerInfo);
+    }
+
+    /**
+     * 修改扫描仪管理
+     */
+    @ApiOperation("修改扫描仪管理")
+    @PreAuthorize("@ss.hasPermi('scanner:info:edit')")
+    @Log(title = "扫描仪管理", businessType = BusinessType.UPDATE, eventLevel = EventLevel.MIDDLE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody ScannerInfo scannerInfo) {
+        return toAjax(scannerInfoService.updateScannerInfo(scannerInfo));
+    }
+
+    /**
+     * 删除扫描仪管理
+     */
+    @ApiOperation("删除扫描仪管理")
+    @PreAuthorize("@ss.hasPermi('scanner:info:remove')")
+    @Log(title = "扫描仪管理", businessType = BusinessType.DELETE, eventLevel = EventLevel.MIDDLE)
+    @DeleteMapping("/{scannerIds}")
+    public AjaxResult remove(@PathVariable Long[] scannerIds) {
+        for (Long id : scannerIds) {
+            try {
+                scannerFtpService.deleteScannerFtpByUserid("user" + id);
+            } catch (Exception ignored) {
+            }
+
+        }
+        return toAjax(scannerInfoService.deleteScannerInfoByScannerIds(scannerIds));
+    }
+}

+ 169 - 0
doc-biz/src/main/java/com/doc/scanner/domain/ScannerFtp.java

@@ -0,0 +1,169 @@
+package com.doc.scanner.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.doc.common.annotation.Excel;
+import com.doc.common.core.domain.BaseEntity;
+
+/**
+ * ftp用户信息对象 scanner_ftp
+ *
+ * @author wukai
+ * @date 2023-11-28
+ */
+@ApiModel(value = "ScannerFtp", description = "ftp用户信息")
+public class ScannerFtp extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 用户名 */
+    @ApiModelProperty("用户名")
+    @TableId
+    private String userid;
+
+    /** 密码 */
+    @ApiModelProperty("密码")
+    private String userpassword;
+
+    /** 默认目录 */
+    @ApiModelProperty("默认目录")
+    private String homedirectory;
+
+    /** 是否可用 */
+    @ApiModelProperty("是否可用")
+    private String enableflag;
+
+    /** 是否有上传权限 */
+    @ApiModelProperty("是否有上传权限")
+    private String writepermission;
+
+    /** 空闲时间 */
+    @ApiModelProperty("空闲时间")
+    private Long idletime;
+
+    /** 上传速率限制 */
+    @ApiModelProperty("上传速率限制")
+    private Long uploadrate;
+
+    /** 下载速率限制 */
+    @ApiModelProperty("下载速率限制")
+    private Long downloadrate;
+
+    /** 最大登录用户数 */
+    @ApiModelProperty("最大登录用户数")
+    private Long maxloginnumber;
+
+    /** 同IP登录数 */
+    @ApiModelProperty("同IP登录数")
+    private Long maxloginperip;
+
+    public void setUserid(String userid)
+    {
+        this.userid = userid;
+    }
+
+    public String getUserid()
+    {
+        return userid;
+    }
+    public void setUserpassword(String userpassword)
+    {
+        this.userpassword = userpassword;
+    }
+
+    public String getUserpassword()
+    {
+        return userpassword;
+    }
+    public void setHomedirectory(String homedirectory)
+    {
+        this.homedirectory = homedirectory;
+    }
+
+    public String getHomedirectory()
+    {
+        return homedirectory;
+    }
+    public void setEnableflag(String enableflag)
+    {
+        this.enableflag = enableflag;
+    }
+
+    public String getEnableflag()
+    {
+        return enableflag;
+    }
+    public void setWritepermission(String writepermission)
+    {
+        this.writepermission = writepermission;
+    }
+
+    public String getWritepermission()
+    {
+        return writepermission;
+    }
+    public void setIdletime(Long idletime)
+    {
+        this.idletime = idletime;
+    }
+
+    public Long getIdletime()
+    {
+        return idletime;
+    }
+    public void setUploadrate(Long uploadrate)
+    {
+        this.uploadrate = uploadrate;
+    }
+
+    public Long getUploadrate()
+    {
+        return uploadrate;
+    }
+    public void setDownloadrate(Long downloadrate)
+    {
+        this.downloadrate = downloadrate;
+    }
+
+    public Long getDownloadrate()
+    {
+        return downloadrate;
+    }
+    public void setMaxloginnumber(Long maxloginnumber)
+    {
+        this.maxloginnumber = maxloginnumber;
+    }
+
+    public Long getMaxloginnumber()
+    {
+        return maxloginnumber;
+    }
+    public void setMaxloginperip(Long maxloginperip)
+    {
+        this.maxloginperip = maxloginperip;
+    }
+
+    public Long getMaxloginperip()
+    {
+        return maxloginperip;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("userid", getUserid())
+            .append("userpassword", getUserpassword())
+            .append("homedirectory", getHomedirectory())
+            .append("enableflag", getEnableflag())
+            .append("writepermission", getWritepermission())
+            .append("idletime", getIdletime())
+            .append("uploadrate", getUploadrate())
+            .append("downloadrate", getDownloadrate())
+            .append("maxloginnumber", getMaxloginnumber())
+            .append("maxloginperip", getMaxloginperip())
+            .toString();
+    }
+}

+ 76 - 0
doc-biz/src/main/java/com/doc/scanner/domain/ScannerInfo.java

@@ -0,0 +1,76 @@
+package com.doc.scanner.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.doc.common.annotation.Excel;
+import com.doc.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 扫描仪管理对象 scanner_info
+ *
+ * @author wukai
+ * @date 2023-11-28
+ */
+@ApiModel(value = "ScannerInfo", description = "扫描仪管理")
+@Data
+public class ScannerInfo extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 扫描仪编号
+     */
+    @ApiModelProperty("扫描仪编号")
+    @TableId
+    private Long scannerId;
+
+    /**
+     * 扫描仪名称;
+     */
+    @ApiModelProperty("扫描仪名称;")
+    @Excel(name = "扫描仪名称;")
+    private String scannerName;
+
+    /**
+     * 扫描仪IP
+     */
+    @ApiModelProperty("扫描仪IP")
+    @Excel(name = "扫描仪IP")
+    private String scannerIp;
+
+    /**
+     * 是否公用
+     */
+    @ApiModelProperty("是否公用")
+    @Excel(name = "是否公用")
+    private String isPublic;
+
+    /**
+     * FTP用户ID
+     */
+    @ApiModelProperty("FTP用户ID")
+    @Excel(name = "FTP用户ID")
+    private String userId;
+
+    /**
+     * 所属部门
+     */
+    @ApiModelProperty("所属部门")
+    @Excel(name = "所属部门")
+    private Long deptId;
+
+    @ApiModelProperty("部门名称")
+    @TableField(exist = false)
+    private String deptName;
+    @ApiModelProperty("ftp账号")
+    @TableField(exist = false)
+    private String user;
+    @ApiModelProperty("ftp密码")
+    @TableField(exist = false)
+    private String pass;
+    @ApiModelProperty("ftp端口号")
+    @TableField(exist = false)
+    private Integer port;
+}

+ 62 - 0
doc-biz/src/main/java/com/doc/scanner/mapper/ScannerFtpMapper.java

@@ -0,0 +1,62 @@
+package com.doc.scanner.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doc.scanner.domain.ScannerFtp;
+
+/**
+ * ftp用户信息Mapper接口
+ * 
+ * @author wukai
+ * @date 2023-11-28
+ */
+public interface ScannerFtpMapper extends BaseMapper<ScannerFtp>
+{
+    /**
+     * 查询ftp用户信息
+     * 
+     * @param userid ftp用户信息主键
+     * @return ftp用户信息
+     */
+    public ScannerFtp selectScannerFtpByUserid(String userid);
+
+    /**
+     * 查询ftp用户信息列表
+     * 
+     * @param scannerFtp ftp用户信息
+     * @return ftp用户信息集合
+     */
+    public List<ScannerFtp> selectScannerFtpList(ScannerFtp scannerFtp);
+
+    /**
+     * 新增ftp用户信息
+     * 
+     * @param scannerFtp ftp用户信息
+     * @return 结果
+     */
+    public int insertScannerFtp(ScannerFtp scannerFtp);
+
+    /**
+     * 修改ftp用户信息
+     * 
+     * @param scannerFtp ftp用户信息
+     * @return 结果
+     */
+    public int updateScannerFtp(ScannerFtp scannerFtp);
+
+    /**
+     * 删除ftp用户信息
+     * 
+     * @param userid ftp用户信息主键
+     * @return 结果
+     */
+    public int deleteScannerFtpByUserid(String userid);
+
+    /**
+     * 批量删除ftp用户信息
+     * 
+     * @param userids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteScannerFtpByUserids(String[] userids);
+}

+ 62 - 0
doc-biz/src/main/java/com/doc/scanner/mapper/ScannerInfoMapper.java

@@ -0,0 +1,62 @@
+package com.doc.scanner.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doc.scanner.domain.ScannerInfo;
+
+/**
+ * 扫描仪管理Mapper接口
+ * 
+ * @author wukai
+ * @date 2023-11-28
+ */
+public interface ScannerInfoMapper extends BaseMapper<ScannerInfo>
+{
+    /**
+     * 查询扫描仪管理
+     * 
+     * @param scannerId 扫描仪管理主键
+     * @return 扫描仪管理
+     */
+    public ScannerInfo selectScannerInfoByScannerId(Long scannerId);
+
+    /**
+     * 查询扫描仪管理列表
+     * 
+     * @param scannerInfo 扫描仪管理
+     * @return 扫描仪管理集合
+     */
+    public List<ScannerInfo> selectScannerInfoList(ScannerInfo scannerInfo);
+
+    /**
+     * 新增扫描仪管理
+     * 
+     * @param scannerInfo 扫描仪管理
+     * @return 结果
+     */
+    public int insertScannerInfo(ScannerInfo scannerInfo);
+
+    /**
+     * 修改扫描仪管理
+     * 
+     * @param scannerInfo 扫描仪管理
+     * @return 结果
+     */
+    public int updateScannerInfo(ScannerInfo scannerInfo);
+
+    /**
+     * 删除扫描仪管理
+     * 
+     * @param scannerId 扫描仪管理主键
+     * @return 结果
+     */
+    public int deleteScannerInfoByScannerId(Long scannerId);
+
+    /**
+     * 批量删除扫描仪管理
+     * 
+     * @param scannerIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteScannerInfoByScannerIds(Long[] scannerIds);
+}

+ 61 - 0
doc-biz/src/main/java/com/doc/scanner/service/IScannerFtpService.java

@@ -0,0 +1,61 @@
+package com.doc.scanner.service;
+
+import java.util.List;
+import com.doc.scanner.domain.ScannerFtp;
+
+/**
+ * ftp用户信息Service接口
+ * 
+ * @author wukai
+ * @date 2023-11-28
+ */
+public interface IScannerFtpService 
+{
+    /**
+     * 查询ftp用户信息
+     * 
+     * @param userid ftp用户信息主键
+     * @return ftp用户信息
+     */
+    public ScannerFtp selectScannerFtpByUserid(String userid);
+
+    /**
+     * 查询ftp用户信息列表
+     * 
+     * @param scannerFtp ftp用户信息
+     * @return ftp用户信息集合
+     */
+    public List<ScannerFtp> selectScannerFtpList(ScannerFtp scannerFtp);
+
+    /**
+     * 新增ftp用户信息
+     * 
+     * @param scannerFtp ftp用户信息
+     * @return 结果
+     */
+    public int insertScannerFtp(ScannerFtp scannerFtp);
+
+    /**
+     * 修改ftp用户信息
+     * 
+     * @param scannerFtp ftp用户信息
+     * @return 结果
+     */
+    public int updateScannerFtp(ScannerFtp scannerFtp);
+
+    /**
+     * 批量删除ftp用户信息
+     * 
+     * @param userids 需要删除的ftp用户信息主键集合
+     * @return 结果
+     */
+    public int deleteScannerFtpByUserids(String[] userids);
+
+    /**
+     * 删除ftp用户信息信息
+     * 
+     * @param userid ftp用户信息主键
+     * @return 结果
+     */
+    public int deleteScannerFtpByUserid(String userid);
+}

+ 61 - 0
doc-biz/src/main/java/com/doc/scanner/service/IScannerInfoService.java

@@ -0,0 +1,61 @@
+package com.doc.scanner.service;
+
+import java.util.List;
+import com.doc.scanner.domain.ScannerInfo;
+
+/**
+ * 扫描仪管理Service接口
+ * 
+ * @author wukai
+ * @date 2023-11-28
+ */
+public interface IScannerInfoService 
+{
+    /**
+     * 查询扫描仪管理
+     * 
+     * @param scannerId 扫描仪管理主键
+     * @return 扫描仪管理
+     */
+    public ScannerInfo selectScannerInfoByScannerId(Long scannerId);
+
+    /**
+     * 查询扫描仪管理列表
+     * 
+     * @param scannerInfo 扫描仪管理
+     * @return 扫描仪管理集合
+     */
+    public List<ScannerInfo> selectScannerInfoList(ScannerInfo scannerInfo);
+
+    /**
+     * 新增扫描仪管理
+     * 
+     * @param scannerInfo 扫描仪管理
+     * @return 结果
+     */
+    public int insertScannerInfo(ScannerInfo scannerInfo);
+
+    /**
+     * 修改扫描仪管理
+     * 
+     * @param scannerInfo 扫描仪管理
+     * @return 结果
+     */
+    public int updateScannerInfo(ScannerInfo scannerInfo);
+
+    /**
+     * 批量删除扫描仪管理
+     * 
+     * @param scannerIds 需要删除的扫描仪管理主键集合
+     * @return 结果
+     */
+    public int deleteScannerInfoByScannerIds(Long[] scannerIds);
+
+    /**
+     * 删除扫描仪管理信息
+     * 
+     * @param scannerId 扫描仪管理主键
+     * @return 结果
+     */
+    public int deleteScannerInfoByScannerId(Long scannerId);
+}

+ 86 - 0
doc-biz/src/main/java/com/doc/scanner/service/impl/ScannerFtpServiceImpl.java

@@ -0,0 +1,86 @@
+package com.doc.scanner.service.impl;
+
+import java.util.List;
+import org.springframework.stereotype.Service;
+import com.doc.scanner.mapper.ScannerFtpMapper;
+import com.doc.scanner.domain.ScannerFtp;
+import com.doc.scanner.service.IScannerFtpService;
+import javax.annotation.Resource;
+
+/**
+ * ftp用户信息Service业务层处理
+ *
+ * @author wukai
+ * @date 2023-11-28
+ */
+@Service
+public class ScannerFtpServiceImpl implements IScannerFtpService {
+    @Resource
+    private ScannerFtpMapper scannerFtpMapper;
+
+    /**
+     * 查询ftp用户信息
+     *
+     * @param userid ftp用户信息主键
+     * @return ftp用户信息
+     */
+    @Override
+    public ScannerFtp selectScannerFtpByUserid(String userid) {
+        return scannerFtpMapper.selectScannerFtpByUserid(userid);
+    }
+
+    /**
+     * 查询ftp用户信息列表
+     *
+     * @param scannerFtp ftp用户信息
+     * @return ftp用户信息
+     */
+    @Override
+    public List<ScannerFtp> selectScannerFtpList(ScannerFtp scannerFtp) {
+        return scannerFtpMapper.selectScannerFtpList(scannerFtp);
+    }
+
+    /**
+     * 新增ftp用户信息
+     *
+     * @param scannerFtp ftp用户信息
+     * @return 结果
+     */
+    @Override
+    public int insertScannerFtp(ScannerFtp scannerFtp) {
+            return scannerFtpMapper.insertScannerFtp(scannerFtp);
+    }
+
+    /**
+     * 修改ftp用户信息
+     *
+     * @param scannerFtp ftp用户信息
+     * @return 结果
+     */
+    @Override
+    public int updateScannerFtp(ScannerFtp scannerFtp) {
+        return scannerFtpMapper.updateScannerFtp(scannerFtp);
+    }
+
+    /**
+     * 批量删除ftp用户信息
+     *
+     * @param userids 需要删除的ftp用户信息主键
+     * @return 结果
+     */
+    @Override
+    public int deleteScannerFtpByUserids(String[] userids) {
+        return scannerFtpMapper.deleteScannerFtpByUserids(userids);
+    }
+
+    /**
+     * 删除ftp用户信息信息
+     *
+     * @param userid ftp用户信息主键
+     * @return 结果
+     */
+    @Override
+    public int deleteScannerFtpByUserid(String userid) {
+        return scannerFtpMapper.deleteScannerFtpByUserid(userid);
+    }
+}

+ 89 - 0
doc-biz/src/main/java/com/doc/scanner/service/impl/ScannerInfoServiceImpl.java

@@ -0,0 +1,89 @@
+package com.doc.scanner.service.impl;
+
+import java.util.List;
+        import com.doc.common.utils.DateUtils;
+import org.springframework.stereotype.Service;
+import com.doc.scanner.mapper.ScannerInfoMapper;
+import com.doc.scanner.domain.ScannerInfo;
+import com.doc.scanner.service.IScannerInfoService;
+import javax.annotation.Resource;
+
+/**
+ * 扫描仪管理Service业务层处理
+ *
+ * @author wukai
+ * @date 2023-11-28
+ */
+@Service
+public class ScannerInfoServiceImpl implements IScannerInfoService {
+    @Resource
+    private ScannerInfoMapper scannerInfoMapper;
+
+    /**
+     * 查询扫描仪管理
+     *
+     * @param scannerId 扫描仪管理主键
+     * @return 扫描仪管理
+     */
+    @Override
+    public ScannerInfo selectScannerInfoByScannerId(Long scannerId) {
+        return scannerInfoMapper.selectScannerInfoByScannerId(scannerId);
+    }
+
+    /**
+     * 查询扫描仪管理列表
+     *
+     * @param scannerInfo 扫描仪管理
+     * @return 扫描仪管理
+     */
+    @Override
+    public List<ScannerInfo> selectScannerInfoList(ScannerInfo scannerInfo) {
+        return scannerInfoMapper.selectScannerInfoList(scannerInfo);
+    }
+
+    /**
+     * 新增扫描仪管理
+     *
+     * @param scannerInfo 扫描仪管理
+     * @return 结果
+     */
+    @Override
+    public int insertScannerInfo(ScannerInfo scannerInfo) {
+                scannerInfo.setCreateTime(DateUtils.getNowDate());
+            return scannerInfoMapper.insertScannerInfo(scannerInfo);
+    }
+
+    /**
+     * 修改扫描仪管理
+     *
+     * @param scannerInfo 扫描仪管理
+     * @return 结果
+     */
+    @Override
+    public int updateScannerInfo(ScannerInfo scannerInfo) {
+                scannerInfo.setUpdateTime(DateUtils.getNowDate());
+        return scannerInfoMapper.updateScannerInfo(scannerInfo);
+    }
+
+    /**
+     * 批量删除扫描仪管理
+     *
+     * @param scannerIds 需要删除的扫描仪管理主键
+     * @return 结果
+     */
+    @Override
+    public int deleteScannerInfoByScannerIds(Long[] scannerIds) {
+        return scannerInfoMapper.deleteScannerInfoByScannerIds(scannerIds);
+    }
+
+    /**
+     * 删除扫描仪管理信息
+     *
+     * @param scannerId 扫描仪管理主键
+     * @return 结果
+     */
+    @Override
+    public int deleteScannerInfoByScannerId(Long scannerId) {
+        return scannerInfoMapper.deleteScannerInfoByScannerId(scannerId);
+    }
+}

+ 28 - 0
doc-biz/src/main/java/com/doc/vo/ScannerVO.java

@@ -0,0 +1,28 @@
+package com.doc.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * ScannerVO$
+ *
+ * @author wukai
+ * @date 2023/11/29 17:24
+ */
+@Data
+@ApiModel(value = "ScannerVO", description = "扫描文件认领")
+public class ScannerVO {
+    @ApiModelProperty("名称")
+    private String name;
+    @ApiModelProperty("目录ID")
+    private Long dirId;
+    @ApiModelProperty("空间ID")
+    private Long spaceId;
+    @ApiModelProperty("是否合并")
+    private Boolean merge;
+    @ApiModelProperty("选中文件的q值")
+    private List<String> q;
+}

+ 90 - 0
doc-biz/src/main/resources/mapper/scanner/ScannerFtpMapper.xml

@@ -0,0 +1,90 @@
+<?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="com.doc.scanner.mapper.ScannerFtpMapper">
+    
+    <resultMap type="ScannerFtp" id="ScannerFtpResult">
+        <result property="userid"    column="userid"    />
+        <result property="userpassword"    column="userpassword"    />
+        <result property="homedirectory"    column="homedirectory"    />
+        <result property="enableflag"    column="enableflag"    />
+        <result property="writepermission"    column="writepermission"    />
+        <result property="idletime"    column="idletime"    />
+        <result property="uploadrate"    column="uploadrate"    />
+        <result property="downloadrate"    column="downloadrate"    />
+        <result property="maxloginnumber"    column="maxloginnumber"    />
+        <result property="maxloginperip"    column="maxloginperip"    />
+    </resultMap>
+
+    <sql id="selectScannerFtpVo">
+        select userid, userpassword, homedirectory, enableflag, writepermission, idletime, uploadrate, downloadrate, maxloginnumber, maxloginperip from scanner_ftp
+    </sql>
+
+    <select id="selectScannerFtpList" parameterType="ScannerFtp" resultMap="ScannerFtpResult">
+        <include refid="selectScannerFtpVo"/>
+        <where>  
+            <if test="userid != null  and userid != ''"> and userid = #{userid}</if>
+        </where>
+    </select>
+    
+    <select id="selectScannerFtpByUserid" parameterType="String" resultMap="ScannerFtpResult">
+        <include refid="selectScannerFtpVo"/>
+        where userid = #{userid}
+    </select>
+        
+    <insert id="insertScannerFtp" parameterType="ScannerFtp">
+        insert into scanner_ftp
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userid != null">userid,</if>
+            <if test="userpassword != null">userpassword,</if>
+            <if test="homedirectory != null">homedirectory,</if>
+            <if test="enableflag != null">enableflag,</if>
+            <if test="writepermission != null">writepermission,</if>
+            <if test="idletime != null">idletime,</if>
+            <if test="uploadrate != null">uploadrate,</if>
+            <if test="downloadrate != null">downloadrate,</if>
+            <if test="maxloginnumber != null">maxloginnumber,</if>
+            <if test="maxloginperip != null">maxloginperip,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="userid != null">#{userid},</if>
+            <if test="userpassword != null">#{userpassword},</if>
+            <if test="homedirectory != null">#{homedirectory},</if>
+            <if test="enableflag != null">#{enableflag},</if>
+            <if test="writepermission != null">#{writepermission},</if>
+            <if test="idletime != null">#{idletime},</if>
+            <if test="uploadrate != null">#{uploadrate},</if>
+            <if test="downloadrate != null">#{downloadrate},</if>
+            <if test="maxloginnumber != null">#{maxloginnumber},</if>
+            <if test="maxloginperip != null">#{maxloginperip},</if>
+         </trim>
+    </insert>
+
+    <update id="updateScannerFtp" parameterType="ScannerFtp">
+        update scanner_ftp
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="userpassword != null">userpassword = #{userpassword},</if>
+            <if test="homedirectory != null">homedirectory = #{homedirectory},</if>
+            <if test="enableflag != null">enableflag = #{enableflag},</if>
+            <if test="writepermission != null">writepermission = #{writepermission},</if>
+            <if test="idletime != null">idletime = #{idletime},</if>
+            <if test="uploadrate != null">uploadrate = #{uploadrate},</if>
+            <if test="downloadrate != null">downloadrate = #{downloadrate},</if>
+            <if test="maxloginnumber != null">maxloginnumber = #{maxloginnumber},</if>
+            <if test="maxloginperip != null">maxloginperip = #{maxloginperip},</if>
+        </trim>
+        where userid = #{userid}
+    </update>
+
+    <delete id="deleteScannerFtpByUserid" parameterType="String">
+        delete from scanner_ftp where userid = #{userid}
+    </delete>
+
+    <delete id="deleteScannerFtpByUserids" parameterType="String">
+        delete from scanner_ftp where userid in 
+        <foreach item="userid" collection="array" open="(" separator="," close=")">
+            #{userid}
+        </foreach>
+    </delete>
+</mapper>

+ 122 - 0
doc-biz/src/main/resources/mapper/scanner/ScannerInfoMapper.xml

@@ -0,0 +1,122 @@
+<?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="com.doc.scanner.mapper.ScannerInfoMapper">
+
+    <resultMap type="ScannerInfo" id="ScannerInfoResult">
+        <result property="scannerId" column="SCANNER_ID"/>
+        <result property="scannerName" column="SCANNER_NAME"/>
+        <result property="scannerIp" column="SCANNER_IP"/>
+        <result property="isPublic" column="IS_PUBLIC"/>
+        <result property="userId" column="USER_ID"/>
+        <result property="deptId" column="DEPT_ID"/>
+        <result property="deptName" column="DEPT_NAME"/>
+        <result property="createBy" column="CREATE_BY"/>
+        <result property="createTime" column="CREATE_TIME"/>
+        <result property="updateBy" column="UPDATE_BY"/>
+        <result property="updateTime" column="UPDATE_TIME"/>
+        <result property="user" column="user"/>
+        <result property="pass" column="userpassword"/>
+    </resultMap>
+
+    <sql id="selectScannerInfoVo">
+    SELECT * FROM (
+        select a.SCANNER_ID,
+               a.SCANNER_NAME,
+               a.SCANNER_IP,
+               a.IS_PUBLIC,
+               a.USER_ID,
+               a.DEPT_ID,
+               a.CREATE_BY,
+               a.CREATE_TIME,
+               a.UPDATE_BY,
+               a.UPDATE_TIME,
+               b.dept_name,
+               c.userid user,
+               c.userpassword
+        from scanner_info a
+            left join sys_dept b on a.dept_id=b.dept_id
+            left join scanner_ftp c on CONCAT('user',a.SCANNER_ID)= c.userid
+    ) T
+
+    </sql>
+
+    <select id="selectScannerInfoList" parameterType="ScannerInfo" resultMap="ScannerInfoResult">
+        <include refid="selectScannerInfoVo"/>
+        <where>
+            <if test="scannerName != null  and scannerName != ''">and SCANNER_NAME like concat('%', #{scannerName},
+                '%')
+            </if>
+            <if test="scannerIp != null  and scannerIp != ''">and SCANNER_IP = #{scannerIp}</if>
+            <if test="isPublic != null  and isPublic != ''">and IS_PUBLIC = #{isPublic}</if>
+            <if test="userId != null  and userId != ''">and USER_ID = #{userId}</if>
+            <if test="deptId != null ">and DEPT_ID = #{deptId}</if>
+            <if test="createBy != null  and createBy != ''">and CREATE_BY = #{createBy}</if>
+            <if test="createTime != null ">and CREATE_TIME = #{createTime}</if>
+            <if test="updateBy != null  and updateBy != ''">and UPDATE_BY = #{updateBy}</if>
+            <if test="updateTime != null ">and UPDATE_TIME = #{updateTime}</if>
+            <if test="params.select != null and params.select == '1'.toString() ">AND (IS_PUBLIC='Y' OR (IS_PUBLIC='N' AND DEPT_ID=#{params.deptId}))</if>
+        </where>
+    </select>
+
+    <select id="selectScannerInfoByScannerId" parameterType="Long" resultMap="ScannerInfoResult">
+        <include refid="selectScannerInfoVo"/>
+        where SCANNER_ID = #{scannerId}
+    </select>
+
+    <insert id="insertScannerInfo" parameterType="ScannerInfo" useGeneratedKeys="true" keyProperty="scannerId">
+        insert into scanner_info
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="scannerName != null">SCANNER_NAME,</if>
+            <if test="scannerIp != null">SCANNER_IP,</if>
+            <if test="isPublic != null">IS_PUBLIC,</if>
+            <if test="userId != null">USER_ID,</if>
+            <if test="deptId != null">DEPT_ID,</if>
+            <if test="createBy != null">CREATE_BY,</if>
+            <if test="createTime != null">CREATE_TIME,</if>
+            <if test="updateBy != null">UPDATE_BY,</if>
+            <if test="updateTime != null">UPDATE_TIME,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="scannerName != null">#{scannerName},</if>
+            <if test="scannerIp != null">#{scannerIp},</if>
+            <if test="isPublic != null">#{isPublic},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="deptId != null">#{deptId},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+        </trim>
+    </insert>
+
+    <update id="updateScannerInfo" parameterType="ScannerInfo">
+        update scanner_info
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="scannerName != null">SCANNER_NAME = #{scannerName},</if>
+            <if test="scannerIp != null">SCANNER_IP = #{scannerIp},</if>
+            <if test="isPublic != null">IS_PUBLIC = #{isPublic},</if>
+            <if test="userId != null">USER_ID = #{userId},</if>
+            <if test="deptId != null">DEPT_ID = #{deptId},</if>
+            <if test="createBy != null">CREATE_BY = #{createBy},</if>
+            <if test="createTime != null">CREATE_TIME = #{createTime},</if>
+            <if test="updateBy != null">UPDATE_BY = #{updateBy},</if>
+            <if test="updateTime != null">UPDATE_TIME = #{updateTime},</if>
+        </trim>
+        where SCANNER_ID = #{scannerId}
+    </update>
+
+    <delete id="deleteScannerInfoByScannerId" parameterType="Long">
+        delete
+        from scanner_info
+        where SCANNER_ID = #{scannerId}
+    </delete>
+
+    <delete id="deleteScannerInfoByScannerIds" parameterType="String">
+        delete from scanner_info where SCANNER_ID in
+        <foreach item="scannerId" collection="array" open="(" separator="," close=")">
+            #{scannerId}
+        </foreach>
+    </delete>
+</mapper>

+ 5 - 0
doc-common/src/main/java/com/doc/common/utils/encrypt/Sm3Util.java

@@ -4,6 +4,8 @@ import com.doc.common.utils.SecurityUtils;
 import org.bouncycastle.crypto.digests.SM3Digest;
 import org.bouncycastle.util.encoders.Hex;
 
+import java.util.Random;
+
 /**
  * SM3 HASH加密
  *
@@ -30,6 +32,9 @@ public class Sm3Util {
     }
 
     public static void main(String[] args) throws Exception {
+        Random random = new Random();
+        int number = random.nextInt(9000) + 1000;
+        System.out.println("随机数字: " + number);
         String message = "123456";
         String en1 = encrypt(message);
         String en2 = SecurityUtils.encryptPassword(en1);

+ 15 - 0
doc-common/src/main/java/com/doc/common/utils/file/FileUtils.java

@@ -19,6 +19,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.*;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
+import java.util.Objects;
 
 /**
  * 文件处理工具类
@@ -294,4 +295,18 @@ public class FileUtils {
 
         return item;
     }
+
+    /**
+     * 获取文件后缀
+     *
+     * @param file 多媒体文件
+     * @return 后缀名
+     */
+    public static String getFileSuffix(MultipartFile file) {
+        String suffix = "";
+        if (Objects.requireNonNull(file.getOriginalFilename()).contains(".")) {
+            suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
+        }
+        return suffix;
+    }
 }