浏览代码

Merge remote-tracking branch 'origin/master'

liuyc 2 年之前
父节点
当前提交
6edf9a34b1
共有 32 个文件被更改,包括 907 次插入62 次删除
  1. 5 0
      blade-common/src/main/java/org/springblade/common/constant/ArchiveConstant.java
  2. 4 2
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/AliOssBuilder.java
  3. 10 8
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/OssBuilder.java
  4. 24 7
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/ossre/AliossTemplateRe.java
  5. 17 0
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/ossre/OssTemplateRe.java
  6. 62 0
      blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/UmsAdminLoginLogDO.java
  7. 35 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveExaminingReport.java
  8. 52 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveExaminingReportDetail.java
  9. 25 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchiveExaminingSocketVo.java
  10. 30 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchiveExaminingVo.java
  11. 16 0
      blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Tenant.java
  12. 8 0
      blade-service/blade-archive/pom.xml
  13. 107 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveExaminingReportController.java
  14. 26 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveExaminingReportDetailController.java
  15. 3 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java
  16. 7 3
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveOfflineVersionInfoController.java
  17. 12 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExaminingReportDetailMapper.java
  18. 5 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExaminingReportDetailMapper.xml
  19. 12 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExaminingReportMapper.java
  20. 5 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExaminingReportMapper.xml
  21. 8 8
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  22. 12 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveExaminingReportDetailService.java
  23. 18 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveExaminingReportService.java
  24. 17 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExaminingReportDetailServiceImpl.java
  25. 166 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExaminingReportImpl.java
  26. 1 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveOfflineVersionInfoServiceImpl.java
  27. 35 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/socket/WebSocketConfig.java
  28. 142 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/socket/WebSocketServer.java
  29. 15 10
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java
  30. 22 21
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java
  31. 3 1
      blade-service/blade-system/src/main/java/org/springblade/system/controller/TenantController.java
  32. 3 1
      blade-service/blade-system/src/main/java/org/springblade/system/mapper/TenantMapper.xml

+ 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>>";
 }

+ 4 - 2
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/AliOssBuilder.java

@@ -22,9 +22,10 @@ import com.aliyun.oss.common.auth.CredentialsProvider;
 import com.aliyun.oss.common.auth.DefaultCredentialProvider;
 import lombok.SneakyThrows;
 import org.springblade.core.oss.OssTemplate;
-import org.springblade.core.oss.AliossTemplate;
 import org.springblade.core.oss.props.OssProperties;
 import org.springblade.core.oss.rule.OssRule;
+import org.springblade.resource.builder.ossre.AliossTemplateRe;
+import org.springblade.resource.builder.ossre.OssTemplateRe;
 import org.springblade.resource.entity.Oss;
 
 /**
@@ -35,7 +36,7 @@ import org.springblade.resource.entity.Oss;
 public class AliOssBuilder {
 
 	@SneakyThrows
-	public static OssTemplate template(Oss oss, OssRule ossRule) {
+	public static OssTemplateRe template(Oss oss, OssRule ossRule) {
 		// 创建ClientConfiguration。ClientConfiguration是OSSClient的配置类,可配置代理、连接超时、最大连接数等参数。
 		ClientConfiguration conf = new ClientConfiguration();
 		// 设置OSSClient允许打开的最大HTTP连接数,默认为1024个。
@@ -57,6 +58,7 @@ public class AliOssBuilder {
 		ossProperties.setBucketName(oss.getBucketName());
 		CredentialsProvider credentialsProvider = new DefaultCredentialProvider(ossProperties.getAccessKey(), ossProperties.getSecretKey());
 		OSSClient ossClient = new OSSClient(ossProperties.getEndpoint(), credentialsProvider, conf);
+
 		return new AliossTemplateRe(ossClient, ossProperties, ossRule);
 	}
 

+ 10 - 8
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/OssBuilder.java

@@ -29,6 +29,7 @@ import org.springblade.core.oss.rule.BladeOssRule;
 import org.springblade.core.oss.rule.OssRule;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.utils.*;
+import org.springblade.resource.builder.ossre.OssTemplateRe;
 import org.springblade.resource.entity.Oss;
 import org.springblade.resource.service.IOssService;
 
@@ -59,7 +60,7 @@ public class OssBuilder {
     /**
      * OssTemplate配置缓存池
      */
-    private final Map<String, OssTemplate> templatePool = new ConcurrentHashMap<>();
+    private final Map<String, OssTemplateRe> templatePool = new ConcurrentHashMap<>();
 
     /**
      * oss配置缓存池
@@ -71,7 +72,7 @@ public class OssBuilder {
      *
      * @return OssTemplate
      */
-    public OssTemplate template() {
+    public OssTemplateRe template() {
         return template(StringPool.EMPTY);
     }
 
@@ -81,11 +82,11 @@ public class OssBuilder {
      * @param code 资源编号
      * @return OssTemplate
      */
-    public OssTemplate template(String code) {
+    public OssTemplateRe template(String code) {
         String tenantId = AuthUtil.getTenantId();
         Oss oss = getOss(tenantId, code);
         Oss ossCached = ossPool.get(tenantId);
-        OssTemplate template = templatePool.get(tenantId);
+        OssTemplateRe template = templatePool.get(tenantId);
         // 若为空或者不一致,则重新加载
         if (Func.hasEmpty(template, ossCached) || !oss.getEndpoint().equals(ossCached.getEndpoint()) || !oss.getAccessKey().equals(ossCached.getAccessKey())) {
             synchronized (OssBuilder.class) {
@@ -98,20 +99,21 @@ public class OssBuilder {
                     } else {
                         ossRule = new BladeOssRule(Boolean.FALSE);
                     }
-                    if (oss.getCategory() == OssEnum.MINIO.getCategory()) {
+                    /*if (oss.getCategory() == OssEnum.MINIO.getCategory()) {
                         template = MinioOssBuilder.template(oss, ossRule);
                     } else if (oss.getCategory() == OssEnum.QINIU.getCategory()) {
                         template = QiniuOssBuilder.template(oss, ossRule);
-                    } else if (oss.getCategory() == OssEnum.ALI.getCategory()) {
+                    } else if (oss.getCategory() == OssEnum.ALI.getCategory()) {*/
                         template = AliOssBuilder.template(oss, ossRule);
-                    } else if (oss.getCategory() == OssEnum.TENCENT.getCategory()) {
+                    /*} else if (oss.getCategory() == OssEnum.TENCENT.getCategory()) {
                         template = TencentOssBuilder.template(oss, ossRule);
-                    }
+                    }*/
                     templatePool.put(tenantId, template);
                     ossPool.put(tenantId, oss);
                 }
             }
         }
+
         return template;
     }
 

+ 24 - 7
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/AliossTemplateRe.java → blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/ossre/AliossTemplateRe.java

@@ -1,11 +1,9 @@
-package org.springblade.resource.builder.oss;
+package org.springblade.resource.builder.ossre;
 
 import com.aliyun.oss.OSSClient;
 import com.aliyun.oss.common.utils.BinaryUtil;
-import com.aliyun.oss.model.MatchMode;
-import com.aliyun.oss.model.ObjectMetadata;
-import com.aliyun.oss.model.PolicyConditions;
-import com.aliyun.oss.model.PutObjectResult;
+import com.aliyun.oss.model.*;
+
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.Date;
@@ -14,7 +12,6 @@ import java.util.List;
 import java.util.Map;
 
 import lombok.SneakyThrows;
-import org.springblade.core.oss.OssTemplate;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.oss.model.OssFile;
 import org.springblade.core.oss.props.OssProperties;
@@ -23,7 +20,7 @@ import org.springblade.core.tool.jackson.JsonUtil;
 import org.springframework.util.StringUtils;
 import org.springframework.web.multipart.MultipartFile;
 
-public class AliossTemplateRe implements OssTemplate {
+public class AliossTemplateRe implements OssTemplateRe {
     private final OSSClient ossClient;
     private final OssProperties ossProperties;
     private final OssRule ossRule;
@@ -288,4 +285,24 @@ public class AliossTemplateRe implements OssTemplate {
         this.ossProperties = ossProperties;
         this.ossRule = ossRule;
     }
+
+
+    // OSS 分片上传
+    public UploadPartResult uploadPart(UploadPartRequest request){
+        UploadPartResult uploadPartResult = this.ossClient.uploadPart(request);
+        return uploadPartResult;
+    }
+
+
+    // OSS 分片上传 合成
+    public CompleteMultipartUploadResult completeMultipartUpload(CompleteMultipartUploadRequest request){
+        CompleteMultipartUploadResult uploadPartResult = this.ossClient.completeMultipartUpload(request);
+        return uploadPartResult;
+    }
+
+    // OSS 分片上传 初始化
+    public InitiateMultipartUploadResult initiateMultipartUpload(InitiateMultipartUploadRequest request){
+        InitiateMultipartUploadResult initResult = this.ossClient.initiateMultipartUpload(request);
+        return initResult;
+    }
 }

+ 17 - 0
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/ossre/OssTemplateRe.java

@@ -0,0 +1,17 @@
+package org.springblade.resource.builder.ossre;
+
+import com.aliyun.oss.model.*;
+import org.springblade.core.oss.OssTemplate;
+
+
+public interface OssTemplateRe extends OssTemplate {
+
+    // OSS 分片上传
+    UploadPartResult uploadPart(UploadPartRequest request);
+
+    // OSS 分片上传 合成
+    CompleteMultipartUploadResult completeMultipartUpload(CompleteMultipartUploadRequest request);
+
+    // OSS 分片上传 初始化
+    InitiateMultipartUploadResult initiateMultipartUpload(InitiateMultipartUploadRequest request);
+}

+ 62 - 0
blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/UmsAdminLoginLogDO.java

@@ -0,0 +1,62 @@
+package org.springblade.resource.endpoint;
+
+import com.aliyun.oss.model.PartETag;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author zhangtonghao
+ * @create 2022-04-06 15:08
+ */
+@Data
+public class UmsAdminLoginLogDO {
+
+    /**
+     * 初始化任务id
+     */
+    private String taskId;
+
+    /**
+     * 上传文件类型
+     */
+    private String fileType;
+
+    /**
+     * 文件总片数
+     */
+    private Integer fileSlicesNum;
+    /**
+     * 分片编号(1-10000有序的编号,越大的编号位置越靠后)
+     */
+    private Integer sliceNo;
+    /**
+     * 本次请求文件的md5值
+     */
+    private String fileMD5;
+    /**
+     *文件流数据
+     */
+    private byte[] content;
+
+    /**
+     * 文件名称
+     */
+    private String fileName;
+
+    /**
+     * oss初始化分片id
+     */
+    private String ossSlicesId;
+
+    /**
+     * 最小分片大小(分片上传是除最后一片外,其他文件不得小于该值)
+     */
+    private String minSliceSize;
+
+    Map<Integer, PartETag> partETags = new HashMap<>(16);
+
+
+}

+ 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;
+
+}

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

@@ -0,0 +1,52 @@
+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;
+
+    @ApiModelProperty(value = "检测结果")
+    private Integer examiningResult;
+
+    public ArchiveExaminingReportDetail() {
+    }
+
+    public ArchiveExaminingReportDetail(Long projectId, Long reportId, String examiningType, String examiningItem,
+                                        Integer unqualifiedCount, String unqualifiedObject,Integer examiningResult) {
+        this.projectId = projectId;
+        this.reportId = reportId;
+        this.examiningType = examiningType;
+        this.examiningItem = examiningItem;
+        this.unqualifiedCount = unqualifiedCount;
+        this.unqualifiedObject = unqualifiedObject;
+        this.examiningResult = examiningResult;
+    }
+}

+ 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 四性检测socket发送值
+ * @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;
+    }
+}

+ 30 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchiveExaminingVo.java

@@ -0,0 +1,30 @@
+package org.springblade.archive.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Param 四性检测参数
+ * @Author wangwl
+ * @Date 2023/4/23 15:42
+ **/
+@Data
+public class ArchiveExaminingVo {
+    @ApiModelProperty("项目ID")
+    private Long projectId;
+
+    @ApiModelProperty("报告ID")
+    private Long reportId;
+
+    @ApiModelProperty("真实性")
+    private String authenticity;
+
+    @ApiModelProperty("完整性")
+    private String integrality;
+
+    @ApiModelProperty("可用性")
+    private String usability;
+
+    @ApiModelProperty("安全性")
+    private String security;
+}

+ 16 - 0
blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Tenant.java

@@ -108,5 +108,21 @@ public class Tenant extends BaseEntity {
 	@ApiModelProperty(value = "授权码")
 	private String licenseKey;
 
+	/**
+	 * 租户标题
+	 */
+	@ApiModelProperty(value = "租户标题")
+	private String tenantTitle;
 
+	/**
+	 * 租户图标
+	 */
+	@ApiModelProperty(value = "租户图标")
+	private String tenantAvatar;
+
+	/**
+	 * 租户图标文字
+	 */
+	@ApiModelProperty(value = "租户图标文字")
+	private String tenantAvatarText;
 }

+ 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.archive.vo.ArchiveExaminingVo;
+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(ArchiveExaminingVo vo) throws InterruptedException, IOException {
+
+        //如果id为0则为一键检测,不为0则有报告正在进行
+        if (vo.getReportId() == 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(vo.getProjectId());
+            archiveExaminingReportService.save(report);
+            //调用四性检测方法
+            archiveExaminingReportService.getExamining(vo,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(vo.getReportId());
+            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>

+ 8 - 8
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml

@@ -131,15 +131,15 @@
     </update>
 
     <select id="getListByProjectId" resultType="org.springblade.archive.dto.ArchivesAutoDTO">
-        select id,project_id as projectId,name,unit,storage_time as storageTime,node_id as nodeId,tree_sort as treeSort,status,is_deleted as isDeleted,is_lock as isLock,create_time as createTime
+        select id,project_id as projectId,name,file_number as fileNumber,unit,storage_time as storageTime,node_id as nodeId,tree_sort as treeSort,status,is_deleted as isDeleted,is_lock as isLock,create_time as createTime
         from u_archives_auto
         where project_id=#{projectId};
     </select>
     <select id="pageByArchivesAuto" resultMap="archivesAutoResultMap">
-        select uaa.* from u_archives_auto uaa left join u_archive_file uaf on uaa.id = uaf.archive_id
+        select uaa.* from m_archive_tree_contract matc left join u_archives_auto uaa on matc.id = uaa.node_id left join u_archive_file uaf on uaa.id = uaf.archive_id
         where uaa.is_deleted = 0
         <if test="vo.projectId != null and vo.projectId != ''">
-            and uaa.project_id = #{vo.projectId}
+            and matc.project_id = #{vo.projectId}
         </if>
         <if test="vo.searchType == 1 and vo.queryValue != null and vo.queryValue != ''">
             and uaa.name like concat('%',#{vo.queryValue},'%')
@@ -181,14 +181,14 @@
     </select>
     <select id="getAllArchiveByContractType" resultType="org.springblade.archive.vo.ArchivesAutoVO">
         SELECT uaa.id,matc.tree_code as 'contractType'
-        FROM u_archives_auto uaa left join m_archive_tree_contract matc on uaa.node_id =matc.id
+        FROM m_archive_tree_contract matc left join u_archives_auto uaa on uaa.node_id =matc.id
         WHERE uaa.project_id =#{projectId} and uaa.is_deleted = #{type}
     </select>
     <select id="getAllArchiveAgeByContractType" resultType="java.util.Map">
-        SELECT CASE storage_time WHEN '10' THEN '10年' WHEN '30' THEN '30年' ELSE '永久' END as name,COUNT(storage_time) as value
-        FROM u_archives_auto uaa
-        WHERE project_id =#{projectId} and is_deleted =0
-        GROUP BY storage_time
+        SELECT CASE uaa.storage_time WHEN '10' THEN '10年' WHEN '30' THEN '30年' ELSE '永久' END as name,COUNT(uaa.storage_time) as value
+        FROM m_archive_tree_contract matc left join u_archives_auto uaa on uaa.node_id =matc.id
+        WHERE matc.project_id =#{projectId} and uaa.is_deleted =0
+        GROUP BY uaa.storage_time
     </select>
 
 

+ 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> {
+}

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

@@ -0,0 +1,18 @@
+package org.springblade.archive.service;
+
+import org.springblade.archive.entity.ArchiveExaminingReport;
+import org.springblade.archive.vo.ArchiveExaminingVo;
+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(ArchiveExaminingVo vo, 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 {
+
+}

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

@@ -0,0 +1,166 @@
+package org.springblade.archive.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+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.archive.vo.ArchiveExaminingVo;
+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(5000L);
+            //获取最新检测的状态
+            ArchiveExaminingReport report = this.getById(id);
+            status = report.getStatus();
+            //获取检测详情
+            List<ArchiveExaminingReportDetail> list = detailService.list(new LambdaQueryWrapper<ArchiveExaminingReportDetail>()
+                    .eq(ArchiveExaminingReportDetail::getReportId, id));
+            for (ArchiveExaminingReportDetail detail : list) {
+                detail.setExaminingItem(detail.getExaminingType()+":"+detail.getExaminingItem());
+            }
+            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(ArchiveExaminingVo vo, Long id) throws InterruptedException {
+        ArchiveExaminingReport report = new ArchiveExaminingReport();
+        report.setId(id);
+        report.setStatus(2);
+        this.updateById(report);
+        //检测中
+            //真实性
+        if (StringUtils.isNotBlank(vo.getAuthenticity()) && "1".equals(vo.getAuthenticity())) {
+            Thread.sleep(7000L);
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对固化信息有效性检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对元数据项数据长度检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对元数据项数据类型、格式检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对设定值域的元数据项值域符合度检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对档号规范性检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对内容数据的电子属性一致性检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对元数据项数据重复性检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对元数据是否关联内容数据检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对信息包目录结构规范性检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对信息包一致性检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对电子档案封装包规范性检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对电子档案封装包电子前面有效性检测", 0, "无", 0));
+        }
+        if (StringUtils.isNotBlank(vo.getIntegrality()) && "1".equals(vo.getIntegrality())) {
+            Thread.sleep(7000L);
+            //完整性
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对总件数相符性检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对总字节数相符性检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对元数据项完整性检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对元数据必填著录项目检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对过程信息完整性检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对连续性元数据项检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对内容数据完整性检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对附件数据完整性检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对归档范围检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对信息包元数据完整性检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对信息包内容数据完整性检测", 0, "无", 0));
+        }
+            //可用性
+        if (StringUtils.isNotBlank(vo.getUsability()) && "1".equals(vo.getUsability())) {
+            Thread.sleep(7000L);
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_USABILITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对信息包中元数据的可读性检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_USABILITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对目标数据库中的元数据可访问下检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_USABILITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对内容数据格式检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_USABILITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对内容数据的可读性检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_USABILITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对内容数据格式长期可用性检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_USABILITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对软硬件环境合规性检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_USABILITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对信息包中包含的内容数据格式合规性检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_USABILITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对备份数据可恢复性检测", 0, "无", 0));
+        }
+            //安全性
+        if (StringUtils.isNotBlank(vo.getSecurity()) && "1".equals(vo.getSecurity())) {
+            Thread.sleep(7000L);
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_SECURITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对系统环境中是否安装杀毒软件检测", 0, "无", 0));
+            detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_SECURITY,
+                    ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对病毒感染检测", 0, "无", 0));
+        }
+        //生成报告,生成PDF
+        report.setStatus(3);
+        this.updateById(report);
+        Thread.sleep(7000L);
+        //完成
+        report.setStatus(4);
+        this.updateById(report);
+    }
+}

+ 1 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveOfflineVersionInfoServiceImpl.java

@@ -224,7 +224,7 @@ public class ArchiveOfflineVersionInfoServiceImpl extends BaseServiceImpl<Archiv
                     pstm.setLong(1, auto.getId());
                     pstm.setLong(2, auto.getProjectId());
                     pstm.setString(3, auto.getName());
-                    pstm.setString(4, auto.getFileNumber());
+                    pstm.setString(4, auto.getFileNumber() == null ? "" :auto.getFileNumber());
                     pstm.setString(5, auto.getUnit());
                     pstm.setString(6, auto.getStorageTime());
                     pstm.setInt(7, auto.getIsArchive() == null ? 0 : 1);

+ 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;
     }
 }

+ 22 - 21
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java

@@ -168,8 +168,7 @@ public class TextdictInfoController extends BladeController {
         //获取当前项目下引用相同模板的元素表信息
         List<WbsTreePrivate> wbsTreePrivatesEqual = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
                 .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
-                .eq(WbsTreePrivate::getHtmlUrl, wbsTreePrivate.getHtmlUrl())
-                .eq(WbsTreePrivate::getStatus, 1));
+                .eq(WbsTreePrivate::getHtmlUrl, wbsTreePrivate.getHtmlUrl()));
         List<Long> pKeyIds = wbsTreePrivatesEqual.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
         String pIds = StringUtils.join(pKeyIds, ",");
 
@@ -479,8 +478,8 @@ public class TextdictInfoController extends BladeController {
         //获取当前项目下引用相同模板的元素表信息
         List<WbsTreePrivate> wbsTreePrivatesEqual = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
                 .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
-                .eq(WbsTreePrivate::getExcelId, wbsTreePrivate.getExcelId())
-                .eq(WbsTreePrivate::getStatus, 1));
+                .eq(WbsTreePrivate::getExcelId, wbsTreePrivate.getExcelId()));
+
         List<Long> pKeyIds = wbsTreePrivatesEqual.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
         String ids = StringUtils.join(pKeyIds, ",");
 
@@ -542,10 +541,12 @@ public class TextdictInfoController extends BladeController {
 
         //删除当前类型
         List<String> collect = textDictInfosNewAll.stream().map(TextdictInfo::getTabId).distinct().collect(Collectors.toList());
-        this.textdictInfoService.getBaseMapper().delete(Wrappers.<TextdictInfo>query().lambda()
-                .eq(TextdictInfo::getType, textdictInfo.getType())
-                .in(TextdictInfo::getTabId, collect)
-        );
+        if(collect!=null && collect.size()>=1){
+            this.textdictInfoService.getBaseMapper().delete(Wrappers.<TextdictInfo>query().lambda()
+                    .eq(TextdictInfo::getType, textdictInfo.getType())
+                    .in(TextdictInfo::getTabId, collect)
+            );
+        }
 
         //批量新增
         this.textdictInfoService.saveBatch(textDictInfosNewAll);
@@ -572,20 +573,20 @@ public class TextdictInfoController extends BladeController {
 
         //修改对应合同段的htmlUrl,当前项目下对应合同段的节点
         List<Long> cIdsList = wbsTreePrivatesEqual.stream().map(WbsTreePrivate::getId).distinct().collect(Collectors.toList());
-        List<Long> cPkeyIds = wbsTreeContractService.getBaseMapper().selectList(Wrappers.<WbsTreeContract>lambdaQuery()
-                .eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId())
-                .eq(WbsTreeContract::getExcelId, wbsTreePrivate.getExcelId())
-                .eq(WbsTreeContract::getStatus, 1)
-                .in(WbsTreeContract::getId, cIdsList)
-        ).stream().map(WbsTreeContract::getPKeyId).collect(Collectors.toList());
-
-        String cPkeyIdsStr = StringUtils.join(cPkeyIds, ",");
-        if (StringUtils.isNotEmpty(cPkeyIdsStr)) {
-            String updateSqlC = "update m_wbs_tree_contract set html_url = '" + replace + "' where p_key_id in (" + cPkeyIdsStr + ")";
-            jdbcTemplate.execute(updateSqlC);
+        if(cIdsList!=null && cIdsList.size()>=1){
+            List<Long> cPkeyIds = wbsTreeContractService.getBaseMapper().selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+                    .eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId())
+                    .eq(WbsTreeContract::getExcelId, wbsTreePrivate.getExcelId())
+                    .eq(WbsTreeContract::getStatus, 1)
+                    .in(WbsTreeContract::getId, cIdsList)
+            ).stream().map(WbsTreeContract::getPKeyId).collect(Collectors.toList());
+
+            String cPkeyIdsStr = StringUtils.join(cPkeyIds, ",");
+            if (StringUtils.isNotEmpty(cPkeyIdsStr)) {
+                String updateSqlC = "update m_wbs_tree_contract set html_url = '" + replace + "' where p_key_id in (" + cPkeyIdsStr + ")";
+                jdbcTemplate.execute(updateSqlC);
+            }
         }
-
-
         return R.success("操作成功");
     }
 

+ 3 - 1
blade-service/blade-system/src/main/java/org/springblade/system/controller/TenantController.java

@@ -195,7 +195,9 @@ public class TenantController extends BladeController {
 		if (tenant != null) {
 			kv.set("tenantId", tenant.getTenantId())
 				.set("domain", tenant.getDomainUrl())
-				.set("backgroundUrl", tenant.getBackgroundUrl());
+				.set("tenantTitle", tenant.getTenantTitle())
+				.set("tenantAvatar", tenant.getTenantAvatar())
+				.set("tenantAvatarText", tenant.getTenantAvatarText());
 		}
 		return R.data(kv);
 	}

+ 3 - 1
blade-service/blade-system/src/main/java/org/springblade/system/mapper/TenantMapper.xml

@@ -21,9 +21,11 @@
         <result column="account_number" property="accountNumber"/>
         <result column="expire_time" property="expireTime"/>
         <result column="license_key" property="licenseKey"/>
+        <result column="tenant_avatar" property="tenantAvatar"/>
+        <result column="tenant_title" property="tenantTitle"/>
+        <result column="tenant_avatar_text" property="tenantAvatarText"/>
     </resultMap>
 
-
     <select id="selectTenantPage" resultMap="tenantResultMap">
         select * from blade_tenant where is_deleted = 0
     </select>