liuchanglan 4 years ago
parent
commit
be0c2b0eaf
100 changed files with 4554 additions and 1450 deletions
  1. 5 0
      Dockerfile
  2. 2 0
      src/main/java/com/gz/aop/WebLogAspect.java
  3. 14 0
      src/main/java/com/gz/common/DataGlobalVariable.java
  4. 53 0
      src/main/java/com/gz/config/rabbitmq/RabbitMQExchangeConfig.java
  5. 126 0
      src/main/java/com/gz/config/rabbitmq/RabbitMQQueueConfig.java
  6. 35 0
      src/main/java/com/gz/consumer/OcrConsumer.java
  7. 18 0
      src/main/java/com/gz/controller/archive/ArchiveController.java
  8. 2 2
      src/main/java/com/gz/controller/archive/ArchiveFileController.java
  9. 86 0
      src/main/java/com/gz/controller/archive/SecondaryArchiveController.java
  10. 8 2
      src/main/java/com/gz/controller/borrow/ArchiveBorrowController.java
  11. 41 0
      src/main/java/com/gz/controller/statistics/SelectStatisticsController.java
  12. 6 0
      src/main/java/com/gz/controller/system/AdminController.java
  13. 10 0
      src/main/java/com/gz/controller/system/ArchivesTreeController.java
  14. 40 0
      src/main/java/com/gz/controller/system/DeptController.java
  15. 6 0
      src/main/java/com/gz/controller/system/DictController.java
  16. 52 0
      src/main/java/com/gz/controller/welcome/AdminStatisticsController.java
  17. 17 0
      src/main/java/com/gz/controller/welcome/UserStatisticsController.java
  18. 58 0
      src/main/java/com/gz/core/UUIDBaseDTO.java
  19. 39 0
      src/main/java/com/gz/dto/archive/SecondaryArchiveDTO.java
  20. 0 1
      src/main/java/com/gz/dto/borrow/ArchiveBorrowDTO.java
  21. 6 0
      src/main/java/com/gz/dto/system/ArchiveFileDTO.java
  22. 26 0
      src/main/java/com/gz/dto/system/DeptDTO.java
  23. 2 0
      src/main/java/com/gz/dto/system/MenuRoleDTO.java
  24. 0 1
      src/main/java/com/gz/dto/system/RoleDTO.java
  25. 9 1
      src/main/java/com/gz/mapper/archive/ArchiveMapper.java
  26. 7 0
      src/main/java/com/gz/mapper/archive/SecondaryArchiveMapper.java
  27. 2 1
      src/main/java/com/gz/mapper/borrow/ArchiveBorrowMapper.java
  28. 21 0
      src/main/java/com/gz/mapper/statistics/SelectStatisticsMapper.java
  29. 11 0
      src/main/java/com/gz/mapper/system/DeptMapper.java
  30. 4 1
      src/main/java/com/gz/mapper/system/MenuRoleMapper.java
  31. 74 0
      src/main/java/com/gz/mapper/welcome/StatisticsMapper.java
  32. 4 0
      src/main/java/com/gz/rvo/borrow/ArchiveBorrowHistoryRVO.java
  33. 17 0
      src/main/java/com/gz/rvo/statistics/ArchiveStatisticsRVO.java
  34. 14 0
      src/main/java/com/gz/rvo/statistics/ArchiveYearStatisticsRVO.java
  35. 18 0
      src/main/java/com/gz/rvo/statistics/BorrowStatisticsRVO.java
  36. 21 0
      src/main/java/com/gz/rvo/welcome/ArchiveCountRVO.java
  37. 15 0
      src/main/java/com/gz/rvo/welcome/BorrowCountRVO.java
  38. 22 0
      src/main/java/com/gz/rvo/welcome/BorrowRecordRVO.java
  39. 1 1
      src/main/java/com/gz/service/archive/ArchiveFileService.java
  40. 26 0
      src/main/java/com/gz/service/archive/ArchiveService.java
  41. 55 0
      src/main/java/com/gz/service/archive/SecondaryArchiveService.java
  42. 56 19
      src/main/java/com/gz/service/archive/impl/ArchiveFileServiceImpl.java
  43. 126 13
      src/main/java/com/gz/service/archive/impl/ArchiveServiceImpl.java
  44. 62 0
      src/main/java/com/gz/service/archive/impl/SecondaryArchiveServiceImpl.java
  45. 4 2
      src/main/java/com/gz/service/borrow/ArchiveBorrowService.java
  46. 16 8
      src/main/java/com/gz/service/borrow/impl/ArchiveBorrowServiceImpl.java
  47. 22 0
      src/main/java/com/gz/service/statistics/SelectStatisticsService.java
  48. 59 0
      src/main/java/com/gz/service/statistics/impl/SelectStatisticsServiceImpl.java
  49. 15 5
      src/main/java/com/gz/service/system/AdminService.java
  50. 6 0
      src/main/java/com/gz/service/system/ArchivesTreeService.java
  51. 63 0
      src/main/java/com/gz/service/system/DeptService.java
  52. 8 0
      src/main/java/com/gz/service/system/DictService.java
  53. 6 0
      src/main/java/com/gz/service/system/impl/AdminServiceImpl.java
  54. 53 1
      src/main/java/com/gz/service/system/impl/ArchivesTreeServiceImpl.java
  55. 13 5
      src/main/java/com/gz/service/system/impl/AuthServiceImpl.java
  56. 62 0
      src/main/java/com/gz/service/system/impl/DeptServiceImpl.java
  57. 39 6
      src/main/java/com/gz/service/system/impl/DictServiceImpl.java
  58. 40 18
      src/main/java/com/gz/service/system/impl/RoleServiceImpl.java
  59. 68 0
      src/main/java/com/gz/service/welcome/StatisticsService.java
  60. 174 0
      src/main/java/com/gz/service/welcome/impl/StatisticsServiceImpl.java
  61. 35 0
      src/main/java/com/gz/utils/ExcelUtils.java
  62. 15 0
      src/main/java/com/gz/utils/UUIdGenId.java
  63. 29 0
      src/main/java/com/gz/vo/archive/GenerateDhVO.java
  64. 1 0
      src/main/java/com/gz/vo/archive/SearchArchiveFileVO.java
  65. 17 0
      src/main/java/com/gz/vo/archive/SearchArchiveVO.java
  66. 13 0
      src/main/java/com/gz/vo/archive/SecondaryArchiveVO.java
  67. 22 0
      src/main/java/com/gz/vo/borrow/SearchBorrowVO.java
  68. 14 0
      src/main/java/com/gz/vo/rabbitmq/OcrEtlVO.java
  69. 3 1
      src/main/java/com/gz/vo/system/RoleMenuVO.java
  70. 17 11
      src/main/resources/application-dev.yml
  71. 96 0
      src/main/resources/application-test.yml
  72. 16 6
      src/main/resources/application.yml
  73. 11 1
      src/main/resources/mapper/archiveBorrowMapper.xml
  74. 84 1
      src/main/resources/mapper/archiveMapper.xml
  75. 2 0
      src/main/resources/mapper/menuMapper.xml
  76. 145 0
      src/main/resources/mapper/statisticsMapper.xml
  77. 546 546
      src/main/resources/static/css/layuimini.css
  78. 2 1
      src/main/resources/static/css/themes/default.css
  79. BIN
      src/main/resources/static/images/logo.png
  80. BIN
      src/main/resources/static/images/shibai.png
  81. BIN
      src/main/resources/static/images/success.png
  82. 204 201
      src/main/resources/static/index.html
  83. 2 2
      src/main/resources/static/js/lay-module/echarts/echarts.js
  84. 8 15
      src/main/resources/static/js/lay-module/layuimini/miniMenu.js
  85. 13 14
      src/main/resources/static/js/lay-module/layuimini/miniTheme.js
  86. 4 5
      src/main/resources/static/js/lay-module/request/http.js
  87. 2 0
      src/main/resources/static/lib/layui-v2.5.5/css/layui.css
  88. 2 0
      src/main/resources/static/page/admin/list.html
  89. 156 0
      src/main/resources/static/page/archive/advancedSearch.html
  90. 348 122
      src/main/resources/static/page/archive/edit.html
  91. 171 0
      src/main/resources/static/page/archive/editSecondary.html
  92. 78 51
      src/main/resources/static/page/archive/fileList.html
  93. 174 31
      src/main/resources/static/page/archive/list.html
  94. 83 82
      src/main/resources/static/page/dept/bureaus.html
  95. 149 0
      src/main/resources/static/page/archive/upload.html
  96. 124 94
      src/main/resources/static/page/auditList/list.html
  97. 71 27
      src/main/resources/static/page/borrow/list.html
  98. 32 45
      src/main/resources/static/page/borrow/reserve.html
  99. 0 107
      src/main/resources/static/page/dept/addBureaus.html
  100. 0 0
      src/main/resources/static/page/dept/addDepartment.html

+ 5 - 0
Dockerfile

@@ -0,0 +1,5 @@
+FROM openjdk:8-jdk-alpine
+ENTRYPOINT 8473136@qq.com
+COPY ./target/**.jar app.jar
+EXPOSE 9091
+ENTRYPOINT ["java","-jar","./app.jar"]

+ 2 - 0
src/main/java/com/gz/aop/WebLogAspect.java

@@ -12,6 +12,7 @@ import org.aspectj.lang.annotation.AfterThrowing;
 import org.aspectj.lang.annotation.Aspect;
 import org.aspectj.lang.annotation.Before;
 import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.context.annotation.Profile;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.context.request.RequestAttributes;
@@ -28,6 +29,7 @@ import javax.servlet.http.HttpServletRequest;
  */
 @Aspect
 @Component
+@Profile("test")
 public class WebLogAspect {
 
     /**

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

@@ -42,4 +42,18 @@ public class DataGlobalVariable {
 
     /** 融媒体档案 生成档号 FOMAT 全宗号-目录号-档案门类代码·属类代码-保管期限-件号*/
     public static final String MT_DH_FOMAT = "%s-%s-MT·%s-%s-%s";
+
+    /** 菜单权限类型*/
+    public static final Integer ROLE_TYPE_MENU = 0;
+    /** 档案树权限类型*/
+    public static final Integer ROLE_TYPE_ARCHIVE_TREE = 1;
+    /** 密集权限*/
+    public static final Integer ROLE_TYPE_MIJI = 2;
+
+    /** ---------------------消息队列相关 ------------------------*/
+    public static final String MQ_SEND_SUCCESS = "0";
+    public static final String MQ_SEND_FAILED = "1";
+    public static final String MQ_X_DEAD_LETTER_EXCHANGE_KEY = "x-dead-letter-exchange";
+    public static final String MQ_X_DEAD_LETTER_ROUTING_KEY = "x-dead-letter-routing-key";
+    public static final String MQ_X_MESSAGE_TTL = "x-message-ttl";
 }

+ 53 - 0
src/main/java/com/gz/config/rabbitmq/RabbitMQExchangeConfig.java

@@ -0,0 +1,53 @@
+package com.gz.config.rabbitmq;
+
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.Binding;
+import org.springframework.amqp.core.BindingBuilder;
+import org.springframework.amqp.core.DirectExchange;
+import org.springframework.amqp.core.Queue;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * rabbitmq默认交换器
+ * @author LiuchangLan
+ * @date 2020/11/18 16:20
+ */
+@Configuration
+@Slf4j
+public class RabbitMQExchangeConfig {
+
+    @Value("${rabbitmq.data-exchange}")
+    private String dataExchangeName;
+
+    @Value("${rabbitmq.dlx-data-exchange}")
+    private String dlxDataExchangeName;
+
+    /**
+     * @description 数据交换机
+     * @author LiuChangLan
+     * @since 2020/11/18 16:39
+     */
+    @Bean
+    DirectExchange dataExchange(){
+        log.info("[rabbitMQ]创建数据交换机");
+        return new DirectExchange(dataExchangeName,true,false);
+    }
+
+
+    /**
+     * @description 死信队列交换机
+     * @author LiuChangLan
+     * @since 2021/3/8 19:22
+     */
+    @Bean
+    DirectExchange dlxDataExchange(){
+        log.info("[rabbitMQ]创建死信交换机");
+        return new DirectExchange(dlxDataExchangeName,true,false);
+    }
+}

+ 126 - 0
src/main/java/com/gz/config/rabbitmq/RabbitMQQueueConfig.java

@@ -0,0 +1,126 @@
+package com.gz.config.rabbitmq;
+
+import com.gz.common.DataGlobalVariable;
+import org.springframework.amqp.core.Binding;
+import org.springframework.amqp.core.BindingBuilder;
+import org.springframework.amqp.core.DirectExchange;
+import org.springframework.amqp.core.Queue;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Rabbitmq队列配置
+ *
+ * @author LiuchangLan
+ * @date 2021/3/8 19:27
+ */
+@Slf4j
+@Configuration
+public class RabbitMQQueueConfig {
+
+    @Value("${rabbitmq.ocr.queue}")
+    private String ocrQueueName;
+
+    @Value("${rabbitmq.ocr.queue-binding-key}")
+    private String ocrBindingKey;
+
+
+    @Value("${rabbitmq.ocr.dlx-queue}")
+    private String dlxOcrQueueName;
+
+    @Value("${rabbitmq.ocr.dlx-queue-binding-key}")
+    private String dlxOcrBindingKey;
+
+    @Value("${rabbitmq.ocr.queue-message-ttl}")
+    private String dlxQueueMessageTTL;
+
+    @Resource
+    private DirectExchange dataExchange;
+
+    @Resource
+    private DirectExchange dlxDataExchange;
+
+    /**
+     * @description ocr识别队列
+     * @author LiuChangLan
+     * @since 2021/3/8 19:43
+     */
+    @Bean
+    public Queue ocrQueue() {
+        log.info("[rabbitMQ]创建ocr队列");
+        Map<String, Object> arguments = null;
+        if ("-1".equals(dlxQueueMessageTTL)){
+            arguments = this.buildQueueDLXArguments(dlxDataExchange.getName(),dlxOcrBindingKey);
+        }else {
+            arguments = this.buildQueueDLXArguments(dlxDataExchange.getName(), dlxOcrBindingKey, Integer.valueOf(dlxQueueMessageTTL) * 1000L);
+        }
+        return new Queue(ocrQueueName, true, false, false, arguments);
+    }
+
+    /**
+     * @description ocr死信队列
+     * @author LiuChangLan
+     * @since 2021/3/8 19:44
+     */
+    @Bean
+    public Queue dlxOcrQueue() {
+        log.info("[rabbitMQ]创建ocr死信队列");
+        return new Queue(dlxOcrQueueName, true, false, false);
+    }
+
+    /**
+     * @description 绑定ocr识别队列
+     * @author LiuChangLan
+     * @since 2021/3/8 19:44
+     */
+    @Bean
+    public Binding bindOcrQueueBinding() {
+        log.info("[rabbitMQ]绑定ocr队列到交换机");
+        return BindingBuilder.bind(ocrQueue()).to(dataExchange).with(ocrBindingKey);
+    }
+
+
+    /**
+     * @description 绑定死信队列
+     * @author LiuChangLan
+     * @since 2021/3/8 19:44
+     */
+    @Bean
+    public Binding bindDlxOcrQueueBinding() {
+        log.info("[rabbitMQ]绑定ocr死信队列到交换机");
+        return BindingBuilder.bind(dlxOcrQueue()).to(dlxDataExchange).with(dlxOcrBindingKey);
+    }
+
+
+    /**
+     * 构造 queue并指定死信交换机和routingKey
+     *
+     * @author WangJixin
+     * @since 2019/11/28 18:31
+     */
+    private Map<String, Object> buildQueueDLXArguments(String dlxName, String dlRoutingKey) {
+        return buildQueueDLXArguments(dlxName, dlRoutingKey, null);
+    }
+
+    /**
+     * 构造 queue并指定死信交换机和routingKey
+     *
+     * @author WangJixin
+     * @since 2019/11/28 18:31
+     */
+    private Map<String, Object> buildQueueDLXArguments(String dlxName, String dlRoutingKey, Long ttl) {
+        Map<String, Object> arguments = new HashMap<>(3);
+        arguments.put(DataGlobalVariable.MQ_X_DEAD_LETTER_EXCHANGE_KEY, dlxName);
+        arguments.put(DataGlobalVariable.MQ_X_DEAD_LETTER_ROUTING_KEY, dlRoutingKey);
+        if (ttl != null) {
+            arguments.put(DataGlobalVariable.MQ_X_MESSAGE_TTL, ttl);
+        }
+        return arguments;
+    }
+}

+ 35 - 0
src/main/java/com/gz/consumer/OcrConsumer.java

@@ -0,0 +1,35 @@
+package com.gz.consumer;
+
+import com.rabbitmq.client.Channel;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.rabbit.annotation.RabbitHandler;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.amqp.support.AmqpHeaders;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+
+/**
+ * 消费者监听
+ * @author LiuchangLan
+ * @date 2021/3/9 9:37
+ */
+//@Component
+@Slf4j
+@RabbitListener(queues = "${rabbitmq.ocr.queue}")
+public class OcrConsumer {
+
+    @RabbitHandler
+    public void process(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException {
+        try {
+            System.out.println(message);
+            // 确认消费
+            channel.basicAck(tag, false);
+        } catch (Exception e) {
+            e.printStackTrace();
+            // 拒绝消费
+            channel.basicReject(tag, false);
+        }
+    }
+}

+ 18 - 0
src/main/java/com/gz/controller/archive/ArchiveController.java

@@ -5,11 +5,14 @@ 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.GenerateDhVO;
 import com.gz.vo.archive.InsertArchiveVO;
 import com.gz.vo.archive.SearchArchiveVO;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import java.io.IOException;
 import java.util.List;
 
 /**
@@ -53,4 +56,19 @@ public class ArchiveController {
     ArchiveDTO selectByPrimaryKey(Integer id) {
         return service.selectByPrimaryKey(id);
     }
+
+    @GetMapping("getJH")
+    Integer getJH(String code){
+        return service.getJH(code);
+    }
+
+    @PostMapping("generateDh")
+    String generateDh(@RequestBody GenerateDhVO generateDhVO){
+        return service.generateDh(generateDhVO);
+    }
+
+    @PostMapping("import")
+    Integer importExcel(@RequestBody MultipartFile file) throws IOException {
+        return service.importExcel(file);
+    }
 }

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

@@ -25,8 +25,8 @@ public class ArchiveFileController {
     private ArchiveFileService archiveFileService;
 
     @PostMapping("upload")
-    public ArchiveFileDTO upload(@RequestBody MultipartFile file, Integer archiveId) throws IOException, BusinessException {
-        return archiveFileService.upload(file, archiveId);
+    public ArchiveFileDTO upload(@RequestBody MultipartFile file, Integer archiveId, Integer fileType, Integer secondaryArchiveId) throws IOException, BusinessException {
+        return archiveFileService.upload(file, archiveId, fileType,secondaryArchiveId);
     }
 
     @DeleteMapping("delete")

+ 86 - 0
src/main/java/com/gz/controller/archive/SecondaryArchiveController.java

@@ -0,0 +1,86 @@
+package com.gz.controller.archive;
+
+import com.github.pagehelper.PageInfo;
+import com.gz.dto.archive.ArchiveDTO;
+import com.gz.dto.archive.SecondaryArchiveDTO;
+import com.gz.service.archive.SecondaryArchiveService;
+import com.gz.vo.PageVO;
+import com.gz.vo.archive.SecondaryArchiveVO;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author LiuchangLan
+ * @date 2021/3/2 18:34
+ */
+@RestController
+@RequestMapping("secondary/archive")
+public class SecondaryArchiveController {
+
+    @Resource
+    private SecondaryArchiveService service;
+
+    /**
+     * @description 增
+     * @author LiuChangLan
+     * @since 2020/9/4 14:46
+     */
+    @PostMapping("insert")
+    Integer insert(@RequestBody SecondaryArchiveDTO dto) throws Exception{
+        return service.insert(dto);
+    }
+
+    /**
+     * @description 删
+     * @author LiuChangLan
+     * @since 2020/9/4 14:46
+     */
+    @DeleteMapping("delete")
+    Integer delete(Integer id){
+        return service.delete(id);
+    }
+
+    /**
+     * @description 改
+     * @author LiuChangLan
+     * @since 2020/9/4 14:46
+     */
+    @PostMapping("update")
+    Integer update(@RequestBody SecondaryArchiveDTO dto){
+        return service.update(dto);
+    }
+
+    /**
+     * @description 分页查询
+     * @author LiuChangLan
+     * @since 2020/9/4 14:46
+     */
+    @GetMapping("selectByPage")
+    PageInfo<SecondaryArchiveDTO> selectByPage(SecondaryArchiveVO vo){
+        return service.selectByPage(vo);
+    }
+
+
+    /**
+     * @description 根据主键查询
+     * @author LiuChangLan
+     * @since 2021/3/2 19:24
+     */
+    @GetMapping("selectByPrimaryKey")
+    SecondaryArchiveDTO selectByPrimaryKey(Integer id) {
+        return service.selectByPrimaryKey(id);
+    }
+
+
+    /**
+     * @description 根据文档id查询卷内目录
+     * @author LiuChangLan
+     * @since 2021/3/9 15:35
+     */
+    @GetMapping("selectByArchiveId")
+    List<SecondaryArchiveDTO> selectByArchiveId(Integer archiveId){
+        return service.selectByArchiveId(archiveId);
+    }
+}

+ 8 - 2
src/main/java/com/gz/controller/borrow/ArchiveBorrowController.java

@@ -8,6 +8,7 @@ import com.gz.rvo.borrow.AuditInfoRVO;
 import com.gz.service.archive.ArchiveService;
 import com.gz.service.borrow.ArchiveBorrowService;
 import com.gz.vo.PageVO;
+import com.gz.vo.borrow.SearchBorrowVO;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
@@ -38,12 +39,12 @@ public class ArchiveBorrowController {
     }
 
     @GetMapping("selectCurrAdminArchiveBorrowHistory")
-    PageInfo<ArchiveBorrowHistoryRVO> selectCurrAdminArchiveBorrowHistory(PageVO vo){
+    PageInfo<ArchiveBorrowHistoryRVO> selectCurrAdminArchiveBorrowHistory(SearchBorrowVO vo){
         return service.selectCurrAdminArchiveBorrowHistory(vo);
     }
 
     @GetMapping("selectArchiveBorrowHistory")
-    PageInfo<ArchiveBorrowHistoryRVO> selectArchiveBorrowHistory(PageVO vo){
+    PageInfo<ArchiveBorrowHistoryRVO> selectArchiveBorrowHistory(SearchBorrowVO vo){
         return service.selectArchiveBorrowHistory(vo);
     }
 
@@ -66,4 +67,9 @@ public class ArchiveBorrowController {
     void returnBorrow(Integer id){
         service.returnBorrow(id);
     }
+
+    @GetMapping("selectByPrimaryKey")
+    ArchiveBorrowDTO selectByPrimaryKey(Integer id){
+        return service.selectByPrimaryKey(id);
+    }
 }

+ 41 - 0
src/main/java/com/gz/controller/statistics/SelectStatisticsController.java

@@ -0,0 +1,41 @@
+package com.gz.controller.statistics;
+
+import cn.hutool.core.lang.tree.Tree;
+import com.gz.rvo.statistics.ArchiveStatisticsRVO;
+import com.gz.rvo.statistics.ArchiveYearStatisticsRVO;
+import com.gz.rvo.statistics.BorrowStatisticsRVO;
+import com.gz.service.statistics.SelectStatisticsService;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 查询统计
+ * @author LiuchangLan
+ * @date 2021/3/8 14:59
+ */
+@RestController
+@RequestMapping("statistics")
+public class SelectStatisticsController {
+
+    @Resource
+    private SelectStatisticsService service;
+
+    @GetMapping("selectStatisticsByType")
+    List<ArchiveStatisticsRVO> selectStatisticsByType(){
+        return service.selectStatisticsByType();
+    }
+
+    @GetMapping("selectArchiveYearStatistics")
+    public List<ArchiveYearStatisticsRVO> selectArchiveYearStatistics() {
+        return service.selectArchiveYearStatistics();
+    }
+
+    @GetMapping("selectBorrowStatistics")
+    List<BorrowStatisticsRVO> selectBorrowStatistics(){
+        return service.selectBorrowStatistics();
+    }
+}

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

@@ -8,6 +8,7 @@ import com.gz.vo.system.AdminVO;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.util.List;
 
 /**
  * @author LiuchangLan
@@ -83,6 +84,11 @@ public class AdminController {
         return adminService.resetPassword(id);
     }
 
+    @GetMapping("selectAll")
+    List<AdminDTO> selectAll(){
+        return adminService.selectAll();
+    }
+
 
 
 }

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

@@ -70,4 +70,14 @@ public class ArchivesTreeController {
     List<ArchivesTreeDTO> selectChildById(Integer id){
         return service.selectChildById(id);
     }
+
+    @GetMapping("selectParentByCode")
+    ArchivesTreeDTO selectParentByCode(String code){
+        return service.selectParentByCode(code);
+    }
+
+    @GetMapping("selectArchiveRole")
+    List<Tree<String>> selectArchiveRole(Integer roleId){
+        return service.selectArchiveRole(roleId);
+    }
 }

+ 40 - 0
src/main/java/com/gz/controller/system/DeptController.java

@@ -0,0 +1,40 @@
+package com.gz.controller.system;
+
+import com.gz.dto.system.DeptDTO;
+import com.gz.service.system.DeptService;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author LiuchangLan
+ * @date 2021/3/9 16:21
+ */
+@RequestMapping("system/dept")
+@RestController
+public class DeptController {
+
+    @Resource
+    private DeptService deptService;
+
+    @PostMapping("insert")
+    Integer insert(@RequestBody DeptDTO dto) {
+        return deptService.insert(dto);
+    }
+
+    @DeleteMapping("delete")
+    Integer delete(Integer id) {
+        return deptService.delete(id);
+    }
+
+    @PostMapping("update")
+    Integer update(DeptDTO dto) {
+        return deptService.update(dto);
+    }
+
+    @GetMapping("selectAll")
+    List<DeptDTO> selectAll() {
+        return deptService.selectAll();
+    }
+}

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

@@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author LiuchangLan
@@ -110,4 +111,9 @@ public class DictController {
     List<DictDTO> selectDictByCode(String code){
         return dictService.selectDictByCode(code);
     }
+
+    @GetMapping("selectMiJiRole")
+    List<Map> selectMiJiRole(Integer roleId){
+        return dictService.selectMiJiRole(roleId);
+    }
 }

+ 52 - 0
src/main/java/com/gz/controller/welcome/AdminStatisticsController.java

@@ -0,0 +1,52 @@
+package com.gz.controller.welcome;
+
+import com.alibaba.fastjson.JSONObject;
+import com.gz.rvo.welcome.BorrowCountRVO;
+import com.gz.rvo.welcome.BorrowRecordRVO;
+import com.gz.service.welcome.StatisticsService;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 首页统计控制器
+ * @author LiuchangLan
+ * @date 2021/3/2 9:24
+ */
+@RestController
+@RequestMapping("welcome/statistics")
+public class AdminStatisticsController {
+
+    @Resource
+    private StatisticsService service;
+
+    @GetMapping("selectWaitHandleRecord")
+    List<BorrowRecordRVO> selectWaitHandleRecord(){
+        return service.selectWaitHandleRecord();
+    }
+
+    @GetMapping("selectWaitReturnRecord")
+    List<BorrowRecordRVO> selectWaitReturnRecord(){
+        return service.selectWaitReturnRecord();
+    }
+
+    @GetMapping("selectArchiveByType")
+    JSONObject selectArchiveByType(){
+        return service.selectArchiveByType();
+    }
+
+    @GetMapping("selectArchiveByYear")
+    JSONObject selectArchiveByYear(){
+        return service.selectArchiveByYear();
+    }
+
+    @GetMapping("selectBorrowCountByDate")
+    Map selectBorrowCountByDate(){
+        return service.selectBorrowCountByDate();
+    }
+
+}

+ 17 - 0
src/main/java/com/gz/controller/welcome/UserStatisticsController.java

@@ -0,0 +1,17 @@
+package com.gz.controller.welcome;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 首页统计控制器
+ * @author LiuchangLan
+ * @date 2021/3/2 9:24
+ */
+@RestController
+@RequestMapping("welcome/statistics")
+public class UserStatisticsController {
+
+
+
+}

+ 58 - 0
src/main/java/com/gz/core/UUIDBaseDTO.java

@@ -0,0 +1,58 @@
+package com.gz.core;
+
+import cn.hutool.core.date.DateUtil;
+import com.gz.utils.JwtUtils;
+import com.gz.utils.UUIdGenId;
+import lombok.Data;
+import tk.mybatis.mapper.annotation.KeySql;
+import tk.mybatis.mapper.annotation.LogicDelete;
+
+import javax.annotation.sql.DataSourceDefinitions;
+import javax.persistence.Column;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author LiuchangLan
+ * @date 2021/3/9 16:07
+ */
+@Data
+public class UUIDBaseDTO {
+
+    /**
+     * 主键id
+     */
+    @Id
+    @KeySql(genId = UUIdGenId.class)
+    private String id;
+    /**
+     * 创建时间
+     */
+    @Column(name = "create_time")
+    private String createTime;
+    /**
+     * 修改时间
+     */
+    @Column(name = "update_time")
+    private String updateTime;
+    /**
+     * 创建人
+     */
+    @Column(name = "created")
+    private Integer created;
+    /**
+     * 修改人
+     */
+    @Column(name = "updated")
+    private Integer updated;
+
+    /**
+     * @description 逻辑删除
+     * @author LiuChangLan
+     * @since 2021/2/23 14:49
+     */
+    @Column(name = "deleted")
+    @LogicDelete(notDeletedValue = 0,isDeletedValue = 1)
+    private Integer deleted;
+
+}

+ 39 - 0
src/main/java/com/gz/dto/archive/SecondaryArchiveDTO.java

@@ -0,0 +1,39 @@
+package com.gz.dto.archive;
+
+import com.gz.core.BaseDTO;
+import lombok.Data;
+
+import javax.persistence.Table;
+
+/**
+ * 文档二级目录DTO
+ * @author LiuchangLan
+ * @date 2021/3/2 18:28
+ */
+@Data
+@Table(name = "tab_secondary_archive")
+public class SecondaryArchiveDTO extends BaseDTO {
+    // 文档id
+    private Integer archiveId;
+
+    // 顺序号
+    private Integer sxh;
+
+    // 题名
+    private String tm;
+
+    // 文号
+    private String wh;
+
+    // 页号
+    private Integer yh;
+
+    // 备注
+    private String bz;
+
+    // 责任者
+    private String zrz;
+
+    // 日期
+    private String rq;
+}

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

@@ -45,5 +45,4 @@ public class ArchiveBorrowDTO extends BaseDTO {
 
     // 归还状态
     private Integer returnStatus;
-
 }

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

@@ -11,6 +11,9 @@ public class ArchiveFileDTO extends BaseDTO {
 
     private Integer archiveId;
 
+    // 卷内目录id
+    private Integer secondaryArchiveId;
+
     // 文件名
     private String fileName;
 
@@ -20,6 +23,9 @@ public class ArchiveFileDTO extends BaseDTO {
     // 文件大小
     private Long fileSize;
 
+    // 0文件 1附件
+    private Integer fileType;
+
     // 下载路径
     private String filePath;
 

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

@@ -0,0 +1,26 @@
+package com.gz.dto.system;
+
+import com.gz.core.UUIDBaseDTO;
+import lombok.Data;
+import tk.mybatis.mapper.annotation.LogicDelete;
+
+import javax.persistence.Column;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * 部门dto * @author LiuchangLan
+ * @date 2021/3/9 16:07
+ */
+@Data
+@Table(name = "tab_dept")
+public class DeptDTO extends UUIDBaseDTO {
+
+    // 部门名称
+    private String deptName;
+    // 父级id
+    private String parentId;
+    // 部门排序
+    private Integer deptOrder;
+}

+ 2 - 0
src/main/java/com/gz/dto/system/MenuRoleDTO.java

@@ -22,4 +22,6 @@ public class MenuRoleDTO {
     private Integer roleId;
     // 菜单表id
     private Integer menuId;
+    // 权限类型
+    private Integer roleType;
 }

+ 0 - 1
src/main/java/com/gz/dto/system/RoleDTO.java

@@ -15,7 +15,6 @@ import javax.persistence.Table;
 public class RoleDTO extends BaseDTO {
     // 权限名称
     private String roleName;
-
     // 备注
     private String remark;
 }

+ 9 - 1
src/main/java/com/gz/mapper/archive/ArchiveMapper.java

@@ -4,6 +4,7 @@ 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.Param;
 import org.apache.ibatis.annotations.Select;
 import tk.mybatis.mapper.common.Mapper;
 
@@ -26,5 +27,12 @@ public interface ArchiveMapper extends Mapper<ArchiveDTO> {
     @Select("SELECT auto_increment FROM information_schema.tables where table_schema=\"guihua_archives\" and table_name=\"tab_archives\";")
     Integer selectCurrAutoIncrement();
 
-    List<ArchiveBorrowListRVO> selectBorrowList();
+    List<ArchiveBorrowListRVO> selectBorrowList(@Param("roleId") Integer roleId);
+
+    Integer selectMaxJH(String mlCode);
+
+
+    List<ArchiveDTO> selectRoleAll(Integer roleId);
+
+    ArchiveDTO selectByRolePrimaryKey(Integer RoleId, Object id);
 }

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

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

+ 2 - 1
src/main/java/com/gz/mapper/borrow/ArchiveBorrowMapper.java

@@ -3,6 +3,7 @@ package com.gz.mapper.borrow;
 import com.gz.dto.borrow.ArchiveBorrowDTO;
 import com.gz.rvo.borrow.ArchiveBorrowHistoryRVO;
 import com.gz.rvo.borrow.AuditInfoRVO;
+import com.gz.vo.borrow.SearchBorrowVO;
 import org.apache.ibatis.annotations.Param;
 import tk.mybatis.mapper.common.Mapper;
 
@@ -14,7 +15,7 @@ import java.util.List;
  */
 public interface ArchiveBorrowMapper extends Mapper<ArchiveBorrowDTO> {
 
-    List<ArchiveBorrowHistoryRVO> selectArchiveBorrowHistory(@Param("adminId") Integer adminId);
+    List<ArchiveBorrowHistoryRVO> selectArchiveBorrowHistory(SearchBorrowVO vo);
 
     AuditInfoRVO selectBorrowInfo(Integer id);
 }

File diff suppressed because it is too large
+ 21 - 0
src/main/java/com/gz/mapper/statistics/SelectStatisticsMapper.java


+ 11 - 0
src/main/java/com/gz/mapper/system/DeptMapper.java

@@ -0,0 +1,11 @@
+package com.gz.mapper.system;
+
+import com.gz.dto.system.DeptDTO;
+import tk.mybatis.mapper.common.Mapper;
+
+/**
+ * @author LiuchangLan
+ * @date 2021/3/9 16:14
+ */
+public interface DeptMapper extends Mapper<DeptDTO> {
+}

+ 4 - 1
src/main/java/com/gz/mapper/system/MenuRoleMapper.java

@@ -1,6 +1,8 @@
 package com.gz.mapper.system;
 
 import com.gz.dto.system.MenuRoleDTO;
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Select;
 import tk.mybatis.mapper.common.Mapper;
 
 /**
@@ -9,5 +11,6 @@ import tk.mybatis.mapper.common.Mapper;
  * @date 2020/9/4 11:57
  */
 public interface MenuRoleMapper extends Mapper<MenuRoleDTO> {
-
+    @Delete("delete from tab_menu_role where role_id = #{roleId}")
+    Integer deleteByRoleId(Integer roleId);
 }

+ 74 - 0
src/main/java/com/gz/mapper/welcome/StatisticsMapper.java

@@ -0,0 +1,74 @@
+package com.gz.mapper.welcome;
+
+import com.gz.rvo.borrow.ArchiveBorrowHistoryRVO;
+import com.gz.rvo.welcome.ArchiveCountRVO;
+import com.gz.rvo.welcome.BorrowRecordRVO;
+
+import java.util.List;
+
+public interface StatisticsMapper {
+
+    /**
+     * @description 查询所有待处理记录
+     * @author LiuChangLan
+     * @since 2021/3/2 11:49
+     */
+    List<BorrowRecordRVO> selectWaitHandleRecord();
+
+    /**
+     * @description 查询所有待归还记录
+     * @author LiuChangLan
+     * @since 2021/3/2 11:49
+     */
+    List<BorrowRecordRVO> selectWaitReturnRecord();
+
+    /**
+     * @description 根据门类统计数量
+     * @author LiuChangLan
+     * @since 2021/3/2 11:50
+     */
+    List<ArchiveCountRVO> selectArchiveByMl();
+
+    /**
+     * @description 根据归档年度统计数量
+     * @author LiuChangLan
+     * @since 2021/3/2 11:50
+     */
+    List<ArchiveCountRVO> selectArchiveByYear();
+
+    /**
+     * @description 查询我的到期未归还记录
+     * @author LiuChangLan
+     * @since 2021/3/2 11:50
+     */
+    List<BorrowRecordRVO> selectMyWaitReturnRecord(Integer userId);
+
+    /**
+     * @description 查询我的三天内到期的记录
+     * @author LiuChangLan
+     * @since 2021/3/2 11:50
+     */
+    List<BorrowRecordRVO> selectMyDueSoonRecord(Integer userId);
+
+    /**
+     * @description 查询借阅历史数量
+     * @author LiuChangLan
+     * @since 2021/3/2 12:50
+     */
+    Integer selectMyHistoryBorrowCount(Integer userId);
+
+    /**
+     * @description 申请未处理数量
+     * @author LiuChangLan
+     * @since 2021/3/2 12:51
+     */
+    Integer selectRuditNotHandleCount(Integer userId);
+
+
+    /**
+     * @description 查询近一年的借阅记录
+     * @author LiuChangLan
+     * @since 2021/3/5 13:14
+     */
+    List<ArchiveBorrowHistoryRVO> selectBorrowCountByDate();
+}

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

@@ -14,6 +14,8 @@ public class ArchiveBorrowHistoryRVO extends BaseDTO {
     private String dh;
     // 提名
     private String tm;
+    // 门类
+    private String ml;
     // 借阅时间
     private String createTime;
     // 预计归还时间
@@ -30,4 +32,6 @@ public class ArchiveBorrowHistoryRVO extends BaseDTO {
     private Integer auditStatus;
     // 借阅人
     private String adminName;
+    // 档案类型
+    private String code;
 }

+ 17 - 0
src/main/java/com/gz/rvo/statistics/ArchiveStatisticsRVO.java

@@ -0,0 +1,17 @@
+package com.gz.rvo.statistics;
+
+import lombok.Data;
+
+/**
+ * @author LiuchangLan
+ * @date 2021/3/8 15:18
+ */
+@Data
+public class ArchiveStatisticsRVO {
+    private String title;
+    private String code;
+    private Integer archiveCount;
+    private Integer fileCount;
+    private Integer id;
+    private Integer parentId;
+}

+ 14 - 0
src/main/java/com/gz/rvo/statistics/ArchiveYearStatisticsRVO.java

@@ -0,0 +1,14 @@
+package com.gz.rvo.statistics;
+
+import lombok.Data;
+
+/**
+ * @author LiuchangLan
+ * @date 2021/3/8 16:16
+ */
+@Data
+public class ArchiveYearStatisticsRVO {
+    private String gdnd;
+    private Integer archiveCount;
+    private Integer fileCount;
+}

+ 18 - 0
src/main/java/com/gz/rvo/statistics/BorrowStatisticsRVO.java

@@ -0,0 +1,18 @@
+package com.gz.rvo.statistics;
+
+import lombok.Data;
+
+/**
+ * @author LiuchangLan
+ * @date 2021/3/8 16:33
+ */
+@Data
+public class BorrowStatisticsRVO {
+    private String dh;
+    private String tm;
+    private String createTime;
+    private String returnTime;
+    private String estimateReturnTime;
+    private String ml;
+    private String borrowCount;
+}

+ 21 - 0
src/main/java/com/gz/rvo/welcome/ArchiveCountRVO.java

@@ -0,0 +1,21 @@
+package com.gz.rvo.welcome;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 统计数量RVO
+ * @author LiuchangLan
+ * @date 2021/3/2 10:41
+ */
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class ArchiveCountRVO {
+    // 标题
+    private String title;
+    // 数量
+    private Integer count;
+
+}

+ 15 - 0
src/main/java/com/gz/rvo/welcome/BorrowCountRVO.java

@@ -0,0 +1,15 @@
+package com.gz.rvo.welcome;
+
+import lombok.Data;
+
+/**
+ * 借阅数量RVO
+ * @author LiuchangLan
+ * @date 2021/3/2 10:42
+ */
+@Data
+public class BorrowCountRVO {
+
+
+
+}

+ 22 - 0
src/main/java/com/gz/rvo/welcome/BorrowRecordRVO.java

@@ -0,0 +1,22 @@
+package com.gz.rvo.welcome;
+
+import lombok.Data;
+
+/**
+ * 统计页面借阅记录RVO
+ * @author LiuchangLan
+ * @date 2021/3/2 10:37
+ */
+@Data
+public class BorrowRecordRVO {
+    // 题名
+    private String tm;
+    // 档号
+    private String dh;
+    // 申请人
+    private String adminName;
+    // 申请时间
+    private String createTime;
+    // 归还时间
+    private String estimateReturnTime;
+}

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

@@ -16,7 +16,7 @@ public interface ArchiveFileService {
      * @since 2020/9/9 11:25
      * @return
      */
-    ArchiveFileDTO upload(MultipartFile files,Integer archiveId) throws BusinessException, IOException;
+    ArchiveFileDTO upload(MultipartFile files,Integer archiveId, Integer fileType,Integer secondaryArchiveId) throws BusinessException, IOException;
 
     /**
      * @description 删除附件

+ 26 - 0
src/main/java/com/gz/service/archive/ArchiveService.java

@@ -5,9 +5,12 @@ 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.GenerateDhVO;
 import com.gz.vo.archive.InsertArchiveVO;
 import com.gz.vo.archive.SearchArchiveVO;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.util.List;
 
 public interface ArchiveService {
@@ -61,4 +64,27 @@ public interface ArchiveService {
      * @return
      */
     PageInfo<ArchiveBorrowListRVO> selectBorrowList(PageVO vo);
+
+    /**
+     * @description 获取当前门类的最大件号
+     * @author LiuChangLan
+     * @since 2021/3/1 15:28
+     */
+    Integer getJH(String mlCode);
+
+    /**
+     * @description 生成档号
+     * @author LiuChangLan
+     * @since 2021/3/1 15:55
+     */
+    String generateDh(GenerateDhVO generateDhVO);
+
+    /**
+     * @description 导入Excel
+     * @author LiuChangLan
+     * @since 2021/3/4 14:44
+     */
+    Integer importExcel(MultipartFile file) throws IOException;
+
+
 }

+ 55 - 0
src/main/java/com/gz/service/archive/SecondaryArchiveService.java

@@ -0,0 +1,55 @@
+package com.gz.service.archive;
+
+import com.github.pagehelper.PageInfo;
+import com.gz.dto.archive.ArchiveDTO;
+import com.gz.dto.archive.SecondaryArchiveDTO;
+import com.gz.vo.PageVO;
+import com.gz.vo.archive.SecondaryArchiveVO;
+import com.sun.javafx.image.IntPixelGetter;
+
+import java.util.List;
+
+public interface SecondaryArchiveService {
+    /**
+     * @description 增
+     * @author LiuChangLan
+     * @since 2020/9/4 14:46
+     */
+    Integer insert(SecondaryArchiveDTO dto) throws Exception;
+
+    /**
+     * @description 删
+     * @author LiuChangLan
+     * @since 2020/9/4 14:46
+     */
+    Integer delete(Integer id);
+
+    /**
+     * @description 改
+     * @author LiuChangLan
+     * @since 2020/9/4 14:46
+     */
+    Integer update(SecondaryArchiveDTO dto);
+
+    /**
+     * @description 分页查询
+     * @author LiuChangLan
+     * @since 2020/9/4 14:46
+     */
+    PageInfo<SecondaryArchiveDTO> selectByPage(SecondaryArchiveVO vo);
+
+    /**
+     * @description 根据主键查询
+     * @author LiuChangLan
+     * @since 2020/9/4 16:36
+     */
+    SecondaryArchiveDTO selectByPrimaryKey(Integer id);
+
+    /**
+     * @description 根据档案id查询卷内目录
+     * @author LiuChangLan
+     * @since 2021/3/9 15:32
+     */
+    List<SecondaryArchiveDTO> selectByArchiveId(Integer archiveId);
+
+}

+ 56 - 19
src/main/java/com/gz/service/archive/impl/ArchiveFileServiceImpl.java

@@ -1,6 +1,8 @@
 package com.gz.service.archive.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.IdUtil;
+import com.alibaba.fastjson.JSON;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.gz.config.FileUploadConfig;
@@ -13,9 +15,15 @@ import com.gz.mapper.archive.ArchiveMapper;
 import com.gz.service.archive.ArchiveFileService;
 import com.gz.utils.JwtUtils;
 import com.gz.vo.archive.SearchArchiveFileVO;
+import com.gz.vo.rabbitmq.OcrEtlVO;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
+import sun.text.resources.cldr.yav.FormatData_yav;
 
 import javax.annotation.Resource;
 import java.io.File;
@@ -34,38 +42,59 @@ public class ArchiveFileServiceImpl implements ArchiveFileService {
     @Resource
     private ArchiveMapper archiveMapper;
 
+    @Autowired
+    private RabbitTemplate rabbitTemplate;
 
-    @Override
-    public ArchiveFileDTO upload(MultipartFile file, Integer archiveId) throws BusinessException, IOException {
+    @Value("${rabbitmq.data-exchange}")
+    private String dataExchangeName;
+
+    @Value("${rabbitmq.ocr.queue-binding-key}")
+    private String ocrBindingKey;
+
+    @Value("${upload-file.server-file-url-prefix}")
+    private String serverFileUrlPrefix;
 
+
+    @Override
+    public ArchiveFileDTO upload(MultipartFile file, Integer archiveId, Integer fileType,Integer secondaryArchiveId) 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();
+        String fileFormat = 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);
+        if (fileType == 0) {
+            // 文档文件
+            switch (fileFormat) {
+                case "PDF":
+//                serverFileUploadPath = String.format(FileUploadConfig.ARCHIVE_UPLOAD_PATH_PDF_FOMAT, archiveDTO.getGdnd(), archiveDTO.getQzh(), archiveDTO.getBgqx(), archiveDTO.getGdnd(), fileFormat);
+                    serverFileUploadPath = "/" + archiveDTO.getQzh() + "/" + archiveDTO.getGdnd() + "/" + archiveDTO.getMl() + "/" + archiveDTO.getBgqx() + "/" + archiveDTO.getDh() + "/pdf";
+                    // pdf文件名为档号
+                    fn = String.format("%s.%s", archiveDTO.getDh(), fileFormat.toLowerCase());
+                    break;
+                case "TIF":
+                    // tif文件名为页码 无法通过后台生成 读取上传文件的名称
+                    fn = fileName;
+                    serverFileUploadPath = "/" + archiveDTO.getQzh() + "/" + archiveDTO.getGdnd() + "/" + archiveDTO.getMl() + "/" + archiveDTO.getBgqx() + "/" + archiveDTO.getDh() + "/tif";
+                    break;
+                default:
+                    // 其他文件直接抛错
+                    throw new BusinessException(CustomExceptionEnum.UPLOAD_ARCHIVE_FILE_TYPE_ERROR);
+            }
+        } else {
+            // 附件
+            serverFileUploadPath = "/" + archiveDTO.getQzh() + "/" + archiveDTO.getGdnd() + "/" + archiveDTO.getMl() + "/" + archiveDTO.getBgqx() + "/" + archiveDTO.getDh() + "/other";
+            fn = String.format("%s.%s", IdUtil.simpleUUID(), fileFormat.toLowerCase());
         }
+
+
         // 上传路径
         File serverFilePath = new File(FileUploadConfig.ARCHIVE_FILE_ROOT_DIRECTORY + serverFileUploadPath);
         // 判断上传路径是否存在
@@ -82,14 +111,22 @@ public class ArchiveFileServiceImpl implements ArchiveFileService {
         archiveFileDTO.setOriginalFileName(fileName);
         archiveFileDTO.setFileName(fn);
         archiveFileDTO.setFileSize(file.getSize());
+        archiveFileDTO.setFileType(fileType);
         archiveFileDTO.setFilePath(serverFileUploadPath);
         archiveFileDTO.setCreated(JwtUtils.getCurrentUserJwtPayload().getId());
         archiveFileMapper.insertSelective(archiveFileDTO);
 
-        return archiveFileDTO;
 
+        if (fileType == 0) {
+            ArchiveDTO d = archiveMapper.selectByPrimaryKey(archiveFileDTO.getArchiveId());
+            OcrEtlVO ocrEtlVO = BeanUtil.copyProperties(d, OcrEtlVO.class);
+            ocrEtlVO.setFileUrl(serverFileUrlPrefix + archiveFileDTO.getFilePath() + "/" + archiveFileDTO.getFileName());
+            rabbitTemplate.convertAndSend(dataExchangeName, ocrBindingKey, JSON.toJSONString(ocrEtlVO));
+        }
+        return archiveFileDTO;
     }
 
+
     @Override
     public Integer delete(Integer id) {
         ArchiveFileDTO archiveFileDTO = archiveFileMapper.selectByPrimaryKey(id);
@@ -98,7 +135,7 @@ public class ArchiveFileServiceImpl implements ArchiveFileService {
         // 删除该文件
         File file = new File(filePath);
         if (file.exists()) {
-            log.info("删除文件:{}",filePath);
+            log.info("删除文件:{}", filePath);
             file.delete();
         }
         return archiveFileMapper.deleteByPrimaryKey(id);

+ 126 - 13
src/main/java/com/gz/service/archive/impl/ArchiveServiceImpl.java

@@ -1,5 +1,10 @@
 package com.gz.service.archive.impl;
 
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.poi.excel.ExcelReader;
+import cn.hutool.poi.excel.ExcelUtil;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.gz.common.DataGlobalVariable;
@@ -12,15 +17,22 @@ 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.ExcelUtils;
 import com.gz.utils.JwtUtils;
 import com.gz.vo.PageVO;
+import com.gz.vo.archive.GenerateDhVO;
 import com.gz.vo.archive.InsertArchiveVO;
 import com.gz.vo.archive.SearchArchiveVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author LiuchangLan
@@ -36,10 +48,10 @@ public class ArchiveServiceImpl implements ArchiveService {
     @Resource
     private ArchivesTreeService archivesTreeService;
 
+
     @Override
     public Integer insert(InsertArchiveVO vo) throws Exception {
         vo.setCreated(JwtUtils.getCurrentUserJwtPayload().getId());
-        this.generateDh(vo);
         return mapper.insertSelective(vo);
     }
 
@@ -56,18 +68,33 @@ public class ArchiveServiceImpl implements ArchiveService {
 
     @Override
     public List<ArchiveDTO> selectAll() {
-        return mapper.selectAll();
+        return mapper.selectRoleAll(JwtUtils.getCurrentUserJwtPayload().getRoleId());
     }
 
     @Override
     public PageInfo<ArchiveRVO> selectByPage(SearchArchiveVO vo) {
         PageHelper.startPage(vo.getPageNum(), vo.getPageSize());
+        vo.setRoleId(JwtUtils.getCurrentUserJwtPayload().getRoleId());
+        Map<String, Object> params = vo.getParams();
+        String sql = "";
+        if (params != null) {
+            for (int i = 1; i <= params.keySet().size() / 3; i++) {
+                sql += "and " + params.get("field_" + i);
+                if ("like".equals(params.get("condition_" + i))) {
+                    sql += " like" + " '%" + params.get("variable_" + i) + "%'";
+                } else {
+                    sql += "" + params.get("condition_" + i) + " '" + params.get("variable_" + i) + "' ";
+                }
+            }
+        }
+        log.info(sql);
+        vo.setSql(sql);
         return new PageInfo<>(mapper.searchList(vo));
     }
 
     @Override
     public ArchiveDTO selectByPrimaryKey(Integer id) {
-        return mapper.selectByPrimaryKey(id);
+        return mapper.selectByRolePrimaryKey(JwtUtils.getCurrentUserJwtPayload().getRoleId(), id);
     }
 
     /**
@@ -83,37 +110,29 @@ public class ArchiveServiceImpl implements ArchiveService {
             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);
         }
@@ -122,7 +141,101 @@ public class ArchiveServiceImpl implements ArchiveService {
 
     @Override
     public PageInfo<ArchiveBorrowListRVO> selectBorrowList(PageVO vo) {
-        PageHelper.startPage(vo.getPageNum(),vo.getPageSize());
-        return new PageInfo<>(mapper.selectBorrowList());
+        PageHelper.startPage(vo.getPageNum(), vo.getPageSize());
+        return new PageInfo<>(mapper.selectBorrowList(JwtUtils.getCurrentUserJwtPayload().getRoleId()));
+    }
+
+    @Override
+    public Integer getJH(String mlCode) {
+        return mapper.selectMaxJH(mlCode);
+    }
+
+    @Override
+    public String generateDh(GenerateDhVO vo) {
+        String jh = String.format("%05d", vo.getJh());
+        vo.setMl(archivesTreeService.selectParentByCode(vo.getMl()).getCode());
+        switch (vo.getMl()) {
+            case "WS":
+                return String.format(DataGlobalVariable.WS_DH_FOMAT, vo.getQzh(), vo.getGdnd(), vo.getBgqx(), jh);
+            case "KU":
+                return String.format(DataGlobalVariable.KU_DH_FOMAT, vo.getQzh(), vo.getMlh(), vo.getGdnd(), vo.getHsdwdh(), vo.getBgqx(), jh);
+            case "KJ":
+                return String.format(DataGlobalVariable.KJ_DH_FOMAT, vo.getQzh(), vo.getMlh(), vo.getMl(), vo.getBgqx(), vo.getXmdh(), jh);
+            case "ZY":
+                return String.format(DataGlobalVariable.ZY_DH_FOMAT, vo.getQzh(), vo.getMlh(), vo.getMl(), vo.getBgqx(), jh);
+            case "YX":
+                // 段号
+                String dh = String.format("%02d", 0);
+                return String.format(DataGlobalVariable.YX_DH_FOMAT, vo.getQzh(), vo.getMlh(), vo.getMl(), vo.getBgqx(), jh, dh);
+            case "SJ":
+                return String.format(DataGlobalVariable.SJ_DH_FOMAT, vo.getQzh(), vo.getMlh(), vo.getBgqx(), jh);
+            case "SW":
+                return String.format(DataGlobalVariable.SW_DH_FOMAT, vo.getQzh(), vo.getMlh(), vo.getMl(), vo.getBgqx(), jh);
+            case "MT":
+                return String.format(DataGlobalVariable.MT_DH_FOMAT, vo.getQzh(), vo.getMlh(), vo.getBgqx(), jh);
+            default:
+                throw new BusinessException(CustomExceptionEnum.GENERATE_DH_ERROR);
+        }
+    }
+
+    @Override
+    @Transactional
+    public Integer importExcel(MultipartFile file) throws IOException {
+        InputStream inputStream = file.getInputStream();
+        Integer count = 0;
+        ExcelReader reader = ExcelUtil.getReader(inputStream, 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.setMl("WS");
+                dto.setDagdm(ExcelUtils.getExcelCellStringValue(row, 0));
+                dto.setDh(ExcelUtils.getExcelCellStringValue(row, 1));
+                dto.setQzh(ExcelUtils.getExcelCellStringValue(row, 2));
+                dto.setGdnd(ExcelUtils.getExcelCellStringValue(row, 3));
+                dto.setMj(ExcelUtils.getExcelCellStringValue(row, 4));
+                dto.setBgqx(ExcelUtils.getExcelCellStringValue(row, 5));
+                // TODO: 2021/2/25 机构代号 6 馆编号 7
+                dto.setZtsl(ExcelUtils.getExcelCellIntegerValue(row, 8));
+                dto.setWjbh(ExcelUtils.getExcelCellStringValue(row, 9));
+                DateTime wjxcsj = DateUtil.parse(ExcelUtils.getExcelCellStringValue(row, 10), "yyyyMMdd");
+                dto.setWjxcsj(DateUtil.formatDate(wjxcsj));
+                String wjdqsj = "";
+                switch (dto.getBgqx()) {
+                    case "005":
+                    case "D10":
+                        wjdqsj = DateUtil.formatDate(DateUtil.offset(wjxcsj, DateField.YEAR, 10));
+                        break;
+                    case "004":
+                    case "D30":
+                        wjdqsj = DateUtil.formatDate(DateUtil.offset(wjxcsj, DateField.YEAR, 30));
+                        break;
+                }
+                dto.setWjdqsj(wjdqsj);
+                dto.setZrz(ExcelUtils.getExcelCellStringValue(row, 11));
+                dto.setTm(ExcelUtils.getExcelCellStringValue(row, 12));
+                dto.setBz(ExcelUtils.getExcelCellStringValue(row, 13));
+                dto.setZbbm(ExcelUtils.getExcelCellStringValue(row, 14));
+                dto.setXbbm(ExcelUtils.getExcelCellStringValue(row, 15));
+                dto.setKzf(ExcelUtils.getExcelCellStringValue(row, 16));
+                dto.setDzwdh(ExcelUtils.getExcelCellStringValue(row, 17));
+                dto.setSwh(ExcelUtils.getExcelCellStringValue(row, 18));
+                dto.setGb(ExcelUtils.getExcelCellStringValue(row, 19));
+                dto.setWz(ExcelUtils.getExcelCellStringValue(row, 20));
+                dto.setZtgg(ExcelUtils.getExcelCellStringValue(row, 21));
+                dto.setZtlx(ExcelUtils.getExcelCellStringValue(row, 22));
+                dto.setZtdw(ExcelUtils.getExcelCellStringValue(row, 23));
+                dto.setZzjgdm(ExcelUtils.getExcelCellStringValue(row, 24));
+                dto.setFlh(ExcelUtils.getExcelCellStringValue(row, 25));
+                dto.setZtc(ExcelUtils.getExcelCellStringValue(row, 26));
+                dto.setQwbs(ExcelUtils.getExcelCellStringValue(row, 27));
+                count += mapper.insertSelective(dto);
+            } catch (Exception e) {
+                new BusinessException(500, String.format("导入出错,错误位置:{}行,错误原因{}", (i + 1), e.getMessage()));
+            }
+        }
+        log.info("成功添加{}行数据", count);
+        return count;
     }
 }

+ 62 - 0
src/main/java/com/gz/service/archive/impl/SecondaryArchiveServiceImpl.java

@@ -0,0 +1,62 @@
+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.dto.archive.SecondaryArchiveDTO;
+import com.gz.mapper.archive.SecondaryArchiveMapper;
+import com.gz.rvo.archive.ArchiveRVO;
+import com.gz.service.archive.SecondaryArchiveService;
+import com.gz.utils.JwtUtils;
+import com.gz.vo.PageVO;
+import com.gz.vo.archive.SecondaryArchiveVO;
+import org.apache.catalina.webresources.JarWarResource;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author LiuchangLan
+ * @date 2021/3/2 18:30
+ */
+@Service
+public class SecondaryArchiveServiceImpl implements SecondaryArchiveService {
+
+    @Resource
+    private SecondaryArchiveMapper secondaryArchiveMapper;
+    @Override
+    public Integer insert(SecondaryArchiveDTO dto) throws Exception {
+        dto.setCreated(JwtUtils.getCurrentUserJwtPayload().getId());
+        return secondaryArchiveMapper.insertSelective(dto);
+    }
+
+    @Override
+    public PageInfo<SecondaryArchiveDTO> selectByPage(SecondaryArchiveVO vo) {
+        PageHelper.startPage(vo.getPageNum(),vo.getPageSize());
+        SecondaryArchiveDTO secondaryArchiveDTO = BeanUtil.copyProperties(vo, SecondaryArchiveDTO.class);
+        return new PageInfo<>(secondaryArchiveMapper.select(secondaryArchiveDTO));
+    }
+
+    @Override
+    public Integer delete(Integer id) {
+        return secondaryArchiveMapper.deleteByPrimaryKey(id);
+    }
+
+    @Override
+    public Integer update(SecondaryArchiveDTO dto) {
+        return secondaryArchiveMapper.updateByPrimaryKeySelective(dto);
+    }
+
+    @Override
+    public SecondaryArchiveDTO selectByPrimaryKey(Integer id) {
+        return secondaryArchiveMapper.selectByPrimaryKey(id);
+    }
+
+    @Override
+    public List<SecondaryArchiveDTO> selectByArchiveId(Integer archiveId) {
+        SecondaryArchiveDTO param = new SecondaryArchiveDTO();
+        param.setArchiveId(archiveId);
+        return secondaryArchiveMapper.select(param);
+    }
+}

+ 4 - 2
src/main/java/com/gz/service/borrow/ArchiveBorrowService.java

@@ -10,6 +10,7 @@ import com.gz.rvo.borrow.AuditInfoRVO;
 import com.gz.vo.PageVO;
 import com.gz.vo.archive.InsertArchiveVO;
 import com.gz.vo.archive.SearchArchiveVO;
+import com.gz.vo.borrow.SearchBorrowVO;
 
 import java.util.List;
 
@@ -47,14 +48,14 @@ public interface ArchiveBorrowService {
      * @author LiuChangLan
      * @since 2021/2/27 16:32
      */
-    PageInfo<ArchiveBorrowHistoryRVO> selectCurrAdminArchiveBorrowHistory(PageVO vo);
+    PageInfo<ArchiveBorrowHistoryRVO> selectCurrAdminArchiveBorrowHistory(SearchBorrowVO vo);
 
     /**
      * @description 查询所有提交的审核列表
      * @author LiuChangLan
      * @since 2021/2/27 17:04
      */
-    PageInfo<ArchiveBorrowHistoryRVO> selectArchiveBorrowHistory(PageVO vo);
+    PageInfo<ArchiveBorrowHistoryRVO> selectArchiveBorrowHistory(SearchBorrowVO vo);
 
     /**
      * @description 审核
@@ -83,4 +84,5 @@ public interface ArchiveBorrowService {
      * @since 2021/2/28 20:07
      */
     void returnBorrow(Integer id);
+
 }

+ 16 - 8
src/main/java/com/gz/service/borrow/impl/ArchiveBorrowServiceImpl.java

@@ -14,6 +14,7 @@ import com.gz.service.archive.ArchiveService;
 import com.gz.service.borrow.ArchiveBorrowService;
 import com.gz.utils.JwtUtils;
 import com.gz.vo.PageVO;
+import com.gz.vo.borrow.SearchBorrowVO;
 import lombok.Data;
 import org.springframework.stereotype.Service;
 
@@ -45,6 +46,13 @@ public class ArchiveBorrowServiceImpl implements ArchiveBorrowService {
     public Integer borrow(ArchiveBorrowDTO dto) throws Exception {
         ArchiveBorrowDTO selectBorrowParam = new ArchiveBorrowDTO();
         selectBorrowParam.setArchiveId(dto.getArchiveId());
+        if (dto.getAdminId() != null){
+            // 用户选择了用户 借阅人就是选择的用户
+            dto.setAuditStatus(2);
+        }else {
+            // 未选择用户 默认当前登录用户
+            dto.setAdminId(JwtUtils.getCurrentUserJwtPayload().getId());
+        }
         // 原件借阅需要判断是否已经被借阅
         if (dto.getBorrowType().equals(1)) {
             // 该文档的所有借阅记录
@@ -57,7 +65,7 @@ public class ArchiveBorrowServiceImpl implements ArchiveBorrowService {
             }
         }
         // 查询当前用户 该文档的借阅记录
-        selectBorrowParam.setAdminId(JwtUtils.getCurrentUserJwtPayload().getId());
+        selectBorrowParam.setAdminId(dto.getAdminId());
         List<ArchiveBorrowDTO> currAdminborrowHistory = mapper.select(selectBorrowParam);
         for (ArchiveBorrowDTO archiveBorrowDTO : currAdminborrowHistory) {
             // 如果记录中包含该文档并且未审核完成 || 借阅未归 不给予借阅
@@ -66,22 +74,20 @@ public class ArchiveBorrowServiceImpl implements ArchiveBorrowService {
             }
         }
         dto.setReturnStatus(0);
-        // 插入借阅记录
-        dto.setAdminId(JwtUtils.getCurrentUserJwtPayload().getId());
         return this.insert(dto);
     }
 
     @Override
-    public PageInfo<ArchiveBorrowHistoryRVO> selectCurrAdminArchiveBorrowHistory(PageVO vo) {
-        Integer id = JwtUtils.getCurrentUserJwtPayload().getId();
+    public PageInfo<ArchiveBorrowHistoryRVO> selectCurrAdminArchiveBorrowHistory(SearchBorrowVO vo) {
+        vo.setAdminId(JwtUtils.getCurrentUserJwtPayload().getId());
         PageHelper.startPage(vo.getPageNum(), vo.getPageSize());
-        return new PageInfo<>(mapper.selectArchiveBorrowHistory(id));
+        return new PageInfo<>(mapper.selectArchiveBorrowHistory(vo));
     }
 
     @Override
-    public PageInfo<ArchiveBorrowHistoryRVO> selectArchiveBorrowHistory(PageVO vo) {
+    public PageInfo<ArchiveBorrowHistoryRVO> selectArchiveBorrowHistory(SearchBorrowVO vo) {
         PageHelper.startPage(vo.getPageNum(), vo.getPageSize());
-        return new PageInfo<>(mapper.selectArchiveBorrowHistory(null));
+        return new PageInfo<>(mapper.selectArchiveBorrowHistory(vo));
     }
 
     @Override
@@ -107,4 +113,6 @@ public class ArchiveBorrowServiceImpl implements ArchiveBorrowService {
         mapper.updateByPrimaryKeySelective(archiveBorrowDTO);
 
     }
+
+
 }

+ 22 - 0
src/main/java/com/gz/service/statistics/SelectStatisticsService.java

@@ -0,0 +1,22 @@
+package com.gz.service.statistics;
+
+import cn.hutool.core.lang.tree.Tree;
+import com.gz.rvo.statistics.ArchiveStatisticsRVO;
+import com.gz.rvo.statistics.ArchiveYearStatisticsRVO;
+import com.gz.rvo.statistics.BorrowStatisticsRVO;
+
+import java.util.List;
+
+/**
+ * 查询统计Service
+ * @author LiuchangLan
+ * @date 2021/3/8 14:59
+ */
+public interface SelectStatisticsService {
+
+    List<ArchiveStatisticsRVO> selectStatisticsByType();
+
+    List<ArchiveYearStatisticsRVO> selectArchiveYearStatistics();
+
+    List<BorrowStatisticsRVO> selectBorrowStatistics();
+}

+ 59 - 0
src/main/java/com/gz/service/statistics/impl/SelectStatisticsServiceImpl.java

@@ -0,0 +1,59 @@
+package com.gz.service.statistics.impl;
+
+import cn.hutool.core.lang.tree.Tree;
+import cn.hutool.core.lang.tree.TreeNodeConfig;
+import cn.hutool.core.lang.tree.TreeUtil;
+import com.gz.dto.system.ArchivesTreeDTO;
+import com.gz.mapper.statistics.SelectStatisticsMapper;
+import com.gz.mapper.system.ArchivesTreeMapper;
+import com.gz.rvo.statistics.ArchiveStatisticsRVO;
+import com.gz.rvo.statistics.ArchiveYearStatisticsRVO;
+import com.gz.rvo.statistics.BorrowStatisticsRVO;
+import com.gz.service.statistics.SelectStatisticsService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 查询统计Service 实现
+ * @author LiuchangLan
+ * @date 2021/3/8 14:59
+ */
+@Service
+public class SelectStatisticsServiceImpl implements SelectStatisticsService {
+
+    @Resource
+    private SelectStatisticsMapper selectStatisticsMapper;
+
+    @Override
+    public List<ArchiveStatisticsRVO> selectStatisticsByType() {
+        // 统计结果
+        List<ArchiveStatisticsRVO> tree = selectStatisticsMapper.selectArchiveStatistics();
+        tree.forEach(e -> {
+            if (e.getParentId() == -1){
+                for (ArchiveStatisticsRVO node : tree) {
+                    Integer archiveCount = 0;
+                    Integer fileCount = 0;
+                    if (e.getId().equals(node.getParentId())) {
+                        archiveCount += node.getArchiveCount();
+                        fileCount += node.getFileCount();
+                    }
+                    e.setArchiveCount(e.getArchiveCount() + archiveCount);
+                    e.setFileCount(e.getFileCount() + fileCount);
+                }
+            }
+        });
+        return tree;
+    }
+
+    @Override
+    public List<ArchiveYearStatisticsRVO> selectArchiveYearStatistics() {
+        return selectStatisticsMapper.selectArchiveYearStatistics();
+    }
+
+    @Override
+    public List<BorrowStatisticsRVO> selectBorrowStatistics() {
+        return selectStatisticsMapper.selectBorrowStatistics();
+    }
+}

+ 15 - 5
src/main/java/com/gz/service/system/AdminService.java

@@ -4,6 +4,8 @@ import com.github.pagehelper.PageInfo;
 import com.gz.dto.system.AdminDTO;
 import com.gz.vo.system.AdminVO;
 
+import java.util.List;
+
 public interface AdminService {
 
     /**
@@ -11,35 +13,35 @@ public interface AdminService {
      * @author LiuChangLan
      * @since 2020/9/4 14:46
      */
-    public Integer insert(AdminDTO adminDTO);
+    Integer insert(AdminDTO adminDTO);
 
     /**
      * @description 删
      * @author LiuChangLan
      * @since 2020/9/4 14:46
      */
-    public Integer delete(Integer id);
+    Integer delete(Integer id);
 
     /**
      * @description 改
      * @author LiuChangLan
      * @since 2020/9/4 14:46
      */
-    public Integer update(AdminDTO adminDTO);
+    Integer update(AdminDTO adminDTO);
 
     /**
      * @description 查(给分页参数查分页 没给查全部)
      * @author LiuChangLan
      * @since 2020/9/4 14:46
      */
-    public PageInfo<AdminDTO> select(AdminVO adminVO);
+    PageInfo<AdminDTO> select(AdminVO adminVO);
 
     /**
      * @description
      * @author LiuChangLan
      * @since 2020/9/4 15:05
      */
-    public AdminDTO selectByPrimaryKey(Integer id);
+    AdminDTO selectByPrimaryKey(Integer id);
 
     /**
      * @description 修改状态
@@ -54,4 +56,12 @@ public interface AdminService {
      * @since 2021/2/19 17:13
      */
     Integer resetPassword(Integer id);
+
+    /**
+     * @description 查询所有用户
+     * @author LiuChangLan
+     * @since 2021/3/4 16:33
+     */
+    List<AdminDTO> selectAll();
+
 }

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

@@ -90,4 +90,10 @@ public interface ArchivesTreeService {
      */
     ArchivesTreeDTO selectParentByCode(String code);
 
+    /**
+     * @description 查询档案树权限
+     * @author LiuChangLan
+     * @since 2021/3/7 23:12
+     */
+    List<Tree<String>> selectArchiveRole(Integer roleId);
 }

+ 63 - 0
src/main/java/com/gz/service/system/DeptService.java

@@ -0,0 +1,63 @@
+package com.gz.service.system;
+
+import cn.hutool.core.lang.tree.Tree;
+import com.gz.dto.system.DeptDTO;
+
+import java.util.List;
+
+/**
+ * @description 档案树Service
+ * @author LiuChangLan
+ * @since 2021/2/23 15:50
+ */
+public interface DeptService {
+
+    /**
+     * @description 增
+     * @author LiuChangLan
+     * @since 2020/9/4 14:46
+     */
+    Integer insert(DeptDTO dto);
+
+    /**
+     * @description 删
+     * @author LiuChangLan
+     * @since 2020/9/4 14:46
+     */
+    Integer delete(Integer id);
+
+    /**
+     * @description 改
+     * @author LiuChangLan
+     * @since 2020/9/4 14:46
+     */
+    Integer update(DeptDTO dto);
+
+    /**
+     * @description 查
+     * @author LiuChangLan
+     * @since 2020/9/4 14:46
+     */
+    List<DeptDTO> selectAll();
+
+    /**
+     * @description 根据主键查询
+     * @author LiuChangLan
+     * @since 2020/9/4 16:36
+     */
+    DeptDTO selectByPrimaryKey(Integer id);
+
+    /**
+     * @description 查询列表(根据排序)
+     * @author LiuChangLan
+     * @since 2021/2/23 16:18
+     */
+    List<DeptDTO> selectByOrder();
+
+    /**
+     * @description 查询树行
+     * @author LiuChangLan
+     * @since 2021/2/23 16:34
+     */
+    List<Tree<String>> selectTree();
+ }

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

@@ -8,6 +8,7 @@ import com.gz.dto.system.DictDTO;
 import com.gz.vo.system.DictVO;
 
 import java.util.List;
+import java.util.Map;
 
 public interface DictService {
 
@@ -88,4 +89,11 @@ public interface DictService {
      * @since 2021/2/24 15:52
      */
     DictDTO selectByCode(String code);
+
+    /**
+     * @description 查询密集权限
+     * @author LiuChangLan
+     * @since 2021/3/8 17:22
+     */
+    List<Map> selectMiJiRole(Integer roleId);
 }

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

@@ -16,6 +16,7 @@ import org.springframework.stereotype.Service;
 import sun.net.util.IPAddressUtil;
 
 import javax.annotation.Resource;
+import java.util.List;
 
 /**
  * @author LiuchangLan
@@ -95,4 +96,9 @@ public class AdminServiceImpl implements AdminService {
         adminDTO.setPassword(PasswordUtils.encryption("123456", adminDTO.getSalt()));
         return update(adminDTO);
     }
+
+    @Override
+    public List<AdminDTO> selectAll() {
+        return adminMapper.selectAll();
+    }
 }

+ 53 - 1
src/main/java/com/gz/service/system/impl/ArchivesTreeServiceImpl.java

@@ -3,9 +3,12 @@ package com.gz.service.system.impl;
 import cn.hutool.core.lang.tree.Tree;
 import cn.hutool.core.lang.tree.TreeNodeConfig;
 import cn.hutool.core.lang.tree.TreeUtil;
+import com.gz.common.DataGlobalVariable;
 import com.gz.dto.system.ArchivesTreeDTO;
 import com.gz.dto.system.MenuDTO;
+import com.gz.dto.system.MenuRoleDTO;
 import com.gz.mapper.system.ArchivesTreeMapper;
+import com.gz.mapper.system.MenuRoleMapper;
 import com.gz.service.system.ArchivesTreeService;
 import com.gz.utils.JwtUtils;
 import org.springframework.stereotype.Service;
@@ -26,6 +29,10 @@ public class ArchivesTreeServiceImpl implements ArchivesTreeService {
     @Resource
     private ArchivesTreeMapper mapper;
 
+    @Resource
+    private MenuRoleMapper menuRoleMapper;
+
+
     @Override
     public Integer insert(ArchivesTreeDTO dto) {
         dto.setCreated(JwtUtils.getCurrentUserJwtPayload().getId());
@@ -76,7 +83,7 @@ public class ArchivesTreeServiceImpl implements ArchivesTreeService {
                     tree.setId(treeNode.getId().toString());
                     tree.setParentId(treeNode.getParentId().toString());
                     tree.setName(treeNode.getTitle());
-                    tree.putExtra("title", treeNode.getTitle());
+                    tree.putExtra("title", treeNode.getTitle() + treeNode.getCode());
                     tree.putExtra("code", treeNode.getCode());
                     tree.putExtra("spread",true);
                 });
@@ -180,4 +187,49 @@ public class ArchivesTreeServiceImpl implements ArchivesTreeService {
         }
         return archivesTreeDTO;
     }
+
+    @Override
+    public List<Tree<String>> selectArchiveRole(Integer roleId) {
+
+        // 查询已有权限列表
+        MenuRoleDTO dto = new MenuRoleDTO();
+        dto.setRoleId(roleId);
+        dto.setRoleType(DataGlobalVariable.ROLE_TYPE_ARCHIVE_TREE);
+        List<MenuRoleDTO> select = menuRoleMapper.select(dto);
+        // 所有档案树
+        List<ArchivesTreeDTO> archiveTrees = mapper.selectAll();
+        //配置
+        TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
+        // 自定义属性名 都要默认值的
+        treeNodeConfig.setIdKey("id");
+        // 最大递归深度
+        treeNodeConfig.setDeep(3);
+
+        //转换器
+        List<Tree<String>> treeNodes = TreeUtil.build(archiveTrees, "-1", treeNodeConfig,
+                (treeNode, tree) -> {
+                    tree.setId(treeNode.getId().toString());
+                    tree.setParentId(treeNode.getParentId().toString());
+                    tree.setName(treeNode.getTitle());
+                    tree.putExtra("title", treeNode.getTitle());
+
+                    for (MenuRoleDTO menuRoleDTO : select) {
+                        boolean flag = false;
+                        // 判断是否有子元素
+                        for (ArchivesTreeDTO menuDTO1 : archiveTrees) {
+                            if (menuDTO1.getParentId().equals(treeNode.getId())) {
+                                flag = true;
+                                break;
+                            }
+                        }
+                        // 有权限 并且没有子元素的默认选中
+                        if (menuRoleDTO.getMenuId().equals(treeNode.getId()) && !flag) {
+                            flag = true;
+                            tree.putExtra("checked", true);
+                            break;
+                        }
+                    }
+                });
+        return treeNodes;
+    }
 }

+ 13 - 5
src/main/java/com/gz/service/system/impl/AuthServiceImpl.java

@@ -1,6 +1,7 @@
 package com.gz.service.system.impl;
 
 import cn.hutool.captcha.CaptchaUtil;
+import cn.hutool.captcha.CircleCaptcha;
 import cn.hutool.captcha.LineCaptcha;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.tree.Tree;
@@ -221,11 +222,18 @@ public class AuthServiceImpl implements AuthService {
 
     @Override
     public String generatePictureCaptcha() {
-        HttpSession session = request.getSession();
-        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
-        session.setAttribute("captcha",lineCaptcha.getCode());
-        log.info("生成验证码:{}",lineCaptcha.getCode());
-        return "data:image/jpg;base64," + lineCaptcha.getImageBase64();
+//        LineCaptcha lineCaptcha = null;
+        CircleCaptcha circleCaptcha = null;
+        try {
+            HttpSession session = request.getSession();
+//            lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
+            circleCaptcha = CaptchaUtil.createCircleCaptcha(200, 100, 4, 20);
+            session.setAttribute("captcha",circleCaptcha.getCode());
+            log.info("生成验证码:{}",circleCaptcha.getCode());
+        } catch (Exception e) {
+            throw new BusinessException(500,"生成验证码失败");
+        }
+        return "data:image/jpg;base64," + circleCaptcha.getImageBase64();
     }
 
     @Override

+ 62 - 0
src/main/java/com/gz/service/system/impl/DeptServiceImpl.java

@@ -0,0 +1,62 @@
+package com.gz.service.system.impl;
+
+import cn.hutool.core.lang.tree.Tree;
+import com.gz.dto.system.ArchivesTreeDTO;
+import com.gz.dto.system.DeptDTO;
+import com.gz.mapper.system.DeptMapper;
+import com.gz.service.system.DeptService;
+import org.springframework.stereotype.Service;
+import tk.mybatis.mapper.entity.Example;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author LiuchangLan
+ * @date 2021/3/9 16:16
+ */
+@Service
+public class DeptServiceImpl implements DeptService {
+
+    @Resource
+    private DeptMapper mapper;
+
+    @Override
+    public Integer insert(DeptDTO dto) {
+        return mapper.insertSelective(dto);
+    }
+
+    @Override
+    public Integer delete(Integer id) {
+        return mapper.deleteByPrimaryKey(id);
+    }
+
+    @Override
+    public Integer update(DeptDTO dto) {
+        return mapper.updateByPrimaryKeySelective(dto);
+    }
+
+    @Override
+    public List<DeptDTO> selectAll() {
+        Example example = new Example(DeptDTO.class);
+        example.setOrderByClause("dept_order ASC");
+        return mapper.selectByExample(example);
+    }
+
+    @Override
+    public DeptDTO selectByPrimaryKey(Integer id) {
+        return mapper.selectByPrimaryKey(id);
+    }
+
+    @Override
+    public List<DeptDTO> selectByOrder() {
+        Example example = new Example(DeptDTO.class);
+        example.setOrderByClause("dept_order ASC");
+        return mapper.selectByExample(example);
+    }
+
+    @Override
+    public List<Tree<String>> selectTree() {
+        return null;
+    }
+}

+ 39 - 6
src/main/java/com/gz/service/system/impl/DictServiceImpl.java

@@ -11,14 +11,19 @@ import com.gz.common.DataGlobalVariable;
 import com.gz.core.exception.BusinessException;
 import com.gz.core.exception.CustomExceptionEnum;
 import com.gz.dto.system.DictDTO;
+import com.gz.dto.system.MenuRoleDTO;
 import com.gz.mapper.system.DictMapper;
+import com.gz.mapper.system.MenuRoleMapper;
 import com.gz.service.system.DictService;
 import com.gz.utils.JwtUtils;
 import com.gz.vo.system.DictVO;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author LiuchangLan
@@ -29,12 +34,15 @@ public class DictServiceImpl implements DictService {
     @Resource
     private DictMapper dictMapper;
 
+    @Resource
+    private MenuRoleMapper menuRoleMapper;
+
     @Override
     public Integer insert(DictDTO dictDTO) throws BusinessException {
         DictDTO codeIsExist = new DictDTO();
         codeIsExist.setDictCode(dictDTO.getDictCode());
         List<DictDTO> select = dictMapper.select(codeIsExist);
-        if (select != null && select.size() > 0){
+        if (select != null && select.size() > 0) {
             throw new BusinessException(CustomExceptionEnum.DICT_CODE_EXISTS);
         }
         // 创建人
@@ -56,12 +64,12 @@ public class DictServiceImpl implements DictService {
         Integer count = select.size();
         // 除了自己原来的code
         for (DictDTO dto : select) {
-            if (dictDTO.getId().equals(dto.getId())){
-                count --;
+            if (dictDTO.getId().equals(dto.getId())) {
+                count--;
             }
         }
         // code已经重复
-        if (select != null && count > 0){
+        if (select != null && count > 0) {
             throw new BusinessException(CustomExceptionEnum.DICT_CODE_EXISTS);
         }
         // 修改人
@@ -74,8 +82,8 @@ public class DictServiceImpl implements DictService {
 
     @Override
     public PageInfo<DictDTO> selectByPage(DictVO dictVO) {
-        if (dictVO.getPageNum() != null && dictVO.getPageSize() != null){
-            PageHelper.startPage(dictVO.getPageNum(),dictVO.getPageSize());
+        if (dictVO.getPageNum() != null && dictVO.getPageSize() != null) {
+            PageHelper.startPage(dictVO.getPageNum(), dictVO.getPageSize());
         }
         // 查询条件转换
         DictDTO dictDTO = BeanUtil.copyProperties(dictVO, DictDTO.class);
@@ -152,4 +160,29 @@ public class DictServiceImpl implements DictService {
         dictDTO.setDictCode(code);
         return dictMapper.selectOne(dictDTO);
     }
+
+    @Override
+    public List<Map> selectMiJiRole(Integer roleId) {
+        List<DictDTO> miji = this.selectDictByCode("MIJI");
+        // 查询已有权限列表
+        MenuRoleDTO dto = new MenuRoleDTO();
+        dto.setRoleId(roleId);
+        dto.setRoleType(DataGlobalVariable.ROLE_TYPE_MIJI);
+        List<MenuRoleDTO> select = menuRoleMapper.select(dto);
+        List<Map> result = new ArrayList<>();
+        for (DictDTO dictDTO : miji) {
+            Map a = new HashMap();
+            a.put("id", dictDTO.getId());
+            a.put("title", dictDTO.getDictName());
+            a.put("checked", false);
+            for (MenuRoleDTO menuRoleDTO : select) {
+                if (dictDTO.getId().equals(menuRoleDTO.getMenuId())) {
+                    a.put("checked", true);
+                    break;
+                }
+            }
+            result.add(a);
+        }
+        return result;
+    }
 }

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

@@ -65,8 +65,8 @@ public class RoleServiceImpl implements RoleService {
 
     @Override
     public PageInfo<RoleDTO> select(RoleVO roleVO) {
-        if (roleVO.getPageNum() != null && roleVO.getPageSize() != null){
-            PageHelper.startPage(roleVO.getPageNum(),roleVO.getPageSize());
+        if (roleVO.getPageNum() != null && roleVO.getPageSize() != null) {
+            PageHelper.startPage(roleVO.getPageNum(), roleVO.getPageSize());
         }
         // 查询条件转换
         RoleDTO roleDTO = BeanUtil.copyProperties(roleVO, RoleDTO.class);
@@ -84,21 +84,42 @@ public class RoleServiceImpl implements RoleService {
     @Override
     @Transactional
     public Integer setRole(RoleMenuVO vo) {
-        String[] menuIds = vo.getMenuId().split(",");
+        String[] menuIds = vo.getMenuIds().split(",");
+        String[] archiveTreeIds = vo.getArchiveTrees().split(",");
+        String[] mijiIds = vo.getMjCodes().split(",");
         // 删除已有的权限
-        MenuRoleDTO deleteDTO = new MenuRoleDTO();
-        deleteDTO.setRoleId(vo.getRoleId());
-        Integer i = menuRoleMapper.delete(deleteDTO);
-        if (vo.getMenuId() == null || "".equals(vo.getMenuId())){
-            return i;
+        Integer i = menuRoleMapper.deleteByRoleId(vo.getRoleId());
+        if (vo.getMenuIds() != null && !"".equals(vo.getMenuIds())) {
+            for (String menuId : menuIds) {
+                MenuRoleDTO menuRoleDTO = new MenuRoleDTO();
+                menuRoleDTO.setRoleId(vo.getRoleId());
+                menuRoleDTO.setMenuId(Integer.parseInt(menuId));
+                menuRoleDTO.setRoleType(DataGlobalVariable.ROLE_TYPE_MENU);
+                i = menuRoleMapper.insert(menuRoleDTO);
+            }
         }
-        // 重新添加权限
-        for (String menuId : menuIds) {
-            MenuRoleDTO menuRoleDTO = new MenuRoleDTO();
-            menuRoleDTO.setRoleId(vo.getRoleId());
-            menuRoleDTO.setMenuId(Integer.parseInt(menuId));
-            i = menuRoleMapper.insert(menuRoleDTO);
+
+        if (vo.getArchiveTrees() != null && !"".equals(vo.getArchiveTrees())) {
+            for (String archiveTreeId : archiveTreeIds) {
+                MenuRoleDTO menuRoleDTO = new MenuRoleDTO();
+                menuRoleDTO.setRoleId(vo.getRoleId());
+                menuRoleDTO.setMenuId(Integer.parseInt(archiveTreeId));
+                menuRoleDTO.setRoleType(DataGlobalVariable.ROLE_TYPE_ARCHIVE_TREE);
+                i = menuRoleMapper.insert(menuRoleDTO);
+            }
         }
+
+
+        if (vo.getMjCodes() != null && !"".equals(vo.getMjCodes())) {
+            for (String mijiId : mijiIds) {
+                MenuRoleDTO menuRoleDTO = new MenuRoleDTO();
+                menuRoleDTO.setRoleId(vo.getRoleId());
+                menuRoleDTO.setMenuId(Integer.parseInt(mijiId));
+                menuRoleDTO.setRoleType(DataGlobalVariable.ROLE_TYPE_MIJI);
+                i = menuRoleMapper.insert(menuRoleDTO);
+            }
+        }
+
         return i;
     }
 
@@ -108,6 +129,7 @@ public class RoleServiceImpl implements RoleService {
 
         MenuRoleDTO dto = new MenuRoleDTO();
         dto.setRoleId(roleId);
+        dto.setRoleType(DataGlobalVariable.ROLE_TYPE_MENU);
         List<MenuRoleDTO> select = menuRoleMapper.select(dto);
         //配置
         TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
@@ -122,21 +144,21 @@ public class RoleServiceImpl implements RoleService {
                     tree.setId(treeNode.getId().toString());
                     tree.setParentId(treeNode.getParentId().toString());
                     tree.setName(treeNode.getTitle());
-                    tree.putExtra("title",treeNode.getTitle());
+                    tree.putExtra("title", treeNode.getTitle());
 
                     for (MenuRoleDTO menuRoleDTO : select) {
                         boolean flag = false;
                         // 判断是否有子元素
                         for (MenuDTO menuDTO1 : menuDTOS) {
-                            if (menuDTO1.getParentId().equals(treeNode.getId())){
+                            if (menuDTO1.getParentId().equals(treeNode.getId())) {
                                 flag = true;
                                 break;
                             }
                         }
                         // 有权限 并且没有子元素的默认选中
-                        if(menuRoleDTO.getMenuId().equals(treeNode.getId()) && !flag){
+                        if (menuRoleDTO.getMenuId().equals(treeNode.getId()) && !flag) {
                             flag = true;
-                            tree.putExtra("checked",true);
+                            tree.putExtra("checked", true);
                             break;
                         }
                     }

+ 68 - 0
src/main/java/com/gz/service/welcome/StatisticsService.java

@@ -0,0 +1,68 @@
+package com.gz.service.welcome;
+
+import com.alibaba.fastjson.JSONObject;
+import com.gz.rvo.welcome.BorrowCountRVO;
+import com.gz.rvo.welcome.BorrowRecordRVO;
+
+import java.util.List;
+import java.util.Map;
+
+public interface StatisticsService {
+
+    /**
+     * @description 查询待处理记录
+     * @author LiuChangLan
+     * @since 2021/3/2 10:33
+     */
+    List<BorrowRecordRVO> selectWaitHandleRecord();
+
+    /**
+     * @description 查询待归还记录
+     * @author LiuChangLan
+     * @since 2021/3/2 10:33
+     */
+    List<BorrowRecordRVO> selectWaitReturnRecord();
+
+    /**
+     * @description 根据类别统计存档数
+     * @author LiuChangLan
+     * @since 2021/3/2 10:35
+     */
+    JSONObject selectArchiveByType();
+
+    /**
+     * @description 根据年度统计存档数
+     * @author LiuChangLan
+     * @since 2021/3/2 10:35
+     */
+    JSONObject selectArchiveByYear();
+
+    /**
+     * @description 根据日期统计借阅数
+     * @author LiuChangLan
+     * @since 2021/3/2 10:36
+     */
+    Map selectBorrowCountByDate();
+
+    /**
+     * @description 个人统计数量
+     * @author LiuChangLan
+     * @since 2021/3/2 12:55
+     */
+    JSONObject selectMyCount();
+
+
+    /**
+     * @description 查询我的到期未归还记录
+     * @author LiuChangLan
+     * @since 2021/3/2 11:50
+     */
+    List<BorrowRecordRVO> selectMyWaitReturnRecord();
+
+    /**
+     * @description 查询我的三天内到期的记录
+     * @author LiuChangLan
+     * @since 2021/3/2 11:50
+     */
+    List<BorrowRecordRVO> selectMyDueSoonRecord();
+}

+ 174 - 0
src/main/java/com/gz/service/welcome/impl/StatisticsServiceImpl.java

@@ -0,0 +1,174 @@
+package com.gz.service.welcome.impl;
+
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.gz.dto.system.ArchivesTreeDTO;
+import com.gz.mapper.borrow.ArchiveBorrowMapper;
+import com.gz.mapper.system.ArchivesTreeMapper;
+import com.gz.mapper.welcome.StatisticsMapper;
+import com.gz.rvo.borrow.ArchiveBorrowHistoryRVO;
+import com.gz.rvo.welcome.ArchiveCountRVO;
+import com.gz.rvo.welcome.BorrowCountRVO;
+import com.gz.rvo.welcome.BorrowRecordRVO;
+import com.gz.service.welcome.StatisticsService;
+import com.gz.utils.JwtUtils;
+import org.apache.poi.ss.formula.functions.Count;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 统计Service
+ *
+ * @author LiuchangLan
+ * @date 2021/3/2 9:25
+ */
+@Service
+public class StatisticsServiceImpl implements StatisticsService {
+
+    @Resource
+    private ArchivesTreeMapper archivesTreeMapper;
+
+    @Resource
+    private ArchiveBorrowMapper archiveBorrowMapper;
+
+    @Resource
+    private StatisticsMapper statisticsMapper;
+
+    @Override
+    public List<BorrowRecordRVO> selectWaitHandleRecord() {
+        return statisticsMapper.selectWaitHandleRecord();
+    }
+
+    @Override
+    public List<BorrowRecordRVO> selectWaitReturnRecord() {
+        return statisticsMapper.selectWaitReturnRecord();
+    }
+
+    @Override
+    public JSONObject selectArchiveByType() {
+        List<ArchiveCountRVO> archiveCountRVOS = statisticsMapper.selectArchiveByMl();
+        List<ArchivesTreeDTO> archivesTreeDTOS = archivesTreeMapper.selectAll();
+        List<ArchiveCountRVO> data = new ArrayList<>();
+        ArrayList<String> x = new ArrayList<>();
+        ArrayList<Integer> y = new ArrayList<>();
+        for (ArchivesTreeDTO archivesTreeDTO : archivesTreeDTOS) {
+            if (archivesTreeDTO.getParentId() == -1) {
+                int count = 0;
+                for (ArchivesTreeDTO treeDTO : archivesTreeDTOS) {
+                    if (archivesTreeDTO.getId().equals(treeDTO.getParentId())) {
+                        count += archiveCountRVOS.stream().filter(e -> e.getTitle().equals(treeDTO.getCode())).mapToInt(e -> {
+                            Integer a = e.getCount();
+                            return a;
+                        }).sum();
+                    } else if (archivesTreeDTO.getId().equals(treeDTO.getId())) {
+                        count += archiveCountRVOS.stream().filter(e -> e.getTitle().equals(treeDTO.getCode())).mapToInt(e -> {
+                            Integer a = e.getCount();
+                            return a;
+                        }).sum();
+                    }
+                }
+                data.add(new ArchiveCountRVO(archivesTreeDTO.getTitle(), count));
+                x.add(archivesTreeDTO.getTitle().substring(0, archivesTreeDTO.getTitle().indexOf("档案")));
+                y.add(count);
+            }
+        }
+        JSONObject result = new JSONObject();
+        result.put("x", x);
+        result.put("y", y);
+//        result.put("data", data);
+        return result;
+    }
+
+    @Override
+    public JSONObject selectArchiveByYear() {
+        ArrayList<String> x = new ArrayList<>();
+        ArrayList<Integer> y = new ArrayList<>();
+        List<ArchiveCountRVO> archiveCountRVOS = statisticsMapper.selectArchiveByYear();
+        for (ArchiveCountRVO archiveCountRVO : archiveCountRVOS) {
+            x.add(archiveCountRVO.getTitle());
+        }
+        JSONObject result = new JSONObject();
+        result.put("x", x);
+        archiveCountRVOS.stream().forEach(e -> y.add(e.getCount()));
+//        result.put("data", archiveCountRVOS);
+        result.put("y", y);
+        return result;
+    }
+
+    @Override
+    public Map<String, Object> selectBorrowCountByDate() {
+        // 所有历史记录
+        List<ArchiveBorrowHistoryRVO> archiveBorrowHistorys = statisticsMapper.selectBorrowCountByDate();
+        // 所有树
+        List<ArchivesTreeDTO> archivesTreeDTOS = archivesTreeMapper.selectAll();
+        // 根据月份分组
+        Map<String, List<ArchiveBorrowHistoryRVO>> byMonth = archiveBorrowHistorys
+                .stream()
+                .collect(Collectors.groupingBy(e -> DateUtil.format(DateUtil.parse(e.getCreateTime()), "yyyy-MM")));
+
+        ArrayList<String> x = new ArrayList<>();
+        ArrayList<Map<String, Object>> y = new ArrayList<>();
+        ArrayList<String> z = new ArrayList<>();
+        // 循环每个月的数量
+        for (String key : byMonth.keySet()) {
+            x.add(key);
+        }
+        // 循环类别
+        for (ArchivesTreeDTO parentDTO : archivesTreeDTOS) {
+            if (parentDTO.getParentId() == -1) {
+                z.add(parentDTO.getTitle());
+                Map<String, Object> result = new HashMap<>();
+                result.put("name", parentDTO.getTitle());
+                result.put("type", "line");
+                result.put("stack", "借阅量");
+                List<Integer> counts = new ArrayList();
+                for (String key : x) {
+                    Integer count = 0;
+                    for (ArchiveBorrowHistoryRVO rvo : byMonth.get(key)) {
+                        if (parentDTO.getCode().equals(rvo.getCode())) {
+                            count++;
+                        }
+                    }
+                    counts.add(count);
+                }
+                result.put("data", counts);
+                y.add(result);
+            }
+        }
+        Collections.reverse(x);
+        Collections.reverse(y);
+        return new HashMap<String, Object>() {{
+            put("x", x);
+            put("y", y);
+        }};
+    }
+
+
+    @Override
+    public JSONObject selectMyCount() {
+        Integer userId = JwtUtils.getCurrentUserJwtPayload().getId();
+        JSONObject result = new JSONObject();
+        // 到期未归还
+        result.put("waitReturnCount", statisticsMapper.selectMyWaitReturnRecord(userId).size());
+        // 即将到期
+        result.put("dueSoonCount", statisticsMapper.selectMyDueSoonRecord(userId).size());
+        // 申请未处理
+        result.put("notHandleCount", statisticsMapper.selectRuditNotHandleCount(userId));
+        // 历史借阅数量
+        result.put("historyBorrowCount", statisticsMapper.selectMyHistoryBorrowCount(userId));
+        return result;
+    }
+
+    @Override
+    public List<BorrowRecordRVO> selectMyWaitReturnRecord() {
+        return statisticsMapper.selectMyWaitReturnRecord(JwtUtils.getCurrentUserJwtPayload().getId());
+    }
+
+    @Override
+    public List<BorrowRecordRVO> selectMyDueSoonRecord() {
+        return statisticsMapper.selectMyDueSoonRecord(JwtUtils.getCurrentUserJwtPayload().getId());
+    }
+}

+ 35 - 0
src/main/java/com/gz/utils/ExcelUtils.java

@@ -0,0 +1,35 @@
+package com.gz.utils;
+
+import java.util.List;
+
+/**
+ * Excel工具
+ * @author LiuchangLan
+ * @date 2021/3/4 14:45
+ */
+public class ExcelUtils {
+
+
+    /**
+     * @description 读取Excel单元格的String值
+     * @author LiuChangLan
+     * @since 2021/3/4 14:46
+     */
+    public static String getExcelCellStringValue(List<Object> row, int index) {
+        if (index >= row.size()) {
+            return null;
+        }
+        return String.valueOf(row.get(index));
+    }
+
+    /**
+     * 读取Excel单元格的Integer值
+     * @description
+     * @author LiuChangLan
+     * @since 2021/3/4 14:46
+     */
+    public static Integer getExcelCellIntegerValue(List<Object> row, int index) {
+        return Integer.valueOf(getExcelCellStringValue(row, index));
+    }
+
+}

+ 15 - 0
src/main/java/com/gz/utils/UUIdGenId.java

@@ -0,0 +1,15 @@
+package com.gz.utils;
+
+import cn.hutool.core.util.IdUtil;
+import tk.mybatis.mapper.genid.GenId;
+
+/**
+ * @author LiuchangLan
+ * @date 2021/3/9 16:09
+ */
+public class UUIdGenId implements GenId<String> {
+    @Override
+    public String genId(String s, String s1) {
+        return IdUtil.simpleUUID();
+    }
+}

+ 29 - 0
src/main/java/com/gz/vo/archive/GenerateDhVO.java

@@ -0,0 +1,29 @@
+package com.gz.vo.archive;
+
+import lombok.Data;
+
+/**
+ * @author LiuchangLan
+ * @date 2021/3/1 15:54
+ */
+@Data
+public class GenerateDhVO {
+    // 全宗号
+    private String qzh;
+    // 门类
+    private String ml;
+    // 属类
+    private String sl;
+    // 保管期限
+    private String bgqx;
+    // 件号/案卷号
+    private Integer jh;
+    // 核算单位代号
+    private String hsdwdh;
+    // 项目代号
+    private String xmdh;
+    // 目录号
+    private String mlh;
+    // 归档年度
+    private String gdnd;
+}

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

@@ -11,4 +11,5 @@ import lombok.Data;
 @Data
 public class SearchArchiveFileVO extends PageVO {
     private Integer archiveId;
+    private Integer fileType;
 }

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

@@ -1,8 +1,11 @@
 package com.gz.vo.archive;
 
+import com.alibaba.fastjson.JSONObject;
 import com.gz.vo.PageVO;
 import lombok.Data;
 
+import java.util.Map;
+
 /**
  * 档案数据查询入参VO
  * @author LiuchangLan
@@ -21,4 +24,18 @@ public class SearchArchiveVO extends PageVO {
 
     // 保管期限code
     private String bgqx;
+
+    // 密级
+    private String mj;
+
+    // 关键字
+    private String ztc;
+
+    // 高级搜索参数
+    private Map<String, Object> params;
+
+    // sql
+    private String sql;
+
+    private Integer roleId;
 }

+ 13 - 0
src/main/java/com/gz/vo/archive/SecondaryArchiveVO.java

@@ -0,0 +1,13 @@
+package com.gz.vo.archive;
+
+import com.gz.vo.PageVO;
+import lombok.Data;
+
+/**
+ * @author LiuchangLan
+ * @date 2021/3/2 19:19
+ */
+@Data
+public class SecondaryArchiveVO extends PageVO {
+    private Integer archiveId;
+}

+ 22 - 0
src/main/java/com/gz/vo/borrow/SearchBorrowVO.java

@@ -0,0 +1,22 @@
+package com.gz.vo.borrow;
+
+import com.gz.vo.PageVO;
+import lombok.Data;
+
+/**
+ * @author LiuchangLan
+ * @date 2021/3/8 11:05
+ */
+@Data
+public class SearchBorrowVO extends PageVO {
+    // 档号
+    private String dh;
+    // 题名
+    private String tm;
+    // 开始时间
+    private String startTime;
+    // 结束时间
+    private String endTime;
+    // 管理id
+    private Integer adminId;
+}

+ 14 - 0
src/main/java/com/gz/vo/rabbitmq/OcrEtlVO.java

@@ -0,0 +1,14 @@
+package com.gz.vo.rabbitmq;
+
+import com.gz.dto.archive.ArchiveDTO;
+import lombok.Data;
+
+/**
+ * @author LiuchangLan
+ * @date 2021/3/9 9:45
+ */
+@Data
+public class OcrEtlVO extends ArchiveDTO {
+    // 文件路径
+    private String fileUrl;
+}

+ 3 - 1
src/main/java/com/gz/vo/system/RoleMenuVO.java

@@ -10,6 +10,8 @@ import lombok.Data;
 public class RoleMenuVO {
 
     private Integer roleId;
-    private String menuId;
+    private String menuIds;
+    private String mjCodes;
+    private String archiveTrees;
 
 }

+ 17 - 11
src/main/resources/application-dev.yml

@@ -3,14 +3,6 @@ server:
 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:
-      # 单个文件大小
-      max-file-size: 100MB
-      # 设置总上传的数据大小
-      max-request-size: 100MB
-      # 开启
-      enabled: true
   # 数据源配置
   datasource:
     # 连接池类型
@@ -66,9 +58,9 @@ spring:
   # redis配置
   redis:
     # redis地址
-    host: 127.0.0.1
+    host: 47.97.217.112
     # redis端口
-    port: 6379
+    port: 8989
     # redis库
     database: 0
     jedis:
@@ -82,9 +74,23 @@ spring:
         # 连接池中的最小空闲连接
         min-idle: 2
     # 密码
-    #    password: 123456
+    password: qwer1234
     # 连接超时时间(毫秒)
     timeout: 30000
+  rabbitmq:
+    host: 47.97.217.112
+    port: 5672
+    username: admin
+    password: admin
+    listener:
+      simple:
+        acknowledge-mode: manual
+        default-requeue-rejected: false #意思是,消息被拒后(即未消费),重新(true)放入队列
+        retry:
+          enabled: true # 是否开启消费者重试(为false时关闭消费者重试,这时消费端代码异常会一直重复收到消息)
+          max-attempts: 5 # 重试次数
+          initial-interval: 5000
 upload-file:
+  server-file-url-prefix: http://127.0.0.1:${server.port}
   file-root-directory: E:\cache
   archive-file-root-directory: E:\cache\archive

+ 96 - 0
src/main/resources/application-test.yml

@@ -0,0 +1,96 @@
+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}
+  # 数据源配置
+  datasource:
+    # 连接池类型
+    type: com.alibaba.druid.pool.DruidDataSource
+    # MYSQL 5 驱动:com.mysql.jdbc.Driver,MYSQL 6+ 驱动:com.mysql.cj.jdbc.Driver
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://115.159.38.225:3306/guihua_archives?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=GMT%2B8
+    username: root
+    password: abcd123456!@#
+    # 连接池配置
+    druid:
+      # 初始化大小,最小,最大
+      initial-size: 5
+      min-idle: 5
+      max-active: 20
+      # 配置获取连接等待超时的时间
+      max-wait: 60000
+      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位毫秒
+      time-between-eviction-runs-millis: 60000
+      # 配置一个连接在池中最小生存时间
+      min-evictable-idle-time-millis: 300000
+      validation-query: SELECT 1
+      test-while-idle: true
+      test-on-borrow: false
+      test-on-return: false
+      # 打开 PSCache,并且指定每个连接上 PSCache 的大小
+      pool-prepared-statements: true
+      max-pool-prepared-statement-per-connection-size: 20
+      # 配置监控统计拦截的 Filter,去掉后监控界面 SQL 无法统计,wall 用于防火墙
+      filters: stat,wall,log4j
+      # 通过 connection-properties 属性打开 mergeSql 功能;慢 SQL 记录
+      connection-properties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
+      # 配置 DruidStatFilter
+      web-stat-filter:
+        enabled: true
+        url-pattern: /*
+        exclusions: .js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*
+      # 配置 DruidStatViewServlet
+      stat-view-servlet:
+        # 开启监控页面
+        enabled: false
+        # 页面地址
+        url-pattern: /druid/*
+        # IP 白名单,没有配置或者为空,则允许所有访问
+        allow: 127.0.0.1
+        # IP 黑名单,若白名单也存在,则优先使用
+        deny: 192.168.31.253
+        # 禁用 HTML 中 Reset All 按钮
+        reset-enable: false
+        # 登录用户名/密码
+        # login-username: admin
+        # login-password: 123456
+  # redis配置
+  redis:
+    # redis地址
+    host: 47.97.217.112
+    # redis端口
+    port: 8989
+    # redis库
+    database: 0
+    jedis:
+      pool:
+        # 连接池最大连接数(使用负值表示没有限制,对应maxTotal)
+        max-active: 50
+        # 连接池最大阻塞等待时间(使用负值表示没有限制)
+        max-wait: 3000
+        # 连接池中的最大空闲连接
+        max-idle: 20
+        # 连接池中的最小空闲连接
+        min-idle: 2
+    # 密码
+    password: qwer1234
+    # 连接超时时间(毫秒)
+    timeout: 30000
+  rabbitmq:
+    host: 47.97.217.112
+    port: 5672
+    username: admin
+    password: admin
+    listener:
+      simple:
+        acknowledge-mode: manual
+        default-requeue-rejected: false #意思是,消息被拒后(即未消费),重新(true)放入队列
+        retry:
+          enabled: true # 是否开启消费者重试(为false时关闭消费者重试,这时消费端代码异常会一直重复收到消息)
+          max-attempts: 5 # 重试次数
+          initial-interval: 5000
+upload-file:
+  server-file-url-prefix: http://175.24.29.29:${server.port}
+  file-root-directory: /home/archive-file
+  archive-file-root-directory: /home/file

+ 16 - 6
src/main/resources/application.yml

@@ -1,10 +1,10 @@
 spring:
-#  mvc:
-#    throw-exception-if-no-handler-found: false
-#  resources:
-#    add-mappings: true
   profiles:
     active: dev
+  servlet:
+    multipart:
+      max-file-size: 5120MB
+      max-request-size: 5120MB
 mybatis:
   #注册Mapper.xml配置文件
   mapper-locations: classpath:mapper/*.xml
@@ -22,5 +22,15 @@ auth:
     # 进行登录验证的地址
     force-urls: /**
     # 跳过验证地址
-    skip-urls: /,/**/*.pdf,/**/*.png,/**/*.jpg,/**/*.html,/**/*.ico,/**/*.css,/**/*.gif,/**/*.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,/template/*.xlsx
+rabbitmq:
+  # 数据交换机
+  data-exchange: ARCHIVE_DATA_EXCHANGE
+  # 死信队列交换机
+  dlx-data-exchange: ARCHIVE_DLX_DATA_EXCHANGE
+  ocr:
+    queue: ARCHIVE_OCR_QUEUE
+    queue-binding-key: ARCHIVE_OCR
+    queue-message-ttl: -1 #消息存活时间 单位秒 -1 不指定时间
+    dlx-queue: DLX_ARCHIVE_OCR_QUEUE
+    dlx-queue-binding-key: DLX_ARCHIVE_OCR

+ 11 - 1
src/main/resources/mapper/archiveBorrowMapper.xml

@@ -2,10 +2,11 @@
 <!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 id="selectArchiveBorrowHistory" resultType="com.gz.rvo.borrow.ArchiveBorrowHistoryRVO" parameterType="com.gz.vo.borrow.SearchBorrowVO">
         SELECT ab.id,
                a.dh,
                a.tm,
+               a.ml,
                ab.create_time,
                ab.borrow_type,
                ab.return_time,
@@ -26,6 +27,15 @@
           <if test="adminId != null and adminId != ''">
               and ad.id = #{adminId}
           </if>
+        <if test="dh != null and dh != ''">
+            and a.dh = #{dh}
+        </if>
+        <if test="tm != null and tm != ''">
+            and a.tm like concat(concat('%',#{tm}),'%')
+        </if>
+        <if test="startTime != null and startTime != '' and endTime != null and endTime != ''">
+            and ab.create_time BETWEEN #{startTime} AND #{endTime}
+        </if>
     </select>
 
     <select id="selectBorrowInfo" resultType="com.gz.rvo.borrow.AuditInfoRVO">

+ 84 - 1
src/main/resources/mapper/archiveMapper.xml

@@ -12,6 +12,17 @@
         ON a.mj = d.dict_code
         <where>
             a.deleted = 0
+            and ml IN (
+            SELECT
+            `code`
+            FROM
+            tab_archives_tree atr
+            LEFT JOIN tab_menu_role tmr ON atr.id = tmr.menu_id
+            WHERE
+            tmr.role_id =  ${roleId}
+            AND tmr.role_type = 1
+            )
+            and mj in (select d.dict_code from tab_dict d left join tab_menu_role mr on d.id = mr.menu_id where mr.role_id =  ${roleId} and mr.role_type = 2 )
             <if test="dh != null and dh != ''">
                 AND a.dh = #{dh}
             </if>
@@ -24,12 +35,22 @@
             <if test="bgqx != null and bgqx != ''">
                 AND a.bgqx = #{bgqx}
             </if>
+            <if test="mj != null and mj != ''">
+                AND a.mj = #{mj}
+            </if>
+            <if test="ztc != null and ztc != ''">
+                AND a.ztc = #{ztc}
+            </if>
+            <if test="sql != null and sql != ''">
+                ${sql}
+            </if>
         </where>
+        order by create_time desc
 
 
     </select>
 
-    <select id="selectBorrowList" resultType="com.gz.rvo.borrow.ArchiveBorrowListRVO">
+    <select id="selectBorrowList" resultType="com.gz.rvo.borrow.ArchiveBorrowListRVO" parameterType="int">
         <![CDATA[
         SELECT IF
                    (
@@ -45,6 +66,68 @@
                a.*
         FROM tab_archives a
         WHERE a.deleted = 0
+          and a.ml IN (
+            SELECT
+                `code`
+            FROM
+                tab_archives_tree atr
+                    LEFT JOIN tab_menu_role tmr ON atr.id = tmr.menu_id
+            WHERE
+                tmr.role_id =  ${roleId}
+              AND tmr.role_type = 1
+        )
+          and a.mj in (select d.dict_code from tab_dict d left join tab_menu_role mr on d.id = mr.menu_id where mr.role_id =  ${roleId} and mr.role_type = 2 )
         ]]>
     </select>
+
+
+    <select id="selectMaxJH" resultType="java.lang.Integer" parameterType="string">
+        SELECT max(jh) + 1
+        from tab_archives
+        where deleted = 0
+          and ml = #{mlCode}
+    </select>
+
+    <select id="selectRoleAll" resultType="com.gz.dto.archive.ArchiveDTO" parameterType="int">
+        SELECT
+            *
+        FROM
+            tab_archives
+        WHERE
+            deleted = 0
+          and ml IN (
+            SELECT
+                `code`
+            FROM
+                tab_archives_tree atr
+                    LEFT JOIN tab_menu_role tmr ON atr.id = tmr.menu_id
+            WHERE
+                tmr.role_id = ${roleId}
+              AND tmr.role_type = 1
+        )
+          and mj in (select d.dict_code from tab_dict d left join tab_menu_role mr on d.id = mr.menu_id where mr.role_id = ${roleId} and mr.role_type = 2 )
+        order by create_time desc
+    </select>
+
+    <select id="selectByRolePrimaryKey" resultType="com.gz.dto.archive.ArchiveDTO" parameterType="int">
+        SELECT
+            *
+        FROM
+            tab_archives
+        WHERE
+            deleted = 0
+            and id = #{id}
+          and ml IN (
+            SELECT
+                `code`
+            FROM
+                tab_archives_tree atr
+                    LEFT JOIN tab_menu_role tmr ON atr.id = tmr.menu_id
+            WHERE
+                tmr.role_id = 8
+              AND tmr.role_type = 1
+        )
+          and mj in (select d.dict_code from tab_dict d left join tab_menu_role mr on d.id = mr.menu_id where mr.role_id = 8 and mr.role_type = 2 )
+        order by create_time desc
+    </select>
 </mapper>

+ 2 - 0
src/main/resources/mapper/menuMapper.xml

@@ -14,6 +14,7 @@
         WHERE
              m.deleted = 0
              AND mr.role_id = #{roleId}
+            AND mr.role_type = 0
             AND m.type != 2
         order by m.`sort` asc
     </select>
@@ -28,6 +29,7 @@
             m.deleted = 0
             AND mr.role_id = #{roleId}
             AND m.parent_id = #{menuId}
+            AND mr.role_type = 0
             AND m.type = 2
         order by m.`sort` asc
     </select>

+ 145 - 0
src/main/resources/mapper/statisticsMapper.xml

@@ -0,0 +1,145 @@
+<?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.welcome.StatisticsMapper">
+
+
+    <select id="selectWaitHandleRecord" resultType="com.gz.rvo.welcome.BorrowRecordRVO">
+        <![CDATA[
+            SELECT
+                ad.admin_name,
+                ab.create_time,
+                a.tm,
+                a.dh
+            FROM
+                `tab_archive_borrow` ab
+                    LEFT JOIN tab_admin ad
+                              ON ab.created = ad.id
+                    LEFT JOIN tab_archives a
+                              ON a.id = ab.archive_id
+            WHERE
+                audit_status = 0
+                AND ab.deleted = 0
+                AND a.deleted = 0
+                AND ad.deleted = 0
+        ]]>
+    </select>
+
+
+    <select id="selectWaitReturnRecord" resultType="com.gz.rvo.welcome.BorrowRecordRVO">
+        <![CDATA[
+        SELECT
+            ad.admin_name,
+            a.tm,
+            ab.estimate_return_time,
+            a.dh
+        FROM
+            `tab_archive_borrow` ab
+                LEFT JOIN tab_admin ad ON ab.created = ad.id
+                LEFT JOIN tab_archives a ON a.id = ab.archive_id
+        WHERE
+            ab.audit_status = 2
+          AND ab.return_status = 0
+          AND ab.borrow_type = 1
+          AND ab.deleted = 0
+          AND a.deleted = 0
+          AND ad.deleted = 0
+        ]]>
+    </select>
+
+    <select id="selectArchiveByYear" resultType="com.gz.rvo.welcome.ArchiveCountRVO">
+        select gdnd title,count(id) count from tab_archives where deleted = 0 group by gdnd
+    </select>
+
+
+    <select id="selectArchiveByMl" resultType="com.gz.rvo.welcome.ArchiveCountRVO">
+        select ml title,count(id) count from tab_archives where deleted = 0 group by ml
+    </select>
+
+    <select id="selectMyWaitReturnRecord" resultType="com.gz.rvo.welcome.BorrowRecordRVO">
+        <![CDATA[
+        SELECT
+            ad.admin_name,
+            a.tm,
+            ab.estimate_return_time,
+            a.dh
+        FROM
+            `tab_archive_borrow` ab
+                LEFT JOIN tab_admin ad ON ab.created = ad.id
+                LEFT JOIN tab_archives a ON a.id = ab.archive_id
+        WHERE
+            ab.audit_status = 2
+          AND ab.return_status = 0
+          AND ab.borrow_type = 1
+          AND ab.deleted = 0
+          AND a.deleted = 0
+          AND ad.deleted = 0
+          AND ab.created = #{userId}
+          AND ab.estimate_return_time <= now()
+        ]]>
+    </select>
+
+    <select id="selectMyDueSoonRecord" resultType="com.gz.rvo.welcome.BorrowRecordRVO">
+        <![CDATA[
+        SELECT
+            ad.admin_name,
+            a.tm,
+            ab.estimate_return_time,
+            a.dh,
+            DATEDIFF( estimate_return_time, now( ) ) surplus_date
+        FROM
+            tab_archive_borrow ab
+                LEFT JOIN tab_admin ad ON ab.created = ad.id
+                LEFT JOIN tab_archives a ON a.id = ab.archive_id
+        WHERE
+            estimate_return_time > now()
+          AND ab.borrow_type = 1 -- 原件借阅
+          AND	ab.audit_status = 2 -- 审核通过
+          AND ab.return_status = 0 -- 未归还
+          AND DATEDIFF( estimate_return_time, now( ) ) < 3 -- 剩余时间小于3天
+          AND ab.deleted = 0
+          AND a.deleted = 0
+          AND ad.deleted = 0
+          AND ab.created = #{userId}
+        ]]>
+    </select>
+
+
+    <select id="selectMyHistoryBorrowCount" resultType="java.lang.Integer">
+        select count(id) from tab_archive_borrow where created = #{userId} and deleted = 0
+    </select>
+
+
+    <select id="selectRuditNotHandleCount" resultType="java.lang.Integer">
+        select count(id) from tab_archive_borrow where created = #{userId} and deleted = 0 and audit_status = 0
+    </select>
+
+    <select id="selectBorrowCountByDate" resultType="com.gz.rvo.borrow.ArchiveBorrowHistoryRVO" >
+        SELECT ab.id,
+               a.dh,
+               a.tm,
+               if(art.parent_id = -1,art.code,(select tart.code from tab_archives_tree tart where tart.id = art.parent_id)) code,
+               art.parent_id,
+               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
+                 left join tab_archives_tree art
+                           on a.ml = art.code
+        where ab.deleted = 0
+          and a.deleted = 0
+          and ad.deleted = 0
+          and ab.create_time > DATE_SUB(CURDATE(), INTERVAL 12 MONTH)
+        order by ab.create_time asc
+    </select>
+
+</mapper>

File diff suppressed because it is too large
+ 546 - 546
src/main/resources/static/css/layuimini.css


+ 2 - 1
src/main/resources/static/css/themes/default.css

@@ -13,6 +13,7 @@
 /*头部右侧字体颜色 headerRightColor */
 .layui-layout-admin .layui-header .layui-nav .layui-nav-item a {
     color: rgba(107, 107, 107, 0.7);
+    height: 0px !important;
 	    margin-top: 20px !important;
 }
 
@@ -49,7 +50,7 @@
 
 /*logo背景颜色 headerLogoBg */
 .layui-layout-admin .layuimini-logo {
-    background-color: rgb(30, 159, 255) !important;
+    /*background-color: rgb(30, 159, 255) !important;*/
 }
 
 /*logo字体颜色 headerLogoColor */

BIN
src/main/resources/static/images/logo.png


BIN
src/main/resources/static/images/shibai.png


BIN
src/main/resources/static/images/success.png


+ 204 - 201
src/main/resources/static/index.html

@@ -1,211 +1,214 @@
 <!DOCTYPE html>
 <html>
-	<head>
-		<meta charset="utf-8">
-		<title>南京市规划和自然资源局档案管理系统</title>
-		<meta name="keywords" content="layuimini,layui,layui模板,layui后台,后台模板,admin,admin模板,layui mini">
-		<meta name="description" 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="*">
-		<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
-		<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="icon" href="images/favicon.ico">
-		<link rel="stylesheet" href="lib/layui-v2.5.5/css/layui.css" media="all">
-		<link rel="stylesheet" href="css/layuimini.css?v=2.0.4.2" media="all">
-		<link rel="stylesheet" href="css/themes/default.css" media="all">
-		<link rel="stylesheet" href="lib/font-awesome-4.7.0/css/font-awesome.min.css" media="all">
-		<!--[if lt IE 9]>
+<head>
+    <meta charset="utf-8">
+    <title>南京市规划和自然资源局档案管理系统</title>
+    <meta name="keywords" content="layuimini,layui,layui模板,layui后台,后台模板,admin,admin模板,layui mini">
+    <meta name="description" 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="*">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <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="icon" href="images/favicon.ico">
+    <link rel="stylesheet" href="lib/layui-v2.5.5/css/layui.css" media="all">
+    <link rel="stylesheet" href="css/layuimini.css?v=2.0.4.2" media="all">
+    <link rel="stylesheet" href="css/themes/default.css" media="all">
+    <link rel="stylesheet" href="lib/font-awesome-4.7.0/css/font-awesome.min.css" media="all">
+    <!--[if lt IE 9]>
     <script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
     <script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
     <![endif]-->
-		<style type="text/css">
-			.toum {
-				position: absolute;
-				z-index: 9999;
-				left: 520px;
-				top: 10px;
-				pointer-events: none;
-			}
-
-			.sy {
-				position: absolute;
-				z-index: 9999;
-				left: 400px;
-				top: 10px;
-			}
-		</style>
-		<style id="layuimini-bg-color">
-		</style>
-	</head>
-	<body class="layui-layout-body layuimini-all">
-		<div id="" class="toum">
-			<img style="margin-right: 95px;height:30px" src="images/1.png">
-			<img style="margin-right: 100px;height:30px" src="images/2.png">
-			<img style="margin-right: 92px;height:30px" src="images/3.png">
-			<img style="margin-right: 95px;height:30px" src="images/4.png">
-			<img style="margin-right: 100px;height:30px" src="images/5.png">
-		</div>
-		<div class="layui-layout layui-layout-admin">
-
-			<div class="layui-header header">
-				<div class="layui-logo layuimini-logo">
-				</div>
-
-				<div class="layuimini-header-content">
-					<!--    <a>
-                <div class="layuimini-tool"><i title="展开" class="fa fa-outdent" data-side-fold="1"></i></div>
-            </a> -->
-
-					<!--电脑端头部菜单-->
-					<div class="xs" style="position: absolute;left: 490px;">
-						<img style=" height: 80px;width: 96px;" src="images/透明边框.png">
-					</div>
-
-					<ul class="layui-nav layui-layout-left layuimini-header-menu layuimini-menu-header-pc layuimini-pc-show">
-					</ul>
-
-					<!--手机端头部菜单-->
-					<!--      <ul class="layui-nav layui-layout-left layuimini-header-menu layuimini-mobile-show">
-                <li class="layui-nav-item">
-                    <a href="javascript:;"><i class="fa fa-list-ul"></i> 选择模块</a>
-                    <dl class="layui-nav-child layuimini-menu-header-mobile">
-                    </dl>
+    <style type="text/css">
+        .toum {
+            position: absolute;
+            z-index: 9999;
+            left: 520px;
+            top: 10px;
+            pointer-events: none;
+        }
+
+        .sy {
+            position: absolute;
+            z-index: 9999;
+            left: 400px;
+            top: 10px;
+        }
+
+    </style>
+    <style id="layuimini-bg-color">
+    </style>
+</head>
+<body class="layui-layout-body layuimini-all">
+<div id="" class="toum">
+    <img style="margin-right: 95px;height:30px" src="images/1.png">
+    <img style="margin-right: 100px;height:30px" src="images/2.png">
+    <img style="margin-right: 92px;height:30px" src="images/3.png">
+    <img style="margin-right: 95px;height:30px" src="images/4.png">
+    <img style="margin-right: 100px;height:30px" src="images/5.png">
+</div>
+<div class="layui-layout layui-layout-admin">
+
+    <div class="layui-header header">
+        <div class="layui-logo layuimini-logo">
+        </div>
+
+        <div class="layuimini-header-content">
+            <!--    <a>
+        <div class="layuimini-tool"><i title="展开" class="fa fa-outdent" data-side-fold="1"></i></div>
+    </a> -->
+
+            <!--电脑端头部菜单-->
+            <div class="xs" style="position: absolute;left: 490px;">
+                <img style=" height: 80px;width: 96px;" src="images/透明边框.png">
+            </div>
+
+            <ul class="layui-nav layui-layout-left layuimini-header-menu layuimini-menu-header-pc layuimini-pc-show">
+            </ul>
+
+            <!--手机端头部菜单-->
+            <!--      <ul class="layui-nav layui-layout-left layuimini-header-menu layuimini-mobile-show">
+        <li class="layui-nav-item">
+            <a href="javascript:;"><i class="fa fa-list-ul"></i> 选择模块</a>
+            <dl class="layui-nav-child layuimini-menu-header-mobile">
+            </dl>
+        </li>
+    </ul> -->
+            <div>
+
+
+            </div>
+
+            <ul class="layui-nav layui-layout-right">
+                <li class="layui-nav-item" lay-unselect>
+                    <a href="javascript:" data-refresh="刷新"><i class="fa fa-refresh"></i></a>
                 </li>
-            </ul> -->
-					<div>
 
-
-					</div>
-
-					<ul class="layui-nav layui-layout-right">
-						<li class="layui-nav-item" lay-unselect>
-							<a href="javascript:;" data-refresh="刷新"><i class="fa fa-refresh"></i></a>
-						</li>
-
-						<li class="layui-nav-item mobile layui-hide-xs" lay-unselect>
-							<a href="javascript:;" data-check-screen="full"><i class="fa fa-arrows-alt"></i></a>
-						</li>
-						<li class="layui-nav-item" lay-unselect>
-							<a href="javascript:;" data-refresh="消息"><i class="fa  fa-bell-o"></i>
-								<span class="layui-badge" style="    top: 17px;
+                <li class="layui-nav-item mobile layui-hide-xs" lay-unselect>
+                    <a href="javascript:" data-check-screen="full"><i class="fa fa-arrows-alt"></i></a>
+                </li>
+                <li class="layui-nav-item" lay-unselect>
+                    <a href="javascript:" data-refresh="消息"><i class="fa  fa-bell-o"></i>
+                        <span class="layui-badge" style="    top: 17px;
 				 font-size: 10px !important;
 				 border-radius: 15px;    margin: 14px -10px 0;">6</span></a>
-						</li>
-						<li class="layui-nav-item layuimini-setting">
-							<a href="javascript:;" class="login-out">退出系统</a>
-						</li>
-
-					</ul>
-				</div>
-			</div>
-
-			<!--    无限极左侧菜单-->
-			<div style="" class="layui-side layui-bg-black layuimini-menu-left">
-			</div>
-
-
-			<!--初始化加载层-->
-			<div class="layuimini-loader">
-				<div class="layuimini-loader-inner"></div>
-			</div>
-
-			<!--手机端遮罩层-->
-			<div class="layuimini-make"></div>
-
-			<!-- 移动导航 -->
-			<div class="layuimini-site-mobile"><i class="layui-icon"></i></div>
-
-			<div class="layui-body">
-
-				<div class="layuimini-tab layui-tab-rollTool layui-tab" lay-filter="layuiminiTab" lay-allowclose="true">
-					<ul class="layui-tab-title">
-						<li class="layui-this" id="layuiminiHomeTabId" lay-id=""></li>
-					</ul>
-					<div class="layui-tab-control">
-						<li class="layuimini-tab-roll-left layui-icon layui-icon-left"></li>
-						<li class="layuimini-tab-roll-right layui-icon layui-icon-right"></li>
-						<li class="layui-tab-tool layui-icon layui-icon-down">
-							<ul class="layui-nav close-box">
-								<li class="layui-nav-item">
-									<a href="javascript:;"><span class="layui-nav-more"></span></a>
-									<dl class="layui-nav-child">
-										<dd><a href="javascript:;" layuimini-tab-close="current">关 闭 当 前</a></dd>
-										<dd><a href="javascript:;" layuimini-tab-close="other">关 闭 其 他</a></dd>
-										<dd><a href="javascript:;" layuimini-tab-close="all">关 闭 全 部</a></dd>
-									</dl>
-								</li>
-							</ul>
-						</li>
-					</div>
-					<div class="layui-tab-content">
-						<div id="layuiminiHomeTabIframe" class="layui-tab-item layui-show"></div>
-					</div>
-				</div>
-
-			</div>
-		</div>
-		<script src="lib/layui-v2.5.5/layui.js" charset="utf-8"></script>
-		<script src="js/lay-config.js?v=2.0.0" charset="utf-8"></script>
-		<script>
-			
-			layui.use(['jquery', 'layer', 'miniAdmin', 'http', 'miniTab', 'miniMenu'], function() {
-				var $ = layui.jquery,
-					layer = layui.layer,
-					miniAdmin = layui.miniAdmin,
-					miniTab = layui.miniTab,
-					miniMenu = layui.miniMenu,
-					websocket = {},
-					http = layui.http;
-
-
-				// 加载用户名
-				let getLoginUserName = function() {
-					
-					http.get('system/auth/getLoginUserName', null, false, function(res) {
-						$("#account").text(res.data.adminName)
-						websocket = new WebSocket("ws://" + http.host + "/webSocket/" + res.data.id);
-					})
-				}
-
-				getLoginUserName()
-				var options = {
-					iniUrl: "system/auth/getLoginMenus", // 初始化接口
-					clearUrl: "api/clear.json", // 缓存清理接口
-					urlHashLocation: false, // 是否打开hash定位
-					bgColorDefault: 8, // 主题默认配置
-					multiModule: true, // 是否开启多模块
-					menuChildOpen: true, // 是否默认展开菜单
-					loadingTime: 1, // 初始化加载时间
-					pageAnim: true, // iframe窗口动画
-					maxTabNum: 20, // 最大的tab打开数量
-				};
-				miniAdmin.render(options);
-
-				// 退出登录
-				$('.login-out').on("click", function() {
-					layui.data('accessToken', {
-						key: 'accessToken',
-						value: ''
-					})
-					layer.msg('退出登录成功', function() {
-						window.location = 'login.html';
-					});
-				});
-
-				// 获取参数
-				function getParams(key) {
-					var reg = new RegExp("(^|&)" + key + "=([^&]*)(&|$)");
-					var r = window.location.search.substr(1).match(reg);
-					if (r != null) {
-						return unescape(r[2]);
-					}
-					return null;
-				};
-			});
-			
-		</script>
-	</body>
+                </li>
+                <li class="layui-nav-item mobile layui-hide-xs" lay-unselect>
+                    <a id="account"></a>
+                </li>
+                <li class="layui-nav-item layuimini-setting">
+                    <a href="javascript:" class="login-out">退出系统</a>
+                </li>
+
+            </ul>
+        </div>
+    </div>
+
+    <!--    无限极左侧菜单-->
+    <div style="" class="layui-side layui-bg-black layuimini-menu-left">
+    </div>
+
+
+    <!--初始化加载层-->
+    <div class="layuimini-loader">
+        <div class="layuimini-loader-inner"></div>
+    </div>
+
+    <!--手机端遮罩层-->
+    <div class="layuimini-make"></div>
+
+    <!-- 移动导航 -->
+    <div class="layuimini-site-mobile"><i class="layui-icon"></i></div>
+
+    <div class="layui-body">
+
+        <div class="layuimini-tab layui-tab-rollTool layui-tab" lay-filter="layuiminiTab" lay-allowclose="true">
+            <ul class="layui-tab-title">
+                <li class="layui-this" id="layuiminiHomeTabId" lay-id=""></li>
+            </ul>
+            <div class="layui-tab-control">
+                <li class="layuimini-tab-roll-left layui-icon layui-icon-left"></li>
+                <li class="layuimini-tab-roll-right layui-icon layui-icon-right"></li>
+                <li class="layui-tab-tool layui-icon layui-icon-down">
+                    <ul class="layui-nav close-box">
+                        <li class="layui-nav-item">
+                            <a href="javascript:"><span class="layui-nav-more"></span></a>
+                            <dl class="layui-nav-child">
+                                <dd><a href="javascript:" layuimini-tab-close="current">关 闭 当 前</a></dd>
+                                <dd><a href="javascript:" layuimini-tab-close="other">关 闭 其 他</a></dd>
+                                <dd><a href="javascript:" layuimini-tab-close="all">关 闭 全 部</a></dd>
+                            </dl>
+                        </li>
+                    </ul>
+                </li>
+            </div>
+            <div class="layui-tab-content">
+                <div id="layuiminiHomeTabIframe" class="layui-tab-item layui-show"></div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="lib/layui-v2.5.5/layui.js" charset="utf-8"></script>
+<script src="js/lay-config.js?v=2.0.0" charset="utf-8"></script>
+<script>
+
+    layui.use(['jquery', 'layer', 'miniAdmin', 'http', 'miniTab', 'miniMenu'], function () {
+        var $ = layui.jquery,
+            layer = layui.layer,
+            miniAdmin = layui.miniAdmin,
+            miniTab = layui.miniTab,
+            miniMenu = layui.miniMenu,
+            websocket = {},
+            http = layui.http;
+
+
+        // 加载用户名
+        let getLoginUserName = function () {
+            http.get('system/auth/getLoginUserName', null, false, function (res) {
+                $("#account").text(res.data.adminName)
+                websocket = new WebSocket("ws://" + http.host + "/webSocket/" + res.data.id);
+            })
+        }
+
+        getLoginUserName()
+        var options = {
+            iniUrl: "system/auth/getLoginMenus", // 初始化接口
+            clearUrl: "api/clear.json", // 缓存清理接口
+            urlHashLocation: false, // 是否打开hash定位
+            bgColorDefault: 8, // 主题默认配置
+            multiModule: true, // 是否开启多模块
+            menuChildOpen: true, // 是否默认展开菜单
+            loadingTime: 1, // 初始化加载时间
+            pageAnim: true, // iframe窗口动画
+            maxTabNum: 20, // 最大的tab打开数量
+        };
+        miniAdmin.render(options);
+
+        // 退出登录
+        $('.login-out').on("click", function () {
+            layui.data('accessToken', {
+                key: 'accessToken',
+                value: ''
+            })
+            layer.msg('退出登录成功', function () {
+                window.location = 'login.html';
+            });
+        });
+
+        // 获取参数
+        function getParams(key) {
+            var reg = new RegExp("(^|&)" + key + "=([^&]*)(&|$)");
+            var r = window.location.search.substr(1).match(reg);
+            if (r != null) {
+                return unescape(r[2]);
+            }
+            return null;
+        }
+    });
+
+</script>
+</body>
 </html>

File diff suppressed because it is too large
+ 2 - 2
src/main/resources/static/js/lay-module/echarts/echarts.js


+ 8 - 15
src/main/resources/static/js/lay-module/layuimini/miniMenu.js

@@ -147,9 +147,6 @@ layui.define(["element", "laytpl", "jquery"], function(exports) {
 				var id = menu + "HeaderId";
 				var topMenuItemHtml = "";
 				var idname = `"#` + id + `"`
-				console.log(idname)
-
-				// console.log(idname)
 				// $("multi_module_1HeaderId").html("123"); //电脑
 				topMenuItemHtml = me.compileMenu({
 					className: headerMenuCheckDefault,
@@ -180,7 +177,7 @@ layui.define(["element", "laytpl", "jquery"], function(exports) {
 			var src=
 			$('.layui-layout-body').addClass('layuimini-multi-module'); //多模块标识
 			$('.layuimini-menu-header-pc').html(headerMenuHtml); //电脑
-		
+
 			$('.layuimini-menu-left').html(leftMenuHtml);
 			$('.layuimini-menu-header-mobile').html(headerMobileMenuHtml); //手机
 			element.init();
@@ -197,10 +194,8 @@ layui.define(["element", "laytpl", "jquery"], function(exports) {
 				$(".layui-side").css("display", "none");
 			});
 			$(document).click(function(e) {
-				console.log($(".layui-side").css("display"))
 				// if( $(".layui-side").css("display")=="block"){
 				var target = $(e.target);
-				console.log(target)
 				if (target.closest(".layui-left-nav").length != 0 || target.closest(".layui-nav").length != 0) return;
 				$(".layui-side").hide();
 				// };
@@ -210,7 +205,7 @@ layui.define(["element", "laytpl", "jquery"], function(exports) {
 			/**
 			 * 菜单模块切换
 			 */
-			
+
 			$('body').on('click', '[data-menu]', function() {
 
 				var loading = layer.load(0, {
@@ -219,7 +214,6 @@ layui.define(["element", "laytpl", "jquery"], function(exports) {
 				});
 				var menuId = $(this).attr('data-menu');
 				// header
-				console.log(menuId)
 				$(".layuimini-header-menu .layui-nav-item.layui-this").removeClass('layui-this');
 				$(this).addClass('layui-this');
 				// left
@@ -227,17 +221,16 @@ layui.define(["element", "laytpl", "jquery"], function(exports) {
 				$(".layuimini-menu-left .layui-nav.layui-nav-tree.layui-this.layui-hide").removeClass('layui-this');
 				$("#" + menuId).removeClass('layui-hide');
 				$("#" + menuId).addClass('layui-this');
-			
+
 				$("#" + menuId).each(function (index, value) {
-				
+
 				        var l = $(this).children("li").length;
-						console.log(l)
 							var meneight=(l*35)+"px"
 							$(".layui-side").css("height",meneight);
 				    });
 					if(menuId=="multi_module_0"){
 					$(".layui-side").css("height","0px");
-						 window.location.href="http://127.0.0.1:8848/daxt/src/main/resources/static/index.html"
+						 window.location.href="/"
 					}
 				let men=menuId.split("_")[2]
 				$(".layui-side").css("display", "block");
@@ -246,9 +239,9 @@ layui.define(["element", "laytpl", "jquery"], function(exports) {
 				// let menHeight=(455+men*100)+"px"
 				$(".layui-side").css("left", menLeft);
 				$(".xs").css("left",menLeft2 );
-			
+
 				// if (menuId == "multi_module_1") {
-				
+
 				// 	$(".layui-side").css("display", "block");
 				// 	$(".layui-side").css("left", "550px");
 				// 	$(".xs").css("left", "570px");
@@ -260,7 +253,7 @@ layui.define(["element", "laytpl", "jquery"], function(exports) {
 				// 	$(".layui-side").css("height", "105px");
 				// 	$(".xs").css("left", "693px");
 				// } else if (menuId == "multi_module_3") {
-					
+
 				// 	$(".layui-side").css("display", "block");
 				// 	$(".layui-side").css("left", "805px");
 				// 	$(".layui-side").css("height", "35px");

+ 13 - 14
src/main/resources/static/js/lay-module/layuimini/miniTheme.js

@@ -18,7 +18,6 @@ layui.define(["jquery", "layer"], function (exports) {
         config: function (bgcolorId) {
             var bgColorConfig = [
                 {
-					
                     headerRightBg: '#ffffff', //头部右侧背景色
                     headerRightBgThis: '#e4e4e4', //头部右侧选中背景色,
                     headerRightColor: '#fff', //头部右侧字体颜色,
@@ -51,7 +50,7 @@ layui.define(["jquery", "layer"], function (exports) {
                     headerLogoBg: '#0c0c0c', //logo背景颜色,
                     headerLogoColor: '#ffffff', //logo字体颜色,
                     leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式,
-                    leftMenuBg: 'rgb(74,175,250)', //左侧菜单背景,
+                    leftMenuBg: 'rgb(53,116,224)', //左侧菜单背景,
                     leftMenuBgThis: '#737373', //左侧菜单选中背景,
                     leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景,
                     leftMenuColor: '#ffffff', //左侧菜单字体颜色,
@@ -71,7 +70,7 @@ layui.define(["jquery", "layer"], function (exports) {
                     headerLogoBg: '#e694bd', //logo背景颜色,
                     headerLogoColor: '#ffffff', //logo字体颜色,
                     leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式,
-                    leftMenuBg: 'rgb(74,175,250)', //左侧菜单背景,
+                    leftMenuBg: 'rgb(53,116,224)', //左侧菜单背景,
                     leftMenuBgThis: '#737373', //左侧菜单选中背景,
                     leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景,
                     leftMenuColor: '#ffffff', //左侧菜单字体颜色,
@@ -91,7 +90,7 @@ layui.define(["jquery", "layer"], function (exports) {
                     headerLogoBg: '#0c0c0c', //logo背景颜色,
                     headerLogoColor: '#ffffff', //logo字体颜色,
                     leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式,
-                    leftMenuBg: 'rgb(74,175,250)', //左侧菜单背景,
+                    leftMenuBg: 'rgb(53,116,224)', //左侧菜单背景,
                     leftMenuBgThis: '#1aa094', //左侧菜单选中背景,
                     leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景,
                     leftMenuColor: '#ffffff', //左侧菜单字体颜色,
@@ -100,7 +99,7 @@ layui.define(["jquery", "layer"], function (exports) {
                 },
                 {
                     headerRightBg: '#1e9fff', //头部右侧背景色
-                    headerRightBgThis: 'rgb(30,159,255)', //头部右侧选中背景色,
+                    headerRightBgThis: 'rgb(24,100,161)', //头部右侧选中背景色,
                     headerRightColor: '#fff', //头部右侧字体颜色,
                     headerRightChildColor: '#676767', //头部右侧下拉字体颜色,
                     headerRightColorThis: '#ffffff', //头部右侧鼠标选中,
@@ -111,7 +110,7 @@ layui.define(["jquery", "layer"], function (exports) {
                     headerLogoBg: '#0c0c0c', //logo背景颜色,
                     headerLogoColor: '#ffffff', //logo字体颜色,
                     leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式,
-                    leftMenuBg: 'rgb(74,175,250)', //左侧菜单背景,
+                    leftMenuBg: 'rgb(53,116,224)', //左侧菜单背景,
                     leftMenuBgThis: '#1e9fff', //左侧菜单选中背景,
                     leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景,
                     leftMenuColor: '#ffffff', //左侧菜单字体颜色,
@@ -131,7 +130,7 @@ layui.define(["jquery", "layer"], function (exports) {
                     headerLogoBg: '#243346', //logo背景颜色,
                     headerLogoColor: '#ffffff', //logo字体颜色,
                     leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式,
-                    leftMenuBg: 'rgb(74,175,250)', //左侧菜单背景,
+                    leftMenuBg: 'rgb(53,116,224)', //左侧菜单背景,
                     leftMenuBgThis: '#8593a7', //左侧菜单选中背景,
                     leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景,
                     leftMenuColor: '#fff', //左侧菜单字体颜色,
@@ -179,7 +178,7 @@ layui.define(["jquery", "layer"], function (exports) {
                     tabActiveColor: '#963885', //tab选项卡选中颜色,
                 },
                 {
-                    headerRightBg: 'rgb(30,159,255)', //头部右侧背景色
+                    headerRightBg: 'rgb(24,100,161)', //头部右侧背景色
                     headerRightBgThis: 'rgb(30,159,255)', //头部右侧选中背景色,
                     headerRightColor: '#fff', //头部右侧字体颜色,
                     headerRightChildColor: '#676767', //头部右侧下拉字体颜色,
@@ -188,15 +187,15 @@ layui.define(["jquery", "layer"], function (exports) {
                     headerRightNavMoreBg: '#0069b7', //头部右侧更多下拉列表选中背景色,
                     headerRightNavMoreColor: '#ffffff', //头部右侧更多下拉列表字体色,
                     headerRightToolColor: '#bbe3df', //头部缩放按钮样式,
-                    headerLogoBg: 'rgb(30,159,255)', //logo背景颜色,
+                    headerLogoBg: 'rgb(24,100,161)', //logo背景颜色,
                     headerLogoColor: '#ffffff', //logo字体颜色,
                     leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式,
-                    leftMenuBg: 'rgb(74,175,250)', //左侧菜单背景,
+                    leftMenuBg: 'rgb(53,116,224)', //左侧菜单背景,
                     leftMenuBgThis: '#2D8CF0', //左侧菜单选中背景,
                     leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景,
                     leftMenuColor: '#fff', //左侧菜单字体颜色,
                     leftMenuColorThis: 'orange', //左侧菜单选中字体颜色,
-                    tabActiveColor: 'rgb(30,159,255)', //tab选项卡选中颜色,
+                    tabActiveColor: 'rgb(24,100,161)', //tab选项卡选中颜色,
                 },
                 {
                     headerRightBg: '#ffb800', //头部右侧背景色
@@ -211,7 +210,7 @@ layui.define(["jquery", "layer"], function (exports) {
                     headerLogoBg: '#d09600', //logo背景颜色,
                     headerLogoColor: '#ffffff', //logo字体颜色,
                     leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式,
-                    leftMenuBg: 'rgb(74,175,250)', //左侧菜单背景,
+                    leftMenuBg: 'rgb(53,116,224)', //左侧菜单背景,
                     leftMenuBgThis: '#3b3f4b', //左侧菜单选中背景,
                     leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景,
                     leftMenuColor: '#fff', //左侧菜单字体颜色,
@@ -231,7 +230,7 @@ layui.define(["jquery", "layer"], function (exports) {
                     headerLogoBg: '#d91f1f', //logo背景颜色,
                     headerLogoColor: '#ffffff', //logo字体颜色,
                     leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式,
-                    leftMenuBg: 'rgb(74,175,250)', //左侧菜单背景,
+                    leftMenuBg: 'rgb(53,116,224)', //左侧菜单背景,
                     leftMenuBgThis: '#3b3f4b', //左侧菜单选中背景,
                     leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景,
                     leftMenuColor: '#fff', //左侧菜单字体颜色,
@@ -251,7 +250,7 @@ layui.define(["jquery", "layer"], function (exports) {
                     headerLogoBg: '#772c6a', //logo背景颜色,
                     headerLogoColor: '#ffffff', //logo字体颜色,
                     leftMenuNavMore: 'rgb(191, 187, 187)', //左侧菜单更多下拉样式,
-                    leftMenuBg: 'rgb(74,175,250)', //左侧菜单背景,
+                    leftMenuBg: 'rgb(53,116,224)', //左侧菜单背景,
                     leftMenuBgThis: '#626f7f', //左侧菜单选中背景,
                     leftMenuChildBg: 'rgba(0,0,0,.3)', //左侧菜单子菜单背景,
                     leftMenuColor: '#fff', //左侧菜单字体颜色,

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

@@ -1,11 +1,10 @@
 layui.define(['jquery', 'layer'], function (exports) {
     var $ = layui.jquery,
         layer = layui.layer,
-        // requestUrl = 'http://192.168.157.154:9090/';
         /** war包 如果有项目名后面填写项目名 没有项目名就去除(没有项目名需要保留斜杠)*/
             // requestUrl = window.location.origin + '/archives/';
-        // host = window.location.host,
-        host = '192.168.0.113:9091',
+        host = window.location.host,
+        // host = '192.168.0.110:9091',
         requestUrl = 'http://' + host + '/';
 
     let ajax = function (method, type, data, async, callback) {
@@ -105,9 +104,9 @@ layui.define(['jquery', 'layer'], function (exports) {
         },
         getRoleButton: function (menuId) {
             // 显示在头部的按钮
-            let header = ['add', 'download', 'import', 'batchDel', 'foldAll', 'unfoldAll', 'clearThirtyOut', 'clearAll']
+            let header = ['add', 'download', 'import', 'batchDel', 'foldAll', 'unfoldAll', 'clearThirtyOut', 'clearAll', 'expostA', 'a', 'advancedSearch']
             // 显示在行里的按钮
-            let row = ['show', 'update', 'delete', 'export', 'up', 'down', 'setRole', 'resetPassword', 'files', 'borrowing']
+            let row = ['show', 'update', 'delete', 'export', 'up', 'down', 'setRole', 'resetPassword', 'files', 'borrowing', 'enclosure', 'secondary', 'register']
             http.get('system/auth/getLoginButtons', {menuId: menuId}, false, function (res) {
                 let headerHtml = '<div class="layui-btn-container">'
                 let rowHtml = ''

File diff suppressed because it is too large
+ 2 - 0
src/main/resources/static/lib/layui-v2.5.5/css/layui.css


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

@@ -49,6 +49,8 @@
                     toolbar: '#toolbar', //开启头部工具栏,并为其绑定左侧模板
                     defaultToolbar: ['filter', 'exports', 'print'],
                     title: '用户数据表',
+                    limit: 15,
+                    limits: [15, 30, 45, 60],
                     page: true,
                     request: {
                         pageName: 'pageNum',

+ 156 - 0
src/main/resources/static/page/archive/advancedSearch.html

@@ -0,0 +1,156 @@
+<!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-btn {
+            /*display: block;*/
+            /*margin: 0 auto;*/
+            /*float: left;*/
+        }
+
+        .layui-form-item {
+            /*text-align: center;*/
+        }
+    </style>
+</head>
+<body>
+    <div class="layui-form layuimini-form" lay-filter="addDict" id="add" style="text-aglin:center">
+        <div class="layui-form-item" id="1">
+            <label class="layui-form-label required">条件1:</label>
+            <div class="layui-input-inline">
+                <select class="layui-select" name="field_1" id="field_1" lay-verify="required" lay-reqtext="条件1字段不能未空">
+                    <option value="">请选择字段</option>
+                    <option value="tm">题名</option>
+                    <option value="dh">档号</option>
+                    <option value="jh">件号</option>
+                    <option value="wjbh">文号</option>
+                    <option value="gdnd">归档年度</option>
+                    <option value="ztsl">载体数量</option>
+                    <option value="zrz">责任者</option>
+                    <option value="cfwzms">存放位置描述</option>
+                    <option value="bz">备注</option>
+                    <option value="ztc">关键词</option>
+                </select>
+            </div>
+            <div class="layui-input-inline">
+                <select class="layui-select" name="condition_1" id="condition_1" lay-verify="required"
+                        lay-reqtext="条件1条件不能未空">
+                    <option value="">请选择条件</option>
+                    <option value="=">等于</option>
+                    <option value="like">包含</option>
+                </select>
+            </div>
+            <div class="layui-input-inline">
+                <input class="layui-input" type="text" name="variable_1" id="variable_1" placeholder="请输入值"
+                       lay-verify="required" lay-reqtext="条件1值不能未空">
+            </div>
+            <div class="layui-input-inline">
+                <button class="layui-btn add">+</button>
+                <button class="layui-btn layui-btn-danger del">-</button>
+            </div>
+        </div>
+        <div class="layui-form-item" id="submit_button_container">
+            <div class="layui-input-block">
+                <button class="layui-btn layui-btn-normal" lay-submit lay-filter="search">搜索</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', 'iconPickerFa', 'laydate', 'upload'], function () {
+        /**变-------------------------------量-------------------------------定-------------------------------义*/
+        var form = layui.form,
+            layer = layui.layer,
+            http = layui.http,
+            $ = layui.$,
+            laydate = layui.laydate;
+
+        let index = 1;
+
+
+        /**方-------------------------------法-------------------------------定-------------------------------义*/
+
+        $(document).on('click', '.add', function () {
+            if (index >= 7){
+                layer.msg('最多不能超过7个条件')
+                return;
+            }
+            $("#submit_button_container").remove()
+            index++;
+            $("#add").append('<div class="layui-form-item"  id="' + index + '">\n' +
+                '            <label class="layui-form-label required">条件' + index + ':</label>\n' +
+                '            <div class="layui-input-inline">\n' +
+                '                <select class="layui-select" name="field_' + index + '" id="field_' + index + '" lay-verify="required" lay-reqtext="条件' + index + '字段不能未空">\n' +
+                '                    <option value="">请选择字段</option>\n' +
+                '                    <option value="tm">题名</option>\n' +
+                '                    <option value="dh">档号</option>\n' +
+                '                    <option value="jh">件号</option>\n' +
+                '                    <option value="wjbh">文号</option>\n' +
+                '                    <option value="gdnd">归档年度</option>\n' +
+                '                    <option value="ztsl">载体数量</option>\n' +
+                '                    <option value="zrz">责任者</option>\n' +
+                '                    <option value="cfwzms">存放位置描述</option>\n' +
+                '                    <option value="bz">备注</option>\n' +
+                '                    <option value="ztc">关键词</option>\n' +
+                '                </select>\n' +
+                '            </div>\n' +
+                '            <div class="layui-input-inline">\n' +
+                '                <select class="layui-select" name="condition_' + index + '" id="condition_' + index + '" lay-verify="required" lay-reqtext="条件' + index + '条件不能未空">\n' +
+                '                    <option value="">请选择条件</option>\n' +
+                '                    <option value="=">等于</option>\n' +
+                '                    <option value="like">包含</option>\n' +
+                '                </select>\n' +
+                '            </div>\n' +
+                '            <div class="layui-input-inline">\n' +
+                '                <input class="layui-input" type="text" name="variable_' + index + '" id="variable_' + index + '" placeholder="请输入值" lay-verify="required" lay-reqtext="条件' + index + '值不能未空">\n' +
+                '            </div>\n' +
+                '            <div class="layui-input-inline">\n' +
+                '                <button class="layui-btn add">+</button>\n' +
+                '                <button class="layui-btn layui-btn-danger del">-</button>\n' +
+                '            </div>\n' +
+                '        </div>')
+            $("#add").append('  <div class="layui-form-item" id="submit_button_container">\n' +
+                '            <div class="layui-input-block">\n' +
+                '                <button class="layui-btn layui-btn-normal" lay-submit lay-filter="search">搜索</button>\n' +
+                '            </div>\n' +
+                '        </div>');
+            form.render();//菜单渲染 把内容加载进去
+            // layer.msg(index)
+
+        })
+
+        $(document).on('click', '.del', function () {
+            let id = $(this).parent().parent().prop('id')
+            if (index <= 1){
+                layer.msg('最少选择一个条件');
+                return;
+            }
+            $(this).parent().parent().remove()
+            index --;
+            // layer.msg(index)
+
+        })
+
+        //监听提交
+        form.on('submit(search)', function (data) {
+            parent.GetValue(data.field)
+            var index = parent.layer.getFrameIndex(window.name);
+            parent.layer.close(index);//关闭当前页
+        });
+
+
+    });
+</script>
+</body>
+</html>

+ 348 - 122
src/main/resources/static/page/archive/edit.html

@@ -11,41 +11,185 @@
             background-color: #ffffff;
         }
 
+        .layui-form-label {
+            padding-left: 0;
+        }
+
+        .layui-form-item {
+            text-align: center;
+        }
+
         .layui-form-item .layui-input-inline {
-            width: 30%;
+            width: 100px;
+            min-width: 100px;
         }
 
-        .layui-form-label {
-            /*width: 90px;*/
+        .layui-main {
+            min-width: 1000px;
+            width: 1000px;
         }
 
-        #gdnd, #wjxcsj, #wjdqsj {
-            cursor: pointer;
+        .layui-btn {
+            /*display: block;*/
+            /*margin: 0 auto;*/
+            /*float: left;*/
         }
     </style>
 </head>
 <body>
-<div class="layui-form layuimini-form" lay-filter="addDict">
-
-    <table>
-        <tr>
-            <td></td>
-            <td></td>
-            <td></td>
-            <td></td>
-        </tr>
-        <tr>
-            <td></td>
-            <td></td>
-            <td></td>
-            <td></td>
-
-        </tr>
-    </table>
-
-    <div class="layui-form-item">
-        <div class="layui-input-block">
-            <button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">确认保存</button>
+<div class="layui-main">
+    <div class="layui-form layuimini-form" lay-filter="addDict" id="add" style="text-aglin:center">
+        <input type="hidden" class="layui-input" name="id" id="id">
+        <div class="layui-form-item">
+            <label class="layui-form-label required">归档年度:</label>
+            <div class="layui-input-inline" style="">
+                <input type="text" class="layui-input" placeholder="请选择归档年度" name="gdnd" id="gdnd" lay-filter="gdnd"
+                       lay-verify="required" lay-reqtext="归档年度不能为空" readonly>
+            </div>
+
+            <label class="layui-form-label required">档案门类:</label>
+            <div class="layui-input-inline">
+                <input type="hidden" id="mlId" class="layui-input">
+                <input type="hidden" id="mlCode" class="layui-input">
+                <select name="ml" id="ml" lay-filter="ml" lay-verify="required" lay-reqtext="档案门类不能为空">
+                    <option value="">请选择档案门类</option>
+                </select>
+            </div>
+
+
+            <label class="layui-form-label required">全宗号:</label>
+            <div class="layui-input-inline">
+                <select name="qzh" id="qzh" lay-filter="qzh" lay-verify="required" lay-reqtext="全宗号不能为空">
+                    <option value="">请选择全宗号</option>
+                </select>
+            </div>
+            <label class="layui-form-label required">目录号:</label>
+            <div class="layui-input-inline">
+                <input type="number" class="layui-input" placeholder="请输入目录号" name="mlh" id="mlh" lay-filter="mlh"
+                       lay-verify="required" lay-reqtext="目录号不能为空">
+            </div>
+
+        </div>
+        <div class="layui-form-item" id="hide_div">
+        </div>
+
+        <div class="layui-form-item">
+            <label class="layui-form-label required" id="jh_label">卷(件)号:</label>
+            <div class="layui-input-inline">
+                <input type="number" class="layui-input" name="jh" id="jh" placeholder="请输入件号" lay-filter="jh"
+                       lay-verify="required" lay-reqtext="件号不能为空" min="0">
+            </div>
+
+            <label class="layui-form-label required">保管期限:</label>
+            <div class="layui-input-inline">
+                <select name="bgqx" id="bgqx" lay-filter="bgqx" lay-verify="required" lay-reqtext="保管期限不能为空">
+                    <option value="">请选择保管期限</option>
+                </select>
+            </div>
+
+            <label class="layui-form-label required">档号:</label>
+            <div class="layui-input-inline" style="width: 344px;">
+                <input type="text" class="layui-input" id="dh" name="dh" placeholder="自动生成" lay-verify="required"
+                       lay-reqtext="档号不能为空" readonly>
+            </div>
+        </div>
+
+        <div class="layui-form-item">
+            <label class="layui-form-label required">题名:</label>
+            <div class="layui-input-inline" style="width: 834px;">
+                <input type="text" class="layui-input" name="tm" id="tm" lay-filter="tm" placeholder="请输入题名"
+                       lay-verify="required" lay-reqtext="题名不能为空">
+            </div>
+        </div>
+
+        <div class="layui-form-item">
+            <label class="layui-form-label">内容概述:</label>
+            <div class="layui-input-inline" style="width: 834px;">
+                <textarea class="layui-textarea" name="nrgs" id="nrgs" placeholder="请输入内容概述"></textarea>
+            </div>
+        </div>
+
+        <div class="layui-form-item">
+            <label class="layui-form-label required">文件形成时间:</label>
+            <div class="layui-input-inline" style="width: 135px;">
+                <input type="text" class="layui-input" name="wjxcsj" id="wjxcsj" lay-filter="wjxcsj" placeholder="开始时间"
+                       lay-verify="required" lay-reqtext="文件形成时间不能为空" readonly>
+            </div>
+            <div class="layui-form-mid">-</div>
+            <div class="layui-input-inline" style="width: 135px">
+                <input type="text" class="layui-input" name="wjdqsj" id="wjdqsj" lay-filter="wjdqsj" placeholder="结束时间"
+                       lay-verify="required" lay-reqtext="文件形成时间不能为空" readonly>
+            </div>
+
+            <label class="layui-form-label required">归档日期:</label>
+            <div class="layui-input-inline" style="width: 150px;">
+                <input type="text" class="layui-input" name="gdrq" id="gdrq" lay-filter="wjdqsj" style="cursor: pointer"
+                       readonly>
+            </div>
+
+            <label class="layui-form-label required">密级:</label>
+            <div class="layui-input-inline">
+                <select name="mj" id="mj" lay-filter="mj" lay-verify="required" lay-reqtext="密级不能为空">
+                    <option value="">请选择密级</option>
+                </select>
+            </div>
+        </div>
+
+        <div class="layui-form-item">
+            <label class="layui-form-label required">文件编号:</label>
+            <div class="layui-input-inline">
+                <input type="text" class="layui-input" name="wjbh" id="wjbh" lay-filter="wjbh" lay-verify="required"
+                       lay-reqtext="文号不能为空" placeholder="请输入文号">
+            </div>
+            <label class="layui-form-label required">责任者:</label>
+            <div class="layui-input-inline">
+                <input type="text" class="layui-input" name="zrz" id="zrz" lay-filter="zrz" lay-verify="required"
+                       lay-reqtext="责任者不能为空" placeholder="请输入责任者">
+            </div>
+            <label class="layui-form-label">主办部门:</label>
+            <div class="layui-input-inline">
+                <input type="text" class="layui-input" name="zbbm" id="zbbm" lay-filter="zbbm" placeholder="请输入主办部门">
+            </div>
+            <label class="layui-form-label">协办部门:</label>
+            <div class="layui-input-inline">
+                <input type="text" class="layui-input" name="xbbm" id="xbbm" lay-filter="xbbm" placeholder="请输入协办部门">
+            </div>
+        </div>
+
+        <div class="layui-form-item">
+            <label class="layui-form-label">存放位置描述:</label>
+            <div class="layui-input-inline" style="width: 344px;">
+                <input type="text" class="layui-input" name="cfwzms" id="cfwzms" lay-filter="cfwzms"
+                       placeholder="请输入存在位置描述">
+            </div>
+
+            <label class="layui-form-label">载体数量:</label>
+            <div class="layui-input-inline">
+                <input type="number" class="layui-input" name="ztsl" id="ztsl" lay-filter="ztsl" placeholder="请输入载体数量"
+                       min="0">
+            </div>
+
+            <label class="layui-form-label">主题词:</label>
+            <div class="layui-input-inline">
+                <input type="number" class="layui-input" name="ztc" id="ztc" lay-filter="ztc" placeholder="请输入主题词">
+            </div>
+        </div>
+
+        <div class="layui-form-item">
+            <label class="layui-form-label">备注:</label>
+            <div class="layui-input-inline" style="width: 834px;">
+                <textarea class="layui-textarea" name="bz" id="bz" placeholder="请输入备注"></textarea>
+            </div>
+        </div>
+
+
+        <div class="layui-form-item">
+            <button class="layui-btn layui-btn"
+                    id="cancel"
+                    style="background-color: white;color:#1E9FFF;border: 1px solid #1E9FFF">取消
+            </button>
+            <button class="layui-btn" lay-submit lay-filter="zj" style="background-color: #f7b374">追加</button>
+            <button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">保存</button>
         </div>
     </div>
 </div>
@@ -65,6 +209,7 @@
         let id = $('#id').val(),
             mlCode = $('#mlCode').val()
         mlId = $('#mlId').val()
+        let bgqxappend = false;
         /**方-------------------------------法-------------------------------定-------------------------------义*/
 
         /** 初始化日期控件*/
@@ -79,13 +224,36 @@
                 elem: '#wjxcsj',
                 type: 'date',
                 trigger: 'click',
-                done: (value, date) => {
-                    console.log(value)
-                    console.log(date)
+                done: function (value, date) {
+                    let year = parseInt(value.substring(0, 4))
+                    let bgqx = $("#bgqx").val()
+                    if (bgqx) {
+                        switch (bgqx) {
+                            case '005':
+                            case 'D10':
+                                year += 10
+                                $("#wjdqsj").val(year + value.substring(4))
+                                break;
+                            case '004':
+                            case 'D30':
+                                year += 30
+                                $("#wjdqsj").val(year + value.substring(4))
+                                break;
+                            default:
+                                return;
+                        }
+                    }
                 }
             });
 
             laydate.render({
+                elem: '#gdrq',
+                type: 'date',
+                trigger: 'click',
+                value: new Date()
+            });
+
+            laydate.render({
                 elem: '#wjdqsj',
                 type: 'date',
                 trigger: 'click'
@@ -152,100 +320,92 @@
                     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) {
+        let save = function (data, method) {
             http.post(id == '' ? 'archive/archive/insert' : 'archive/archive/update', data, true, function (res) {
                 if (res.code == 200) {
                     let index = layer.alert('保存成功!', {
                         title: id == '' ? '添加' : '修改' + '信息'
                     }, function () {
-                        // 关闭弹出层
+                        if (method == 'save') {
+                            // 关闭弹出层
+                            let iframeIndex = parent.layer.getFrameIndex(window.name);
+                            parent.layer.close(iframeIndex);
+                        }
                         layer.close(index);
-                        let iframeIndex = parent.layer.getFrameIndex(window.name);
-                        parent.layer.close(iframeIndex);
                     });
                 }
             })
         }
 
+        let getJh = function () {
+            http.get('archive/archive/getJH', {
+                    code: mlCode
+                }, false, function (res) {
+                    if (res.code == 200) {
+                        if (res.data) {
+                            $("#jh").val(res.data)
+                        } else {
+                            $("#jh").val(1)
+                        }
+                    }
+                }
+            )
+        }
+
         let loadDictSelect = function () {
-            switch (mlCode) {
-                case 'WS':
-                    $('#mlh-container').hide()
-                    break;
-                case 'KU':
-                    $("#hsdwdh-container").show()
-                    break;
-                case 'KJ':
-                    $("#xmdh-container").show()
-                    break;
-            }
+
+            http.get('system/archivesTree/selectParentByCode',{
+                code: mlCode
+            },false,res => {
+                if(res.code == 200){
+                    let html = ''
+                    switch (res.data.code) {
+                        case 'KU':
+                            html += ' <label class="layui-form-label required" id="hsdwdh_label">核算单位代号:</label>\n' +
+                                '        <div class="layui-input-inline" style="width: 540px;" id="hsdwdh_input">\n' +
+                                '            <input type="text" class="layui-input" name="hsdwdh" id="hsdwdh" placeholder="请输入核算单位代号" lay-filter="hsdwdh"\n' +
+                                '                   lay-verify="required" lay-reqtext="核算单位代号不能为空">\n' +
+                                '        </div>'
+                            break;
+                        case 'KJ':
+                            html += '<label class="layui-form-label required" id="xmdh_label" >项目代号:</label>\n' +
+                                '        <div class="layui-input-inline" style="width: 540px;" id="xmdh_input" >\n' +
+                                '            <input type="text" class="layui-input" name="xmdh" id="xmdh" placeholder="请输入项目代号" lay-filter="xmldh"\n' +
+                                '                   lay-verify="required" lay-reqtext="项目代号不能为空">\n' +
+                                '        </div>'
+                            break;
+                    }
+                    $('#hide_div').append(html)
+
+                    let jhLable = '';
+                    switch (res.data.code) {
+                        case 'SJ':
+                        case 'MT':
+                        case 'SW':
+                        case 'WS':
+                            jhLable = '件号:'
+                            break;
+                        case 'KU':
+                        case 'KJ':
+                        case 'ZY':
+                            jhLable = '卷号:'
+                            break;
+                        case 'YX':
+                            break;
+                        case 'WS':
+                            jhLable = '张号/盘号:'
+                            break;
+                        default:
+                            jhLable = '卷(件)号:'
+                            break;
+                    }
+
+                    $("#jh_label").text(jhLable)
+                }
+            })
 
             http.get('system/archivesTree/selectChildById', {
                 id: mlId
@@ -277,19 +437,64 @@
                 $("#mj").append(html)
                 form.render();//菜单渲染 把内容加载进去
             })
+        }
 
+        let generateDh = function () {
+            var d = {};
+            var t = $('#add [name]').serializeArray();
+            $.each(t, function () {
+                d[this.name] = this.value;
+            });
+            d.sl = d.ml
+            d.ml = mlCode
+            http.post('archive/archive/generateDh', d, true, res => {
+                if (res.code === 200) {
+                    $("#dh").val(res.data)
+                }
+            })
+            // let data = {
+            //     qzh: $("#qzh").val(),
+            //     ml: mlCode,
+            //     sl: $("#ml").val(),
+            //     bgqx: $("#bgqx").val(),
+            //     jh: $("#jh").val(),
+            //     hsdwdh: $("#hsdwdh").val(),
+            //     xmdh: $("#xmdh").val(),
+            //     mlh: $("#mlh").val(),
+            //     gdnd: $("#gdnd").val()
+            // }
+            // console.log(data)
         }
 
         // 加载数据
         let initData = function () {
+            let adata = ''
             if (id != '') {
                 http.get('/archive/archive/selectByPrimaryKey', {
                     id: id
                 }, false, function (res) {
+                    adata = res.data
                     form.val("addDict", res.data);
                     form.render();
                 })
             }
+
+            if (!bgqxappend) {
+                let ml = $("#ml").val()
+                // 加载保管期限
+                http.get('system/dict/selectDictByCode', {code: ml === '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();//菜单渲染 把内容加载进去
+                })
+                bgqxappend = !bgqxappend
+            }
+            form.val("addDict", adata);
+            form.render();
+
         }
         /**事-------------------------------件-------------------------------绑-------------------------------定*/
         initDate()
@@ -298,27 +503,48 @@
         initData()
         //监听提交
         form.on('submit(saveBtn)', function (data) {
-            let icon = 'fa '
-            icon += data.field.icon
-            data.field.icon = icon
-            save(data.field)
+            save(data.field, 'save')
+        });
+
+
+        layui.$('#cancel').on('click', function () {
+            var index = parent.layer.getFrameIndex(window.name);
+            parent.layer.close(index);//关闭当前页
         });
 
+        //监听提交
+        form.on('submit(zj)', function (data) {
+            save(data.field, 'zj')
+            getJh()
+            generateDh()
+            $("#tm").val('')
+            $("#nrgs").val('')
+            $("#wjbh").val('')
+            $("#zrz").val('')
+            $("#bz").val('')
+            $("#ztsl").val('')
+            $("#ztc").val('')
+        });
 
         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();//菜单渲染 把内容加载进去
-            })
+            if (!bgqxappend) {
+                // 加载保管期限
+                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();//菜单渲染 把内容加载进去
+                })
+                bgqxappend = !bgqxappend
+            }
+
+            getJh()
         });
 
         form.on('select(bgqx)', function (data) {
-            console.log(data)
+            generateDh()
         });
 
     });

+ 171 - 0
src/main/resources/static/page/archive/editSecondary.html

@@ -0,0 +1,171 @@
+<!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-label {
+            padding-left: 0;
+        }
+
+        .layui-form-item {
+            text-align: center;
+        }
+
+    </style>
+</head>
+<body>
+<div class="layui-form layuimini-form" lay-filter="addDict" id="add" style="text-aglin:center">
+    <div class="layui-form-item">
+        <label class="layui-form-label required">顺序号:</label>
+        <div class="layui-input-block" style="">
+            <input id="id" name="id" type="hidden">
+            <input id="archive_id" name="archiveId" type="hidden">
+            <input type="text" class="layui-input" placeholder="请输入顺序号" name="sxh" id="sxh" lay-filter="sxh"
+                   lay-verify="required" lay-reqtext="顺序号不能为空" >
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label required">题名:</label>
+        <div class="layui-input-block" style="">
+            <input type="text" class="layui-input" placeholder="请输入题名" name="tm" id="tm" lay-filter="tm"
+                   lay-verify="required" lay-reqtext="题名不能为空" >
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label required">日期:</label>
+        <div class="layui-input-block" style="">
+            <input type="text" class="layui-input" placeholder="请选择日期" name="rq" id="rq" lay-filter="rq"
+                   lay-verify="required" lay-reqtext="日期不能为空" >
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label required">页号:</label>
+        <div class="layui-input-block" style="">
+            <input type="number" class="layui-input" placeholder="请输入页号" name="yh" id="yh" lay-filter="yh"
+                   lay-verify="required" lay-reqtext="页号不能为空" >
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">文号:</label>
+        <div class="layui-input-block" style="">
+            <input type="text" class="layui-input" placeholder="请输入文号" name="wh" id="wh" lay-filter="wh"
+                   lay-verify="required" lay-reqtext="文号不能为空" >
+        </div>
+    </div>
+
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">责任者:</label>
+        <div class="layui-input-block" style="">
+            <input type="text" class="layui-input" placeholder="请输入责任者" name="zrz" id="zrz" lay-filter="zrz"
+                   lay-verify="required" lay-reqtext="责任者不能为空" >
+        </div>
+    </div>
+
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">备注:</label>
+        <div class="layui-input-block" style="">
+            <textarea class="layui-textarea" name="bz" placeholder="请输入备注">
+            </textarea>
+        </div>
+    </div>
+
+
+    <div class="layui-form-item">
+        <button class="layui-btn layui-btn"
+                id="cancel"
+                style="background-color: white;color:#1E9FFF;border: 1px solid #1E9FFF">取消
+        </button>
+        <!--        <button class="layui-btn" lay-submit lay-filter="zj" style="background-color: #f7b374">追加</button>-->
+        <button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">保存</button>
+    </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,
+            $ = layui.$,
+            laydate = layui.laydate
+            id = $('#id').val(),
+            archive_id = $("#archive_id").val();
+        /**方-------------------------------法-------------------------------定-------------------------------义*/
+
+        /** 初始化日期控件*/
+        let initDate = function () {
+            laydate.render({
+                elem: '#rq',
+                type: 'date',
+                trigger: 'click',
+            });
+
+        }
+
+        // 保存方法
+        let save = function (data, method) {
+            http.post(id == '' ? 'secondary/archive/insert' : 'secondary/archive/update', data, true, function (res) {
+                if (res.code == 200) {
+                    let index = layer.alert('保存成功!', {
+                        title: id == '' ? '添加' : '修改' + '信息'
+                    }, function () {
+                        if (method == 'save') {
+                            // 关闭弹出层
+                            let iframeIndex = parent.layer.getFrameIndex(window.name);
+                            parent.layer.close(iframeIndex);
+                        }
+                        layer.close(index);
+                    });
+                }
+            })
+        }
+
+
+        // 加载数据
+        let initData = function () {
+            let adata = ''
+            if (id != '') {
+                http.get('secondary/archive/selectByPrimaryKey', {
+                    id: id
+                }, false, function (res) {
+                    adata = res.data
+                    form.val("addDict", res.data);
+                    form.render();
+                })
+            }
+        }
+        /**事-------------------------------件-------------------------------绑-------------------------------定*/
+        initDate()
+        initData()
+        //监听提交
+        form.on('submit(saveBtn)', function (data) {
+            save(data.field, 'save')
+        });
+
+
+        layui.$('#cancel').on('click', function () {
+            var index = parent.layer.getFrameIndex(window.name);
+            parent.layer.close(index);//关闭当前页
+        });
+
+
+    });
+</script>
+</body>
+</html>

+ 78 - 51
src/main/resources/static/page/archive/fileList.html

@@ -14,17 +14,18 @@
                 <div class="layui-form-item">
                     <div class="layui-inline">
                         <input type="hidden" id="archive_id" class="layui-input">
+                        <input type="hidden" id="fileType" name="fileType" 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>
+<!--                        <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>
@@ -36,6 +37,9 @@
 <!--  头部工具栏  -->
 <script type="text/html" id="toolbar">
     <!--    <button class="layui-btn layui-btn-sm" lay-event="upload" id="upload">上传</button>-->
+<!--    <a class="layui-btn layui-btn-sm" lay-even="aaa" >上传</a>-->
+    <a class="layui-btn layui-btn-sm" lay-event="upload">上传</a>
+
 </script>
 <!-- 操作列 -->
 <script type="text/html" id="operating">
@@ -56,6 +60,7 @@
             $ = layui.jquery;
 
         let archive_id = $("#archive_id").val()
+        let fileType = $("#fileType").val()
 
         /**方-------------------------------法-------------------------------定-------------------------------义*/
             //数据加载方法
@@ -65,16 +70,18 @@
                     elem: '#user-table',
                     url: 'archive/archiveFile/selectByPage',
                     toolbar: '#toolbar', //开启头部工具栏,并为其绑定左侧模板
-                    defaultToolbar: ['filter', 'exports', 'print'],
+                    // defaultToolbar: ['filter', 'exports', 'print'],
                     title: '附件表',
-                    toolbar: '#toolbar',
+                    limit: 15,
+                    limits: [15, 30, 45, 60],
                     page: true,
                     request: {
                         pageName: 'pageNum',
                         limitName: 'pageSize'
                     },
                     where: {
-                        archiveId: archive_id
+                        archiveId: archive_id,
+                        fileType: fileType
                     },
                     response: {
                         statusCode: 200 //重新规定成功的状态码为 200,table 组件默认为 0
@@ -97,7 +104,24 @@
                         {
                             field: 'fileSize', title: '文件大小',
                             templet: function (rv) {
-                                return (rv.fileSize / (1 * 1024 * 1024)).toFixed(2) + 'MB'
+                                let size = rv.fileSize
+                                let data = ''
+                                if (size < 0.1 * 1024) { //如果小于0.1KB转化成B
+                                    data = size.toFixed(2) + "B";
+                                } else if (size < 0.1 * 1024 * 1024) {//如果小于0.1MB转化成KB
+                                    data = (size / 1024).toFixed(2) + "KB";
+                                } else if (size < 0.1 * 1024 * 1024 * 1024) { //如果小于0.1GB转化成MB
+                                    data = (size / (1024 * 1024)).toFixed(2) + "MB";
+                                } else { //其他转化成GB
+                                    data = (size / (1024 * 1024 * 1024)).toFixed(2) + "GB";
+                                }
+                                var sizestr = data + "";
+                                var len = sizestr.indexOf("\.");
+                                var dec = sizestr.substr(len + 1, 2);
+                                if (dec == "00") {//当小数点后为00时 去掉小数部分
+                                    return sizestr.substring(0, len) + sizestr.substr(len + 3, 2);
+                                }
+                                return sizestr;
                             }
                         },
                         {field: 'createTime', title: '上传时间'},
@@ -122,57 +146,49 @@
             });
         }
 
-        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
-                        })
-                    }
+        let openUpload = function () {
+            var index = layer.open({
+                title: '预约借阅',
+                type: 2,
+                shade: 0.2,
+                maxmin: true,
+                shadeClose: true,
+                area: ['600px', '400px'],
+                content: './upload.html',
+                success: function (layero, index) {
+                    var body = layer.getChildFrame('body', index);
+                    body.find("#archive_id").val(archive_id);
+                    body.find("#fileType").val(fileType);
+                },
+                end: function () {
+                    renderTable()
                 }
             });
-            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
-            });
+            if (data.fileName.substring(data.fileName.indexOf('.') + 1) == 'pdf'){
+                layer.open({
+                    type: 2,
+                    area: ['100%', '100%'],
+                    fixed: false, //不固定
+                    maxmin: true,
+                    content: data.filePath + '/' + data.fileName
+                });
+            }else {
+                layer.msg('只支持预览pdf格式文件',{
+                    icon: 2
+                })
+            }
         }
 
-        initUpload()
+        // initUpload()
         renderTable()
 
-
         //表格操作栏
         table.on('tool(table)', function (obj) {
             let data = obj.data;
-            console.log(obj)
             switch (obj.event) {
                 case 'delete':
                     deleteFile(data.id);
@@ -182,5 +198,16 @@
                     break;
             }
         });
+
+
+        table.on('toolbar(table)', function (obj) {
+            let data = obj.data;
+            switch (obj.event){
+                case 'upload':
+                    openUpload();
+                    break;
+            }
+        });
+
     });
 </script>

+ 174 - 31
src/main/resources/static/page/archive/list.html

@@ -24,18 +24,38 @@
                         <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="请输入目录号"
+                        <input type="text" id="gdnd" name="gdnd" lay-filter="gdnd" placeholder="请输入归档年度"
                                class="layui-input">
                     </div>
                     <div class="layui-inline">
+                        <select name="mj" id="mj">
+                            <option value="">请选择密级</option>
+                        </select>
+                    </div>
+                    <div class="layui-inline">
+                        <input type="text" id="ztc" name="ztc" lay-filter="ztc" placeholder="请输入关键字"
+                               class="layui-input">
+                    </div>
+
+                    <div class="layui-inline">
                         <select name="bgqx" id="bgqx">
                             <option value="">请选择保管期限</option>
                         </select>
                     </div>
                     <div class="layui-inline">
+                        <input type="checkbox" name="all" lay-skin="primary" title="全文检索" checked="">
+                        <div class="layui-unselect layui-form-checkbox layui-form-checked" lay-skin="primary">
+                            <span>全文检索</span>
+                            <i class="layui-icon layui-icon-ok"></i>
+                        </div>
+                    </div>
+                    <div class="layui-inline">
                         <button id="btnSearch" lay-submit lay-filter="search" class="layui-btn icon-btn"><i
                                 class="layui-icon"></i>搜索
                         </button>
+                        <button id="resultSearch" lay-submit lay-filter="resultSearch" class="layui-btn icon-btn"><i
+                                class="layui-icon"></i>结果中搜索
+                        </button>
                     </div>
                 </div>
             </div>
@@ -49,7 +69,7 @@
 </html>
 
 <!--  头部工具栏  -->
-<button type="button" class="layui-btn layui-btn-sm" id="importFile" value="导入隐藏按钮" style="display: none"/>
+<button type="button" class="layui-btn layui-btn-sm" id="import" value="导入隐藏按钮" style="display: none"/>
 <script type="text/html" id="toolbar">
 </script>
 
@@ -60,6 +80,13 @@
 <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>
+
+    let params;
+
+    function GetValue(data) {
+        params = data
+    }
+
     layui.use(['table', 'http', 'laydate', 'form', 'tree', 'upload', 'url'], function () {
         /**变-------------------------------量-------------------------------定-------------------------------义*/
 
@@ -84,10 +111,10 @@
         let initUpload = function () {
             var loading;
             upload.render({
-                elem: '#importFile'
-                , url: http.requestUrl + 'archives/user/import' //改成您自己的上传接口
+                elem: '#import'
+                , url: http.requestUrl + 'archive/archive/import' //改成您自己的上传接口
                 , headers: {
-                    accessToken: layui.data('accessToken').accessToken
+                    accessToken: (layui.data('auth').data ? layui.data('auth').data.accessToken : '') || ''
                 }
                 , accept: 'file' //普通文件
                 , acceptMime: '.xls,.xlsx'
@@ -97,9 +124,8 @@
                 }
                 , done: function (res) {
                     if (res.code == 200) {
-                        layer.msg('导入成功');
+                        layer.msg('成功导入' + res.data + '条数据');
                         renderTable();
-                        // partyTable = res.data.path
                     } else {
                         layer.alert(res.msg, {icon: 2, title: '导入错误'})
                     }
@@ -111,25 +137,36 @@
 
 
         let initSelect = function () {
-            //职级
-            http.get('system/dict/selectDictByCode', {code: 'ZHIJI'}, false, function (res) {
+            initBgqx()
+            // 加载密集
+            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>'
                 }
-                $("#duty").append(html)
+                $("#mj").append(html)
                 form.render();//菜单渲染 把内容加载进去
             })
+        }
 
-            //政治面貌
-            http.get('system/dict/selectDictByCode', {code: 'ZHENGZHIMIANMAO'}, false, function (res) {
-                let html = '';
-                for (let i in res.data) {
-                    html += '<option value="' + res.data[i].dictCode + '">' + res.data[i].dictName + '</option>'
+        //借阅
+        let openBorrow = function (data) {
+            var index = layer.open({
+                title: '预约借阅',
+                type: 2,
+                shade: 0.2,
+                maxmin: true,
+                shadeClose: true,
+                area: ['800px', '800px'],
+                content: '../borrow/reserve.html',
+                success: function (layero, index) {
+                    var body = layer.getChildFrame('body', index);
+                    body.find("#archive_id").val(data.id);
+                },
+                end: function () {
+                    renderTable()
                 }
-                $("#political").append(html)
-                form.render();//菜单渲染 把内容加载进去
-            })
+            });
         }
 
         // 加载组织架构
@@ -170,6 +207,7 @@
                         var data = obj.data;  //获取当前点击的节点数据
                         searchParam.ml = data.code
                         searchParam.mlId = data.id
+                        initBgqx()
                         renderTable()
                     }
                 });
@@ -184,8 +222,21 @@
             })
         }
 
+        let initBgqx = function () {
+            http.get('system/dict/selectDictByCode', {code: searchParam.ml === '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").html('<option value="">请选择保管期限</option>')
+                $("#bgqx").append(html)
+                form.render();//菜单渲染 把内容加载进去
+            })
+        }
+
         //数据加载方法
         let renderTable = function () {
+            searchParam.params = params
             // 加载表格数据
             table.render({
                 elem: '#user-table',
@@ -193,7 +244,8 @@
                 toolbar: '#toolbar', //开启头部工具栏,并为其绑定左侧模板
                 defaultToolbar: ['filter', 'exports', 'print'],
                 title: '用户数据表',
-                toolbar: '#toolbar',
+                limit: 15,
+                limits: [15, 30, 45, 60],
                 page: true,
                 request: {
                     pageName: 'pageNum',
@@ -212,19 +264,20 @@
                     }
                 },
                 done: function (res, curr, count) {
+                    params = {}
                     // $('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', title: '归档年度'},
-                    {field: 'zrz', title: '责任者'},
-                    {field: 'mjText', title: '密级'},
-                    {field: 'wjxcsj', title: '文件形成时间'},
-                    {field: 'wjdqsj', title: '文件到期时间'},
-                    {templet: '#operating', width: 240, align: 'center', title: '操作'}
+                    {field: 'tm', title: '题名', width: 700},
+                    {field: 'gdnd', title: '归档年度', width: 120},
+                    {field: 'zrz', title: '责任者', width: 120},
+                    {field: 'mjText', title: '密级', width: 80},
+                    {field: 'wjxcsj', title: '文件形成时间', width: 120},
+                    {field: 'wjdqsj', title: '文件到期时间', width: 120},
+                    {templet: '#operating', width: 350, align: 'center', title: '操作', fixed: 'right'}
                 ]]
             });
         }
@@ -251,7 +304,46 @@
             });
         }
 
+        let advancedSearch = function () {
+            var index = layer.open({
+                title: '高级检索',
+                type: 2,
+                shade: 0.2,
+                maxmin: true,
+                shadeClose: true,
+                area: ['55%', '80%'],
+                content: './advancedSearch.html',
+                success: function (layero, index) {
+                    var body = layer.getChildFrame('body', index);
+                },
+                end: function () {
+                    renderTable()
+                }
+            });
+        }
+
         //打开附件列表
+        let openEnclosure = 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);
+                    body.find("#fileType").val(1);
+                },
+                end: function () {
+                    renderTable()
+                }
+            });
+        }
+
+        //打开文件列表
         let openFiles = function (data) {
             var index = layer.open({
                 title: '附件',
@@ -264,6 +356,29 @@
                 success: function (layero, index) {
                     var body = layer.getChildFrame('body', index);
                     body.find("#archive_id").val(data.id);
+                    body.find("#fileType").val(0);
+                },
+                end: function () {
+                    renderTable()
+                }
+            });
+        }
+
+
+        //打开文件列表
+        let openSecondary = function (data) {
+            var index = layer.open({
+                title: '卷内目录',
+                type: 2,
+                shade: 0.2,
+                maxmin: true,
+                shadeClose: true,
+                area: ['100%', '100%'],
+                content: './secondaryList.html',
+                success: function (layero, index) {
+                    var body = layer.getChildFrame('body', index);
+                    body.find("#archive_id").val(data.id);
+                    body.find("#dh").val(data.dh);
                 },
                 end: function () {
                     renderTable()
@@ -361,6 +476,10 @@
             });
         }
 
+        let download = function () {
+            window.open("/template/导入模板.xlsx", "_blank")
+        }
+
         let exportUser = function (data) {
             var url = http.requestUrl + 'archives/user/exportWord?userId=' + data.id;
             var xhr = new XMLHttpRequest();
@@ -391,10 +510,11 @@
         }
         /**事-------------------------------件-------------------------------绑-------------------------------定*/
 
-        // initSelect()
         // initUpload()
         loadTree()
+        initSelect()
         renderTable()
+        initUpload()
 
 
         //表格操作栏
@@ -413,9 +533,18 @@
                 case 'files':
                     openFiles(data)
                     break;
+                case 'enclosure':
+                    openEnclosure(data)
+                    break;
+                case 'secondary':
+                    openSecondary(data)
+                    break;
                 case 'export':
                     exportUser(data);
                     break;
+                case 'borrowing':
+                    openBorrow(data);
+                    break;
             }
         });
 
@@ -430,15 +559,29 @@
                     batchDel();
                     break;
                 case 'import':
-                    $("#importFile").click();
+                    $("#import").click();
+                    break;
+                case 'advancedSearch':
+                    advancedSearch();
+                    break;
+                case 'download':
+                    download();
                     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
+
+            // if (data.field.dh)
+            //     if (data.field.mlh)
+            //         if (data.field.bgqx)
+            //             if (data.field.mj)
+            //                 if (data.field.gjz)
+            searchParam.dh = data.field.dh
+            searchParam.mlh = data.field.mlh
+            searchParam.bgqx = data.field.bgqx
+            searchParam.mj = data.field.mj
+            searchParam.ztc = data.field.ztc
             renderTable()
         })
     });

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

@@ -10,54 +10,64 @@
 <div class="layuimini-container">
     <div class="layuimini-main">
         <div>
+            <div class="layui-form toolbar">
+                <input type="hidden" id="dh" name="dh" class="layui-input">
+                <input id="archive_id" name="archiveId" type="hidden">
+            </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>-->
+    <a class="layui-btn layui-btn-xs" lay-event="add">新增</a>
 </script>
-
 <!-- 操作列 -->
 <script type="text/html" id="operating">
-</script>
+    <!--    <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-xs" lay-event="update">修改</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'], function () {
+    layui.use(['table', 'http', 'form', 'upload'], function () {
         /**变-------------------------------量-------------------------------定-------------------------------义*/
 
         var table = layui.table,
-            laydate = layui.laydate,
             http = layui.http,
             form = layui.form,
+            upload = layui.upload,
             $ = layui.jquery;
 
-        let searchData = {}
+        let archive_id = $("#archive_id").val()
 
         /**方-------------------------------法-------------------------------定-------------------------------义*/
-
-
-        http.getRoleButton(24)
-         //数据加载方法
+            //数据加载方法
         let renderTable = function () {
                 // 加载表格数据
                 table.render({
                     elem: '#user-table',
-                    url: 'archives/dept/selectBureausByPage',
+                    url: 'secondary/archive/selectByPage',
                     toolbar: '#toolbar', //开启头部工具栏,并为其绑定左侧模板
                     defaultToolbar: ['filter', 'exports', 'print'],
-                    title: '用户数据表',
+                    title: '附件表',
+                    toolbar: '#toolbar',
+                    limit: 15,
+                    limits: [15, 30, 45, 60],
                     page: true,
                     request: {
                         pageName: 'pageNum',
                         limitName: 'pageSize'
                     },
-                    where: searchData,
+                    where: {
+                        archiveId: archive_id,
+                    },
                     response: {
                         statusCode: 200 //重新规定成功的状态码为 200,table 组件默认为 0
                     },
@@ -69,54 +79,37 @@
                             "data": res.data.list
                         }
                     },
-                    done: function(res, curr, count) {
-                        // $('th').css({'background-color': '#1aa094', 'color': '#fff','font-weight':'bold'})
+                    done: function (res, curr, count) {
+                        // $('th').css({'background-color': '#1aa094', 'color': '#fff', 'font-weight': 'bold'})
                     },
                     cols: [[
-                        {type: 'numbers'},
-                        {field: 'deptName', title: '局办名称'},
-                        {field: 'deptAlias', title: '局办别名'},
-                        {field: 'deptType', title: '局办类型',
-                            templet: function(d) {
-                                return d.deptType == 0 ? '局办' : d.deptType == 1 ? '直属机构' : '';
+                        // {type: 'numbers'},
+                        // {field: 'originalFileName', title: '原文件名'},
+                        {
+                            field: 'dh', title: '档号', width: 250, templet: function (rv) {
+                                return $('#dh').val()
                             }
                         },
-                        {templet: '#operating', width: 300, align: 'center', title: '操作'}
+                        {field: 'sxh', title: '顺序'},
+                        {field: 'wh', title: '文号'},
+                        {field: 'zrz', title: '责任者'},
+                        {field: 'tm', title: '题名'},
+                        {field: 'yh', title: '页号'},
+                        {field: 'bz', title: '备注'},
+                        {templet: '#operating', width: 240, align: 'center', title: '操作'}
                     ]]
                 });
 
             }
 
-        //添加方法
-        let addDict = function () {
-            var index = layer.open({
-                title: '添加局办',
-                type: 2,
-                shade: 0.2,
-                maxmin:true,
-                shadeClose: true,
-                area: ['100%', '100%'],
-                content: './addBureaus.html',
-                end: function () {
-                    renderTable()
-                }
-            });
-        }
-
-        //删除方法
-        let deleteDict = function (id) {
+        let deleteFile = function (id) {
             layer.confirm('真的删除行么', function (index) {
-                http.delete('archives/dept/delete',{id: id},true,function (res) {
-                    if (res.code == 200){
+                http.delete('secondary/archive/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()
                 })
@@ -124,19 +117,18 @@
             });
         }
 
-        //修改方法
-        let updateDict = function (id) {
-            layer.open({
-                title: '修改局办',
+        let add = function () {
+            var index = layer.open({
+                title: '添加卷内目录',
                 type: 2,
                 shade: 0.2,
-                maxmin:true,
+                maxmin: true,
                 shadeClose: true,
-                area: ['100%', '100%'],
-                content: './addBureaus.html',
-                success: function(layero, index){
-                    var body=layer.getChildFrame('body',index);
-                    body.find("#id").val(id);
+                area: ['500px', '550px'],
+                content: './editSecondary.html',
+                success: function (layero, index) {
+                    var body = layer.getChildFrame('body', index);
+                    body.find("#archive_id").val(archive_id);
                 },
                 end: function () {
                     renderTable()
@@ -144,43 +136,52 @@
             });
         }
 
-        let up = function(id){
-            http.get('archives/dept/upMove',{id:id},true,function (res) {
-                if(res.code == 200){
-                    renderTable()
-                }
-            })
-        }
 
-        let down = function(id) {
-            http.get('archives/dept/downMove',{id:id},true,function (res) {
-                if(res.code == 200){
+        let update = function (data) {
+            var index = layer.open({
+                title: '修改卷内目录',
+                type: 2,
+                shade: 0.2,
+                maxmin: true,
+                shadeClose: true,
+                area: ['500px', '550px'],
+                content: './editSecondary.html',
+                success: function (layero, index) {
+                    var body = layer.getChildFrame('body', index);
+                    body.find("#archive_id").val(archive_id);
+                    body.find("#id").val(data.id)
+                },
+                end: function () {
                     renderTable()
                 }
-            })
+            });
         }
-        /**事-------------------------------件-------------------------------绑-------------------------------定*/
 
-        renderTable()
-
-        //表格操作栏
-        table.on('tool(table)', function (obj) {
-            let data = obj.data;
-            switch (obj.event) {
-                case 'delete': deleteDict(data.id); break;
-                case 'update': updateDict(data.id); break;
-                case 'up': up(data.id); break;
-                case 'down': down(data.id); break;
-            }
-        });
 
+        renderTable()
 
         //头部工具栏监听
         table.on('toolbar(table)', function (obj) {
             switch (obj.event) {
-                case 'add': addDict(); break;
+                case 'add':
+                    add();
+                    break;
             }
         })
 
+
+        //表格操作栏
+        table.on('tool(table)', function (obj) {
+            let data = obj.data;
+            console.log(obj)
+            switch (obj.event) {
+                case 'delete':
+                    deleteFile(data.id);
+                    break;
+                case 'update':
+                    update(data);
+                    break;
+            }
+        });
     });
 </script>

+ 149 - 0
src/main/resources/static/page/archive/upload.html

@@ -0,0 +1,149 @@
+<!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="upload">
+    <div class="layui-form-item">
+        <label class="layui-form-label">卷内目录:</label>
+        <div class="layui-input-block">
+            <input type="hidden" id="archive_id" name="archiveId" class="layui-input">
+            <input type="hidden" id="fileType" name="fileType" class="layui-input">
+            <select class="layui-select" name="secondaryArchiveId" id="secondaryArchiveId" lay-search="">
+                <option value="">直接选择或搜索选择</option>
+            </select>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <div class="layui-input-block">
+            <div class="layui-upload-drag" id="startUpload" style="width: 358px;height: 100px">
+                <i class="layui-icon"></i>
+                <p>点击上传,或将文件拖拽到此处</p>
+                <!--                <div class="layui-hide" id="uploadDemoView">-->
+                <!--                    <hr>-->
+                <!--                    <img src="" alt="上传成功后渲染" style="max-width: 196px">-->
+                <!--                </div>-->
+            </div>
+            <button class="layui-hide" id="uploadBtn"></button>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <div class="layui-input-block">
+            <button class="layui-btn layui-btn-normal" lay-submit lay-filter="save">上传</button>
+        </div>
+    </div>
+</div>
+</body>
+</html>
+<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', 'upload', 'http'], () => {
+
+        let archive_id = layui.$("#archive_id").val()
+        let fileType = layui.$("#fileType").val()
+        let secondaryArchiveId = ''
+        let selectFile = false;
+
+        let initUpload = function () {
+            //指定允许上传的文件类型
+            layui.upload.render({
+                elem: '#startUpload'
+                , url: layui.http.requestUrl + 'archive/archiveFile/upload' //改成您自己的上传接口
+                , headers: {
+                    accessToken: (layui.data('auth').data ? layui.data('auth').data.accessToken : '') || ''
+                }
+                , data: {
+                    archiveId: () => {
+                        return archive_id
+                    },
+                    fileType: () => {
+                        return fileType
+                    },
+                    secondaryArchiveId: () => {
+                        return secondaryArchiveId
+                    }
+                }
+                , multiple: true
+                , auto: false
+                , bindAction: '#uploadBtn'
+                , accept: 'file' //普通文件
+                , exts: 'pdf|tif'
+                , choose: function (obj) {
+                    selectFile = true;
+                }
+                , done: function (res) {
+                    if (res.code === 200) {
+                        layer.msg('上传成功', {
+                            icon: 1
+                        },function () {
+                            // 关闭弹出层
+                            let iframeIndex = parent.layer.getFrameIndex(window.name);
+                            parent.layer.close(iframeIndex);
+                        })
+                    } else {
+                        layer.msg(res.msg, {
+                            icon: 2
+                        })
+                    }
+                }
+            });
+            console.log('上传组件加载完成')
+        }
+
+        let initJNML = function () {
+            layui.http.get('secondary/archive/selectByArchiveId', {
+                archiveId: archive_id
+            }, true, res => {
+                if (res.code === 200) {
+                    let html = '';
+                    for (let i = 0; i < res.data.length; i++) {
+                        let item = res.data[i]
+                        html += '<option value="' + item.id + '">' + item.tm + '</option>'
+                    }
+                    layui.$("#secondaryArchiveId").append(html)
+                    layui.form.render()
+                }
+            })
+        }
+
+        // 提交
+        layui.form.on('submit(save)', function (data) {
+            if (!selectFile) {
+                layui.layer.msg('未选择文件', {
+                    icon: 2
+                })
+                return;
+            }
+            secondaryArchiveId = data.field.secondaryArchiveId
+            layui.layer.msg('正在上传,请稍等', {
+                icon: '3',
+            }, function () {
+                layui.$("#uploadBtn").click()
+            })
+
+        });
+
+
+        initJNML()
+        initUpload()
+
+    })
+</script>

+ 124 - 94
src/main/resources/static/page/auditList/list.html

@@ -15,27 +15,24 @@
 <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>-->
+            <div class="layui-form toolbar">
+                <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="tm" name="tm" lay-filter="tm" placeholder="请输入题名"
+                           class="layui-input">
+                </div>
+                <div class="layui-inline" style="width: 300px">
+                    <input type="text" placeholder="请选择借阅时间" class="layui-input" readonly name="borrowTime"
+                           id="borrowTime">
+                </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>
             <table class="layui-hide" id="user-table" lay-filter="table"></table>
         </div>
         <div style="clear: both"></div>
@@ -85,91 +82,123 @@
 
             // http.getRoleButton(164)
 
-            //数据加载方法
+        let initDate = () => {
+                laydate.render({
+                    elem: '#borrowTime'
+                    , type: 'datetime'
+                    , range: true //或 range: '~' 来自定义分割字符
+                });
+            }
+
+        //数据加载方法
         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
+            // 加载表格数据
+            table.render({
+                elem: '#user-table',
+                url: 'borrow/archiveBorrow/selectArchiveBorrowHistory',
+                toolbar: '#toolbar', //开启头部工具栏,并为其绑定左侧模板
+                defaultToolbar: ['filter', 'exports', 'print'],
+                title: '用户数据表',
+                toolbar: '#toolbar',
+                limit: 15,
+                limits: [15, 30, 45, 60],
+                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: 110, templet(rv) {
+                            return rv.createTime.substring(0, 11)
+                        }
                     },
-                    parseData: function (res) {
-                        return {
-                            "code": res.code,
-                            "msg": res.msg,
-                            "count": res.data.total,
-                            "data": res.data.list
+                    {
+                        field: 'estimateReturnTime', title: '预计归还时间', width: 120, templet(rv) {
+                            return rv.estimateReturnTime.substring(0, 11)
                         }
                     },
-                    done: function (res, curr, count) {
-                        // $('th').css({'background-color': '#1aa094', 'color': '#fff', 'font-weight': 'bold'})
+                    // {
+                    //     field: 'returnTime', title: '实际归还时间', width: 120, templet(rv) {
+                    //         if (rv.borrowType == 1) {
+                    //             if (rv.returnTime) {
+                    //                 return rv.returnTime.substring(0, 11)
+                    //             } else {
+                    //                 return '暂未归还'
+                    //             }
+                    //         } else {
+                    //             return '无需归还'
+                    //         }
+                    //     }
+                    // },
+                    // {field: 'mjText', title: '密级'},
+                    {field: 'adminName', title: '借阅人', width: 110},
+                    {
+                        field: 'borrowType', title: '借阅方式', width: 90,
+                        templet: function (rv) {
+                            return rv.borrowType == 0 ? '打印借阅' : '原件借阅'
+                        }
                     },
-                    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>'
-                                    }
+                    // {
+                    //     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: '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: '操作'}
-                    ]]
-                });
-            }
+                        }
+                    },
+                    // {field: 'wjdqsj', title: '文件到期时间'},
+                    {templet: '#operating', align: 'center', title: '操作', width: 120}
+                ]]
+            });
+        }
 
         /**事-------------------------------件-------------------------------绑-------------------------------定*/
 
         renderTable()
 
+        initDate()
 
         //表格操作栏
         table.on('tool(table)', function (obj) {
@@ -260,9 +289,10 @@
         })
 
         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
+            searchParam.dh = data.field.dh
+            searchParam.tm = data.field.tm
+            searchParam.startTime = data.field.borrowTime.substring(0, data.field.borrowTime.indexOf(" - "))
+            searchParam.endTime = data.field.borrowTime.substring(data.field.borrowTime.indexOf(" - ") + " - ".length)
             renderTable()
         })
     });

+ 71 - 27
src/main/resources/static/page/borrow/list.html

@@ -17,22 +17,35 @@
         <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 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="gdnd" name="gdnd" lay-filter="gdnd" placeholder="请输入归档年度"
+                                   class="layui-input">
+                        </div>
+                        <div class="layui-inline">
+                            <select name="mj" id="mj">
+                                <option value="">请选择密级</option>
+                            </select>
+                        </div>
+                        <div class="layui-inline">
+                            <input type="text" id="ztc" name="ztc" lay-filter="ztc" 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>
             </div>
@@ -46,7 +59,6 @@
 </html>
 
 <!--  头部工具栏  -->
-<button type="button" class="layui-btn layui-btn-sm" id="importFile" value="导入隐藏按钮" style="display: none"/>
 <script type="text/html" id="toolbar">
 </script>
 
@@ -89,6 +101,8 @@
                 title: '用户数据表',
                 toolbar: '#toolbar',
                 page: true,
+                limit: 15,
+                limits: [15, 30, 45, 60],
                 request: {
                     pageName: 'pageNum',
                     limitName: 'pageSize'
@@ -113,12 +127,12 @@
                     {type: 'numbers'},
                     {field: 'dh', title: '档号', width: 240},
                     {field: 'tm', title: '题名'},
-                    {field: 'gdnd', width:100,title: '归档年度'},
-                    {field: 'zrz', width: 120,title: '责任者'},
+                    {field: 'gdnd', width: 100, title: '归档年度'},
+                    {field: 'zrz', width: 120, title: '责任者'},
                     // {field: 'mjText', title: '密级'},
-                    {field: 'wjxcsj',width:120, title: '文件形成时间'},
+                    {field: 'wjxcsj', width: 120, title: '文件形成时间'},
                     {
-                        field: 'originalStatus', title: '原件状态', width: 90,templet: function (rv) {
+                        field: 'originalStatus', title: '原件状态', width: 90, templet: function (rv) {
                             switch (rv.originalStatus) {
                                 case '可借阅':
                                     return '<span class="layui-badge layui-bg-orange">' + rv.originalStatus + '</span>';
@@ -128,7 +142,7 @@
                         }
                     },
                     // {field: 'wjdqsj', title: '文件到期时间'},
-                    {templet: '#operating',width:100, align: 'center', title: '操作'}
+                    {templet: '#operating', width: 140, align: 'center', title: '操作'}
                 ]]
             });
         }
@@ -144,10 +158,13 @@
                 case 'borrowing':
                     openBorrow(data);
                     break;
+                case 'register':
+                    register(data);
+                    break;
             }
         });
 
-        //打开附件列表
+        //借阅
         let openBorrow = function (data) {
             var index = layer.open({
                 title: '预约借阅',
@@ -155,7 +172,32 @@
                 shade: 0.2,
                 maxmin: true,
                 shadeClose: true,
-                area: ['100%', '100%'],
+                area: ['800px', '600px'],
+                content: './reserve.html',
+                success: function (layero, index) {
+                    var body = layer.getChildFrame('body', index);
+                    body.find("#archive_id").val(data.id);
+                    body.find("#name_container").hide()
+                    body.find("#dept_container").hide()
+                    body.find("#id_card_container").hide()
+                    body.find("#phone").hide()
+                },
+                end: function () {
+                    renderTable()
+                }
+            });
+        }
+
+
+        //借阅
+        let register = function (data) {
+            var index = layer.open({
+                title: '预约借阅',
+                type: 2,
+                shade: 0.2,
+                maxmin: true,
+                shadeClose: true,
+                area: ['800px', '600px'],
                 content: './reserve.html',
                 success: function (layero, index) {
                     var body = layer.getChildFrame('body', index);
@@ -184,9 +226,11 @@
         })
 
         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
+            searchParam.dh = data.field.dh
+            searchParam.mlh = data.field.mlh
+            searchParam.bgqx = data.field.bgqx
+            searchParam.mj = data.field.mj
+            searchParam.ztc = data.field.ztc
             renderTable()
         })
     });

+ 32 - 45
src/main/resources/static/page/borrow/reserve.html

@@ -20,86 +20,66 @@
 <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" id="name_container">
+        <label class="layui-form-label required">借阅人:</label>
+        <div class="layui-input-block">
+            <select class="layui-select" name="adminId" id="adminId" lay-search="">
+                <option value="">直接选择或搜索选择</option>
+            </select>
+        </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>
+            <input type="text" name="dh" placeholder="请输入档号" value="" lay-verify="required" 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>
+            <input type="text" name="tm" placeholder="请输入题名" value="" lay-verify="required" 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="归还时间不能为空"
+            <input type="text" name="estimateReturnTime" id="estimateReturnTime" lay-verify="required"
+                   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">
+            <select name="borrowType" id="bgqx" lay-verify="required" lay-reqtext="借阅方式不能为空">
                 <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>
+        <label class="layui-form-label">利用目的:</label>
         <div class="layui-input-block">
-            <input type="text" name="usePurpose" placeholder="请输入利用目的" value="" lay-reqtext="利用目的不能为空"
+            <input type="text" name="usePurpose" placeholder="请输入利用目的" value=""
                    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>
+            <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">
@@ -154,13 +134,20 @@
 
         // 加载下拉框
         let loadDictSelect = function () {
-
+            http.get('system/admin/selectAll', {}, false, function (res) {
+                let html = '';
+                for (let i in res.data) {
+                    html += '<option value="' + res.data[i].id + '">' + res.data[i].adminName + "(" + res.data[i].idCard + ")" +'</option>'
+                }
+                $("#adminId").append(html)
+                form.render();//菜单渲染 把内容加载进去
+            })
         }
 
 
-        function minDate(){
+        function minDate() {
             var now = new Date();
-            return now.getFullYear()+"-" + (now.getMonth()+1) + "-" + now.getDate();
+            return now.getFullYear() + "-" + (now.getMonth() + 1) + "-" + now.getDate();
         }
 
         // 加载数据
@@ -169,7 +156,7 @@
                 elem: '#estimateReturnTime',
                 type: 'datetime',
                 trigger: 'click',
-                min:minDate()
+                min: minDate()
             });
 
 

+ 0 - 107
src/main/resources/static/page/dept/addBureaus.html

@@ -1,107 +0,0 @@
-<!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">
-    <style>
-        body {
-            background-color: #ffffff;
-        }
-    </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" value="" class="layui-input">
-            <input type="text" id="deptName" name="deptName" lay-verify="required" lay-reqtext="局办名称不能为空" placeholder="请输入局办名称" value="" class="layui-input">
-        </div>
-    </div>
-    <div class="layui-form-item">
-        <label class="layui-form-label">局办别名</label>
-        <div class="layui-input-block">
-            <input type="text" name="deptAlias" id="deptAlias" lay-verify="" lay-reqtext="字典编码不能为空" placeholder="请输入局办别名" value="" class="layui-input">
-        </div>
-    </div>
-    <div class="layui-form-item">
-        <label class="layui-form-label">局办类型</label>
-        <div class="layui-input-inline" style="width: 540px">
-            <select name="deptType" id="deptType"  lay-reqtext="请选择局办类型" lay-verify="required" >
-                <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" min="0" name="deptSort" id="deptSort" placeholder="请输入局办排序" value="0" lay-verify="required|number" lay-reqtext="局办排序不能为空" class="layui-input">-->
-<!--            <div class="layui-form-mid layui-word-aux">数字越小越靠前</div>-->
-<!--        </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','strpy','treeSelect'], function () {
-        /**变-------------------------------量-------------------------------定-------------------------------义*/
-        var form = layui.form,
-            layer = layui.layer,
-            http = layui.http,
-            $ = layui.$;
-        let id = $('#id').val()
-        /**方-------------------------------法-------------------------------定-------------------------------义*/
-
-        // 保存方法
-        let save = function (data) {
-            data.parentId = -1
-            http.post(id == '' ? 'archives/dept/insert': 'archives/dept/update',data,true,function (res) {
-                if (res.code == 200){
-                    let index = layer.alert('保存成功!', {
-                        title: id == '' ? '添加':'修改' + '信息'
-                    }, function () {
-                        // 关闭弹出层
-                        layer.close(index);
-                        let iframeIndex = parent.layer.getFrameIndex(window.name);
-                        parent.layer.close(iframeIndex);
-                    });
-                }
-            })
-        }
-
-        // 加载数据
-        let initData = function () {
-            if(id != ''){
-                http.get('archives/dept/selectByPrimaryKey',{id: id},false,function (res) {
-                    form.val("addDict", res.data);
-                    form.render();
-                })
-            }
-        }
-        /**事-------------------------------件-------------------------------绑-------------------------------定*/
-
-        initData()
-        //监听提交
-        form.on('submit(saveBtn)', function (data) {
-            save(data.field)
-        });
-
-        $("#deptName").on("input",function(e){
-            var dictName = $(this).val();
-            $("#deptAlias").val(dictName)
-        })
-
-    });
-</script>
-</body>
-</html>

+ 0 - 0
src/main/resources/static/page/dept/addDepartment.html


Some files were not shown because too many files changed in this diff