Browse Source

档案四性检测基本流程

qianxb 2 years ago
parent
commit
55ec87262e
20 changed files with 687 additions and 13 deletions
  1. 5 0
      blade-common/src/main/java/org/springblade/common/constant/ArchiveConstant.java
  2. 35 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveExaminingReport.java
  3. 47 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveExaminingReportDetail.java
  4. 25 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchiveExaminingSocketVo.java
  5. 8 0
      blade-service/blade-archive/pom.xml
  6. 107 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveExaminingReportController.java
  7. 26 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveExaminingReportDetailController.java
  8. 3 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java
  9. 7 3
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveOfflineVersionInfoController.java
  10. 12 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExaminingReportDetailMapper.java
  11. 5 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExaminingReportDetailMapper.xml
  12. 12 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExaminingReportMapper.java
  13. 5 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExaminingReportMapper.xml
  14. 12 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveExaminingReportDetailService.java
  15. 17 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveExaminingReportService.java
  16. 17 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExaminingReportDetailServiceImpl.java
  17. 152 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExaminingReportImpl.java
  18. 35 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/socket/WebSocketConfig.java
  19. 142 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/socket/WebSocketServer.java
  20. 15 10
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java

+ 5 - 0
blade-common/src/main/java/org/springblade/common/constant/ArchiveConstant.java

@@ -2,4 +2,9 @@ package org.springblade.common.constant;
 
 public interface ArchiveConstant {
     String APPLICATION_WEATHER_NAME = "blade-archive";
+    String ARCHIVE_EXAMINING_AUTHENTICITY = "真实性";
+    String ARCHIVE_EXAMINING_INTEGRALITY = "完整性";
+    String ARCHIVE_EXAMINING_USABILITY = "可用性";
+    String ARCHIVE_EXAMINING_SECURITY = "安全性";
+    String ARCHIVE_EXAMINING_STANDARD = "依据<<电子档案检测一般要求:DA/T 70-2018>>";
 }

+ 35 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveExaminingReport.java

@@ -0,0 +1,35 @@
+package org.springblade.archive.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.time.LocalDateTime;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/4/20 17:29
+ **/
+@Data
+@TableName("u_archive_examining_report")
+@EqualsAndHashCode(callSuper = true)
+public class ArchiveExaminingReport extends BaseEntity {
+    @ApiModelProperty(value = "检测文档名称")
+    private String reportName;
+
+    @ApiModelProperty(value = "检测文档PDF路径")
+    private String reportPdfUrl;
+
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "检测时间")
+    private LocalDateTime examiningTime;
+    /**
+     * 项目ID
+     */
+    private Long projectId;
+
+}

+ 47 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveExaminingReportDetail.java

@@ -0,0 +1,47 @@
+package org.springblade.archive.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/4/21 15:03
+ **/
+@Data
+@TableName("u_archive_examining_report_detail")
+@EqualsAndHashCode(callSuper = true)
+public class ArchiveExaminingReportDetail extends BaseEntity {
+    @ApiModelProperty(value = "项目id")
+    private Long projectId;
+
+    @ApiModelProperty(value = "检测报告id")
+    private Long reportId;
+
+    @ApiModelProperty(value = "检测类型")
+    private String examiningType;
+
+    @ApiModelProperty(value = "检测项")
+    private String examiningItem;
+
+    @ApiModelProperty(value = "不合格总数")
+    private Integer unqualifiedCount;
+
+    @ApiModelProperty(value = "不合格对象")
+    private String unqualifiedObject;
+
+    public ArchiveExaminingReportDetail() {
+    }
+
+    public ArchiveExaminingReportDetail(Long projectId, Long reportId, String examiningType, String examiningItem, Integer unqualifiedCount, String unqualifiedObject) {
+        this.projectId = projectId;
+        this.reportId = reportId;
+        this.examiningType = examiningType;
+        this.examiningItem = examiningItem;
+        this.unqualifiedCount = unqualifiedCount;
+        this.unqualifiedObject = unqualifiedObject;
+    }
+}

+ 25 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchiveExaminingSocketVo.java

@@ -0,0 +1,25 @@
+package org.springblade.archive.vo;
+
+import lombok.Data;
+import org.springblade.archive.entity.ArchiveExaminingReportDetail;
+
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/4/23 10:13
+ **/
+@Data
+public class ArchiveExaminingSocketVo {
+    private Integer status;
+    private List<ArchiveExaminingReportDetail> detailList;
+
+    public ArchiveExaminingSocketVo() {
+    }
+
+    public ArchiveExaminingSocketVo(Integer status, List<ArchiveExaminingReportDetail> detailList) {
+        this.status = status;
+        this.detailList = detailList;
+    }
+}

+ 8 - 0
blade-service/blade-archive/pom.xml

@@ -106,6 +106,14 @@
             <version>2.9.1.RELEASE</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-websocket</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-messaging</artifactId>
+        </dependency>
 
     </dependencies>
 

+ 107 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveExaminingReportController.java

@@ -0,0 +1,107 @@
+package org.springblade.archive.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.archive.entity.ArchiveExaminingReport;
+import org.springblade.archive.service.IArchiveExaminingReportService;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.SecureUtil;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/4/20 17:33
+ **/
+@RestController
+@AllArgsConstructor
+@RequestMapping("/archiveExaminingReport")
+@Api(value = "档案检测报告", tags = "档案检测报告")
+public class ArchiveExaminingReportController {
+    private final IArchiveExaminingReportService archiveExaminingReportService;
+    @GetMapping("test")
+    public String test(){
+        ArchiveExaminingReport report = new ArchiveExaminingReport();
+        report.setId(12312312223L);
+        report.setReportName("电子文件四性检测报告");
+        report.setReportPdfUrl("https://bladex-chongqing-info.oss-cn-hangzhou.aliyuncs.com//upload/20230302/35cce8354eac0600e2e614e9b58f48a5.pdf");
+        report.setExaminingTime(LocalDateTime.now());
+        report.setStatus(1);
+        report.setCreateTime(new Date());
+        report.setProjectId(1578599210897772545L);
+        archiveExaminingReportService.save(report);
+        return "666";
+    }
+
+    @GetMapping("/getList")
+    @ApiOperation(value = "获取检测报告列表")
+    public R getList(@RequestParam("projectId") Long projectId){
+        List<ArchiveExaminingReport> list = archiveExaminingReportService.list(new LambdaQueryWrapper<ArchiveExaminingReport>()
+                .eq(projectId != null, ArchiveExaminingReport::getProjectId, projectId)
+                .eq(ArchiveExaminingReport::getStatus,4)
+                .last("limit 5"));
+        return R.data(list);
+    }
+
+    @GetMapping("/getReportStatus")
+    @ApiOperation(value = "获取检测报告状态")
+    public R getReportStatus(@RequestParam("projectId") Long projectId){
+        //获取最新的报告
+        ArchiveExaminingReport report = archiveExaminingReportService.getOne(new LambdaQueryWrapper<ArchiveExaminingReport>()
+                .eq(projectId != null, ArchiveExaminingReport::getProjectId, projectId)
+                .orderByDesc(ArchiveExaminingReport::getExaminingTime).last("limit 1"));
+        //判断是否报告正在进行,如果正在进行就跳转
+        if (report != null){
+            if (report.getStatus() == 4){
+                return R.data(-1);
+            }else {
+                return R.data(report.getId());
+            }
+        }
+        return R.data(-1);
+    }
+
+    @GetMapping("/getExamining")
+    @ApiOperation(value = "档案四性检测")
+    public R getExamining(@RequestParam("reportId") Long reportId,
+                          @RequestParam("projectId") Long projectId) throws InterruptedException, IOException {
+
+        //如果id为0则为一键检测,不为0则有报告正在进行
+        if (reportId == 0){
+            //创建报告
+            ArchiveExaminingReport report = new ArchiveExaminingReport();
+            Long id = SnowFlakeUtil.getId();
+            report.setId(id);
+            report.setReportName("电子文件四性检测报告");
+            report.setExaminingTime(LocalDateTime.now());
+            report.setStatus(1);
+            report.setCreateTime(new Date());
+            report.setProjectId(projectId);
+            archiveExaminingReportService.save(report);
+            //调用四性检测方法
+            archiveExaminingReportService.getExamining(projectId,id);
+            //调用socket,每隔3秒检测当前报告状态然后推送
+            BladeUser user = SecureUtil.getUser();
+            System.out.println(user.getUserId()+"Controller");
+            archiveExaminingReportService.pushStatusBySocket(user.getUserId(), id);
+            return R.data(report);
+        }else {
+            ArchiveExaminingReport report = archiveExaminingReportService.getById(reportId);
+            return R.data(report);
+        }
+
+    }
+
+}

+ 26 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveExaminingReportDetailController.java

@@ -0,0 +1,26 @@
+package org.springblade.archive.controller;
+
+import io.swagger.annotations.Api;
+import lombok.AllArgsConstructor;
+import org.springblade.archive.entity.ArchiveExaminingReportDetail;
+import org.springblade.archive.service.IArchiveExaminingReportDetailService;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/4/21 15:09
+ **/
+@RestController
+@AllArgsConstructor
+@RequestMapping("/archiveExaminingReportDetailController")
+@Api(value = "档案检测报告详情", tags = "档案检测报告详情")
+public class ArchiveExaminingReportDetailController {
+    private final IArchiveExaminingReportDetailService detailService;
+    @GetMapping("/test")
+    public String test(){
+        return "666";
+    }
+}

+ 3 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java

@@ -288,6 +288,9 @@ public class ArchiveFileController extends BladeController {
     public R allArchiveFileSize(Long projectId) {
         //统计案卷文件大小
         Long fileSize = archiveFileClient.getAllArchiveFileSize(projectId);
+        if (fileSize == null){
+            return R.data("0B");
+        }
         //统计表单数据大小
 //        Long tableSize = wbsTreeContractClient.getAllTableFileSize(projectId);
         String size = org.springblade.common.utils.FileUtils.formatSize(fileSize );

+ 7 - 3
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveOfflineVersionInfoController.java

@@ -48,9 +48,13 @@ public class ArchiveOfflineVersionInfoController {
     @GetMapping("/getVersionInfo")
     public R<ArchiveOfflineVersionInfo> getVersionInfo(Long projectId){
         ArchiveOfflineVersionInfo versionInfo = mapper.selectVersionInfo(projectId);
-        String size = this.formatSize(Long.parseLong(versionInfo.getFileSize()));
-        versionInfo.setFileSize(size);
-        return R.data(versionInfo);
+        if (versionInfo != null) {
+            String size = this.formatSize(Long.parseLong(versionInfo.getFileSize()));
+            versionInfo.setFileSize(size);
+            return R.data(versionInfo);
+        }else {
+            return R.data(null);
+        }
     }
     /**
      * 根据字节返回文件大小

+ 12 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExaminingReportDetailMapper.java

@@ -0,0 +1,12 @@
+package org.springblade.archive.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.archive.entity.ArchiveExaminingReportDetail;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/4/21 15:11
+ **/
+public interface ArchiveExaminingReportDetailMapper extends BaseMapper<ArchiveExaminingReportDetail> {
+}

+ 5 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExaminingReportDetailMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.archive.mapper.ArchiveExaminingReportDetailMapper">
+
+</mapper>

+ 12 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExaminingReportMapper.java

@@ -0,0 +1,12 @@
+package org.springblade.archive.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.archive.entity.ArchiveExaminingReport;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/4/20 17:36
+ **/
+public interface ArchiveExaminingReportMapper extends BaseMapper<ArchiveExaminingReport> {
+}

+ 5 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExaminingReportMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.archive.mapper.ArchiveExaminingReportMapper">
+
+</mapper>

+ 12 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveExaminingReportDetailService.java

@@ -0,0 +1,12 @@
+package org.springblade.archive.service;
+
+import org.springblade.archive.entity.ArchiveExaminingReportDetail;
+import org.springblade.core.mp.base.BaseService;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/4/21 15:10
+ **/
+public interface IArchiveExaminingReportDetailService extends BaseService<ArchiveExaminingReportDetail> {
+}

+ 17 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveExaminingReportService.java

@@ -0,0 +1,17 @@
+package org.springblade.archive.service;
+
+import org.springblade.archive.entity.ArchiveExaminingReport;
+import org.springblade.core.mp.base.BaseService;
+
+import java.io.IOException;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/4/20 17:35
+ **/
+public interface IArchiveExaminingReportService extends BaseService<ArchiveExaminingReport> {
+    void pushStatusBySocket(Long userId,Long id) throws IOException, InterruptedException;
+
+    void getExamining(Long projectId,Long id) throws InterruptedException;
+}

+ 17 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExaminingReportDetailServiceImpl.java

@@ -0,0 +1,17 @@
+package org.springblade.archive.service.impl;
+
+import org.springblade.archive.entity.ArchiveExaminingReportDetail;
+import org.springblade.archive.mapper.ArchiveExaminingReportDetailMapper;
+import org.springblade.archive.service.IArchiveExaminingReportDetailService;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/4/21 15:10
+ **/
+@Service
+public class ArchiveExaminingReportDetailServiceImpl extends BaseServiceImpl<ArchiveExaminingReportDetailMapper, ArchiveExaminingReportDetail> implements IArchiveExaminingReportDetailService {
+
+}

+ 152 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExaminingReportImpl.java

@@ -0,0 +1,152 @@
+package org.springblade.archive.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.AllArgsConstructor;
+import org.springblade.archive.entity.ArchiveExaminingReport;
+import org.springblade.archive.entity.ArchiveExaminingReportDetail;
+import org.springblade.archive.mapper.ArchiveExaminingReportMapper;
+import org.springblade.archive.service.IArchiveExaminingReportDetailService;
+import org.springblade.archive.service.IArchiveExaminingReportService;
+import org.springblade.archive.socket.WebSocketServer;
+import org.springblade.archive.vo.ArchiveExaminingSocketVo;
+import org.springblade.common.constant.ArchiveConstant;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.secure.utils.SecureUtil;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/4/20 17:36
+ **/
+@Service
+@AllArgsConstructor
+public class ArchiveExaminingReportImpl extends BaseServiceImpl<ArchiveExaminingReportMapper, ArchiveExaminingReport> implements IArchiveExaminingReportService {
+    private final WebSocketServer webSocketServer;
+    private final IArchiveExaminingReportDetailService detailService;
+    /**
+     * 推送状态到前端
+     * @param id
+     */
+    @Async
+    @Override
+    public void pushStatusBySocket(Long userId,Long id) throws IOException, InterruptedException {
+        Integer status;
+        //获取检测状态,如果正在检测,则一直推送
+        do {
+            Thread.sleep(3000L);
+            //获取最新检测的状态
+            ArchiveExaminingReport report = this.getById(id);
+            status = report.getStatus();
+            //获取检测详情
+            List<ArchiveExaminingReportDetail> list = detailService.list(new LambdaQueryWrapper<ArchiveExaminingReportDetail>()
+                    .eq(ArchiveExaminingReportDetail::getReportId, id));
+            ArchiveExaminingSocketVo vo = new ArchiveExaminingSocketVo(status,list);
+            webSocketServer.sendMessagesToArchive(userId+"", JSON.toJSONString(vo));
+            status = report.getStatus();
+        }while (status != 4);
+
+    }
+
+    /**
+     * 四性检测
+     * @param id
+     */
+    @Async
+    @Override
+    public void getExamining(Long projectId,Long id) throws InterruptedException {
+        ArchiveExaminingReport report = new ArchiveExaminingReport();
+        report.setId(id);
+        report.setStatus(2);
+        this.updateById(report);
+        //检测中
+            //真实性
+        Thread.sleep(7000L);
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对固化信息有效性检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对元数据项数据长度检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对元数据项数据类型、格式检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对设定值域的元数据项值域符合度检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对档号规范性检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对内容数据的电子属性一致性检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对元数据项数据重复性检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对元数据是否关联内容数据检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对信息包目录结构规范性检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对信息包一致性检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对电子档案封装包规范性检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对电子档案封装包电子前面有效性检测",0,"无"));
+        Thread.sleep(7000L);
+            //完整性
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对总件数相符性检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对总字节数相符性检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对元数据项完整性检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对元数据必填著录项目检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对过程信息完整性检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对连续性元数据项检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对内容数据完整性检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对附件数据完整性检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对归档范围检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对信息包元数据完整性检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对信息包内容数据完整性检测",0,"无"));
+            //可用性
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_USABILITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对信息包中元数据的可读性检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_USABILITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对目标数据库中的元数据可访问下检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_USABILITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对内容数据格式检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_USABILITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对内容数据的可读性检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_USABILITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对内容数据格式长期可用性检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_USABILITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对软硬件环境合规性检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_USABILITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对信息包中包含的内容数据格式合规性检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_USABILITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对备份数据可恢复性检测",0,"无"));
+        Thread.sleep(7000L);
+            //安全性
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_SECURITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对系统环境中是否安装杀毒软件检测",0,"无"));
+        detailService.save(new ArchiveExaminingReportDetail(projectId,id, ArchiveConstant.ARCHIVE_EXAMINING_SECURITY,
+                ArchiveConstant.ARCHIVE_EXAMINING_STANDARD+"对病毒感染检测",0,"无"));
+        Thread.sleep(7000L);
+        //生成报告,生成PDF
+        report.setStatus(3);
+        this.updateById(report);
+        //完成
+        report.setStatus(4);
+        this.updateById(report);
+    }
+}

+ 35 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/socket/WebSocketConfig.java

@@ -0,0 +1,35 @@
+package org.springblade.archive.socket;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.messaging.simp.config.MessageBrokerRegistry;
+import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
+import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
+import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+@Configuration
+@EnableWebSocketMessageBroker
+public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
+
+    @Bean
+    public ServerEndpointExporter serverEndpointExporter() {
+        return new ServerEndpointExporter();
+    }
+
+    @Override
+    public void registerStompEndpoints(StompEndpointRegistry registry){
+        registry.addEndpoint("/websocket")
+                .setAllowedOrigins("*") //跨域
+                .withSockJS();
+    }
+
+    @Override
+    public void configureMessageBroker(MessageBrokerRegistry registry){
+        registry.enableSimpleBroker("*");
+        registry.setApplicationDestinationPrefixes("*");
+        registry.setUserDestinationPrefix("*");
+    }
+
+}
+

+ 142 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/socket/WebSocketServer.java

@@ -0,0 +1,142 @@
+package org.springblade.archive.socket;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.*;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.io.IOException;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/4/19 15:35
+ **/
+@ServerEndpoint("/websocket/archive/{userId}")
+@Component
+public class WebSocketServer {
+
+    private static final Logger log = LoggerFactory.getLogger(WebSocketServer.class);
+
+    /**
+     * 当前在线连接数
+     */
+    private static AtomicInteger onlineCount = new AtomicInteger(0);
+
+    /**
+     * 用来存放每个客户端对应的 WebSocketServer 对象
+     */
+    private static ConcurrentHashMap<String, WebSocketServer> webSocketMap = new ConcurrentHashMap<>();
+
+    /**
+     * 与某个客户端的连接会话,需要通过它来给客户端发送数据
+     */
+    private Session session;
+
+    /**
+     * 接收 userId
+     */
+    private String userId = "";
+
+    /**
+     * 连接建立成功调用的方法
+     */
+    @OnOpen
+    public void onOpen(Session session, @PathParam("userId") String userId) {
+        this.session = session;
+        this.userId = userId;
+        if (webSocketMap.containsKey(userId)) {
+            webSocketMap.remove(userId);
+            webSocketMap.put(userId, this);
+        } else {
+            webSocketMap.put(userId, this);
+            addOnlineCount();
+        }
+        log.info("用户连接:" + userId + ",当前在线人数为:" + getOnlineCount());
+        try {
+            sendMessage("连接成功!");
+        } catch (IOException e) {
+            log.error("用户:" + userId + ",网络异常!!!!!!");
+        }
+    }
+
+    /**
+     * 连接关闭调用的方法
+     */
+    @OnClose
+    public void onClose() {
+        if (webSocketMap.containsKey(userId)) {
+            webSocketMap.remove(userId);
+            subOnlineCount();
+        }
+        log.info("用户退出:" + userId + ",当前在线人数为:" + getOnlineCount());
+    }
+
+    /**
+     * 收到客户端消息后调用的方法
+     *
+     * @param message 客户端发送过来的消息
+     */
+    @OnMessage
+    public void onMessage(String message, Session session) {
+        log.info("用户消息:" + userId + ",报文:" + message);
+        if (!StringUtils.isEmpty(message)) {
+            try {
+                JSONObject jsonObject = JSON.parseObject(message);
+                jsonObject.put("fromUserId", this.userId);
+                String toUserId = jsonObject.getString("toUserId");
+                if (!StringUtils.isEmpty(toUserId) && webSocketMap.containsKey(toUserId)) {
+                    webSocketMap.get(toUserId).sendMessage(jsonObject.toJSONString());
+                } else {
+                    log.error("请求的 userId:" + toUserId + "不在该服务器上");
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    public void sendMessagesToArchive(String user,String str) throws IOException {
+        if (webSocketMap.get(user) != null) {
+            webSocketMap.get(user).sendMessage(str);
+        }
+    }
+
+    /**
+     * 发生错误时调用
+     *
+     * @param session
+     * @param error
+     */
+    @OnError
+    public void onError(Session session, Throwable error) {
+        log.error("用户错误:" + this.userId + ",原因:" + error.getMessage());
+        error.printStackTrace();
+    }
+
+    /**
+     * 实现服务器主动推送
+     */
+    public void sendMessage(String message) throws IOException {
+        this.session.getBasicRemote().sendText(message);
+    }
+
+    public static synchronized AtomicInteger getOnlineCount() {
+        return onlineCount;
+    }
+
+    public static synchronized void addOnlineCount() {
+        WebSocketServer.onlineCount.getAndIncrement();
+    }
+
+    public static synchronized void subOnlineCount() {
+        WebSocketServer.onlineCount.getAndDecrement();
+    }
+}

+ 15 - 10
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java

@@ -168,17 +168,22 @@ public class ArchiveFileClientImpl implements ArchiveFileClient {
     public Long getAllArchiveFileSize(Long projectId) {
         //获取所有文件的url
         List<ArchiveFile> archiveFileList = fileMapper.getAllArchiveFileUrl(projectId);
-        List<String> list = new ArrayList<>();
-        for (ArchiveFile file : archiveFileList) {
-            if (StringUtils.isNotBlank(file.getFileUrl())){
-                list.add(file.getFileUrl());
-            }
-            if (StringUtils.isNotBlank(file.getPdfFileUrl())){
-                list.add(file.getPdfFileUrl());
+        if (archiveFileList != null && archiveFileList.size() >0) {
+            List<String> list = new ArrayList<>();
+            for (ArchiveFile file : archiveFileList) {
+                if (StringUtils.isNotBlank(file.getFileUrl())) {
+                    list.add(file.getFileUrl());
+                }
+                if (StringUtils.isNotBlank(file.getPdfFileUrl())) {
+                    list.add(file.getPdfFileUrl());
+                }
             }
+            //从阿里云返回文件大小
+            Long sizeCount = 0L;
+            sizeCount += FileUtils.getOssFileSizeCount(list);
+            return sizeCount;
+        }else {
+            return 0L;
         }
-        //从阿里云返回文件大小
-        Long sizeCount = FileUtils.getOssFileSizeCount(list);
-        return sizeCount;
     }
 }