liuchanglan 4 years ago
parent
commit
d49f3c5451
79 changed files with 3337 additions and 310 deletions
  1. 7 0
      pom.xml
  2. 24 0
      src/main/java/com/gz/common/DataGlobalVariable.java
  3. 1 1
      src/main/java/com/gz/config/ErrorPageConfig.java
  4. 38 0
      src/main/java/com/gz/config/FileUploadConfig.java
  5. 1 0
      src/main/java/com/gz/config/FilterConfig.java
  6. 1 0
      src/main/java/com/gz/config/WebSocketConfig.java
  7. 11 3
      src/main/java/com/gz/controller/archive/ArchiveController.java
  8. 41 0
      src/main/java/com/gz/controller/archive/ArchiveFileController.java
  9. 69 0
      src/main/java/com/gz/controller/borrow/ArchiveBorrowController.java
  10. 5 0
      src/main/java/com/gz/controller/system/ArchivesTreeController.java
  11. 6 0
      src/main/java/com/gz/controller/system/AuthController.java
  12. 0 1
      src/main/java/com/gz/controller/system/DictController.java
  13. 7 15
      src/main/java/com/gz/controller/system/FileController.java
  14. 10 1
      src/main/java/com/gz/core/exception/CustomExceptionEnum.java
  15. 34 0
      src/main/java/com/gz/dto/archive/ArchiveDTO.java
  16. 49 0
      src/main/java/com/gz/dto/borrow/ArchiveBorrowDTO.java
  17. 7 0
      src/main/java/com/gz/dto/system/AdminDTO.java
  18. 26 0
      src/main/java/com/gz/dto/system/ArchiveFileDTO.java
  19. 11 5
      src/main/java/com/gz/dto/system/FileDTO.java
  20. 7 0
      src/main/java/com/gz/mapper/archive/ArchiveFileMapper.java
  21. 18 0
      src/main/java/com/gz/mapper/archive/ArchiveMapper.java
  22. 20 0
      src/main/java/com/gz/mapper/borrow/ArchiveBorrowMapper.java
  23. 1 0
      src/main/java/com/gz/mapper/system/ArchivesTreeMapper.java
  24. 5 0
      src/main/java/com/gz/mapper/system/FileMapper.java
  25. 13 0
      src/main/java/com/gz/rvo/archive/ArchiveRVO.java
  26. 33 0
      src/main/java/com/gz/rvo/borrow/ArchiveBorrowHistoryRVO.java
  27. 16 0
      src/main/java/com/gz/rvo/borrow/ArchiveBorrowListRVO.java
  28. 39 0
      src/main/java/com/gz/rvo/borrow/AuditInfoRVO.java
  29. 0 2
      src/main/java/com/gz/rvo/system/FileUploadRVO.java
  30. 35 0
      src/main/java/com/gz/service/archive/ArchiveFileService.java
  31. 14 2
      src/main/java/com/gz/service/archive/ArchiveService.java
  32. 113 0
      src/main/java/com/gz/service/archive/impl/ArchiveFileServiceImpl.java
  33. 77 8
      src/main/java/com/gz/service/archive/impl/ArchiveServiceImpl.java
  34. 86 0
      src/main/java/com/gz/service/borrow/ArchiveBorrowService.java
  35. 110 0
      src/main/java/com/gz/service/borrow/impl/ArchiveBorrowServiceImpl.java
  36. 15 0
      src/main/java/com/gz/service/system/ArchivesTreeService.java
  37. 7 0
      src/main/java/com/gz/service/system/AuthService.java
  38. 8 0
      src/main/java/com/gz/service/system/DictService.java
  39. 1 14
      src/main/java/com/gz/service/system/FileService.java
  40. 29 0
      src/main/java/com/gz/service/system/impl/ArchivesTreeServiceImpl.java
  41. 6 0
      src/main/java/com/gz/service/system/impl/AuthServiceImpl.java
  42. 7 0
      src/main/java/com/gz/service/system/impl/DictServiceImpl.java
  43. 41 52
      src/main/java/com/gz/service/system/impl/FileServiceImpl.java
  44. 2 2
      src/main/java/com/gz/service/system/impl/RoleServiceImpl.java
  45. 16 0
      src/main/java/com/gz/vo/archive/InsertArchiveVO.java
  46. 14 0
      src/main/java/com/gz/vo/archive/SearchArchiveFileVO.java
  47. 1 1
      src/main/java/com/gz/vo/archive/SearchArchiveVO.java
  48. 6 1
      src/main/resources/application-dev.yml
  49. 1 1
      src/main/resources/application.yml
  50. 58 0
      src/main/resources/mapper/archiveBorrowMapper.xml
  51. 50 0
      src/main/resources/mapper/archiveMapper.xml
  52. 9 0
      src/main/resources/mapper/archivesTreeMapper.xml
  53. 2 2
      src/main/resources/static/404.html
  54. 5 5
      src/main/resources/static/index.html
  55. 4 3
      src/main/resources/static/js/lay-module/request/http.js
  56. 4 4
      src/main/resources/static/login.html
  57. 10 1
      src/main/resources/static/page/admin/edit.html
  58. 2 1
      src/main/resources/static/page/admin/list.html
  59. 410 67
      src/main/resources/static/page/archive/edit.html
  60. 186 0
      src/main/resources/static/page/archive/fileList.html
  61. 47 15
      src/main/resources/static/page/archive/list.html
  62. 4 4
      src/main/resources/static/page/archives-tree/list.html
  63. 206 0
      src/main/resources/static/page/auditList/audit.html
  64. 269 0
      src/main/resources/static/page/auditList/list.html
  65. 193 0
      src/main/resources/static/page/borrow/list.html
  66. 232 0
      src/main/resources/static/page/borrow/reserve.html
  67. 1 1
      src/main/resources/static/page/dept/bureaus.html
  68. 1 1
      src/main/resources/static/page/dept/department.html
  69. 1 1
      src/main/resources/static/page/dict/list.html
  70. 7 77
      src/main/resources/static/page/home/welcome.html
  71. 1 1
      src/main/resources/static/page/log/logsList.html
  72. 1 1
      src/main/resources/static/page/menu/menuList.html
  73. 239 0
      src/main/resources/static/page/myBorrow/list.html
  74. 189 0
      src/main/resources/static/page/myBorrow/reserve.html
  75. 2 2
      src/main/resources/static/page/role/list.html
  76. 1 1
      src/main/resources/static/page/user/userList.html
  77. 21 14
      src/main/resources/static/updatePassword.html
  78. 2 0
      src/test/java/com/gz/GuihuaArchivesApplicationTests.java
  79. 91 0
      src/test/java/com/gz/ImportArchives.java

+ 7 - 0
pom.xml

@@ -29,6 +29,7 @@
         <screw.version>1.0.3</screw.version>
         <aliyun.sdk.version>4.5.3</aliyun.sdk.version>
         <aliyun.oss.sdk.version>3.10.2</aliyun.oss.sdk.version>
+        <poi.version>4.1.2</poi.version>
         <!-- 跳过打包测试 -->
         <skipTests>true</skipTests>
     </properties>
@@ -110,6 +111,12 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-websocket</artifactId>
         </dependency>
+        <!-- poi-->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>${poi.version}</version>
+        </dependency>
 
         <!--        单元测试模块-->
         <dependency>

+ 24 - 0
src/main/java/com/gz/common/DataGlobalVariable.java

@@ -18,4 +18,28 @@ public class DataGlobalVariable {
 
     /** 登录日志的code*/
     public static final String LOGIN_LOG_CODE = "LOGIN_LOG";
+
+    /** 文书档案 生成档号 FOMAT 全宗号-档案门类代码年度-保管期限-机构代码-件号 */
+    public static final String WS_DH_FOMAT = "%s-WS%s-%s-0000-%s";
+
+    /** 会计档案 生成档号 FOMAT 全宗号-(目录号)-档案门类代码年度--核算单位代号-(保管期限)-案卷号*/
+    public static final String KU_DH_FOMAT = "%s-(%s)-KU%s-%s-(%s)-%s";
+
+    /** 科技档案 生成档号 FOMAT 全宗号-目录号-档案门类代码·属类代码-保管期限-项目代号/设备代号--案卷号*/
+    public static final String KJ_DH_FOMAT = "%s-%s-KJ·%s-%s-%s-%s";
+
+    /** 专业档案 生成档号 FOMAT 全宗号-目录号-档案门类代码·属类代码-保管期限-案卷号*/
+    public static final String ZY_DH_FOMAT = "%s-%s-ZY·%s-%s-%s";
+
+    /** 音像档案 生成档号 FOMAT 全宗号-目录号-档案门类代码·属类代码-保管期限-张号/盘号(_段号)*/
+    public static final String YX_DH_FOMAT = "%s-%s-YX·%s-%s-%s";
+
+    /** 业务数据档案 生成档号 FOMAT 全宗号-目录号-档案门类代码-保管期限-件号*/
+    public static final String SJ_DH_FOMAT = "%s-%s-SJ-%s-%s";
+
+    /** 实物档案 生成档号 FOMAT 全宗号-目录号-档案门类代码·属类代码-保管期限-件号*/
+    public static final String SW_DH_FOMAT = "%s-%s-SW·%s-%s-%s";
+
+    /** 融媒体档案 生成档号 FOMAT 全宗号-目录号-档案门类代码·属类代码-保管期限-件号*/
+    public static final String MT_DH_FOMAT = "%s-%s-MT·%s-%s-%s";
 }

+ 1 - 1
src/main/java/com/gz/config/ErrorPageConfig.java

@@ -9,7 +9,7 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.http.HttpStatus;
 
 /**
- *
+ * 错误页面配置
  * @author LiuchangLan
  * @date 2021/2/22 14:44
  */

+ 38 - 0
src/main/java/com/gz/config/FileUploadConfig.java

@@ -0,0 +1,38 @@
+package com.gz.config;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author LiuchangLan
+ * @date 2021/2/25 17:40
+ */
+@Slf4j
+@Configuration
+public class FileUploadConfig {
+
+    /** 文档附件根目录地址*/
+    public static String ARCHIVE_FILE_ROOT_DIRECTORY;
+
+    /** 附件根目录地址*/
+    public static String FILE_ROOT_DIRECTORY;
+
+    /** 附件上传目录 归档年份/全宗号-保管期限(归档年度)-文件格式   文件格式只有 PDF和TF*/
+    public static final String ARCHIVE_UPLOAD_PATH_PDF_FOMAT = "/%s/%s-%s(%s)-%s";
+
+    public static final String ARCHIVE_UPLOAD_PATH_TIF_FOMAT = "/%s/%s-%s(%s)-%s/%s";
+
+    @Value("${upload-file.archive-file-root-directory}")
+    public void setArchiveFileRootDirectory(String uploadFileRootDirectory) {
+        log.info("文档附件根目录地址:{}",uploadFileRootDirectory);
+        ARCHIVE_FILE_ROOT_DIRECTORY = uploadFileRootDirectory;
+    }
+
+
+    @Value("${upload-file.file-root-directory}")
+    public void setFileRootDirectory(String uploadFileRootDirectory) {
+        log.info("其他附件根目录地址:{}",uploadFileRootDirectory);
+        FILE_ROOT_DIRECTORY = uploadFileRootDirectory;
+    }
+}

+ 1 - 0
src/main/java/com/gz/config/FilterConfig.java

@@ -14,6 +14,7 @@ import javax.annotation.Resource;
 import java.util.Arrays;
 
 /**
+ * 过滤器配置
  * @author LiuchangLan
  * @date 2021/1/15 13:28
  */

+ 1 - 0
src/main/java/com/gz/config/WebSocketConfig.java

@@ -6,6 +6,7 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.web.socket.server.standard.ServerEndpointExporter;
 
 /**
+ * WebSocket 扫描 配置
  * @author LiuchangLan
  * @date 2020/8/7 9:50
  */

+ 11 - 3
src/main/java/com/gz/controller/archive/ArchiveController.java

@@ -2,7 +2,10 @@ package com.gz.controller.archive;
 
 import com.github.pagehelper.PageInfo;
 import com.gz.dto.archive.ArchiveDTO;
+import com.gz.dto.system.ArchivesTreeDTO;
+import com.gz.rvo.archive.ArchiveRVO;
 import com.gz.service.archive.ArchiveService;
+import com.gz.vo.archive.InsertArchiveVO;
 import com.gz.vo.archive.SearchArchiveVO;
 import org.springframework.web.bind.annotation.*;
 
@@ -22,8 +25,8 @@ public class ArchiveController {
     private ArchiveService service;
 
     @PostMapping("insert")
-    Integer insert(@RequestBody ArchiveDTO dto) {
-        return service.insert(dto);
+    Integer insert(@RequestBody InsertArchiveVO vo) throws Exception {
+        return service.insert(vo);
     }
 
     @DeleteMapping("delete")
@@ -42,7 +45,12 @@ public class ArchiveController {
     }
 
     @GetMapping("selectByPage")
-    PageInfo<ArchiveDTO> selectByPage(SearchArchiveVO vo) {
+    PageInfo<ArchiveRVO> selectByPage(SearchArchiveVO vo) {
         return service.selectByPage(vo);
     }
+
+    @GetMapping("selectByPrimaryKey")
+    ArchiveDTO selectByPrimaryKey(Integer id) {
+        return service.selectByPrimaryKey(id);
+    }
 }

+ 41 - 0
src/main/java/com/gz/controller/archive/ArchiveFileController.java

@@ -0,0 +1,41 @@
+package com.gz.controller.archive;
+
+import com.github.pagehelper.PageInfo;
+import com.gz.core.exception.BusinessException;
+import com.gz.dto.system.ArchiveFileDTO;
+import com.gz.service.archive.ArchiveFileService;
+import com.gz.vo.archive.SearchArchiveFileVO;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+
+/**
+ * 文档附件控制器
+ *
+ * @author LiuchangLan
+ * @date 2020/9/9 11:23
+ */
+@RestController
+@RequestMapping("archive/archiveFile")
+public class ArchiveFileController {
+
+    @Resource
+    private ArchiveFileService archiveFileService;
+
+    @PostMapping("upload")
+    public ArchiveFileDTO upload(@RequestBody MultipartFile file, Integer archiveId) throws IOException, BusinessException {
+        return archiveFileService.upload(file, archiveId);
+    }
+
+    @DeleteMapping("delete")
+    Integer delete(Integer id) {
+        return archiveFileService.delete(id);
+    }
+
+    @GetMapping("selectByPage")
+    PageInfo<ArchiveFileDTO> selectByPage(SearchArchiveFileVO vo) {
+        return archiveFileService.selectByPage(vo);
+    }
+}

+ 69 - 0
src/main/java/com/gz/controller/borrow/ArchiveBorrowController.java

@@ -0,0 +1,69 @@
+package com.gz.controller.borrow;
+
+import com.github.pagehelper.PageInfo;
+import com.gz.dto.borrow.ArchiveBorrowDTO;
+import com.gz.rvo.borrow.ArchiveBorrowHistoryRVO;
+import com.gz.rvo.borrow.ArchiveBorrowListRVO;
+import com.gz.rvo.borrow.AuditInfoRVO;
+import com.gz.service.archive.ArchiveService;
+import com.gz.service.borrow.ArchiveBorrowService;
+import com.gz.vo.PageVO;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author LiuchangLan
+ * @date 2021/2/27 15:11
+ */
+@RestController
+@RequestMapping("borrow/archiveBorrow")
+public class ArchiveBorrowController {
+
+    @Resource
+    private ArchiveBorrowService service;
+
+    @Resource
+    private ArchiveService archiveService;
+
+    @PostMapping("borrow")
+    Integer borrow(@RequestBody ArchiveBorrowDTO dto) throws Exception {
+        return service.borrow(dto);
+    }
+
+    @GetMapping("selectBorrowList")
+    PageInfo<ArchiveBorrowListRVO> selectBorrowList(PageVO vo){
+        return archiveService.selectBorrowList(vo);
+    }
+
+    @GetMapping("selectCurrAdminArchiveBorrowHistory")
+    PageInfo<ArchiveBorrowHistoryRVO> selectCurrAdminArchiveBorrowHistory(PageVO vo){
+        return service.selectCurrAdminArchiveBorrowHistory(vo);
+    }
+
+    @GetMapping("selectArchiveBorrowHistory")
+    PageInfo<ArchiveBorrowHistoryRVO> selectArchiveBorrowHistory(PageVO vo){
+        return service.selectArchiveBorrowHistory(vo);
+    }
+
+    @PostMapping("audit")
+    void audit(@RequestBody ArchiveBorrowDTO dto){
+        service.audit(dto);
+    }
+
+    @DeleteMapping("delete")
+    Integer delete(Integer id) {
+        return service.delete(id);
+    }
+
+    @GetMapping("selectBorrowInfo")
+    AuditInfoRVO selectBorrowInfo(Integer id){
+        return service.selectBorrowInfo(id);
+    }
+
+    @GetMapping("return")
+    void returnBorrow(Integer id){
+        service.returnBorrow(id);
+    }
+}

+ 5 - 0
src/main/java/com/gz/controller/system/ArchivesTreeController.java

@@ -65,4 +65,9 @@ public class ArchivesTreeController {
     void upDown(Integer id){
         service.downMove(id);
     }
+
+    @GetMapping("selectChildById")
+    List<ArchivesTreeDTO> selectChildById(Integer id){
+        return service.selectChildById(id);
+    }
 }

+ 6 - 0
src/main/java/com/gz/controller/system/AuthController.java

@@ -1,6 +1,7 @@
 package com.gz.controller.system;
 
 import com.gz.core.exception.BusinessException;
+import com.gz.dto.system.AdminDTO;
 import com.gz.dto.system.MenuDTO;
 import com.gz.jwt.JwtPayload;
 import com.gz.rvo.system.InitialHomeRVO;
@@ -80,4 +81,9 @@ public class AuthController {
     public String generatePictureCaptcha(){
         return authService.generatePictureCaptcha();
     }
+
+    @GetMapping("currLoginAdmin")
+    public AdminDTO currLoginAdmin(){
+        return authService.currLoginAdmin();
+    }
 }

+ 0 - 1
src/main/java/com/gz/controller/system/DictController.java

@@ -110,5 +110,4 @@ public class DictController {
     List<DictDTO> selectDictByCode(String code){
         return dictService.selectDictByCode(code);
     }
-
 }

+ 7 - 15
src/main/java/com/gz/controller/system/FileController.java

@@ -4,16 +4,18 @@ import com.gz.core.exception.BusinessException;
 import com.gz.dto.system.FileDTO;
 import com.gz.rvo.system.FileUploadRVO;
 import com.gz.service.system.FileService;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import java.io.IOException;
-import java.util.List;
 
 /**
  * @author LiuchangLan
- * @date 2020/9/9 11:23
+ * @date 2021/2/28 13:39
  */
 @RestController
 @RequestMapping("system/file")
@@ -23,17 +25,7 @@ public class FileController {
     private FileService fileService;
 
     @PostMapping("upload")
-    public FileUploadRVO upload(@RequestBody MultipartFile file, String fileId) throws IOException, BusinessException {
-        return fileService.upload(file, fileId);
-    }
-
-    @GetMapping("selectByFileId")
-    public List<FileDTO> selectByPrimaryKey(String fileId) {
-        return fileService.selectByFileId(fileId);
-    }
-
-    @DeleteMapping("delete")
-    Integer delete(Integer id){
-        return fileService.delete(id);
+    public FileDTO upload(@RequestBody MultipartFile file) throws IOException, BusinessException {
+        return fileService.upload(file);
     }
 }

+ 10 - 1
src/main/java/com/gz/core/exception/CustomExceptionEnum.java

@@ -19,7 +19,16 @@ public enum CustomExceptionEnum implements CustomResponsInterface {
     CAPTCHA_ERROR(1003,"验证码错误"),
     DICT_CODE_EXISTS(1004,"字典编码已存在,请更换"),
     File_NOT_EXISTS(1005,"请选择一个文件"),
-    PASSWORD_NO_INCORRECT(1006,"密码不正确");
+    PASSWORD_NO_INCORRECT(1006,"密码不正确"),
+    GENERATE_DH_ERROR(1007,"档号生成失败"),
+    UPLOAD_ARCHIVE_FILE_TYPE_ERROR(1008,"档案附件暂只支持PDF、TIF"),
+
+
+    ORIGINAL_SCRIPT_NO_EXISTS(1009,"原件已被借阅"),
+    REPEAT_BORROW(1010,"您提交已借阅该文档,请勿重复借阅");
+
+
+
     ;
 
 

+ 34 - 0
src/main/java/com/gz/dto/archive/ArchiveDTO.java

@@ -78,5 +78,39 @@ public class ArchiveDTO extends BaseDTO {
     // 附件
     private String fj;
 
+    // 控制符
+    private String kzf;
 
+    // 电子文档号
+    private String dzwdh;
+
+    // 缩微号
+    private String swh;
+
+    // 稿本
+    private String gb;
+
+    // 文种
+    private String wz;
+
+    // 载体规格
+    private String ztgg;
+
+    // 载体类型
+    private String ztlx;
+
+    // 载体单位
+    private String ztdw;
+
+    // 组织机构代码
+    private String zzjgdm;
+
+    // 分类号
+    private String flh;
+
+    // 主题词或关键词
+    private String ztc;
+
+    // 全文标识
+    private String qwbs;
 }

+ 49 - 0
src/main/java/com/gz/dto/borrow/ArchiveBorrowDTO.java

@@ -0,0 +1,49 @@
+package com.gz.dto.borrow;
+
+import com.gz.core.BaseDTO;
+import lombok.Data;
+
+import javax.persistence.Table;
+
+/**
+ * 借阅DTO
+ * @author LiuchangLan
+ * @date 2021/2/27 14:50
+ */
+@Data
+@Table(name = "tab_archive_borrow")
+public class ArchiveBorrowDTO extends BaseDTO {
+    // 借阅的档案id
+    private Integer archiveId;
+
+    // 借阅的用户id
+    private Integer adminId;
+
+    // 备注
+    private String remarks;
+
+    // 归还时间
+    private String returnTime;
+
+    // 预计归还时间
+    private String estimateReturnTime;
+
+    // 借阅类型 0打印借阅 1原件借阅
+    private Integer borrowType;
+
+    // 审核状态 0待审核 1未通过 2(已通过)
+    private Integer auditStatus;
+
+    // 审核意见
+    private String auditOpinion;
+
+    // 相关证明 文件表关联
+    private Integer relevantCertification;
+
+    // 利用目的
+    private String usePurpose;
+
+    // 归还状态
+    private Integer returnStatus;
+
+}

+ 7 - 0
src/main/java/com/gz/dto/system/AdminDTO.java

@@ -34,5 +34,12 @@ public class AdminDTO extends BaseDTO {
     // 状态(0正常 1禁用)
     private Integer status;
 
+    // 身份证号码
+    private String idCard;
+
+    // TODO: 2021/2/27 目前没有部门临时使用String 方便存储
+    // 部门id
+    private String deptId;
+
     private Integer roleId;
 }

+ 26 - 0
src/main/java/com/gz/dto/system/ArchiveFileDTO.java

@@ -0,0 +1,26 @@
+package com.gz.dto.system;
+
+import com.gz.core.BaseDTO;
+import lombok.Data;
+
+import javax.persistence.Table;
+
+@Data
+@Table(name = "tab_archive_file")
+public class ArchiveFileDTO extends BaseDTO {
+
+    private Integer archiveId;
+
+    // 文件名
+    private String fileName;
+
+    // 源文件名
+    private String originalFileName;
+
+    // 文件大小
+    private Long fileSize;
+
+    // 下载路径
+    private String filePath;
+
+}

+ 11 - 5
src/main/java/com/gz/dto/system/FileDTO.java

@@ -5,16 +5,22 @@ import lombok.Data;
 
 import javax.persistence.Table;
 
+/**
+ * @author LiuchangLan
+ * @date 2021/2/28 14:19
+ */
 @Data
 @Table(name = "tab_file")
 public class FileDTO extends BaseDTO {
-    // 文件id
-    private String fileId;
+    // 现文件名
+    private String fileName;
 
-    // 文件名
+    // 文件名
     private String originalFileName;
 
-    // 下载路径
-    private String downloadPath;
+    // 文件大小
+    private Long fileSize;
 
+    // 服务器文件路径
+    private String serverFilePath;
 }

+ 7 - 0
src/main/java/com/gz/mapper/archive/ArchiveFileMapper.java

@@ -0,0 +1,7 @@
+package com.gz.mapper.archive;
+
+import com.gz.dto.system.ArchiveFileDTO;
+import tk.mybatis.mapper.common.Mapper;
+
+public interface ArchiveFileMapper extends Mapper<ArchiveFileDTO> {
+}

+ 18 - 0
src/main/java/com/gz/mapper/archive/ArchiveMapper.java

@@ -1,12 +1,30 @@
 package com.gz.mapper.archive;
 
 import com.gz.dto.archive.ArchiveDTO;
+import com.gz.rvo.archive.ArchiveRVO;
+import com.gz.rvo.borrow.ArchiveBorrowListRVO;
+import com.gz.vo.archive.SearchArchiveVO;
+import org.apache.ibatis.annotations.Select;
 import tk.mybatis.mapper.common.Mapper;
 
+import java.util.List;
+
 /**
  * @description 档案Mapper
  * @author LiuChangLan
  * @since 2021/2/23 18:11
  */
 public interface ArchiveMapper extends Mapper<ArchiveDTO> {
+
+    List<ArchiveRVO> searchList(SearchArchiveVO vo);
+
+    /**
+     * @description 查询当前件号
+     * @author LiuChangLan
+     * @since 2021/2/24 17:44
+     */
+    @Select("SELECT auto_increment FROM information_schema.tables where table_schema=\"guihua_archives\" and table_name=\"tab_archives\";")
+    Integer selectCurrAutoIncrement();
+
+    List<ArchiveBorrowListRVO> selectBorrowList();
 }

+ 20 - 0
src/main/java/com/gz/mapper/borrow/ArchiveBorrowMapper.java

@@ -0,0 +1,20 @@
+package com.gz.mapper.borrow;
+
+import com.gz.dto.borrow.ArchiveBorrowDTO;
+import com.gz.rvo.borrow.ArchiveBorrowHistoryRVO;
+import com.gz.rvo.borrow.AuditInfoRVO;
+import org.apache.ibatis.annotations.Param;
+import tk.mybatis.mapper.common.Mapper;
+
+import java.util.List;
+
+/**
+ * @author LiuchangLan
+ * @date 2021/2/27 14:51
+ */
+public interface ArchiveBorrowMapper extends Mapper<ArchiveBorrowDTO> {
+
+    List<ArchiveBorrowHistoryRVO> selectArchiveBorrowHistory(@Param("adminId") Integer adminId);
+
+    AuditInfoRVO selectBorrowInfo(Integer id);
+}

+ 1 - 0
src/main/java/com/gz/mapper/system/ArchivesTreeMapper.java

@@ -9,4 +9,5 @@ import tk.mybatis.mapper.common.Mapper;
  * @since 2021/2/23 15:49
  */
 public interface ArchivesTreeMapper extends Mapper<ArchivesTreeDTO> {
+    ArchivesTreeDTO selectParentByCode(String code);
 }

+ 5 - 0
src/main/java/com/gz/mapper/system/FileMapper.java

@@ -3,5 +3,10 @@ package com.gz.mapper.system;
 import com.gz.dto.system.FileDTO;
 import tk.mybatis.mapper.common.Mapper;
 
+/**
+ * 文件Mapper
+ * @author LiuchangLan
+ * @date 2021/2/28 14:23
+ */
 public interface FileMapper extends Mapper<FileDTO> {
 }

+ 13 - 0
src/main/java/com/gz/rvo/archive/ArchiveRVO.java

@@ -0,0 +1,13 @@
+package com.gz.rvo.archive;
+
+import com.gz.dto.archive.ArchiveDTO;
+import lombok.Data;
+
+/**
+ * @author LiuchangLan
+ * @date 2021/2/24 16:27
+ */
+@Data
+public class ArchiveRVO extends ArchiveDTO {
+    private String mjText;
+}

+ 33 - 0
src/main/java/com/gz/rvo/borrow/ArchiveBorrowHistoryRVO.java

@@ -0,0 +1,33 @@
+package com.gz.rvo.borrow;
+
+import com.gz.core.BaseDTO;
+import lombok.Data;
+
+/**
+ * 借阅记录RVO
+ * @author LiuchangLan
+ * @date 2021/2/27 16:08
+ */
+@Data
+public class ArchiveBorrowHistoryRVO extends BaseDTO {
+    // 档号
+    private String dh;
+    // 提名
+    private String tm;
+    // 借阅时间
+    private String createTime;
+    // 预计归还时间
+    private String estimateReturnTime;
+    // 归还时间
+    private String returnTime;
+    // 借阅人
+    private String userName;
+    // 借阅类型
+    private Integer borrowType;
+    // 归还状态
+    private Integer returnStatus;
+    // 借阅状态
+    private Integer auditStatus;
+    // 借阅人
+    private String adminName;
+}

+ 16 - 0
src/main/java/com/gz/rvo/borrow/ArchiveBorrowListRVO.java

@@ -0,0 +1,16 @@
+package com.gz.rvo.borrow;
+
+import com.gz.dto.archive.ArchiveDTO;
+import lombok.Data;
+
+/**
+ * 借阅列表查看列表RVO
+ * @author LiuchangLan
+ * @date 2021/2/27 15:43
+ */
+@Data
+public class ArchiveBorrowListRVO extends ArchiveDTO {
+
+    // 原件状态
+    private String originalStatus;
+}

+ 39 - 0
src/main/java/com/gz/rvo/borrow/AuditInfoRVO.java

@@ -0,0 +1,39 @@
+package com.gz.rvo.borrow;
+
+import lombok.Data;
+
+/**
+ * 借阅预约申请信息RVO
+ *
+ * @author LiuchangLan
+ * @date 2021/2/28 15:18
+ */
+@Data
+public class AuditInfoRVO {
+    // 档号
+    private String dh;
+    // 借阅人
+    private String adminName;
+    // 借阅单位
+    private String deptId;
+    // 题名
+    private String tm;
+    // 证件号码
+    private String idCard;
+    // 创建时间
+    private String createTime;
+    // 归还时间
+    private String returnTime;
+    // 借阅类型
+    private String borrowType;
+    // 联系方式
+    private String phone;
+    // 备注
+    private String remarks;
+    // 附件下载地址
+    private String serverFilePath;
+    // 附件名称
+    private String originalFileName;
+    // 利用目的
+    private String usePurpose;
+}

+ 0 - 2
src/main/java/com/gz/rvo/system/FileUploadRVO.java

@@ -12,8 +12,6 @@ import lombok.NoArgsConstructor;
 @AllArgsConstructor
 @NoArgsConstructor
 public class FileUploadRVO {
-    // 关联id
-    private String fileId;
     // 原文件名
     private String originalFileName;
     // 现文件名

+ 35 - 0
src/main/java/com/gz/service/archive/ArchiveFileService.java

@@ -0,0 +1,35 @@
+package com.gz.service.archive;
+
+import com.github.pagehelper.PageInfo;
+import com.gz.core.exception.BusinessException;
+import com.gz.dto.system.ArchiveFileDTO;
+import com.gz.vo.archive.SearchArchiveFileVO;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+public interface ArchiveFileService {
+
+    /**
+     * @description 上传文件
+     * @author LiuChangLan
+     * @since 2020/9/9 11:25
+     * @return
+     */
+    ArchiveFileDTO upload(MultipartFile files,Integer archiveId) throws BusinessException, IOException;
+
+    /**
+     * @description 删除附件
+     * @author LiuChangLan
+     * @since 2021/2/25 17:09
+     */
+    Integer delete(Integer id);
+
+    /**
+     * @description 查询分页列表
+     * @author LiuChangLan
+     * @since 2021/2/25 17:09
+     * @param vo
+     */
+    PageInfo<ArchiveFileDTO> selectByPage(SearchArchiveFileVO vo);
+}

+ 14 - 2
src/main/java/com/gz/service/archive/ArchiveService.java

@@ -2,6 +2,10 @@ package com.gz.service.archive;
 
 import com.github.pagehelper.PageInfo;
 import com.gz.dto.archive.ArchiveDTO;
+import com.gz.rvo.archive.ArchiveRVO;
+import com.gz.rvo.borrow.ArchiveBorrowListRVO;
+import com.gz.vo.PageVO;
+import com.gz.vo.archive.InsertArchiveVO;
 import com.gz.vo.archive.SearchArchiveVO;
 
 import java.util.List;
@@ -11,8 +15,9 @@ public interface ArchiveService {
      * @description 增
      * @author LiuChangLan
      * @since 2020/9/4 14:46
+     * @param vo
      */
-    Integer insert(ArchiveDTO dto);
+    Integer insert(InsertArchiveVO vo) throws Exception;
 
     /**
      * @description 删
@@ -40,7 +45,7 @@ public interface ArchiveService {
      * @author LiuChangLan
      * @since 2020/9/4 14:46
      */
-    PageInfo<ArchiveDTO> selectByPage(SearchArchiveVO vo);
+    PageInfo<ArchiveRVO> selectByPage(SearchArchiveVO vo);
 
     /**
      * @description 根据主键查询
@@ -49,4 +54,11 @@ public interface ArchiveService {
      */
     ArchiveDTO selectByPrimaryKey(Integer id);
 
+    /**
+     * @description 查询借阅列表
+     * @author LiuChangLan
+     * @since 2021/2/27 15:45
+     * @return
+     */
+    PageInfo<ArchiveBorrowListRVO> selectBorrowList(PageVO vo);
 }

+ 113 - 0
src/main/java/com/gz/service/archive/impl/ArchiveFileServiceImpl.java

@@ -0,0 +1,113 @@
+package com.gz.service.archive.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.gz.config.FileUploadConfig;
+import com.gz.core.exception.BusinessException;
+import com.gz.core.exception.CustomExceptionEnum;
+import com.gz.dto.archive.ArchiveDTO;
+import com.gz.dto.system.ArchiveFileDTO;
+import com.gz.mapper.archive.ArchiveFileMapper;
+import com.gz.mapper.archive.ArchiveMapper;
+import com.gz.service.archive.ArchiveFileService;
+import com.gz.utils.JwtUtils;
+import com.gz.vo.archive.SearchArchiveFileVO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * @author LiuchangLan
+ * @date 2020/9/9 11:24
+ */
+@Service
+@Slf4j
+public class ArchiveFileServiceImpl implements ArchiveFileService {
+    @Resource
+    private ArchiveFileMapper archiveFileMapper;
+
+    @Resource
+    private ArchiveMapper archiveMapper;
+
+
+    @Override
+    public ArchiveFileDTO upload(MultipartFile file, Integer archiveId) throws BusinessException, IOException {
+
+        if (file.isEmpty()) {
+            throw new BusinessException(CustomExceptionEnum.File_NOT_EXISTS);
+        }
+        // 上传文件名称
+        String fileName = file.getOriginalFilename();
+        // 文件格式类型 大写
+        String fileType = fileName.substring(fileName.lastIndexOf(".") + 1).toUpperCase();
+        // 查询需要上传的档案信息
+        ArchiveDTO archiveDTO = archiveMapper.selectByPrimaryKey(archiveId);
+        // 获取服务器文件存储路径
+        String serverFileUploadPath = "";
+        // 保存到服务器的文件名
+        String fn = "";
+        switch (fileType) {
+            case "PDF":
+                serverFileUploadPath = String.format(FileUploadConfig.ARCHIVE_UPLOAD_PATH_PDF_FOMAT, archiveDTO.getGdnd(), archiveDTO.getQzh(), archiveDTO.getBgqx(), archiveDTO.getGdnd(), fileType);
+                // pdf文件名为档号
+                fn = String.format("%s.%s", archiveDTO.getDh(), fileType.toLowerCase());
+                break;
+            case "TIF":
+                // tif文件名为页码 无法通过后台生成 读取上传文件的名称
+                fn = fileName;
+                serverFileUploadPath = String.format(FileUploadConfig.ARCHIVE_UPLOAD_PATH_PDF_FOMAT, archiveDTO.getGdnd(), archiveDTO.getQzh(), archiveDTO.getBgqx(), archiveDTO.getGdnd(), fileType, archiveDTO.getDh());
+                break;
+            default:
+                // 其他文件直接抛错
+                throw new BusinessException(CustomExceptionEnum.UPLOAD_ARCHIVE_FILE_TYPE_ERROR);
+        }
+        // 上传路径
+        File serverFilePath = new File(FileUploadConfig.ARCHIVE_FILE_ROOT_DIRECTORY + serverFileUploadPath);
+        // 判断上传路径是否存在
+        if (!serverFilePath.exists()) {
+            serverFilePath.mkdirs();
+        }
+        // 创建文件
+        File dest = new File(serverFilePath.getPath() + "/" + fn);
+        // 上传
+        file.transferTo(dest);
+        // 数据库插入
+        ArchiveFileDTO archiveFileDTO = new ArchiveFileDTO();
+        archiveFileDTO.setArchiveId(archiveId);
+        archiveFileDTO.setOriginalFileName(fileName);
+        archiveFileDTO.setFileName(fn);
+        archiveFileDTO.setFileSize(file.getSize());
+        archiveFileDTO.setFilePath(serverFileUploadPath);
+        archiveFileDTO.setCreated(JwtUtils.getCurrentUserJwtPayload().getId());
+        archiveFileMapper.insertSelective(archiveFileDTO);
+
+        return archiveFileDTO;
+
+    }
+
+    @Override
+    public Integer delete(Integer id) {
+        ArchiveFileDTO archiveFileDTO = archiveFileMapper.selectByPrimaryKey(id);
+        // 文件路径
+        String filePath = String.format("%s%s/%s", FileUploadConfig.ARCHIVE_FILE_ROOT_DIRECTORY, archiveFileDTO.getFilePath(), archiveFileDTO.getFileName());
+        // 删除该文件
+        File file = new File(filePath);
+        if (file.exists()) {
+            log.info("删除文件:{}",filePath);
+            file.delete();
+        }
+        return archiveFileMapper.deleteByPrimaryKey(id);
+    }
+
+    @Override
+    public PageInfo<ArchiveFileDTO> selectByPage(SearchArchiveFileVO vo) {
+        PageHelper.startPage(vo.getPageNum(), vo.getPageSize());
+        ArchiveFileDTO archiveFileDTO = BeanUtil.copyProperties(vo, ArchiveFileDTO.class);
+        return new PageInfo<>(archiveFileMapper.select(archiveFileDTO));
+    }
+}

+ 77 - 8
src/main/java/com/gz/service/archive/impl/ArchiveServiceImpl.java

@@ -1,13 +1,22 @@
 package com.gz.service.archive.impl;
 
-import cn.hutool.core.bean.BeanUtil;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.gz.common.DataGlobalVariable;
+import com.gz.core.exception.BusinessException;
+import com.gz.core.exception.CustomExceptionEnum;
 import com.gz.dto.archive.ArchiveDTO;
+import com.gz.dto.system.ArchivesTreeDTO;
 import com.gz.mapper.archive.ArchiveMapper;
+import com.gz.rvo.archive.ArchiveRVO;
+import com.gz.rvo.borrow.ArchiveBorrowListRVO;
 import com.gz.service.archive.ArchiveService;
+import com.gz.service.system.ArchivesTreeService;
 import com.gz.utils.JwtUtils;
+import com.gz.vo.PageVO;
+import com.gz.vo.archive.InsertArchiveVO;
 import com.gz.vo.archive.SearchArchiveVO;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -17,16 +26,21 @@ import java.util.List;
  * @author LiuchangLan
  * @date 2021/2/23 18:12
  */
+@Slf4j
 @Service
 public class ArchiveServiceImpl implements ArchiveService {
 
     @Resource
     private ArchiveMapper mapper;
 
+    @Resource
+    private ArchivesTreeService archivesTreeService;
+
     @Override
-    public Integer insert(ArchiveDTO dto) {
-        dto.setCreated(JwtUtils.getCurrentUserJwtPayload().getId());
-        return mapper.insertSelective(dto);
+    public Integer insert(InsertArchiveVO vo) throws Exception {
+        vo.setCreated(JwtUtils.getCurrentUserJwtPayload().getId());
+        this.generateDh(vo);
+        return mapper.insertSelective(vo);
     }
 
     @Override
@@ -46,14 +60,69 @@ public class ArchiveServiceImpl implements ArchiveService {
     }
 
     @Override
-    public PageInfo<ArchiveDTO> selectByPage(SearchArchiveVO vo) {
-        PageHelper.startPage(vo.getPageNum(),vo.getPageSize());
-        ArchiveDTO param = BeanUtil.copyProperties(vo, ArchiveDTO.class);
-        return new PageInfo<>(mapper.select(param));
+    public PageInfo<ArchiveRVO> selectByPage(SearchArchiveVO vo) {
+        PageHelper.startPage(vo.getPageNum(), vo.getPageSize());
+        return new PageInfo<>(mapper.searchList(vo));
     }
 
     @Override
     public ArchiveDTO selectByPrimaryKey(Integer id) {
         return mapper.selectByPrimaryKey(id);
     }
+
+    /**
+     * @description 生成档号
+     * @author LiuChangLan
+     * @since 2021/2/24 17:11
+     */
+    private void generateDh(InsertArchiveVO vo) throws Exception {
+        ArchivesTreeDTO archivesTreeDTO = archivesTreeService.selectParentByCode(vo.getMl());
+        // 查询件号
+        String jh = String.format("%05d", mapper.selectCurrAutoIncrement());
+        switch (archivesTreeDTO.getCode()) {
+            case "WS":
+                vo.setDh(String.format(DataGlobalVariable.WS_DH_FOMAT, vo.getQzh(), vo.getGdnd(), vo.getBgqx(), jh));
+                break;
+//                return String.format(DataGlobalVariable.WS_DH_FOMAT, vo.getQzh(), vo.getGdnd(), vo.getBgqx(), jh);
+            case "KU":
+                vo.setDh(String.format(DataGlobalVariable.KU_DH_FOMAT, vo.getQzh(), vo.getMlh(), vo.getGdnd(), vo.getHsdwdh(), vo.getBgqx(), jh));
+                break;
+//                return String.format(DataGlobalVariable.KU_DH_FOMAT, vo.getQzh(), vo.getMlh(), vo.getGdnd(), vo.getHsdwdh(), vo.getBgqx(), jh);
+            case "KJ":
+                vo.setDh(String.format(DataGlobalVariable.KJ_DH_FOMAT, vo.getQzh(), vo.getMlh(), vo.getMl(), vo.getBgqx(), vo.getXmdh(), jh));
+                break;
+//                return String.format(DataGlobalVariable.KJ_DH_FOMAT, vo.getQzh(), vo.getMlh(), vo.getMl(), vo.getBgqx(), vo.getXmdh(), jh);
+            case "ZY":
+                vo.setDh(String.format(DataGlobalVariable.ZY_DH_FOMAT, vo.getQzh(), vo.getMlh(), vo.getMl(), vo.getBgqx(), jh));
+                break;
+//                return String.format(DataGlobalVariable.ZY_DH_FOMAT, vo.getQzh(), vo.getMlh(), vo.getMl(), vo.getBgqx(), jh);
+            case "YX":
+                // 段号
+                String dh = String.format("%02d", 0);
+                vo.setDh(String.format(DataGlobalVariable.YX_DH_FOMAT, vo.getQzh(), vo.getMlh(), vo.getMl(), vo.getBgqx(), jh, dh));
+                break;
+//                return String.format(DataGlobalVariable.YX_DH_FOMAT, vo.getQzh(), vo.getMlh(), vo.getMl(), vo.getBgqx(), jh, dh);
+            case "SJ":
+                vo.setDh(String.format(DataGlobalVariable.SJ_DH_FOMAT, vo.getQzh(), vo.getMlh(), vo.getBgqx(), jh));
+                break;
+//                return String.format(DataGlobalVariable.SJ_DH_FOMAT, vo.getQzh(), vo.getMlh(), vo.getBgqx(), jh);
+            case "SW":
+                vo.setDh(String.format(DataGlobalVariable.SW_DH_FOMAT, vo.getQzh(), vo.getMlh(), vo.getMl(), vo.getBgqx(), jh));
+                break;
+//                return String.format(DataGlobalVariable.SW_DH_FOMAT, vo.getQzh(), vo.getMlh(), vo.getMl(), vo.getBgqx(), jh);
+            case "MT":
+                vo.setDh(String.format(DataGlobalVariable.MT_DH_FOMAT, vo.getQzh(), vo.getMlh(), vo.getBgqx(), jh));
+                break;
+//                return String.format(DataGlobalVariable.MT_DH_FOMAT, vo.getQzh(), vo.getMlh(), vo.getBgqx(), jh);
+            default:
+                throw new BusinessException(CustomExceptionEnum.GENERATE_DH_ERROR);
+        }
+    }
+
+
+    @Override
+    public PageInfo<ArchiveBorrowListRVO> selectBorrowList(PageVO vo) {
+        PageHelper.startPage(vo.getPageNum(),vo.getPageSize());
+        return new PageInfo<>(mapper.selectBorrowList());
+    }
 }

+ 86 - 0
src/main/java/com/gz/service/borrow/ArchiveBorrowService.java

@@ -0,0 +1,86 @@
+package com.gz.service.borrow;
+
+import com.github.pagehelper.PageInfo;
+import com.gz.dto.archive.ArchiveDTO;
+import com.gz.dto.borrow.ArchiveBorrowDTO;
+import com.gz.rvo.archive.ArchiveRVO;
+import com.gz.rvo.borrow.ArchiveBorrowHistoryRVO;
+import com.gz.rvo.borrow.ArchiveBorrowListRVO;
+import com.gz.rvo.borrow.AuditInfoRVO;
+import com.gz.vo.PageVO;
+import com.gz.vo.archive.InsertArchiveVO;
+import com.gz.vo.archive.SearchArchiveVO;
+
+import java.util.List;
+
+/**
+ * @author LiuchangLan
+ * @date 2021/2/27 14:51
+ */
+public interface ArchiveBorrowService {
+
+    /**
+     * @param dto
+     * @description 增
+     * @author LiuChangLan
+     * @since 2020/9/4 14:46
+     */
+    Integer insert(ArchiveBorrowDTO dto) throws Exception;
+
+    /**
+     * @description 根据主键查询
+     * @author LiuChangLan
+     * @since 2020/9/4 16:36
+     */
+    ArchiveBorrowDTO selectByPrimaryKey(Integer id);
+
+    /**
+     * @description 预约借阅
+     * @author LiuChangLan
+     * @since 2021/2/27 14:57
+     */
+    Integer borrow(ArchiveBorrowDTO dto) throws Exception;
+
+
+    /**
+     * @description 查询当前用户的借阅记录
+     * @author LiuChangLan
+     * @since 2021/2/27 16:32
+     */
+    PageInfo<ArchiveBorrowHistoryRVO> selectCurrAdminArchiveBorrowHistory(PageVO vo);
+
+    /**
+     * @description 查询所有提交的审核列表
+     * @author LiuChangLan
+     * @since 2021/2/27 17:04
+     */
+    PageInfo<ArchiveBorrowHistoryRVO> selectArchiveBorrowHistory(PageVO vo);
+
+    /**
+     * @description 审核
+     * @author LiuChangLan
+     * @since 2021/2/27 17:16
+     */
+    void audit(ArchiveBorrowDTO dto);
+
+    /**
+     * @description 删
+     * @author LiuChangLan
+     * @since 2020/9/4 14:46
+     */
+    Integer delete(Integer id);
+
+    /**
+     * @description 查询借阅申请信息
+     * @author LiuChangLan
+     * @since 2021/2/28 15:31
+     */
+    AuditInfoRVO selectBorrowInfo(Integer id);
+
+    /**
+     * @description 归还
+     * @author LiuChangLan
+     * @since 2021/2/28 20:07
+     */
+    void returnBorrow(Integer id);
+}

+ 110 - 0
src/main/java/com/gz/service/borrow/impl/ArchiveBorrowServiceImpl.java

@@ -0,0 +1,110 @@
+package com.gz.service.borrow.impl;
+
+import cn.hutool.core.date.DateUtil;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.gz.core.exception.BusinessException;
+import com.gz.core.exception.CustomExceptionEnum;
+import com.gz.dto.borrow.ArchiveBorrowDTO;
+import com.gz.mapper.archive.ArchiveMapper;
+import com.gz.mapper.borrow.ArchiveBorrowMapper;
+import com.gz.rvo.borrow.ArchiveBorrowHistoryRVO;
+import com.gz.rvo.borrow.AuditInfoRVO;
+import com.gz.service.archive.ArchiveService;
+import com.gz.service.borrow.ArchiveBorrowService;
+import com.gz.utils.JwtUtils;
+import com.gz.vo.PageVO;
+import lombok.Data;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author LiuchangLan
+ * @date 2021/2/27 14:52
+ */
+@Service
+public class ArchiveBorrowServiceImpl implements ArchiveBorrowService {
+
+    @Resource
+    private ArchiveBorrowMapper mapper;
+
+    @Override
+    public Integer insert(ArchiveBorrowDTO dto) throws Exception {
+        dto.setCreated(JwtUtils.getCurrentUserJwtPayload().getId());
+        return mapper.insertSelective(dto);
+    }
+
+    @Override
+    public ArchiveBorrowDTO selectByPrimaryKey(Integer id) {
+        return mapper.selectByPrimaryKey(id);
+    }
+
+    @Override
+    public Integer borrow(ArchiveBorrowDTO dto) throws Exception {
+        ArchiveBorrowDTO selectBorrowParam = new ArchiveBorrowDTO();
+        selectBorrowParam.setArchiveId(dto.getArchiveId());
+        // 原件借阅需要判断是否已经被借阅
+        if (dto.getBorrowType().equals(1)) {
+            // 该文档的所有借阅记录
+            List<ArchiveBorrowDTO> borrowHistory = mapper.select(selectBorrowParam);
+            for (ArchiveBorrowDTO archiveBorrowDTO : borrowHistory) {
+                // 该文档借阅方式为原件借阅 && 借阅出去未归还
+                if (archiveBorrowDTO.getBorrowType().equals(1) && new Integer(0).equals(archiveBorrowDTO.getReturnStatus()) && archiveBorrowDTO.getAuditStatus().equals(2)) {
+                    throw new BusinessException(CustomExceptionEnum.ORIGINAL_SCRIPT_NO_EXISTS);
+                }
+            }
+        }
+        // 查询当前用户 该文档的借阅记录
+        selectBorrowParam.setAdminId(JwtUtils.getCurrentUserJwtPayload().getId());
+        List<ArchiveBorrowDTO> currAdminborrowHistory = mapper.select(selectBorrowParam);
+        for (ArchiveBorrowDTO archiveBorrowDTO : currAdminborrowHistory) {
+            // 如果记录中包含该文档并且未审核完成 || 借阅未归 不给予借阅
+            if (archiveBorrowDTO.getAuditStatus().equals(0) || archiveBorrowDTO.equals(2)) {
+                throw new BusinessException(CustomExceptionEnum.REPEAT_BORROW);
+            }
+        }
+        dto.setReturnStatus(0);
+        // 插入借阅记录
+        dto.setAdminId(JwtUtils.getCurrentUserJwtPayload().getId());
+        return this.insert(dto);
+    }
+
+    @Override
+    public PageInfo<ArchiveBorrowHistoryRVO> selectCurrAdminArchiveBorrowHistory(PageVO vo) {
+        Integer id = JwtUtils.getCurrentUserJwtPayload().getId();
+        PageHelper.startPage(vo.getPageNum(), vo.getPageSize());
+        return new PageInfo<>(mapper.selectArchiveBorrowHistory(id));
+    }
+
+    @Override
+    public PageInfo<ArchiveBorrowHistoryRVO> selectArchiveBorrowHistory(PageVO vo) {
+        PageHelper.startPage(vo.getPageNum(), vo.getPageSize());
+        return new PageInfo<>(mapper.selectArchiveBorrowHistory(null));
+    }
+
+    @Override
+    public void audit(ArchiveBorrowDTO dto) {
+        mapper.updateByPrimaryKeySelective(dto);
+    }
+
+    @Override
+    public Integer delete(Integer id) {
+        return mapper.deleteByPrimaryKey(id);
+    }
+
+    @Override
+    public AuditInfoRVO selectBorrowInfo(Integer id) {
+        return mapper.selectBorrowInfo(id);
+    }
+
+    @Override
+    public void returnBorrow(Integer id) {
+        ArchiveBorrowDTO archiveBorrowDTO = mapper.selectByPrimaryKey(id);
+        archiveBorrowDTO.setReturnTime(DateUtil.now());
+        archiveBorrowDTO.setReturnStatus(1);
+        mapper.updateByPrimaryKeySelective(archiveBorrowDTO);
+
+    }
+}

+ 15 - 0
src/main/java/com/gz/service/system/ArchivesTreeService.java

@@ -75,4 +75,19 @@ public interface ArchivesTreeService {
      * @since 2020/9/8 11:02
      */
     void downMove(Integer id);
+
+    /**
+     * @description 根据id查询子项
+     * @author LiuChangLan
+     * @since 2021/2/24 16:57
+     */
+    List<ArchivesTreeDTO> selectChildById(Integer id);
+
+    /**
+     * @description 根据code 查询父节点信息 找不到返回本节点信息
+     * @author LiuChangLan
+     * @since 2021/2/24 17:23
+     */
+    ArchivesTreeDTO selectParentByCode(String code);
+
 }

+ 7 - 0
src/main/java/com/gz/service/system/AuthService.java

@@ -50,4 +50,11 @@ public interface AuthService {
     List<MenuDTO> getLoginButtons(Integer menuId);
 
     String generatePictureCaptcha();
+
+    /**
+     * @description 获取当前登录的用户
+     * @author LiuChangLan
+     * @since 2021/2/27 14:32
+     */
+    public AdminDTO currLoginAdmin();
 }

+ 8 - 0
src/main/java/com/gz/service/system/DictService.java

@@ -2,6 +2,7 @@ package com.gz.service.system;
 
 import cn.hutool.core.lang.tree.Tree;
 import com.github.pagehelper.PageInfo;
+import com.gz.controller.system.DictController;
 import com.gz.core.exception.BusinessException;
 import com.gz.dto.system.DictDTO;
 import com.gz.vo.system.DictVO;
@@ -80,4 +81,11 @@ public interface DictService {
      * @since 2020/10/28 14:16
      */
     String getDictName(String code);
+
+    /**
+     * @description 根据code查询单个字典
+     * @author LiuChangLan
+     * @since 2021/2/24 15:52
+     */
+    DictDTO selectByCode(String code);
 }

+ 1 - 14
src/main/java/com/gz/service/system/FileService.java

@@ -1,24 +1,11 @@
 package com.gz.service.system;
 
-import com.gz.core.exception.BusinessException;
 import com.gz.dto.system.FileDTO;
 import com.gz.rvo.system.FileUploadRVO;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
-import java.util.List;
 
 public interface FileService {
-
-    /**
-     * @description 上传文件
-     * @author LiuChangLan
-     * @since 2020/9/9 11:25
-     * @return
-     */
-    FileUploadRVO upload(MultipartFile files, String fileId) throws BusinessException, IOException;
-
-    List<FileDTO> selectByFileId(String fileId);
-
-    Integer delete(Integer id);
+    FileDTO upload(MultipartFile file) throws IOException;
 }

+ 29 - 0
src/main/java/com/gz/service/system/impl/ArchivesTreeServiceImpl.java

@@ -13,6 +13,7 @@ import tk.mybatis.mapper.entity.Example;
 
 import javax.annotation.Resource;
 import java.beans.ParameterDescriptor;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -151,4 +152,32 @@ public class ArchivesTreeServiceImpl implements ArchivesTreeService {
             }
         }
     }
+
+
+    @Override
+    public List<ArchivesTreeDTO> selectChildById(Integer id) {
+        ArchivesTreeDTO param = new ArchivesTreeDTO();
+        param.setParentId(id);
+        // 查询子集
+        List<ArchivesTreeDTO> select = mapper.select(param);
+        // 无子集就返回自己
+        if (select.size() > 0){
+            return select;
+        }else {
+            return new ArrayList<ArchivesTreeDTO>(){{
+                add(mapper.selectByPrimaryKey(id));
+            }};
+        }
+    }
+
+    @Override
+    public ArchivesTreeDTO selectParentByCode(String code) {
+        ArchivesTreeDTO archivesTreeDTO = mapper.selectParentByCode(code);
+        if (archivesTreeDTO == null){
+            ArchivesTreeDTO param = new ArchivesTreeDTO();
+            param.setCode(code);
+            return mapper.selectOne(param);
+        }
+        return archivesTreeDTO;
+    }
 }

+ 6 - 0
src/main/java/com/gz/service/system/impl/AuthServiceImpl.java

@@ -227,4 +227,10 @@ public class AuthServiceImpl implements AuthService {
         log.info("生成验证码:{}",lineCaptcha.getCode());
         return "data:image/jpg;base64," + lineCaptcha.getImageBase64();
     }
+
+    @Override
+    public AdminDTO currLoginAdmin() {
+        Integer id = JwtUtils.getCurrentUserJwtPayload().getId();
+        return adminMapper.selectByPrimaryKey(id);
+    }
 }

+ 7 - 0
src/main/java/com/gz/service/system/impl/DictServiceImpl.java

@@ -145,4 +145,11 @@ public class DictServiceImpl implements DictService {
         DictDTO dictDTO1 = dictMapper.selectOne(dictDTO);
         return dictDTO1.getDictName();
     }
+
+    @Override
+    public DictDTO selectByCode(String code) {
+        DictDTO dictDTO = new DictDTO();
+        dictDTO.setDictCode(code);
+        return dictMapper.selectOne(dictDTO);
+    }
 }

+ 41 - 52
src/main/java/com/gz/service/system/impl/FileServiceImpl.java

@@ -2,84 +2,73 @@ package com.gz.service.system.impl;
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.IdUtil;
-import com.gz.common.DataGlobalVariable;
+import com.gz.config.FileUploadConfig;
 import com.gz.core.exception.BusinessException;
 import com.gz.core.exception.CustomExceptionEnum;
 import com.gz.dto.system.FileDTO;
 import com.gz.mapper.system.FileMapper;
 import com.gz.rvo.system.FileUploadRVO;
 import com.gz.service.system.FileService;
-import com.gz.utils.JwtUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.ClassUtils;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import java.io.File;
 import java.io.IOException;
 import java.util.Date;
-import java.util.List;
 
 /**
  * @author LiuchangLan
- * @date 2020/9/9 11:24
+ * @date 2021/2/28 13:27
  */
-@Service
 @Slf4j
+@Service
 public class FileServiceImpl implements FileService {
+
     @Resource
     private FileMapper fileMapper;
 
     @Override
-    @Transactional
-    public FileUploadRVO upload(MultipartFile file, String fileId) throws BusinessException, IOException {
-
-            if (file.isEmpty()) {
-                throw new BusinessException(CustomExceptionEnum.File_NOT_EXISTS);
-            }
-            String fileName = file.getOriginalFilename();
-            // 上传路径
-            String filePath = ClassUtils.getDefaultClassLoader().getResource("").getPath() + "static/upload/" + DateUtil.format(new Date(), "yyyyMMdd") + "/";
-            File file1 = new File(filePath);
-            // 判断上传是否存在
-            if (!file1.exists()) {
-                file1.mkdirs();
-            }
-            if ("null".equals(fileId) || fileId == null || "".equals(fileId)) {
-                fileId = IdUtil.simpleUUID();
-            }
-        // 现文件名
-            String fn = IdUtil.simpleUUID() + fileName.substring(fileName.indexOf("."));
-            File dest = new File(filePath + fn);
-            // 上传
-            file.transferTo(dest);
-            // 数据库插入
-            FileDTO fileDTO = new FileDTO();
-            fileDTO.setFileId(fileId);
-            fileDTO.setOriginalFileName(fileName);
-            fileDTO.setDownloadPath("upload/" + DateUtil.format(new Date(), "yyyyMMdd") + "/" + fn);
-            fileDTO.setCreated(JwtUtils.getCurrentUserJwtPayload().getId());
-            fileMapper.insertSelective(fileDTO);
-
-            FileUploadRVO fileUploadRVO = new FileUploadRVO(fileId,fileName, fn, "upload/" + DateUtil.format(new Date(), "yyyyMMdd") + "/" + fn);
-            return fileUploadRVO;
-
-    }
+    public FileDTO upload(MultipartFile file) throws IOException {
+        if (file.isEmpty()) {
+            throw new BusinessException(CustomExceptionEnum.File_NOT_EXISTS);
+        }
+        // 上传文件名称
+        String fileName = file.getOriginalFilename();
+        log.info("上传附件:[{}]", fileName);
+        // 当前时间
+        Date date = DateUtil.date();
+        // 相对路径
+        String serverRelativePath = "/" + DateUtil.year(date) + "/" + (DateUtil.month(date) + 1) + "/" + DateUtil.dayOfMonth(date) + "/";
+        // 绝对路径
+        String serverPath = FileUploadConfig.FILE_ROOT_DIRECTORY + serverRelativePath;
+        // 判断路径是否存在
+        File serverPathObj = new File(serverPath);
+        // 判断路径是否存在
+        if (!serverPathObj.exists()) {
+            log.info("路径:[{}]不存在,创建路径", serverPath);
+            serverPathObj.mkdirs();
+        }
+        // 文件类型(带点)
+        String fileType = fileName.substring(fileName.lastIndexOf("."));
+        // 存储在服务器上的文件名
+        String serverFileName = IdUtil.simpleUUID().toUpperCase() + fileType;
+        // 服务器上文件的路径
+        String serverFilePath = serverPath + serverFileName;
+        // 创建文件
+        File dest = new File(serverFilePath);
+        // 上传
+        file.transferTo(dest);
 
-    @Override
-    public List<FileDTO> selectByFileId(String fileId) {
         FileDTO fileDTO = new FileDTO();
-        fileDTO.setFileId(fileId);
-        List<FileDTO> select = fileMapper.select(fileDTO);
-        return select;
-    }
+        fileDTO.setFileName(serverFileName);
+        fileDTO.setFileSize(file.getSize());
+        fileDTO.setOriginalFileName(fileName);
+        fileDTO.setServerFilePath(serverRelativePath + serverFileName);
 
-    @Override
-    public Integer delete(Integer id) {
-        return fileMapper.deleteByPrimaryKey(id);
+        fileMapper.insertSelective(fileDTO);
+        log.info("文件上传完成,原文件名[{}],服务器地址[{}],现在文件名[{}]", fileName, serverFilePath, serverFileName);
+        return fileDTO;
     }
-
-
 }

+ 2 - 2
src/main/java/com/gz/service/system/impl/RoleServiceImpl.java

@@ -57,8 +57,8 @@ public class RoleServiceImpl implements RoleService {
     public Integer update(RoleDTO roleDTO) {
         // 修改人
         roleDTO.setUpdated(JwtUtils.getCurrentUserJwtPayload().getId());
-        // 修改时间
-        roleDTO.setUpdateTime(DateUtil.now());
+//        // 修改时间
+//        roleDTO.setUpdateTime(DateUtil.now());
         // 执行入库
         return roleMapper.updateByPrimaryKeySelective(roleDTO);
     }

+ 16 - 0
src/main/java/com/gz/vo/archive/InsertArchiveVO.java

@@ -0,0 +1,16 @@
+package com.gz.vo.archive;
+
+import com.gz.dto.archive.ArchiveDTO;
+import lombok.Data;
+
+/**
+ * @author LiuchangLan
+ * @date 2021/2/25 10:09
+ */
+@Data
+public class InsertArchiveVO extends ArchiveDTO {
+    // 核算单位代号
+    private Integer hsdwdh;
+    // 项目代号
+    private Integer xmdh;
+}

+ 14 - 0
src/main/java/com/gz/vo/archive/SearchArchiveFileVO.java

@@ -0,0 +1,14 @@
+package com.gz.vo.archive;
+
+import com.gz.vo.PageVO;
+import lombok.Data;
+
+/**
+ * 查询附件入参VO
+ * @author LiuchangLan
+ * @date 2021/2/25 17:15
+ */
+@Data
+public class SearchArchiveFileVO extends PageVO {
+    private Integer archiveId;
+}

+ 1 - 1
src/main/java/com/gz/vo/archive/SearchArchiveVO.java

@@ -10,7 +10,7 @@ import lombok.Data;
  */
 @Data
 public class SearchArchiveVO extends PageVO {
-    // 档案树id
+    // 档
     private String dh;
 
     // 目录号

+ 6 - 1
src/main/resources/application-dev.yml

@@ -1,6 +1,8 @@
 server:
   port: 9091
 spring:
+  resources:
+    static-locations: classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resources,file:${upload-file.file-root-directory},file:${upload-file.archive-file-root-directory}
   servlet:
     multipart:
       # 单个文件大小
@@ -80,6 +82,9 @@ spring:
         # 连接池中的最小空闲连接
         min-idle: 2
     # 密码
-#    password: 123456
+    #    password: 123456
     # 连接超时时间(毫秒)
     timeout: 30000
+upload-file:
+  file-root-directory: E:\cache
+  archive-file-root-directory: E:\cache\archive

+ 1 - 1
src/main/resources/application.yml

@@ -22,5 +22,5 @@ auth:
     # 进行登录验证的地址
     force-urls: /**
     # 跳过验证地址
-    skip-urls: /,/**/*.png,/**/*.jpg,/**/*.html,/**/*.ico,/**/*.css,/**/*.js,/webSocket/**,/**/*.woff2,/**/*.less,/system/auth/login,/system/auth/refreshToken,/system/auth/generatePictureCaptcha
+    skip-urls: /,/**/*.pdf,/**/*.png,/**/*.jpg,/**/*.html,/**/*.ico,/**/*.css,/**/*.gif,/**/*.js,/webSocket/**,/**/*.woff2,/**/*.less,/system/auth/login,/system/auth/refreshToken,/system/auth/generatePictureCaptcha
 

+ 58 - 0
src/main/resources/mapper/archiveBorrowMapper.xml

@@ -0,0 +1,58 @@
+<?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.gz.mapper.borrow.ArchiveBorrowMapper">
+
+    <select id="selectArchiveBorrowHistory" resultType="com.gz.rvo.borrow.ArchiveBorrowHistoryRVO" parameterType="int">
+        SELECT ab.id,
+               a.dh,
+               a.tm,
+               ab.create_time,
+               ab.borrow_type,
+               ab.return_time,
+               ab.return_status,
+               ab.estimate_return_time,
+               ab.audit_status,
+               ad.admin_name
+        FROM tab_archive_borrow ab
+                 LEFT JOIN
+             tab_archives a
+             ON ab.archive_id = a.id
+                 left join
+             tab_admin ad
+             on ad.id = ab.admin_id
+        where ab.deleted = 0
+          and a.deleted = 0
+          and ad.deleted = 0
+          <if test="adminId != null and adminId != ''">
+              and ad.id = #{adminId}
+          </if>
+    </select>
+
+    <select id="selectBorrowInfo" resultType="com.gz.rvo.borrow.AuditInfoRVO">
+        SELECT
+            ad.admin_name,
+            ad.dept_id,
+            a.tm,
+            ad.id_card,
+            a.dh,
+            ab.use_purpose,
+            ab.create_time,
+            ab.return_time,
+            ab.borrow_type,
+            ad.phone,
+            f.original_file_name,
+            f.server_file_path
+        FROM
+            `tab_archive_borrow` ab
+                LEFT JOIN tab_archives a
+                          ON ab.archive_id = a.id
+                LEFT JOIN tab_admin ad
+                          ON ab.admin_id = ad.id
+                LEFT JOIN tab_file f
+                          ON ab.relevant_certification = f.id
+        WHERE a.deleted = 0
+          AND ab.deleted = 0
+          AND ad.deleted = 0
+          AND ab.id = #{id}
+    </select>
+</mapper>

+ 50 - 0
src/main/resources/mapper/archiveMapper.xml

@@ -0,0 +1,50 @@
+<?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.gz.mapper.archive.ArchiveMapper">
+
+    <select id="searchList" resultType="com.gz.rvo.archive.ArchiveRVO"
+            parameterType="com.gz.vo.archive.SearchArchiveVO">
+        SELECT
+        d.dict_name mj_text,
+        a.*
+        FROM `tab_archives` a
+        LEFT JOIN tab_dict d
+        ON a.mj = d.dict_code
+        <where>
+            a.deleted = 0
+            <if test="dh != null and dh != ''">
+                AND a.dh = #{dh}
+            </if>
+            <if test="mlh != null and mlh != ''">
+                AND a.mlh = #{mlh}
+            </if>
+            <if test="ml != null and ml != ''">
+                AND a.ml = #{ml}
+            </if>
+            <if test="bgqx != null and bgqx != ''">
+                AND a.bgqx = #{bgqx}
+            </if>
+        </where>
+
+
+    </select>
+
+    <select id="selectBorrowList" resultType="com.gz.rvo.borrow.ArchiveBorrowListRVO">
+        <![CDATA[
+        SELECT IF
+                   (
+                           (SELECT count(admin_id) num
+                            FROM tab_archive_borrow ab
+                            WHERE ab.archive_id = a.id
+                              AND ab.borrow_type = 1
+                              AND ab.audit_status = 2
+                              AND ab.return_status = 0) <= 0,
+                           '可借阅',
+                           '已借阅'
+                   ) original_status,
+               a.*
+        FROM tab_archives a
+        WHERE a.deleted = 0
+        ]]>
+    </select>
+</mapper>

+ 9 - 0
src/main/resources/mapper/archivesTreeMapper.xml

@@ -0,0 +1,9 @@
+<?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.gz.mapper.system.ArchivesTreeMapper">
+
+    <select id="selectParentByCode" resultType="com.gz.dto.system.ArchivesTreeDTO"
+            parameterType="string">
+        select * from tab_archives_tree where id = (select parent_id from tab_archives_tree where code = #{code})
+    </select>
+</mapper>

+ 2 - 2
src/main/resources/static/404.html

@@ -9,7 +9,7 @@
     <meta name="apple-mobile-web-app-status-bar-style" content="black">
     <meta name="apple-mobile-web-app-capable" content="yes">
     <meta name="format-detection" content="telephone=no">
-    <link rel="stylesheet" href="lib/layui-v2.5.5/css/layui.css" media="all">
+    <link rel="stylesheet" href="/lib/layui-v2.5.5/css/layui.css" media="all">
     <style>
         .error .clip .shadow {height:180px;}
         .error .clip:nth-of-type(2) .shadow {width:130px;}
@@ -72,7 +72,7 @@
         </div>
     </div>
 </div>
-<script src="lib/layui-v2.5.5/layui.js" charset="utf-8"></script>
+<script src="/lib/layui-v2.5.5/layui.js" charset="utf-8"></script>
 <script>
     function randomNum() {
         return Math.floor(Math.random() * 9) + 1;

+ 5 - 5
src/main/resources/static/index.html

@@ -2,10 +2,10 @@
 <html>
 <head>
     <meta charset="utf-8">
-    <title>江宁开发区干部员工电子廉政档案系统</title>
+    <title>南京市规划和自然资源局档案管理系统</title>
     <meta name="keywords" content="layuimini,layui,layui模板,layui后台,后台模板,admin,admin模板,layui mini">
     <meta name="description"
-          content="layuimini基于layui的轻量级前端后台管理框架,最简洁、易用的后台框架模板,面向所有层次的前后端程序,只需提供一个接口就直接初始化整个框架,无需复杂操作。">
+          content="南京市规划和自然资源局档案管理系统">
     <meta name="renderer" content="webkit">
     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
     <meta http-equiv="Access-Control-Allow-Origin" content="*">
@@ -146,7 +146,7 @@
         // 加载用户名
         let getLoginUserName = function () {
             http.get('system/auth/getLoginUserName', null, false, function (res) {
-                $("#account").text(res.data.nickName)
+                $("#account").text(res.data.adminName)
                 websocket = new WebSocket("ws://"+http.host+"/webSocket/" + res.data.id);
             })
         }
@@ -156,8 +156,8 @@
             iniUrl: "system/auth/getLoginMenus",    // 初始化接口
             clearUrl: "api/clear.json", // 缓存清理接口
             urlHashLocation: false,      // 是否打开hash定位
-            bgColorDefault: 3,      // 主题默认配置
-            multiModule: false,          // 是否开启多模块
+            bgColorDefault: 8,      // 主题默认配置
+            multiModule: true,          // 是否开启多模块
             menuChildOpen: true,       // 是否默认展开菜单
             loadingTime: 0,             // 初始化加载时间
             pageAnim: true,             // iframe窗口动画

+ 4 - 3
src/main/resources/static/js/lay-module/request/http.js

@@ -54,7 +54,7 @@ layui.define(['jquery', 'layer'], function (exports) {
                 }
             },
             error: function (e) {
-                layer.msg('请求出错' + e,{
+                layer.msg('请求出错' + e, {
                     icon: 2
                 })
             }
@@ -106,7 +106,7 @@ layui.define(['jquery', 'layer'], function (exports) {
             // 显示在头部的按钮
             let header = ['add', 'download', 'import', 'batchDel', 'foldAll', 'unfoldAll', 'clearThirtyOut', 'clearAll']
             // 显示在行里的按钮
-            let row = ['show', 'update', 'delete', 'export', 'up', 'down', 'setRole', 'resetPassword']
+            let row = ['show', 'update', 'delete', 'export', 'up', 'down', 'setRole', 'resetPassword', 'files', 'borrowing']
             http.get('system/auth/getLoginButtons', {menuId: menuId}, false, function (res) {
                 let headerHtml = '<div class="layui-btn-container">'
                 let rowHtml = ''
@@ -130,7 +130,8 @@ layui.define(['jquery', 'layer'], function (exports) {
         login: function (data) {
             login(data)
         },
-        host: host
+        host: host,
+        requestUrl: requestUrl
     };
     //输出接口
     exports('http', http);

+ 4 - 4
src/main/resources/static/login.html

@@ -2,7 +2,7 @@
 <html>
 <head>
     <meta charset="UTF-8">
-    <title>后台管理-登陆</title>
+    <title>南京市规划和自然资源局档案管理系统-登陆</title>
     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
     <meta http-equiv="Access-Control-Allow-Origin" content="*">
     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
@@ -122,17 +122,17 @@
         <div class="layui-form login-form" lay-filter="login-form">
             <form class="layui-form" action="">
                 <div class="layui-form-item logo-title">
-                    <h1>廉政档案系统</h1>
+                    <h1>南京市规划和自然资源局档案管理系统</h1>
                 </div>
                 <div class="layui-form-item">
                     <label class="layui-icon layui-icon-username"></label>
                     <input type="text" name="account" lay-verify="required|account" placeholder="用户名或者邮箱"
-                           autocomplete="off" class="layui-input" value="">
+                           autocomplete="off" class="layui-input" value="admin">
                 </div>
                 <div class="layui-form-item">
                     <label class="layui-icon layui-icon-password"></label>
                     <input type="password" name="password" lay-verify="required|password" placeholder="密码"
-                           autocomplete="off" class="layui-input" value="">
+                           autocomplete="off" class="layui-input" value="123456">
                 </div>
                 <div class="layui-form-item">
                     <label class="layui-icon layui-icon-vercode"></label>

+ 10 - 1
src/main/resources/static/page/admin/edit.html

@@ -43,6 +43,15 @@
     </div>
 
     <div class="layui-form-item">
+        <label class="layui-form-label required">身份证号</label>
+        <div class="layui-input-block">
+            <input type="text" name="idCard" lay-verify="idCard" lay-verify="identity" lay-reqtext="身份证号不能为空" placeholder="请输入身份证号"
+                   value="" class="layui-input">
+        </div>
+    </div>
+
+
+    <div class="layui-form-item">
         <label class="layui-form-label required">邮箱</label>
         <div class="layui-input-block">
         <input type="text" name="email" lay-verify="email" lay-reqtext="邮箱不能为空" placeholder="请输入邮箱"
@@ -87,7 +96,7 @@
 
         //保存方法
         let save = function (data) {
-            http.post(id == '' ? 'system/admin/insert': 'system/admin/update',data,true,function (res) {
+            http.post('borrow/archiveBorrow/',data,true,function (res) {
                 if (res.code == 200){
                     let index = layer.alert('保存成功!', {
                         title: id == '' ? '添加':'修改' + '信息'

+ 2 - 1
src/main/resources/static/page/admin/list.html

@@ -66,13 +66,14 @@
                         }
                     },
                     done: function(res, curr, count) {
-                        $('th').css({'background-color': '#1aa094', 'color': '#fff','font-weight':'bold'})
+                        // $('th').css({'background-color': '#1aa094', 'color': '#fff','font-weight':'bold'})
                     },
                     cols: [[
                         // {type: 'checkbox', fixed: 'left'}
                         {type: 'numbers'},
                         {field: 'adminName', title: '用户名'},
                         {field: 'account', title: '登录名'},
+                        {field: 'idCard', title: '身份证号'},
                         {field: 'email', title: '邮箱'},
                         {field: 'phone', title: '手机'},
                         {field: 'createTime', title: '创建时间'},

+ 410 - 67
src/main/resources/static/page/archive/edit.html

@@ -10,45 +10,214 @@
         body {
             background-color: #ffffff;
         }
+
+        .layui-form-item .layui-input-inline {
+            width: 30%;
+        }
+
+        .layui-form-label {
+            /*width: 90px;*/
+        }
+
+        #gdnd, #wjxcsj, #wjdqsj {
+            cursor: pointer;
+        }
     </style>
 </head>
 <body>
 <div class="layui-form layuimini-form" lay-filter="addDict">
+
     <div class="layui-form-item">
-        <label class="layui-form-label required">门类名称</label>
-        <div class="layui-input-block">
-            <input type="hidden" name="id" id="id" class="layui-input">
-            <input type="text" name="title" lay-verify="required" lay-reqtext="门类名称不能为空" placeholder="请输入门类名称" value="" class="layui-input">
+        <div class="layui-input-inline">
+            <label class="layui-form-label required">归档年度:</label>
+            <div class="layui-input-block">
+                <input type="text" class="layui-input" name="gdnd" id="gdnd" lay-filter="gdnd" readonly>
+            </div>
+        </div>
+        <div class="layui-input-inline">
+            <label class="layui-form-label required">全宗号:</label>
+            <div class="layui-input-block">
+                <input type="hidden" class="layui-input" name="`id" id="id">
+                <select name="qzh" id="qzh" lay-filter="qzh">
+                    <option value="-1">请选择全宗号</option>
+                </select>
+            </div>
+        </div>
+        <div class="layui-input-inline" id="mlh-container">
+            <label class="layui-form-label">目录号:</label>
+            <div class="layui-input-block">
+                <input type="number" class="layui-input" name="mlh" id="mlh" lay-filter="mlh">
+            </div>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <div class="layui-input-inline">
+            <label class="layui-form-label required">档案门类:</label>
+            <div class="layui-input-block">
+                <input type="hidden" id="mlId" class="layui-input">
+                <input type="hidden" id="mlCode" class="layui-input">
+                <select name="ml" id="ml" lay-filter="ml">
+                    <option value="-1">请选择档案门类</option>
+                </select>
+            </div>
+        </div>
+        <div class="layui-input-inline">
+            <label class="layui-form-label required">保管期限:</label>
+            <div class="layui-input-block">
+                <select name="bgqx" id="bgqx" lay-filter="bgqx">
+                    <option value="-1">请选择保管期限</option>
+                </select>
+            </div>
+        </div>
+        <div class="layui-input-inline">
+            <label class="layui-form-label required">档号:</label>
+            <div class="layui-input-block">
+                <input type="text" class="layui-input" id="dh" name="dh">
+            </div>
         </div>
     </div>
 
 
     <div class="layui-form-item">
-        <label class="layui-form-label required">门类代码</label>
+        <label class="layui-form-label">题名:</label>
         <div class="layui-input-block">
-            <input type="text" name="code" placeholder="请输入门类代码" value="" lay-verify="" lay-reqtext="门类代码不能为空" class="layui-input">
+            <input type="text" class="layui-input" name="tm" id="tm" lay-filter="tm">
         </div>
     </div>
 
+    <div class="layui-form-item">
+        <div class="layui-input-inline">
+            <label class="layui-form-label required">文件形成时间:</label>
+            <div class="layui-input-block">
+                <input type="text" class="layui-input" name="wjxcsj" id="wjxcsj" lay-filter="wjxcsj" readonly>
+            </div>
+        </div>
+        <div class="layui-input-inline">
+            <label class="layui-form-label required">文件到期时间:</label>
+            <div class="layui-input-block">
+                <input type="text" class="layui-input" name="wjdqsj" id="wjdqsj" lay-filter="wjdqsj" readonly>
+            </div>
+        </div>
 
+        <div class="layui-input-inline">
+            <label class="layui-form-label required">件号:</label>
+            <div class="layui-input-block">
+                <input type="number" class="layui-input" name="jh" id="jh" lay-filter="jh">
+            </div>
+        </div>
+
+        <div class="layui-input-inline">
+            <label class="layui-form-label">文件编号(文号):</label>
+            <div class="layui-input-block">
+                <input type="text" class="layui-input" name="wjbh" id="wjbh" lay-filter="wjbh">
+            </div>
+        </div>
+        <div class="layui-input-inline">
+            <label class="layui-form-label required">密级:</label>
+            <div class="layui-input-block">
+                <select name="mj" id="mj" lay-filter="mj">
+                    <option value="-1">请选择密级</option>
+                </select>
+            </div>
+        </div>
+    </div>
 
     <div class="layui-form-item">
-        <label class="layui-form-label">父级门类</label>
-        <div class="layui-input-block">
-<!--            <select name="parentId" id="parentId" lay-filter="parentId">-->
-<!--                <option value="-1">请选择父级菜单</option>-->
-<!--            </select>-->
-            <input type="text" id="parentId" name="parentId" lay-filter="parentId" class="layui-input">
+        <div class="layui-input-inline">
+            <label class="layui-form-label">载体数量:</label>
+            <div class="layui-input-block">
+                <input type="number" class="layui-input" name="ztsl" id="ztsl" lay-filter="ztsl">
+            </div>
+        </div>
+
+
+        <div class="layui-input-inline">
+            <label class="layui-form-label">主办部门:</label>
+            <div class="layui-input-block">
+                <input type="text" class="layui-input" name="zbbm" id="zbbm" lay-filter="zbbm">
+            </div>
+        </div>
+
+        <div class="layui-input-inline">
+            <label class="layui-form-label">协办部门:</label>
+            <div class="layui-input-block">
+                <input type="text" class="layui-input" name="xbbm" id="xbbm" lay-filter="xbbm">
+            </div>
         </div>
     </div>
+    <div class="layui-form-item">
+        <div class="layui-input-inline">
+            <label class="layui-form-label">页数:</label>
+            <div class="layui-input-block">
+                <input type="number" class="layui-input" name="ys" id="ys" lay-filter="ys">
+            </div>
+        </div>
 
+        <div class="layui-input-inline">
+            <label class="layui-form-label">内容概述:</label>
+            <div class="layui-input-block">
+                <input type="text" class="layui-input" name="nrgs" id="nrgs" lay-filter="nrgs">
+            </div>
+        </div>
+    </div>
     <div class="layui-form-item">
-        <label class="layui-form-label">排序</label>
-        <div class="layui-input-block">
-            <input type="number" name="sort" class="layui-input" lay-verify="" lay-reqtext="排序不能为空">
+        <div class="layui-input-inline">
+            <label class="layui-form-label">责任者:</label>
+            <div class="layui-input-block">
+                <input type="text" class="layui-input" name="zrz" id="zrz" lay-filter="zrz">
+            </div>
+        </div>
+        <div class="layui-input-inline">
+            <label class="layui-form-label">存放位置描述:</label>
+            <div class="layui-input-block">
+                <input type="text" class="layui-input" name="cfwzms" id="cfwzms" lay-filter="cfwzms">
+            </div>
+        </div>
+        <div class="layui-input-inline">
+            <label class="layui-form-label">备注:</label>
+            <div class="layui-input-block">
+                <input type="text" class="layui-input" name="bz" id="bz" lay-filter="bz">
+            </div>
+        </div>
+    </div>
+    <div class="layui-form-item">
+
+
+    </div>
+
+
+    <div class="layui-form-item">
+        <div class="layui-input-inline" style="display: none" id="hsdwdh-container">
+            <label class="layui-form-label">核算单位代号:</label>
+            <div class="layui-input-block">
+                <input type="number" max="99" class="layui-input" name="hsdwdh" id="hsdwdh" lay-filter="hsdwdh">
+            </div>
+        </div>
+        <div class="layui-input-inline" style="display: none" id="xmdh-container">
+            <label class="layui-form-label">项目代号/设备代号:</label>
+            <div class="layui-input-block">
+                <input type="number" max="9999" class="layui-input" name="xmdh" id="xmdh" lay-filter="xmdh">
+            </div>
         </div>
     </div>
 
+    <!--    <div class="layui-form-item">-->
+    <!--        <button type="button" class="layui-btn layui-btn-normal" id="selectFile">选择多文件</button>-->
+    <!--        <div class="layui-upload-list">-->
+    <!--            <table class="layui-table">-->
+    <!--                <thead>-->
+    <!--                <tr><th>文件名</th>-->
+    <!--                    <th>大小</th>-->
+    <!--                    <th>状态</th>-->
+    <!--                    <th>操作</th>-->
+    <!--                </tr></thead>-->
+    <!--                <tbody id="file-list"></tbody>-->
+    <!--            </table>-->
+    <!--        </div>-->
+    <!--        <button type="button" class="layui-btn" id="start-upload">开始上传</button>-->
+    <!--    </div>-->
+
 
     <div class="layui-form-item">
         <div class="layui-input-block">
@@ -60,28 +229,177 @@
 <script src="../../js/lay-config.js?v=1.0.4" charset="utf-8"></script>
 <script>
 
-    layui.use(['form','http','iconPickerFa','treeSelect'], function () {
+    layui.use(['form', 'http', 'iconPickerFa', 'treeSelect', 'laydate', 'upload'], function () {
         /**变-------------------------------量-------------------------------定-------------------------------义*/
         var form = layui.form,
             layer = layui.layer,
             http = layui.http,
             $ = layui.$,
+            laydate = layui.laydate,
+            upload = layui.upload,
             treeSelect = layui.treeSelect;
-        let id = $('#id').val()
-        let parentId;
+        let id = $('#id').val(),
+            mlCode = $('#mlCode').val()
+        mlId = $('#mlId').val()
         /**方-------------------------------法-------------------------------定-------------------------------义*/
+
+        /** 初始化日期控件*/
+        let initDate = function () {
+            laydate.render({
+                elem: '#gdnd',
+                type: 'year',
+                trigger: 'click'
+            });
+
+            laydate.render({
+                elem: '#wjxcsj',
+                type: 'date',
+                trigger: 'click',
+                done: (value, date) => {
+                    console.log(value)
+                    console.log(date)
+                }
+            });
+
+            laydate.render({
+                elem: '#wjdqsj',
+                type: 'date',
+                trigger: 'click'
+            });
+
+        }
+
+        let initUpload = function () {
+            let fileList = $('#file-list')
+            let uploadListIns = upload.render({
+                elem: '#selectFile'
+                , url: http.requestUrl + 'system/file/upload'
+                , headers: {
+                    accessToken: (layui.data('auth').data ? layui.data('auth').data.accessToken : '') || ''
+                }
+                , accept: 'file'
+                , multiple: true
+                , auto: false
+                , bindAction: '#start-upload'
+                , choose: function (obj) {
+                    var files = this.files = obj.pushFile(); //将每次选择的文件追加到文件队列
+                    //读取本地文件
+                    obj.preview(function (index, file, result) {
+                        var tr = $(['<tr id="upload-' + index + '">'
+                            , '<td>' + file.name + '</td>'
+                            , '<td>' + (file.size / 1024).toFixed(1) + 'kb</td>'
+                            , '<td>等待上传</td>'
+                            , '<td>'
+                            , '<button class="layui-btn layui-btn-xs demo-reload layui-hide">重传</button>'
+                            , '<button class="layui-btn layui-btn-xs layui-btn-danger demo-delete">删除</button>'
+                            , '</td>'
+                            , '</tr>'].join(''));
+
+                        //单个重传
+                        tr.find('.demo-reload').on('click', function () {
+                            obj.upload(index, file);
+                        });
+
+                        //删除
+                        tr.find('.demo-delete').on('click', function () {
+                            delete files[index]; //删除对应的文件
+                            tr.remove();
+                            uploadListIns.config.elem.next()[0].value = ''; //清空 input file 值,以免删除后出现同名文件不可选
+                        });
+
+                        fileList.append(tr);
+                    });
+                }
+                , done: function (res, index, upload) {
+                    console.log(res)
+                    if (res.code === 200) { //上传成功
+                        var tr = fileList.find('tr#upload-' + index)
+                            , tds = tr.children();
+                        tds.eq(2).html('<span style="color: #5FB878;">上传成功</span>');
+                        tds.eq(3).html(''); //清空操作
+                        return delete this.files[index]; //删除文件队列已经上传成功的文件
+                    }
+                    this.error(index, upload);
+                }
+                , error: function (index, upload) {
+                    var tr = fileList.find('tr#upload-' + index)
+                        , tds = tr.children();
+                    tds.eq(2).html('<span style="color: #FF5722;">上传失败</span>');
+                    tds.eq(3).find('.demo-reload').removeClass('layui-hide'); //显示重传
+                }
+            });
+
+
+            // upload.render({
+            //     elem: '#fj'
+            //     , url: http.requestUrl + 'system/file/upload' //改成您自己的上传接口
+            //     , auto: true
+            //     , headers: {
+            //         accessToken: (layui.data('auth').data ? layui.data('auth').data.accessToken : '') || ''
+            //     }
+            //     , accept: 'file' //普通文件
+            //     , multiple: true
+            //     , bindAction: '#partyTableUpload'
+            //     , data: {
+            //         // fileId: function () {
+            //         //     return partyTable
+            //         // }
+            //     }
+            //     , choose: function (obj) {
+            //         var files = this.files = obj.pushFile(); //将每次选择的文件追加到文件队列
+            //         //读取本地文件
+            //         obj.preview(function (index, file, result) {
+            //             var tr = $(['<tr id="upload-' + index + '">'
+            //                 , '<td><div class="layui-table-cell laytable-cell-1-0-0" style="padding: 0 15px;">' + file.name + '</div></td>'
+            //                 , '<td align="center"><div class="layui-table-cell laytable-cell-1-0-0" style="margin-right: 2px;">'
+            //                 , '<button class="layui-btn layui-btn-xs demo-reload layui-hide" style="border: 1px;padding: 0 6px">重传</button>'
+            //                 , '<button class="layui-btn layui-btn-xs layui-btn-danger demo-delete" style="margin-left: 13px;border: 1px;padding: 0 5px" >删除</button>'
+            //                 , '</div></td>'
+            //                 , '</tr>'].join(''));
+            //
+            //             //单个重传
+            //             tr.find('.demo-reload').on('click', function () {
+            //                 obj.upload(index, file);
+            //             });
+            //
+            //             //删除
+            //             tr.find('.demo-delete').on('click', function () {
+            //                 delete files[index]; //删除对应的文件
+            //                 tr.remove();
+            //                 upload.config.elem.next()[0].value = ''; //清空 input file 值,以免删除后出现同名文件不可选
+            //             });
+            //             // $('.layui-table-body').children('.layui-table').prepend(tr);
+            //             // partyTableShow.prepend(tr);
+            //         });
+            //     }
+            //     , before: function (obj) { //obj参数包含的信息,跟 choose回调完全一致,可参见上文。
+            //         layer.load(); //上传loading
+            //     }
+            //     , done: function (res, index, upload) {
+            //         if (res.code = 200) { //上传成功
+            //             layer.msg('上传成功');
+            //             delete this.files[index] //删除文件队列已经上传成功的文件
+            //             // partyTable = res.data.fileId
+            //             // renderTablePartyFile()
+            //             return;
+            //         }
+            //         this.error(index, upload);
+            //     }
+            //     , error: function (index, upload) {
+            //         var tr = partyTableShow.find('tr#upload-' + index)
+            //             , tds = tr.children();
+            //         tds.eq(0).html('<span style="color: #FF5722;">上传失败</span>');
+            //         tds.eq(1).find('.demo-reload').removeClass('layui-hide'); //显示重传
+            //     }
+            // });
+        }
+
         // 保存方法
         let save = function (data) {
-                var selectedNodes = treeSelect.zTree('parentId').getSelectedNodes();
-                if (selectedNodes.length > 0){
-                    data.parentId = selectedNodes[0].id
-                }else {
-                    data.parentId = -1
-                }
-            http.post(id == '' ? 'system/archivesTree/insert': 'system/archivesTree/update',data,true,function (res) {
-                if (res.code == 200){
+            http.post(id == '' ? 'archive/archive/insert' : 'archive/archive/update', data, true, function (res) {
+                if (res.code == 200) {
                     let index = layer.alert('保存成功!', {
-                        title: id == '' ? '添加':'修改' + '信息'
+                        title: id == '' ? '添加' : '修改' + '信息'
                     }, function () {
                         // 关闭弹出层
                         layer.close(index);
@@ -92,60 +410,68 @@
             })
         }
 
-        // 加载下拉框
         let loadDictSelect = function () {
-            // http.get('/system/menu/select',null,false,function (res) {
-            //     let html = ''
-            //     for (let index in res.data) {
-            //         html += '<option value="'+res.data[index].id+'">'+res.data[index].title+'</option>'
-            //     }
-            //     $('#parentId').append(html)
-            //     form.render();//菜单渲染 把内容加载进去
-            // })
-            treeSelect.render({
-                // 选择器
-                elem: '#parentId',
-                // 数据
-                data: 'system/archivesTree/selectTree',
-                // 异步加载方式:get/post,默认get
-                type: 'get',
-                // 占位符
-                placeholder: '请选择父节点',
-                // 是否开启搜索功能:true/false,默认false
-                search: true,
-                // 一些可定制的样式
-                style: {
-                    folder: {
-                        enable: true
-                    },
-                    line: {
-                        enable: true
-                    }
-                },
-                success: function (res) {
-                    if(id != '' && parentId != '' && parentId != -1){
-                        treeSelect.checkNode('parentId', parentId);
-                    }
+            switch (mlCode) {
+                case 'WS':
+                    $('#mlh-container').hide()
+                    break;
+                case 'KU':
+                    $("#hsdwdh-container").show()
+                    break;
+                case 'KJ':
+                    $("#xmdh-container").show()
+                    break;
+            }
+
+            http.get('system/archivesTree/selectChildById', {
+                id: mlId
+            }, false, res => {
+                let html = '';
+                for (let i in res.data) {
+                    html += '<option value="' + res.data[i].code + '">' + res.data[i].title + '</option>'
                 }
-            });
+                $("#ml").append(html)
+                form.render();//菜单渲染 把内容加载进去
+            })
+
+            // 加载全宗号
+            http.get('system/dict/selectDictByCode', {code: 'QUANZONGHAO'}, false, function (res) {
+                let html = '';
+                for (let i in res.data) {
+                    html += '<option value="' + res.data[i].dictCode + '">' + res.data[i].dictName + '</option>'
+                }
+                $("#qzh").append(html)
+                form.render();//菜单渲染 把内容加载进去
+            })
+
+            // 加载密集
+            http.get('system/dict/selectDictByCode', {code: 'MIJI'}, false, function (res) {
+                let html = '';
+                for (let i in res.data) {
+                    html += '<option value="' + res.data[i].dictCode + '">' + res.data[i].dictName + '</option>'
+                }
+                $("#mj").append(html)
+                form.render();//菜单渲染 把内容加载进去
+            })
+
         }
 
         // 加载数据
         let initData = function () {
-            if(id != ''){
-                http.get('/system/archivesTree/selectByPrimaryKey',{
+            if (id != '') {
+                http.get('/archive/archive/selectByPrimaryKey', {
                     id: id
-                },false,function (res) {
+                }, false, function (res) {
                     form.val("addDict", res.data);
-                    parentId = res.data.parentId
                     form.render();
                 })
             }
         }
         /**事-------------------------------件-------------------------------绑-------------------------------定*/
-
-        initData()
+        initDate()
+        initUpload()
         loadDictSelect()
+        initData()
         //监听提交
         form.on('submit(saveBtn)', function (data) {
             let icon = 'fa '
@@ -154,6 +480,23 @@
             save(data.field)
         });
 
+
+        form.on('select(ml)', function (data) {
+            // 加载保管期限
+            http.get('system/dict/selectDictByCode', {code: data.value === 'WS' ? 'BAOGUANQIXIANYI' : 'BAOGUANQIXIANER'}, false, function (res) {
+                let html = '';
+                for (let i in res.data) {
+                    html += '<option value="' + res.data[i].dictCode + '">' + res.data[i].dictName + '</option>'
+                }
+                $("#bgqx").append(html)
+                form.render();//菜单渲染 把内容加载进去
+            })
+        });
+
+        form.on('select(bgqx)', function (data) {
+            console.log(data)
+        });
+
     });
 </script>
 </body>

+ 186 - 0
src/main/resources/static/page/archive/fileList.html

@@ -0,0 +1,186 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+    <link rel="stylesheet" href="../../lib/layui-v2.5.5/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../css/public.css" media="all">
+</head>
+<body>
+<div class="layuimini-container">
+    <div class="layuimini-main">
+        <div>
+            <div class="layui-form toolbar">
+                <div class="layui-form-item">
+                    <div class="layui-inline">
+                        <input type="hidden" id="archive_id" class="layui-input">
+                    </div>
+                    <div class="layui-inline">
+                        <button id="upload" class="layui-btn icon-btn"><i
+                                class="layui-icon"></i>上传
+                        </button>
+                    </div>
+                    <div class="layui-inline">
+                        <button id="btnSearch" lay-submit lay-filter="search" class="layui-btn icon-btn"><i
+                                class="layui-icon"></i>搜索
+                        </button>
+                    </div>
+                </div>
+            </div>
+            <table class="layui-hide" id="user-table" lay-filter="table"></table>
+        </div>
+    </div>
+</div>
+</body>
+</html>
+<!--  头部工具栏  -->
+<script type="text/html" id="toolbar">
+    <!--    <button class="layui-btn layui-btn-sm" lay-event="upload" id="upload">上传</button>-->
+</script>
+<!-- 操作列 -->
+<script type="text/html" id="operating">
+    <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="openPDF">预览</a>
+    <!--    <a class="layui-btn layui-btn-xs" lay-event="openPDF">下载</a>-->
+    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete">删除</a>
+</script>
+<script src="../../lib/layui-v2.5.5/layui.js" charset="utf-8"></script>
+<script src="../../js/lay-config.js?v=1.0.4" charset="utf-8"></script>
+<script>
+    layui.use(['table', 'http', 'form', 'upload'], function () {
+        /**变-------------------------------量-------------------------------定-------------------------------义*/
+
+        var table = layui.table,
+            http = layui.http,
+            form = layui.form,
+            upload = layui.upload,
+            $ = layui.jquery;
+
+        let archive_id = $("#archive_id").val()
+
+        /**方-------------------------------法-------------------------------定-------------------------------义*/
+            //数据加载方法
+        let renderTable = function () {
+                // 加载表格数据
+                table.render({
+                    elem: '#user-table',
+                    url: 'archive/archiveFile/selectByPage',
+                    toolbar: '#toolbar', //开启头部工具栏,并为其绑定左侧模板
+                    defaultToolbar: ['filter', 'exports', 'print'],
+                    title: '附件表',
+                    toolbar: '#toolbar',
+                    page: true,
+                    request: {
+                        pageName: 'pageNum',
+                        limitName: 'pageSize'
+                    },
+                    where: {
+                        archiveId: archive_id
+                    },
+                    response: {
+                        statusCode: 200 //重新规定成功的状态码为 200,table 组件默认为 0
+                    },
+                    parseData: function (res) {
+                        return {
+                            "code": res.code,
+                            "msg": res.msg,
+                            "count": res.data.total,
+                            "data": res.data.list
+                        }
+                    },
+                    done: function (res, curr, count) {
+                        // $('th').css({'background-color': '#1aa094', 'color': '#fff', 'font-weight': 'bold'})
+                    },
+                    cols: [[
+                        {type: 'numbers'},
+                        // {field: 'originalFileName', title: '原文件名'},
+                        {field: 'fileName', title: '文件名'},
+                        {
+                            field: 'fileSize', title: '文件大小',
+                            templet: function (rv) {
+                                return (rv.fileSize / (1 * 1024 * 1024)).toFixed(2) + 'MB'
+                            }
+                        },
+                        {field: 'createTime', title: '上传时间'},
+                        {templet: '#operating', width: 240, align: 'center', title: '操作'}
+                    ]]
+                });
+
+            }
+
+        let deleteFile = function (id) {
+            layer.confirm('真的删除行么', function (index) {
+                http.delete('archive/archiveFile/delete', {id: id}, true, function (res) {
+                    if (res.code == 200) {
+                        layer.msg('删除成功', {
+                            icon: 1,
+                            time: 2000
+                        })
+                    }
+                    renderTable()
+                })
+                layer.close(index);
+            });
+        }
+
+        let initUpload = function () {
+            //指定允许上传的文件类型
+            upload.render({
+                elem: '#upload'
+                , url: http.requestUrl + 'archive/archiveFile/upload' //改成您自己的上传接口
+                , headers: {
+                    accessToken: (layui.data('auth').data ? layui.data('auth').data.accessToken : '') || ''
+                }
+                , data: {
+                    archiveId: () => {
+                        return archive_id
+                    }
+                }
+                , multiple: true
+                , auto: true
+                , accept: 'file' //普通文件
+                , done: function (res) {
+                    if (res.code === 200) {
+                        layer.msg('上传成功', {
+                            icon: 1
+                        })
+                        renderTable()
+                    } else {
+                        layer.msg(res.msg, {
+                            icon: 2
+                        })
+                    }
+                }
+            });
+            console.log('上传组件加载完成')
+        }
+
+        let openPDF = function (data) {
+            console.log(data.filePath + '/' + data.fileName)
+            layer.open({
+                type: 2,
+                area: ['100%', '100%'],
+                fixed: false, //不固定
+                maxmin: true,
+                content: data.filePath + '/' + data.fileName
+            });
+        }
+
+        initUpload()
+        renderTable()
+
+
+        //表格操作栏
+        table.on('tool(table)', function (obj) {
+            let data = obj.data;
+            console.log(obj)
+            switch (obj.event) {
+                case 'delete':
+                    deleteFile(data.id);
+                    break;
+                case 'openPDF':
+                    openPDF(data)
+                    break;
+            }
+        });
+    });
+</script>

+ 47 - 15
src/main/resources/static/page/archive/list.html

@@ -73,10 +73,10 @@
             $ = layui.jquery;
 
         let searchParam = {
-            dh: '',
-            mlh: '',
-            bgqx: '',
-            ml: ''
+            // dh: null,
+            // mlh: null,
+            // bgqx: null,
+            // ml: null
         }
         /**方-------------------------------法-------------------------------定-------------------------------义*/
 
@@ -144,6 +144,7 @@
                 // parentId = res.data[0].parentId
                 // deptId = res.data[0].id
                 searchParam.ml = res.data[0].code
+                searchParam.mlId = res.data[0].id
                 //基本演示
                 tree.render({
                     elem: '#tree'
@@ -168,6 +169,7 @@
                         }
                         var data = obj.data;  //获取当前点击的节点数据
                         searchParam.ml = data.code
+                        searchParam.mlId = data.id
                         renderTable()
                     }
                 });
@@ -210,18 +212,18 @@
                     }
                 },
                 done: function (res, curr, count) {
-                    $('th').css({'background-color': '#1aa094', 'color': '#fff', 'font-weight': 'bold'})
+                    // $('th').css({'background-color': '#1aa094', 'color': '#fff', 'font-weight': 'bold'})
                 },
                 cols: [[
                     // {type: 'checkbox', fixed: 'left'},
                     {type: 'numbers'},
-                    {field: 'name', title: '档号'},
-                    {field: 'bureaus', title: '题名'},
-                    {field: 'department', title: '类别'},
-                    {field: 'dutyName', title: '所属部门'},
-                    {field: 'propertiesName', title: '状态'},
-                    {field: 'nationName', title: '开始时间'},
-                    {field: 'nationName', title: '结束时间'},
+                    {field: 'dh', title: '档号', width: 240},
+                    {field: 'tm', title: '题名'},
+                    {field: 'gdnd', title: '归档年度'},
+                    {field: 'zrz', title: '责任者'},
+                    {field: 'mjText', title: '密级'},
+                    {field: 'wjxcsj', title: '文件形成时间'},
+                    {field: 'wjdqsj', title: '文件到期时间'},
                     {templet: '#operating', width: 240, align: 'center', title: '操作'}
                 ]]
             });
@@ -238,6 +240,31 @@
                 shadeClose: true,
                 area: ['100%', '100%'],
                 content: './edit.html',
+                success: function (layero, index) {
+                    var body = layer.getChildFrame('body', index);
+                    body.find("#mlId").val(searchParam.mlId);
+                    body.find("#mlCode").val(searchParam.ml);
+                },
+                end: function () {
+                    renderTable()
+                }
+            });
+        }
+
+        //打开附件列表
+        let openFiles = function (data) {
+            var index = layer.open({
+                title: '附件',
+                type: 2,
+                shade: 0.2,
+                maxmin: true,
+                shadeClose: true,
+                area: ['100%', '100%'],
+                content: './fileList.html',
+                success: function (layero, index) {
+                    var body = layer.getChildFrame('body', index);
+                    body.find("#archive_id").val(data.id);
+                },
                 end: function () {
                     renderTable()
                 }
@@ -278,6 +305,8 @@
                 success: function (layero, index) {
                     var body = layer.getChildFrame('body', index);
                     body.find("#id").val(id);
+                    body.find("#mlId").val(searchParam.mlId);
+                    body.find("#mlCode").val(searchParam.ml);
                 },
                 end: function () {
                     renderTable()
@@ -381,6 +410,9 @@
                 case 'show':
                     join(data.id);
                     break;
+                case 'files':
+                    openFiles(data)
+                    break;
                 case 'export':
                     exportUser(data);
                     break;
@@ -404,9 +436,9 @@
         })
 
         form.on('submit(search)', function (data) {
-            searchParam.dh = data.field.dh
-            searchParam.mlh = data.field.mlh
-            searchParam.bgqx = data.field.bgqx
+            if (data.field.dh) searchParam.dh = data.field.dh
+            if (data.field.mlh) searchParam.mlh = data.field.mlh
+            if (data.field.bgqx) searchParam.bgqx = data.field.bgqx
             renderTable()
         })
     });

+ 4 - 4
src/main/resources/static/page/archives-tree/list.html

@@ -57,12 +57,12 @@
                 page: false,
                 cols: [[
                     {type: 'numbers'},
-                    {field: 'title',  title: '门类名称'},
-                    {field: 'code', title: '门类代码'},
+                    {field: 'title',  title: '名称'},
+                    {field: 'code', title: '代码'},
                     {templet: '#operating', width: 300, align: 'center', title: '操作'}
                 ]],
                 done: function () {
-                    $('th').css({'background-color': '#1aa094', 'color': '#fff','font-weight':'bold'})
+                    // $('th').css({'background-color': '#1aa094', 'color': '#fff','font-weight':'bold'})
                     layer.closeAll('loading');
                 }
             });
@@ -81,7 +81,7 @@
         //添加方法
         let addDict = function () {
             var index = layer.open({
-                title: '添加菜单',
+                title: '添加',
                 type: 2,
                 shade: 0.2,
                 maxmin:true,

+ 206 - 0
src/main/resources/static/page/auditList/audit.html

@@ -0,0 +1,206 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>layui</title>
+    <link rel="stylesheet" href="../../lib/layui-v2.5.5/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../css/public.css" media="all">
+    <link rel="stylesheet" href="../../lib/font-awesome-4.7.0/css/font-awesome.min.css" media="all">
+    <style>
+        body {
+            background-color: #ffffff;
+
+        }
+
+        table tr td, th {
+            font-size: 14px;
+        }
+
+        tr {
+            line-height: 30px;
+            height: 30px;
+        }
+
+        th {
+            text-align: right;
+        }
+
+        td {
+            /*width: 15%;*/
+            text-align: left;
+            /*padding-right: 200px;*/
+            width: 400px;
+        }
+    </style>
+</head>
+<body>
+<div class="layui-form layuimini-form" lay-filter="addDict">
+    <div class="layui-form layuimini-form" lay-filter="addDict">
+        <fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
+            <legend>借阅申请信息</legend>
+        </fieldset>
+        <div style="text-align: center">
+            <div class="layui-inline">
+                <table>
+                    <tr>
+                        <th>借阅人:</th>
+                        <td id="adminName"></td>
+                        <th>借阅单位:</th>
+                        <td id="deptId"></td>
+                    </tr>
+                    <tr>
+                        <th>档号:</th>
+                        <td id="dh"></td>
+                        <th>题名:</th>
+                        <td id="tm"></td>
+                    </tr>
+                    <tr>
+                        <th>证件号码:</th>
+                        <td id="idCard"></td>
+                        <th>联系方式:</th>
+                        <td id="phone"></td>
+                    </tr>
+                    <tr>
+                        <th>开始时间:</th>
+                        <td id="createTime"></td>
+                        <th>归还时间:</th>
+                        <td id="returnTime"></td>
+                    </tr>
+                    <tr>
+                        <th>借阅方式:</th>
+                        <td id="borrowType"></td>
+                        <th>利用目的:</th>
+                        <td id="usePurpose"></td>
+                    </tr>
+                    <tr>
+                        <th>备注:</th>
+                        <td colspan="3" id="remarks"></td>
+                    </tr>
+                    <tr>
+                        <th>附件名称:</th>
+                        <td colspan="3" id="fj"></td>
+                    </tr>
+                </table>
+            </div>
+        </div>
+
+
+        <fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
+            <legend>借阅审核信息</legend>
+        </fieldset>
+        <div style="text-align: center">
+            <div class="layui-inline">
+                <table>
+                    <tr>
+                        <th></th>
+                        <td></td>
+                        <th></th>
+                        <td></td>
+                    </tr>
+                    <tr>
+                        <th>审核:</th>
+                        <td colspan="2">
+                            <input type="hidden" id="id" name="id">
+                            <select class="layui-select" name="auditStatus" lay-verify="required" lay-reqtext="审核不能为空">
+                                <option value="">请选择</option>
+                                <option value="1">未通过</option>
+                                <option value="2">已通过</option>
+                            </select>
+                        </td>
+                    </tr>
+                    <tr></tr>
+                    <tr>
+                        <th>意见:</th>
+                        <td colspan="3">
+                            <textarea class="layui-textarea" name="auditOpinion"></textarea>
+                        </td>
+                    </tr>
+                    <tr></tr>
+                    <tr>
+                        <td colspan="2">
+
+                        </td>
+                        <td colspan="2">
+                            <button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">确认保存</button>
+                        </td>
+                    </tr>
+                </table>
+            </div>
+        </div>
+    </div>
+    <script src="../../lib/layui-v2.5.5/layui.js" charset="utf-8"></script>
+    <script src="../../js/lay-config.js?v=1.0.4" charset="utf-8"></script>
+    <script>
+
+        layui.use(['form', 'http', 'laydate'], function () {
+            /**变-------------------------------量-------------------------------定-------------------------------义*/
+            var form = layui.form,
+                layer = layui.layer,
+                http = layui.http,
+                laydate = layui.laydate,
+                $ = layui.$;
+            let id = $('#id').val()
+            /**方-------------------------------法-------------------------------定-------------------------------义*/
+                // 保存方法
+            let save = function (data) {
+                    http.post('borrow/archiveBorrow/audit', data, true, function (res) {
+                        if (res.code == 200) {
+                            let index = layer.alert('保存成功!', {
+                                title: '审核结果'
+                            }, function () {
+                                // 关闭弹出层
+                                layer.close(index);
+                                let iframeIndex = parent.layer.getFrameIndex(window.name);
+                                parent.layer.close(iframeIndex);
+                            });
+                        }
+                    })
+                }
+
+
+            // 加载数据
+            let initData = function () {
+                // 加载当前文档信息
+                http.get('borrow/archiveBorrow/selectBorrowInfo', {
+                    id: id
+                }, false, function (res) {
+                    $("#adminName").text(res.data.adminName == null ? '无' : res.data.adminName)
+                    let jy = ''
+                    if (res.data.borrowType == 0) {
+                        jy = '打印借阅'
+                    } else if (res.data.borrowType == 1) {
+                        jy = '原件借阅'
+                    } else {
+                        jy = '无'
+                    }
+                    $("#borrowType").text(jy)
+                    $("#createTime").text(res.data.createTime == null ? '无' : res.data.createTime)
+                    $("#returnTime").text(res.data.returnTime == null ? '无' : res.data.returnTime)
+                    $("#deptId").text(res.data.deptId == null ? '无' : res.data.deptId)
+                    $("#dh").text(res.data.dh == null ? '无' : res.data.dh)
+                    $("#tm").text(res.data.tm == null ? '无' : res.data.tm)
+                    $("#idCard").text(res.data.idCard == null ? '无' : res.data.idCard)
+                    $("#remarks").text(res.data.remarks == null ? '无' : res.data.remarks)
+                    $("#usePurpose").text(res.data.usePurpose == null ? '无' : res.data.usePurpose)
+                    $("#phone").text(res.data.phone == null ? '无' : res.data.phone)
+                    let fjHtml = '无'
+                    if (res.data.originalFileName) {
+                        fjHtml = '<a style="color: #2D8CF0" target="_blank" href="' + res.data.serverFilePath + '">' + res.data.originalFileName + '</a>'
+                    }
+                    $("#fj").html(fjHtml)
+                    // form.val("addDict", res.data);
+                    // form.render();
+                })
+            }
+            /**事-------------------------------件-------------------------------绑-------------------------------定*/
+
+            initData()
+            //监听提交
+            form.on('submit(saveBtn)', function (data) {
+                save(data.field)
+            });
+
+        });
+    </script>
+</body>
+</html>

+ 269 - 0
src/main/resources/static/page/auditList/list.html

@@ -0,0 +1,269 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+    <link rel="stylesheet" href="../../lib/layui-v2.5.5/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../css/public.css" media="all">
+</head>
+<style>
+    /*.layui-disabled, .layui-disabled:hover{*/
+    /*    color: red!important;*/
+    /*}*/
+</style>
+<body>
+<div class="layuimini-container">
+    <div class="layuimini-main">
+        <div>
+            <!--            <div class="layui-form toolbar">-->
+            <!--                <div class="layui-form-item">-->
+            <!--                    <div class="layui-inline">-->
+            <!--                        <input type="text" id="dh" name="dh" lay-filter="dh" placeholder="请输入档号" class="layui-input">-->
+            <!--                    </div>-->
+            <!--                    <div class="layui-inline">-->
+            <!--                        <input type="text" id="mlh" name="mlh" lay-filter="mlh" placeholder="请输入目录号"-->
+            <!--                               class="layui-input">-->
+            <!--                    </div>-->
+            <!--                    <div class="layui-inline">-->
+            <!--                        <select name="bgqx" id="bgqx">-->
+            <!--                            <option value="">请选择保管期限</option>-->
+            <!--                        </select>-->
+            <!--                    </div>-->
+            <!--                    <div class="layui-inline">-->
+            <!--                        <button id="btnSearch" lay-submit lay-filter="search" class="layui-btn icon-btn"><i-->
+            <!--                                class="layui-icon"></i>搜索-->
+            <!--                        </button>-->
+            <!--                    </div>-->
+            <!--                </div>-->
+            <!--            </div>-->
+            <table class="layui-hide" id="user-table" lay-filter="table"></table>
+        </div>
+        <div style="clear: both"></div>
+    </div>
+</div>
+
+</body>
+</html>
+
+<!--  头部工具栏  -->
+<button type="button" class="layui-btn layui-btn-sm" id="importFile" value="导入隐藏按钮" style="display: none"/>
+<script type="text/html" id="toolbar">
+</script>
+
+<!-- 操作列 -->
+<script type="text/html" id="operating">
+    {{# if(d.auditStatus === 0){ }}
+    <a class="layui-btn layui-btn-xs" lay-event="audit">审核</a>
+    {{# } }}
+    {{# if(d.auditStatus === 2 && d.returnStatus === 0 && d.borrowType === 1){ }}
+    <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="return">归还</a>
+    {{# } }}
+    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete">删除</a>
+</script>
+
+<script src="../../lib/layui-v2.5.5/layui.js" charset="utf-8"></script>
+<script src="../../js/lay-config.js?v=1.0.4" charset="utf-8"></script>
+<script>
+    layui.use(['table', 'http', 'laydate', 'form', 'upload', 'url'], function () {
+        /**变-------------------------------量-------------------------------定-------------------------------义*/
+
+        var table = layui.table,
+            laydate = layui.laydate,
+            http = layui.http,
+            form = layui.form,
+            upload = layui.upload,
+            url = layui.url,
+            $ = layui.jquery;
+
+        let searchParam = {
+            // dh: null,
+            // mlh: null,
+            // bgqx: null,
+            // ml: null
+        }
+        /**方-------------------------------法-------------------------------定-------------------------------义*/
+
+            // http.getRoleButton(164)
+
+            //数据加载方法
+        let renderTable = function () {
+                // 加载表格数据
+                table.render({
+                    elem: '#user-table',
+                    url: 'borrow/archiveBorrow/selectArchiveBorrowHistory',
+                    toolbar: '#toolbar', //开启头部工具栏,并为其绑定左侧模板
+                    defaultToolbar: ['filter', 'exports', 'print'],
+                    title: '用户数据表',
+                    toolbar: '#toolbar',
+                    page: true,
+                    request: {
+                        pageName: 'pageNum',
+                        limitName: 'pageSize'
+                    },
+                    where: searchParam,
+                    response: {
+                        statusCode: 200 //重新规定成功的状态码为 200,table 组件默认为 0
+                    },
+                    parseData: function (res) {
+                        return {
+                            "code": res.code,
+                            "msg": res.msg,
+                            "count": res.data.total,
+                            "data": res.data.list
+                        }
+                    },
+                    done: function (res, curr, count) {
+                        // $('th').css({'background-color': '#1aa094', 'color': '#fff', 'font-weight': 'bold'})
+                    },
+                    cols: [[
+                        // {type: 'checkbox', fixed: 'left'},
+                        {type: 'numbers'},
+                        {field: 'dh', title: '档号', width: 240},
+                        {field: 'tm', title: '题名'},
+                        {field: 'createTime', title: '开始时间'},
+                        {field: 'estimateReturnTime', title: '归还时间'},
+                        // {field: 'mjText', title: '密级'},
+                        {field: 'adminName', title: '借阅人'},
+                        {
+                            field: 'borrowType', title: '借阅方式',width: 90,
+                            templet: function (rv) {
+                                return rv.borrowType == 0 ? '打印借阅' : '原件借阅'
+                            }
+                        },
+                        // {
+                        //     field: 'originalStatus', title: '是否需要归还', templet: function (rv) {
+                        //         return rv.borrowType == 0 ? '否' : '是'
+                        //     }
+                        // },
+                        {
+                            field: 'originalStatus', title: '归还状态', width: 110, templet: function (rv) {
+                                if (rv.borrowType == 1) {
+                                    if (rv.auditStatus == 2) {
+                                        return rv.returnStatus == 0 ? '<span class="layui-badge layui-bg-orange">未归还</span>' : '<span class="layui-badge layui-bg-green">已归还</span>'
+                                    } else {
+                                        return '<span class="layui-badge layui-bg-green">无需归还</span>'
+                                    }
+                                } else {
+                                    return '<span class="layui-badge layui-bg-green">无需归还</span>'
+                                }
+                            }
+                        },
+                        {
+                            field: 'auditStatus', title: '审核状态', width: 110, templet: function (rv) {
+                                switch (rv.auditStatus) {
+                                    case 0:
+                                        return '<span class="layui-badge layui-bg-orange">待审核</span>';
+                                    case 1:
+                                        return '<span class="layui-badge">审核不通过</span>';
+                                    case 2:
+                                        return '<span class="layui-badge layui-bg-green">审核通过</span>';
+                                }
+                            }
+                        },
+                        // {field: 'wjdqsj', title: '文件到期时间'},
+                        {templet: '#operating', align: 'center', title: '操作'}
+                    ]]
+                });
+            }
+
+        /**事-------------------------------件-------------------------------绑-------------------------------定*/
+
+        renderTable()
+
+
+        //表格操作栏
+        table.on('tool(table)', function (obj) {
+            let data = obj.data;
+            switch (obj.event) {
+                case 'audit':
+                    audit(data);
+                    break;
+                case 'return':
+                    returnBorrow(data.id);
+                    break;
+                case 'delete':
+                    deleteHistory(data.id);
+                    break;
+            }
+        })
+
+        //删除方法
+        let deleteHistory = function (id) {
+            layer.confirm('真的删除行么', function (index) {
+                http.delete('borrow/archiveBorrow/delete', {id: id}, true, function (res) {
+                    if (res.code == 200) {
+                        layer.msg('删除成功', {
+                            icon: 1,
+                            time: 2000
+                        })
+                    } else {
+                        layer.msg(res.msg, {
+                            icon: 2,
+                            time: 2000
+                        })
+                    }
+                    renderTable()
+                })
+                layer.close(index);
+            });
+        }
+
+        let returnBorrow = function (id) {
+            layer.confirm('确定归还么?', function (index) {
+                http.get('borrow/archiveBorrow/return', {id: id}, true, function (res) {
+                    if (res.code == 200) {
+                        layer.msg('归还成功', {
+                            icon: 1,
+                            time: 2000
+                        })
+                    } else {
+                        layer.msg(res.msg, {
+                            icon: 2,
+                            time: 2000
+                        })
+                    }
+                    renderTable()
+                })
+                layer.close(index);
+            });
+        }
+
+        //打开附件列表
+        let audit = function (data) {
+            var index = layer.open({
+                title: '预约借阅',
+                type: 2,
+                shade: 0.2,
+                maxmin: true,
+                shadeClose: true,
+                area: ['100%', '100%'],
+                content: './audit.html',
+                success: function (layero, index) {
+                    var body = layer.getChildFrame('body', index);
+                    console.log(data)
+                    body.find("#id").val(data.id);
+                },
+                end: function () {
+                    renderTable()
+                }
+            });
+        }
+
+
+        //头部工具栏监听
+        table.on('toolbar(table)', function (obj) {
+            switch (obj.event) {
+                case 'import':
+                    $("#importFile").click();
+                    break;
+            }
+        })
+
+        form.on('submit(search)', function (data) {
+            if (data.field.dh) searchParam.dh = data.field.dh
+            if (data.field.mlh) searchParam.mlh = data.field.mlh
+            if (data.field.bgqx) searchParam.bgqx = data.field.bgqx
+            renderTable()
+        })
+    });
+</script>

+ 193 - 0
src/main/resources/static/page/borrow/list.html

@@ -0,0 +1,193 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+    <link rel="stylesheet" href="../../lib/layui-v2.5.5/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../css/public.css" media="all">
+</head>
+<style>
+    /*.layui-disabled, .layui-disabled:hover{*/
+    /*    color: red!important;*/
+    /*}*/
+</style>
+<body>
+<div class="layuimini-container">
+    <div class="layuimini-main">
+        <div>
+            <div class="layui-form toolbar">
+                <div class="layui-form-item">
+                    <div class="layui-inline">
+                        <input type="text" id="dh" name="dh" lay-filter="dh" placeholder="请输入档号" class="layui-input">
+                    </div>
+                    <div class="layui-inline">
+                        <input type="text" id="mlh" name="mlh" lay-filter="mlh" placeholder="请输入目录号"
+                               class="layui-input">
+                    </div>
+                    <div class="layui-inline">
+                        <select name="bgqx" id="bgqx">
+                            <option value="">请选择保管期限</option>
+                        </select>
+                    </div>
+                    <div class="layui-inline">
+                        <button id="btnSearch" lay-submit lay-filter="search" class="layui-btn icon-btn"><i
+                                class="layui-icon"></i>搜索
+                        </button>
+                    </div>
+                </div>
+            </div>
+            <table class="layui-hide" id="user-table" lay-filter="table"></table>
+        </div>
+        <div style="clear: both"></div>
+    </div>
+</div>
+
+</body>
+</html>
+
+<!--  头部工具栏  -->
+<button type="button" class="layui-btn layui-btn-sm" id="importFile" value="导入隐藏按钮" style="display: none"/>
+<script type="text/html" id="toolbar">
+</script>
+
+<!-- 操作列 -->
+<script type="text/html" id="operating">
+</script>
+
+<script src="../../lib/layui-v2.5.5/layui.js" charset="utf-8"></script>
+<script src="../../js/lay-config.js?v=1.0.4" charset="utf-8"></script>
+<script>
+    layui.use(['table', 'http', 'laydate', 'form', 'upload', 'url'], function () {
+        /**变-------------------------------量-------------------------------定-------------------------------义*/
+
+        var table = layui.table,
+            laydate = layui.laydate,
+            http = layui.http,
+            form = layui.form,
+            upload = layui.upload,
+            url = layui.url,
+            $ = layui.jquery;
+
+        let searchParam = {
+            // dh: null,
+            // mlh: null,
+            // bgqx: null,
+            // ml: null
+        }
+        /**方-------------------------------法-------------------------------定-------------------------------义*/
+
+        http.getRoleButton(164)
+
+        //数据加载方法
+        let renderTable = function () {
+            // 加载表格数据
+            table.render({
+                elem: '#user-table',
+                url: 'borrow/archiveBorrow/selectBorrowList',
+                toolbar: '#toolbar', //开启头部工具栏,并为其绑定左侧模板
+                defaultToolbar: ['filter', 'exports', 'print'],
+                title: '用户数据表',
+                toolbar: '#toolbar',
+                page: true,
+                request: {
+                    pageName: 'pageNum',
+                    limitName: 'pageSize'
+                },
+                where: searchParam,
+                response: {
+                    statusCode: 200 //重新规定成功的状态码为 200,table 组件默认为 0
+                },
+                parseData: function (res) {
+                    return {
+                        "code": res.code,
+                        "msg": res.msg,
+                        "count": res.data.total,
+                        "data": res.data.list
+                    }
+                },
+                done: function (res, curr, count) {
+                    // $('th').css({'background-color': '#1aa094', 'color': '#fff', 'font-weight': 'bold'})
+                },
+                cols: [[
+                    // {type: 'checkbox', fixed: 'left'},
+                    {type: 'numbers'},
+                    {field: 'dh', title: '档号', width: 240},
+                    {field: 'tm', title: '题名'},
+                    {field: 'gdnd', width:100,title: '归档年度'},
+                    {field: 'zrz', width: 120,title: '责任者'},
+                    // {field: 'mjText', title: '密级'},
+                    {field: 'wjxcsj',width:120, title: '文件形成时间'},
+                    {
+                        field: 'originalStatus', title: '原件状态', width: 90,templet: function (rv) {
+                            switch (rv.originalStatus) {
+                                case '可借阅':
+                                    return '<span class="layui-badge layui-bg-orange">' + rv.originalStatus + '</span>';
+                                case '已借阅':
+                                    return '<span class="layui-badge">' + rv.originalStatus + '</span>';
+                            }
+                        }
+                    },
+                    // {field: 'wjdqsj', title: '文件到期时间'},
+                    {templet: '#operating',width:100, align: 'center', title: '操作'}
+                ]]
+            });
+        }
+        /**事-------------------------------件-------------------------------绑-------------------------------定*/
+
+        renderTable()
+
+
+        //表格操作栏
+        table.on('tool(table)', function (obj) {
+            let data = obj.data;
+            switch (obj.event) {
+                case 'borrowing':
+                    openBorrow(data);
+                    break;
+            }
+        });
+
+        //打开附件列表
+        let openBorrow = function (data) {
+            var index = layer.open({
+                title: '预约借阅',
+                type: 2,
+                shade: 0.2,
+                maxmin: true,
+                shadeClose: true,
+                area: ['100%', '100%'],
+                content: './reserve.html',
+                success: function (layero, index) {
+                    var body = layer.getChildFrame('body', index);
+                    body.find("#archive_id").val(data.id);
+                },
+                end: function () {
+                    renderTable()
+                }
+            });
+        }
+
+
+        //头部工具栏监听
+        table.on('toolbar(table)', function (obj) {
+            switch (obj.event) {
+                case 'add':
+                    // addDict();
+                    break;
+                case 'batchDel':
+                    // batchDel();
+                    break;
+                case 'import':
+                    $("#importFile").click();
+                    break;
+            }
+        })
+
+        form.on('submit(search)', function (data) {
+            if (data.field.dh) searchParam.dh = data.field.dh
+            if (data.field.mlh) searchParam.mlh = data.field.mlh
+            if (data.field.bgqx) searchParam.bgqx = data.field.bgqx
+            renderTable()
+        })
+    });
+</script>

+ 232 - 0
src/main/resources/static/page/borrow/reserve.html

@@ -0,0 +1,232 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>layui</title>
+    <link rel="stylesheet" href="../../lib/layui-v2.5.5/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../css/public.css" media="all">
+    <link rel="stylesheet" href="../../lib/font-awesome-4.7.0/css/font-awesome.min.css" media="all">
+    <style>
+        body {
+            background-color: #ffffff;
+
+        }
+
+        .layui-form-item .layui-input-inline {
+            /*width: 20%;*/
+        }
+    </style>
+</head>
+<body>
+<div class="layui-form layuimini-form" lay-filter="addDict">
+
+    <!--    <div class="layui-form-item">-->
+    <!--        <label class="layui-form-label required">借阅人:</label>-->
+    <!--        <div class="layui-input-block">-->
+    <!--            <input type="text" name="adminName" lay-verify="required" lay-reqtext="借阅人不能为空" placeholder="请输入借阅人"-->
+    <!--                   value=""-->
+    <!--                   class="layui-input">-->
+    <!--        </div>-->
+    <!--    </div>-->
+
+
+    <!--    <div class="layui-form-item">-->
+    <!--        <label class="layui-form-label required">借阅单位:</label>-->
+    <!--        <div class="layui-input-block">-->
+    <!--            <input type="text" name="jydw" placeholder="请输入借阅单位" value="" lay-reqtext="借阅单位不能为空"-->
+    <!--                   class="layui-input">-->
+    <!--        </div>-->
+
+    <!--    </div>-->
+
+    <!--    <div class="layui-form-item">-->
+    <!--        <label class="layui-form-label required">证件号码:</label>-->
+    <!--        <div class="layui-input-block">-->
+    <!--            <input type="text" name="zjhm" placeholder="请输入证件号码" value="" lay-reqtext="证件号码不能为空"-->
+    <!--                   class="layui-input">-->
+    <!--        </div>-->
+    <!--    </div>-->
+
+    <div class="layui-form-item">
+        <label class="layui-form-label required">档号:</label>
+        <div class="layui-input-block">
+            <input type="hidden" name="archiveId" id="archive_id" class="layui-input">
+            <input type="text" name="dh" placeholder="请输入档号" value="" lay-reqtext="档号不能为空" class="layui-input" readonly>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label required">题名:</label>
+        <div class="layui-input-block">
+            <input type="text" name="tm" placeholder="请输入题名" value="" lay-reqtext="题名不能为空" class="layui-input" readonly>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label required">归还时间:</label>
+        <div class="layui-input-block">
+            <input type="text" name="estimateReturnTime" id="estimateReturnTime" placeholder="请选择归还时间" value="" lay-reqtext="归还时间不能为空"
+                   class="layui-input">
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label required">借阅方式:</label>
+        <div class="layui-input-block">
+            <select name="borrowType" id="bgqx">
+                <option value="">请选择借阅方式</option>
+                <option value="0">打印借阅</option>
+                <option value="1">原件借阅</option>
+            </select>
+        </div>
+    </div>
+    <!--    <div class="layui-form-item">-->
+    <!--        <label class="layui-form-label required">联系电话:</label>-->
+    <!--        <div class="layui-input-block">-->
+    <!--            <input type="number" name="phone" placeholder="请输入联系电话" value="" lay-reqtext="联系电话不能为空"-->
+    <!--                   class="layui-input">-->
+    <!--        </div>-->
+    <!--    </div>-->
+
+
+    <div class="layui-form-item">
+        <label class="layui-form-label required">利用目的:</label>
+        <div class="layui-input-block">
+            <input type="text" name="usePurpose" placeholder="请输入利用目的" value="" lay-reqtext="利用目的不能为空"
+                   class="layui-input">
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">相关证明:</label>
+        <div class="layui-input-inline" style="width: 400px">
+            <input type="text" name="relevantCertificationShow" id="relevantCertificationShow" value="" class="layui-input" readonly>
+            <input type="hidden" name="relevantCertification" id="relevantCertification" value="" class="layui-input" readonly>
+        </div>
+        <div class="layui-input-inline">
+            <button id="upload" class="layui-btn icon-btn">
+                <i class="layui-icon">&#xe67c;</i>上传
+            </button>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">备注:</label>
+        <div class="layui-input-block">
+            <textarea name="remarks" placeholder="请输入备注" class="layui-textarea"></textarea>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <div class="layui-input-block">
+            <button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">确认保存</button>
+        </div>
+    </div>
+</div>
+<script src="../../lib/layui-v2.5.5/layui.js" charset="utf-8"></script>
+<script src="../../js/lay-config.js?v=1.0.4" charset="utf-8"></script>
+<script>
+
+    layui.use(['form', 'http', 'laydate', 'upload'], function () {
+        /**变-------------------------------量-------------------------------定-------------------------------义*/
+        var form = layui.form,
+            layer = layui.layer,
+            http = layui.http,
+            upload = layui.upload,
+            laydate = layui.laydate,
+            $ = layui.$;
+        let archiveId = $('#archive_id').val()
+        /**方-------------------------------法-------------------------------定-------------------------------义*/
+            // 保存方法
+        let save = function (data) {
+                http.post('borrow/archiveBorrow/borrow', data, true, function (res) {
+                    if (res.code == 200) {
+                        let index = layer.alert('保存成功!', {
+                            title: '预约借阅文档'
+                        }, function () {
+                            // 关闭弹出层
+                            layer.close(index);
+                            let iframeIndex = parent.layer.getFrameIndex(window.name);
+                            parent.layer.close(iframeIndex);
+                        });
+                    }
+                })
+            }
+
+
+        // 加载下拉框
+        let loadDictSelect = function () {
+
+        }
+
+
+        function minDate(){
+            var now = new Date();
+            return now.getFullYear()+"-" + (now.getMonth()+1) + "-" + now.getDate();
+        }
+
+        // 加载数据
+        let initData = function () {
+            laydate.render({
+                elem: '#estimateReturnTime',
+                type: 'datetime',
+                trigger: 'click',
+                min:minDate()
+            });
+
+
+            // // 加载当前登录用户
+            // http.get('system/auth/currLoginAdmin', {}, false, function (res) {
+            //     console.log(res.data)
+            //     form.val("addDict", res.data);
+            //     form.render();
+            // })
+
+            // 加载当前文档信息
+            http.get('archive/archive/selectByPrimaryKey', {
+                id: archiveId
+            }, false, function (res) {
+                form.val("addDict", res.data);
+                form.render();
+            })
+        }
+
+        let initUpload = function () {
+            //指定允许上传的文件类型
+            upload.render({
+                elem: '#upload'
+                , url: http.requestUrl + 'system/file/upload' //改成您自己的上传接口
+                , headers: {
+                    accessToken: (layui.data('auth').data ? layui.data('auth').data.accessToken : '') || ''
+                }
+                , multiple: true
+                , auto: true
+                , accept: 'file' //普通文件
+                , done: function (res) {
+                    if (res.code === 200) {
+                        $("#relevantCertificationShow").val(res.data.originalFileName)
+                        $("#relevantCertification").val(res.data.id)
+                        layer.msg('上传成功', {
+                            icon: 1
+                        })
+                    } else {
+                        layer.msg(res.msg, {
+                            icon: 2
+                        })
+                    }
+                }
+            });
+            console.log('上传组件加载完成')
+        }
+        /**事-------------------------------件-------------------------------绑-------------------------------定*/
+
+        initData()
+        initUpload()
+        loadDictSelect()
+        //监听提交
+        form.on('submit(saveBtn)', function (data) {
+            save(data.field)
+        });
+
+    });
+</script>
+</body>
+</html>

+ 1 - 1
src/main/resources/static/page/dept/bureaus.html

@@ -70,7 +70,7 @@
                         }
                     },
                     done: function(res, curr, count) {
-                        $('th').css({'background-color': '#1aa094', 'color': '#fff','font-weight':'bold'})
+                        // $('th').css({'background-color': '#1aa094', 'color': '#fff','font-weight':'bold'})
                     },
                     cols: [[
                         {type: 'numbers'},

+ 1 - 1
src/main/resources/static/page/dept/department.html

@@ -128,7 +128,7 @@
                     }
                 },
                 done: function(res, curr, count) {
-                    $('th').css({'background-color': '#1aa094', 'color': '#fff','font-weight':'bold'})
+                    // $('th').css({'background-color': '#1aa094', 'color': '#fff','font-weight':'bold'})
                 },
                 cols: [[
                     {type: 'numbers'},

+ 1 - 1
src/main/resources/static/page/dict/list.html

@@ -62,7 +62,7 @@
                     {templet: '#operating', width: 120, align: 'center', title: '操作'}
                 ]],
                 done: function () {
-                    $('th').css({'background-color': '#1aa094', 'color': '#fff','font-weight':'bold'})
+                    // $('th').css({'background-color': '#1aa094', 'color': '#fff','font-weight':'bold'})
                     layer.closeAll('loading');
                 }
             });

+ 7 - 77
src/main/resources/static/page/home/welcome.html

@@ -190,24 +190,9 @@
                 <div class="layui-row layui-col-space15">
                     <div class="layui-col-md6">
                         <div class="layui-card">
-                            <div class="layui-card-header"><i class="fa fa-warning icon"></i>监督信息概览</div>
+                            <div class="layui-card-header"><i class="fa fa-warning icon"></i>借阅待处理记录</div>
                             <div class="layui-card-body">
-                                <div class="welcome-module">
-                                    <div class="layui-row layui-col-space10 jd_info">
-                                        <div>
-                                            <img src="../../images/xscz.png">
-                                            <h1>线索处置<a id="xscz">0</a>条</h1>
-                                        </div>
-                                        <div>
-                                            <img src="../../images/lzhf.png">
-                                            <h1>廉政回复<a id="lzhf">0</a>条</h1>
-                                        </div>
-                                        <div>
-                                            <img src="../../images/jcqk.png">
-                                            <h1>奖惩情况<a id="jcqk">0</a>条</h1>
-                                        </div>
-                                    </div>
-                                </div>
+
                             </div>
                         </div>
                     </div>
@@ -215,21 +200,8 @@
 
                     <div class="layui-col-md6">
                         <div class="layui-card">
-                            <div class="layui-card-header"><i class="fa fa-credit-card icon icon-blue"></i>各职级人数统计</div>
+                            <div class="layui-card-header"><i class="fa fa-credit-card icon icon-blue"></i>借阅待归还记录</div>
                             <div class="layui-card-body">
-                                <div class="layui-form layuimini-form" lay-filter="addDict" style="margin-left: 500px;">
-                                    <div class="layui-input-inline" style="width: 120px">
-                                        <select name="depa" id="depa" lay-verify="required" lay-reqtext="选择局办" lay-filter="depa">
-                                            <option value="">请选择</option>
-                                        </select>
-                                    </div>
-                                    <div class="layui-input-inline" style="width: 120px">
-                                        <select name="dept" id="dept" lay-verify="required" lay-reqtext="选择科室" lay-filter="dept">
-                                            <option value="">请选择</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div id="dept-person-count" style="width: 100%;min-height:210px"></div>
                             </div>
                         </div>
                     </div>
@@ -237,72 +209,30 @@
 
                     <div class="layui-col-md6">
                         <div class="layui-card">
-                            <div class="layui-card-header"><i class="fa fa-warning icon"></i>最终处理结果</div>
+                            <div class="layui-card-header"><i class="fa fa-warning icon"></i>存档统计记录</div>
                             <div class="layui-card-body">
-                                <div id="finally-result" style="width: 100%;min-height:388px"></div>
                             </div>
                         </div>
                     </div>
 
                     <div class="layui-col-md6">
                         <div class="layui-card">
-                            <div class="layui-card-header"><i class="fa fa-line-chart icon"></i>处置方式</div>
-                            <div class="layui-card-body">
-                                <div id="chuzhifangshi" style="width: 100%;min-height:388px"></div>
-                            </div>
-                        </div>
-                    </div>
-
-
-                    <div class="layui-col-md8">
-                        <div class="layui-card">
-                            <div class="layui-card-header"><i class="fa fa-line-chart icon"></i>问题线索</div>
-                            <div class="layui-card-body">
-                                <div id="wentixiansuo" style="width: 100%;min-height:450px"></div>
-                            </div>
-                        </div>
-                    </div>
-
-                    <div class="layui-col-md4">
-                        <div class="layui-card">
-                            <div class="layui-card-header"><i class="fa fa-credit-card icon icon-blue"></i>奖惩人数</div>
+                            <div class="layui-card-header"><i class="fa fa-line-chart icon"></i>按年统计记录</div>
                             <div class="layui-card-body">
-                                <div id="jianglirenshu" style="width: 100%;min-height:450px"></div>
                             </div>
                         </div>
                     </div>
 
 
-                    <div class="layui-col-md6">
-                        <div class="layui-card">
-                            <div class="layui-card-header"><i class="fa fa-credit-card icon icon-blue"></i>登录情况</div>
-                            <div class="layui-card-body">
-                                <div class="welcome-module">
-                                    <div class="layui-row layui-col-space10 layuimini-qiuck">
-                                        <div id="login-info" style="width: 100%;min-height:200px"></div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-
-                    <div class="layui-col-md6">
+                    <div class="layui-col-md12">
                         <div class="layui-card">
-                            <div class="layui-card-header"><i class="fa fa-line-chart icon"></i>政治面貌</div>
+                            <div class="layui-card-header"><i class="fa fa-line-chart icon"></i>借阅统计图</div>
                             <div class="layui-card-body">
-                                <div id="zzmm" style="width: 100%;min-height:250px"></div>
                             </div>
                         </div>
                     </div>
-
-
                 </div>
             </div>
-
-            <div class="layui-col-md4">
-
-
-            </div>
         </div>
     </div>
 </div>

+ 1 - 1
src/main/resources/static/page/log/logsList.html

@@ -98,7 +98,7 @@
                     }
                 },
                 done: function (res, curr, count) {
-                    $('th').css({'background-color': '#1aa094', 'color': '#fff', 'font-weight': 'bold'})
+                    // $('th').css({'background-color': '#1aa094', 'color': '#fff', 'font-weight': 'bold'})
                 },
                 cols: [[
                     {type: 'numbers'},

+ 1 - 1
src/main/resources/static/page/menu/menuList.html

@@ -81,7 +81,7 @@
                     {templet: '#operating', width: 120, align: 'center', title: '操作'}
                 ]],
                 done: function () {
-                    $('th').css({'background-color': '#1aa094', 'color': '#fff','font-weight':'bold'})
+                    // $('th').css({'background-color': '#1aa094', 'color': '#fff','font-weight':'bold'})
                     layer.closeAll('loading');
                 }
             });

+ 239 - 0
src/main/resources/static/page/myBorrow/list.html

@@ -0,0 +1,239 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+    <link rel="stylesheet" href="../../lib/layui-v2.5.5/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../css/public.css" media="all">
+</head>
+<style>
+    /*.layui-disabled, .layui-disabled:hover{*/
+    /*    color: red!important;*/
+    /*}*/
+</style>
+<body>
+<div class="layuimini-container">
+    <div class="layuimini-main">
+        <div>
+            <!--            <div class="layui-form toolbar">-->
+            <!--                <div class="layui-form-item">-->
+            <!--                    <div class="layui-inline">-->
+            <!--                        <input type="text" id="dh" name="dh" lay-filter="dh" placeholder="请输入档号" class="layui-input">-->
+            <!--                    </div>-->
+            <!--                    <div class="layui-inline">-->
+            <!--                        <input type="text" id="mlh" name="mlh" lay-filter="mlh" placeholder="请输入目录号"-->
+            <!--                               class="layui-input">-->
+            <!--                    </div>-->
+            <!--                    <div class="layui-inline">-->
+            <!--                        <select name="bgqx" id="bgqx">-->
+            <!--                            <option value="">请选择保管期限</option>-->
+            <!--                        </select>-->
+            <!--                    </div>-->
+            <!--                    <div class="layui-inline">-->
+            <!--                        <button id="btnSearch" lay-submit lay-filter="search" class="layui-btn icon-btn"><i-->
+            <!--                                class="layui-icon"></i>搜索-->
+            <!--                        </button>-->
+            <!--                    </div>-->
+            <!--                </div>-->
+            <!--            </div>-->
+            <table class="layui-hide" id="user-table" lay-filter="table"></table>
+        </div>
+        <div style="clear: both"></div>
+    </div>
+</div>
+
+</body>
+</html>
+
+<!--  头部工具栏  -->
+<script type="text/html" id="toolbar">
+</script>
+
+<!-- 操作列 -->
+<script type="text/html" id="operating">
+    {{#  if(d.auditStatus == 0){  }}
+    <a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="revoke">撤销</a>
+    {{# }else{  }}
+    <a class="layui-btn layui-btn-xs layui-btn-normal" lay-event="opinion">意见</a>
+    {{# }  }}
+</script>
+
+<script src="../../lib/layui-v2.5.5/layui.js" charset="utf-8"></script>
+<script src="../../js/lay-config.js?v=1.0.4" charset="utf-8"></script>
+<script>
+    layui.use(['table', 'http', 'laydate', 'form', 'upload', 'url'], function () {
+        /**变-------------------------------量-------------------------------定-------------------------------义*/
+
+        var table = layui.table,
+            laydate = layui.laydate,
+            http = layui.http,
+            form = layui.form,
+            upload = layui.upload,
+            url = layui.url,
+            $ = layui.jquery;
+
+        let searchParam = {
+            // dh: null,
+            // mlh: null,
+            // bgqx: null,
+            // ml: null
+        }
+        /**方-------------------------------法-------------------------------定-------------------------------义*/
+
+            // http.getRoleButton(164)
+
+            //数据加载方法
+        let renderTable = function () {
+                // 加载表格数据
+                table.render({
+                    elem: '#user-table',
+                    url: 'borrow/archiveBorrow/selectCurrAdminArchiveBorrowHistory',
+                    toolbar: '#toolbar', //开启头部工具栏,并为其绑定左侧模板
+                    defaultToolbar: ['filter', 'exports', 'print'],
+                    title: '用户数据表',
+                    toolbar: '#toolbar',
+                    page: true,
+                    request: {
+                        pageName: 'pageNum',
+                        limitName: 'pageSize'
+                    },
+                    where: searchParam,
+                    response: {
+                        statusCode: 200 //重新规定成功的状态码为 200,table 组件默认为 0
+                    },
+                    parseData: function (res) {
+                        return {
+                            "code": res.code,
+                            "msg": res.msg,
+                            "count": res.data.total,
+                            "data": res.data.list
+                        }
+                    },
+                    done: function (res, curr, count) {
+                        // $('th').css({'background-color': '#1aa094', 'color': '#fff', 'font-weight': 'bold'})
+                    },
+                    cols: [[
+                        // {type: 'checkbox', fixed: 'left'},
+                        {type: 'numbers'},
+                        {field: 'dh', title: '档号', width: 240},
+                        {field: 'tm', title: '题名'},
+                        {field: 'createTime', title: '开始时间', width: 180},
+                        {field: 'estimateReturnTime', title: '归还时间', width: 180},
+                        // {field: 'mjText', title: '密级'}1,
+                        {field: 'adminName', title: '借阅人', width: 150},
+                        {
+                            field: 'borrowType', title: '借阅方式', width: 90,
+                            templet: function (rv) {
+                                return rv.borrowType == 0 ? '打印借阅' : '原件借阅'
+                            }
+                        },
+                        // {
+                        //     field: 'originalStatus', title: '是否需要归还', templet: function (rv) {
+                        //         return rv.borrowType == 0 ? '否' : '是'
+                        //     }
+                        // },
+                        {
+                            field: 'originalStatus', title: '归还状态', width: 110, templet: function (rv) {
+                                if (rv.borrowType == 1) {
+                                    if (rv.auditStatus == 2) {
+                                        return rv.returnStatus == 0 ? '<span class="layui-badge layui-bg-orange">未归还</span>' : '<span class="layui-badge layui-bg-green">已归还</span>'
+                                    } else {
+                                        return '<span class="layui-badge layui-bg-green">无需归还</span>'
+                                    }
+                                } else {
+                                    return '<span class="layui-badge layui-bg-green">无需归还</span>'
+                                }
+                            }
+                        },
+                        {
+                            field: 'auditStatus', title: '审核状态', width: 110, templet: function (rv) {
+                                switch (rv.auditStatus) {
+                                    case 0:
+                                        return '<span class="layui-badge layui-bg-orange">待审核</span>';
+                                    case 1:
+                                        return '<span class="layui-badge">审核不通过</span>';
+                                    case 2:
+                                        return '<span class="layui-badge layui-bg-green">审核通过</span>';
+                                }
+                            }
+                        },
+                        // {field: 'wjdqsj', title: '文件到期时间'},
+                        {templet: '#operating', align: 'center', width: 120, title: '操作'}
+                    ]]
+                });
+            }
+
+        //删除方法
+        let revoke = function (id) {
+            layer.confirm('真的撤销么', function (index) {
+                http.delete('borrow/archiveBorrow/delete', {id: id}, true, function (res) {
+                    if (res.code == 200) {
+                        layer.msg('撤销成功', {
+                            icon: 1,
+                            time: 2000
+                        })
+                    } else {
+                        layer.msg(res.msg, {
+                            icon: 2,
+                            time: 2000
+                        })
+                    }
+                    renderTable()
+                })
+                layer.close(index);
+            });
+        }
+
+        /**事-------------------------------件-------------------------------绑-------------------------------定*/
+
+        renderTable()
+
+
+        //表格操作栏
+        table.on('tool(table)', function (obj) {
+            let data = obj.data;
+            switch (obj.event) {
+                case 'opinion':
+                    opinion(data);
+                    break;
+                case 'revoke':
+                    revoke(data.id);
+                    break;
+            }
+        });
+
+        //打开附件列表
+        let opinion = function (data) {
+            var index = layer.open({
+                title: '预约借阅',
+                type: 2,
+                shade: 0.2,
+                maxmin: true,
+                shadeClose: true,
+                area: ['100%', '100%'],
+                content: './opinion.html',
+                success: function (layero, index) {
+                    var body = layer.getChildFrame('body', index);
+                    body.find("#id").val(data.id);
+                },
+                end: function () {
+                    renderTable()
+                }
+            });
+        }
+
+
+        //头部工具栏监听
+        table.on('toolbar(table)', function (obj) {
+            switch (obj.event) {
+            }
+        })
+
+        form.on('submit(search)', function (data) {
+            if (data.field.dh) searchParam.dh = data.field.dh
+            if (data.field.mlh) searchParam.mlh = data.field.mlh
+            if (data.field.bgqx) searchParam.bgqx = data.field.bgqx
+            renderTable()
+        })
+    });
+</script>

+ 189 - 0
src/main/resources/static/page/myBorrow/reserve.html

@@ -0,0 +1,189 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>layui</title>
+    <link rel="stylesheet" href="../../lib/layui-v2.5.5/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../css/public.css" media="all">
+    <link rel="stylesheet" href="../../lib/font-awesome-4.7.0/css/font-awesome.min.css" media="all">
+    <style>
+        body {
+            background-color: #ffffff;
+
+        }
+
+        .layui-form-item .layui-input-inline {
+            /*width: 20%;*/
+        }
+    </style>
+</head>
+<body>
+<div class="layui-form layuimini-form" lay-filter="addDict">
+
+    <!--    <div class="layui-form-item">-->
+    <!--        <label class="layui-form-label required">借阅人:</label>-->
+    <!--        <div class="layui-input-block">-->
+    <!--            <input type="text" name="adminName" lay-verify="required" lay-reqtext="借阅人不能为空" placeholder="请输入借阅人"-->
+    <!--                   value=""-->
+    <!--                   class="layui-input">-->
+    <!--        </div>-->
+    <!--    </div>-->
+
+
+    <!--    <div class="layui-form-item">-->
+    <!--        <label class="layui-form-label required">借阅单位:</label>-->
+    <!--        <div class="layui-input-block">-->
+    <!--            <input type="text" name="jydw" placeholder="请输入借阅单位" value="" lay-reqtext="借阅单位不能为空"-->
+    <!--                   class="layui-input">-->
+    <!--        </div>-->
+
+    <!--    </div>-->
+
+    <!--    <div class="layui-form-item">-->
+    <!--        <label class="layui-form-label required">证件号码:</label>-->
+    <!--        <div class="layui-input-block">-->
+    <!--            <input type="text" name="zjhm" placeholder="请输入证件号码" value="" lay-reqtext="证件号码不能为空"-->
+    <!--                   class="layui-input">-->
+    <!--        </div>-->
+    <!--    </div>-->
+
+    <div class="layui-form-item">
+        <label class="layui-form-label required">档号:</label>
+        <div class="layui-input-block">
+            <input type="hidden" name="archiveId" id="archive_id" class="layui-input">
+            <input type="text" name="dh" placeholder="请输入档号" value="" lay-reqtext="档号不能为空" class="layui-input" readonly>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label required">题名:</label>
+        <div class="layui-input-block">
+            <input type="text" name="tm" placeholder="请输入题名" value="" lay-reqtext="题名不能为空" class="layui-input" readonly>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label required">归还时间:</label>
+        <div class="layui-input-block">
+            <input type="text" name="returnTime" id="returnTime" placeholder="请选择归还时间" value="" lay-reqtext="归还时间不能为空"
+                   class="layui-input">
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label required">借阅方式:</label>
+        <div class="layui-input-block">
+            <select name="borrowType" id="bgqx">
+                <option value="">请选择借阅方式</option>
+                <option value="0">打印借阅</option>
+                <option value="1">原件借阅</option>
+            </select>
+        </div>
+    </div>
+    <!--    <div class="layui-form-item">-->
+    <!--        <label class="layui-form-label required">联系电话:</label>-->
+    <!--        <div class="layui-input-block">-->
+    <!--            <input type="number" name="phone" placeholder="请输入联系电话" value="" lay-reqtext="联系电话不能为空"-->
+    <!--                   class="layui-input">-->
+    <!--        </div>-->
+    <!--    </div>-->
+
+
+    <div class="layui-form-item">
+        <label class="layui-form-label required">利用目的:</label>
+        <div class="layui-input-block">
+            <input type="text" name="usePurpose" placeholder="请输入利用目的" value="" lay-reqtext="利用目的不能为空"
+                   class="layui-input">
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label required">相关证明:</label>
+        <div class="layui-input-block">
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">备注:</label>
+        <div class="layui-input-block">
+            <textarea name="remarks" placeholder="请输入备注" class="layui-textarea"></textarea>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <div class="layui-input-block">
+            <button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">确认保存</button>
+        </div>
+    </div>
+</div>
+<script src="../../lib/layui-v2.5.5/layui.js" charset="utf-8"></script>
+<script src="../../js/lay-config.js?v=1.0.4" charset="utf-8"></script>
+<script>
+
+    layui.use(['form', 'http', 'laydate'], function () {
+        /**变-------------------------------量-------------------------------定-------------------------------义*/
+        var form = layui.form,
+            layer = layui.layer,
+            http = layui.http,
+            laydate = layui.laydate,
+            $ = layui.$;
+        let archiveId = $('#archive_id').val()
+        /**方-------------------------------法-------------------------------定-------------------------------义*/
+            // 保存方法
+        let save = function (data) {
+            http.post('borrow/archiveBorrow/borrow', data, true, function (res) {
+                if (res.code == 200) {
+                    let index = layer.alert('保存成功!', {
+                        title: '预约借阅文档'
+                    }, function () {
+                        // 关闭弹出层
+                        layer.close(index);
+                        let iframeIndex = parent.layer.getFrameIndex(window.name);
+                        parent.layer.close(iframeIndex);
+                    });
+                }
+            })
+        }
+
+
+        // 加载下拉框
+        let loadDictSelect = function () {
+
+        }
+
+        // 加载数据
+        let initData = function () {
+            laydate.render({
+                elem: '#returnTime',
+                type: 'datetime',
+                trigger: 'click'
+            });
+
+            // // 加载当前登录用户
+            // http.get('system/auth/currLoginAdmin', {}, false, function (res) {
+            //     console.log(res.data)
+            //     form.val("addDict", res.data);
+            //     form.render();
+            // })
+
+            // 加载当前文档信息
+            http.get('archive/archive/selectByPrimaryKey', {
+                id: archiveId
+            }, false, function (res) {
+                form.val("addDict", res.data);
+                form.render();
+            })
+
+
+        }
+        /**事-------------------------------件-------------------------------绑-------------------------------定*/
+
+        initData()
+        loadDictSelect()
+        //监听提交
+        form.on('submit(saveBtn)', function (data) {
+            save(data.field)
+        });
+
+    });
+</script>
+</body>
+</html>

+ 2 - 2
src/main/resources/static/page/role/list.html

@@ -69,7 +69,7 @@
                         }
                     },
                     done: function(res, curr, count) {
-                        $('th').css({'background-color': '#1aa094', 'color': '#fff','font-weight':'bold'})
+                        // $('th').css({'background-color': '#1aa094', 'color': '#fff','font-weight':'bold'})
                     },
                     cols: [[
                         // {type: 'checkbox', fixed: 'left'}
@@ -166,7 +166,7 @@
         //头工具栏事件
         table.on('toolbar(paper-table)', function (obj) {
             switch (obj.event) {
-                case 'addPaper': addPaper(); break;
+                case 'add': addPaper(); break;
             }
         })
 

+ 1 - 1
src/main/resources/static/page/user/userList.html

@@ -70,7 +70,7 @@
                         }
                     },
                     done: function(res, curr, count) {
-                        $('th').css({'background-color': '#1aa094', 'color': '#fff','font-weight':'bold'})
+                        // $('th').css({'background-color': '#1aa094', 'color': '#fff','font-weight':'bold'})
                     },
                     cols: [[
                         // {type: 'checkbox', fixed: 'left'}

+ 21 - 14
src/main/resources/static/updatePassword.html

@@ -9,7 +9,11 @@
     <link rel="stylesheet" href="../lib/layui-v2.5.5/css/layui.css" media="all">
     <link rel="stylesheet" href="../css/public.css" media="all">
     <style>
-        .layui-form-item .layui-input-company {width: auto;padding-right: 10px;line-height: 38px;}
+        .layui-form-item .layui-input-company {
+            width: auto;
+            padding-right: 10px;
+            line-height: 38px;
+        }
     </style>
 </head>
 <body>
@@ -20,7 +24,8 @@
             <div class="layui-form-item">
                 <label class="layui-form-label required">旧的密码</label>
                 <div class="layui-input-block">
-                    <input type="password" name="oldPassword" lay-verify="required" lay-reqtext="旧的密码不能为空" placeholder="请输入旧的密码"  value="" class="layui-input">
+                    <input type="password" name="oldPassword" lay-verify="required" lay-reqtext="旧的密码不能为空"
+                           placeholder="请输入旧的密码" value="" class="layui-input">
                     <tip>填写自己账号的旧的密码。</tip>
                 </div>
             </div>
@@ -28,13 +33,15 @@
             <div class="layui-form-item">
                 <label class="layui-form-label required">新的密码</label>
                 <div class="layui-input-block">
-                    <input type="password" name="newPassword" lay-verify="pass" lay-reqtext="新的密码不能为空" placeholder="请输入新的密码"  value="" class="layui-input">
+                    <input type="password" name="newPassword" lay-verify="pass" lay-reqtext="新的密码不能为空"
+                           placeholder="请输入新的密码" value="" class="layui-input">
                 </div>
             </div>
             <div class="layui-form-item">
                 <label class="layui-form-label required">新的密码</label>
                 <div class="layui-input-block">
-                    <input type="password" name="againPassword" lay-verify="pass" lay-reqtext="新的密码不能为空" placeholder="请输入新的密码"  value="" class="layui-input">
+                    <input type="password" name="againPassword" lay-verify="pass" lay-reqtext="新的密码不能为空"
+                           placeholder="请输入新的密码" value="" class="layui-input">
                 </div>
             </div>
 
@@ -49,7 +56,7 @@
 <script src="../lib/layui-v2.5.5/layui.js" charset="utf-8"></script>
 <script src="../js/lay-config.js?v=1.0.4" charset="utf-8"></script>
 <script>
-    layui.use(['form','miniTab','http'], function () {
+    layui.use(['form', 'miniTab', 'http'], function () {
         var form = layui.form,
             layer = layui.layer,
             http = layui.http,
@@ -57,27 +64,27 @@
 
         // 自定义校验规则
         form.verify({
-           pass: [
+            pass: [
                 /^[\S]{6,12}$/
-                ,'密码必须6到12位,且不能出现空格'
+                , '密码必须6到12位,且不能出现空格'
             ]
-            ,content: function(value){
+            , content: function (value) {
                 layedit.sync(editIndex);
             }
         });
 
         //监听提交
         form.on('submit(saveBtn)', function (data) {
-            if (data.field.newPassword != data.field.againPassword){
-                layer.msg('两次密码输入不一致',{icon: 5});
+            if (data.field.newPassword != data.field.againPassword) {
+                layer.msg('两次密码输入不一致', {icon: 5});
                 return;
             }
-            http.post('system/auth/updatePassword',JSON.stringify(data.field),true,function (res) {
-                if (res.code == 200){
-                    layer.msg('修改成功',{
+            http.post('system/auth/updatePassword', data.field, true, function (res) {
+                if (res.code == 200) {
+                    layer.msg('修改成功', {
                         icon: 1,
                         time: 2000
-                    },function () {
+                    }, function () {
                         miniTab.deleteCurrentByIframe();
                     })
                 }

+ 2 - 0
src/test/java/com/gz/GuihuaArchivesApplicationTests.java

@@ -2,12 +2,14 @@ package com.gz;
 
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
 
 @SpringBootTest
 class GuihuaArchivesApplicationTests {
 
     @Test
     void contextLoads() {
+        System.out.println(1);
     }
 
 }

+ 91 - 0
src/test/java/com/gz/ImportArchives.java

@@ -0,0 +1,91 @@
+package com.gz;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.poi.excel.ExcelReader;
+import cn.hutool.poi.excel.ExcelUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.gz.core.exception.BusinessException;
+import com.gz.dto.archive.ArchiveDTO;
+import com.gz.mapper.archive.ArchiveMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.util.LittleEndianOutputStream;
+import org.junit.jupiter.api.Test;
+import org.omg.CORBA.IRObject;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.transaction.annotation.Transactional;
+import sun.rmi.runtime.Log;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author LiuchangLan
+ * @date 2021/2/25 13:04
+ */
+@Slf4j
+@SpringBootTest
+class ImportArchives {
+
+    private String excelPath = "C:\\Users\\84731\\Desktop\\a.xlsx";
+
+    @Resource
+    private ArchiveMapper mapper;
+
+    @Test
+//    @Transactional
+    public void test() {
+        ExcelReader reader = ExcelUtil.getReader(FileUtil.file(excelPath), 0);
+        List<List<Object>> rows = reader.read();
+        for (int i = 1; i < rows.size(); i++) {
+            try {
+                List<Object> row = rows.get(i);
+                ArchiveDTO dto = new ArchiveDTO();
+                dto.setDagdm(this.getExcelCellStringValue(row, 0));
+                dto.setDh(this.getExcelCellStringValue(row, 1));
+                dto.setQzh(this.getExcelCellStringValue(row, 2));
+                dto.setGdnd(this.getExcelCellStringValue(row, 3));
+                dto.setMj(this.getExcelCellStringValue(row, 4));
+                dto.setBgqx(this.getExcelCellStringValue(row, 5));
+                // TODO: 2021/2/25 机构代号 6 馆编号 7
+                dto.setZtsl(this.getExcelCellIntegerValue(row, 8));
+                dto.setWjbh(this.getExcelCellStringValue(row, 9));
+                dto.setWjxcsj(this.getExcelCellStringValue(row, 10));
+                dto.setZrz(this.getExcelCellStringValue(row, 11));
+                dto.setTm(this.getExcelCellStringValue(row, 12));
+                dto.setBz(this.getExcelCellStringValue(row, 13));
+                dto.setZbbm(this.getExcelCellStringValue(row, 14));
+                dto.setXbbm(this.getExcelCellStringValue(row, 15));
+                dto.setKzf(this.getExcelCellStringValue(row, 16));
+                dto.setDzwdh(this.getExcelCellStringValue(row, 17));
+                dto.setSwh(this.getExcelCellStringValue(row, 18));
+                dto.setGb(this.getExcelCellStringValue(row, 19));
+                dto.setWz(this.getExcelCellStringValue(row, 20));
+                dto.setZtgg(this.getExcelCellStringValue(row, 21));
+                dto.setZtlx(this.getExcelCellStringValue(row, 22));
+                dto.setZtdw(this.getExcelCellStringValue(row, 23));
+                dto.setZzjgdm(this.getExcelCellStringValue(row, 24));
+                dto.setFlh(this.getExcelCellStringValue(row, 25));
+                dto.setZtc(this.getExcelCellStringValue(row, 26));
+                dto.setQwbs(this.getExcelCellStringValue(row, 27));
+                System.out.println(dto);
+                mapper.insertSelective(dto);
+            } catch (Exception e) {
+                new BusinessException(500, String.format("导入出错,错误位置:{}行,错误原因{}", (i + 1), e.getMessage()));
+            }
+        }
+        log.info("成功添加{}行数据", rows.size());
+    }
+
+    private String getExcelCellStringValue(List<Object> row, int index) {
+        if (index >= row.size()) {
+            return null;
+        }
+        return String.valueOf(row.get(index));
+    }
+
+    private Integer getExcelCellIntegerValue(List<Object> row, int index) {
+        return Integer.valueOf(getExcelCellStringValue(row, index));
+    }
+
+}