浏览代码

Merge remote-tracking branch 'origin/master' into master

yangyj 2 年之前
父节点
当前提交
403bc77938
共有 33 个文件被更改,包括 653 次插入150 次删除
  1. 28 0
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/BladeOssRule.java
  2. 7 3
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/OssBuilder.java
  3. 3 0
      blade-ops/blade-swagger/src/main/resources/application-dev.yml
  4. 30 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveOfflineVersionInfo.java
  5. 5 4
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialMaterialMobilization.java
  6. 2 2
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialSampleInfo.java
  7. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java
  8. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ArchiveTreeContractClient.java
  9. 74 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveOfflineVersionInfoController.java
  10. 14 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveOfflineVersionInfoMapper.java
  11. 20 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveOfflineVersionInfoMapper.xml
  12. 12 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveOfflineVersionInfoService.java
  13. 0 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java
  14. 16 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveOfflineVersionInfoServiceImpl.java
  15. 83 49
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  16. 5 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java
  17. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialMaterialController.java
  18. 9 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java
  19. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITrialMaterialMobilizationService.java
  20. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ArchiveFileServiceImpl.java
  21. 52 6
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialDetectionDataServiceImpl.java
  22. 2 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialMaterialMobilizationServiceImpl.java
  23. 4 4
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSampleInfoServiceImpl.java
  24. 52 52
      blade-service/blade-business/src/main/java/org/springblade/business/utils/FileUtils.java
  25. 8 8
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java
  26. 16 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ArchiveTreeContractImpl.java
  27. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java
  28. 28 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  29. 42 8
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java
  30. 105 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java
  31. 20 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java
  32. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeServiceImpl.java
  33. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

+ 28 - 0
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/BladeOssRule.java

@@ -0,0 +1,28 @@
+package org.springblade.resource.builder.oss;
+
+import org.springblade.core.oss.rule.OssRule;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.core.tool.utils.FileUtil;
+
+/**
+ * @author liuYC
+ * @date 2023-03-31
+ * 修改fileName
+ */
+class BladeOssRuleRe implements OssRule {
+    private final Boolean tenantMode;
+
+    public String bucketName(String bucketName) {
+        String prefix = this.tenantMode ? AuthUtil.getTenantId().concat("-") : "";
+        return prefix + bucketName;
+    }
+
+    public String fileName(String originalFilename) {
+        return "upload/" + DateUtil.today() + "/" + FileUtil.getNameWithoutExtension(originalFilename) + "." + FileUtil.getFileExtension(originalFilename);
+    }
+
+    public BladeOssRuleRe(final Boolean tenantMode) {
+        this.tenantMode = tenantMode;
+    }
+}

+ 7 - 3
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/OssBuilder.java

@@ -25,7 +25,6 @@ import org.springblade.core.oss.OssTemplate;
 import org.springblade.core.oss.enums.OssEnum;
 import org.springblade.core.oss.enums.OssEnum;
 import org.springblade.core.oss.enums.OssStatusEnum;
 import org.springblade.core.oss.enums.OssStatusEnum;
 import org.springblade.core.oss.props.OssProperties;
 import org.springblade.core.oss.props.OssProperties;
-import org.springblade.core.oss.rule.BladeOssRule;
 import org.springblade.core.oss.rule.OssRule;
 import org.springblade.core.oss.rule.OssRule;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.utils.*;
 import org.springblade.core.tool.utils.*;
@@ -94,9 +93,14 @@ public class OssBuilder {
                     OssRule ossRule;
                     OssRule ossRule;
                     // 若采用默认设置则开启多租户模式, 若是用户自定义oss则不开启
                     // 若采用默认设置则开启多租户模式, 若是用户自定义oss则不开启
                     if (oss.getEndpoint().equals(ossProperties.getEndpoint()) && oss.getAccessKey().equals(ossProperties.getAccessKey()) && ossProperties.getTenantMode()) {
                     if (oss.getEndpoint().equals(ossProperties.getEndpoint()) && oss.getAccessKey().equals(ossProperties.getAccessKey()) && ossProperties.getTenantMode()) {
-                        ossRule = new BladeOssRule(Boolean.TRUE);
+                        /**
+                         * @author liuYc
+                         * @create 2023-03-31
+                         * @deprecated 重写BladeOssRule-》BladeOssRuleRe 修改文件名UUID -》原始名
+                         */
+                        ossRule = new BladeOssRuleRe(Boolean.TRUE);
                     } else {
                     } else {
-                        ossRule = new BladeOssRule(Boolean.FALSE);
+                        ossRule = new BladeOssRuleRe(Boolean.FALSE);
                     }
                     }
                     if (oss.getCategory() == OssEnum.MINIO.getCategory()) {
                     if (oss.getCategory() == OssEnum.MINIO.getCategory()) {
                         template = MinioOssBuilder.template(oss, ossRule);
                         template = MinioOssBuilder.template(oss, ossRule);

+ 3 - 0
blade-ops/blade-swagger/src/main/resources/application-dev.yml

@@ -19,3 +19,6 @@ knife4j:
       - name: 业务接口
       - name: 业务接口
         uri: 127.0.0.1:8090
         uri: 127.0.0.1:8090
         location: /blade-business/v2/api-docs
         location: /blade-business/v2/api-docs
+      - name: 档案接口
+        uri: 127.0.0.1:8090
+        location: /blade-archive/v2/api-docs

+ 30 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveOfflineVersionInfo.java

@@ -0,0 +1,30 @@
+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 org.springblade.core.mp.base.BaseEntity;
+
+import java.time.LocalDateTime;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/3/30 18:26
+ **/
+@Data
+@TableName("u_archive_offline_version_info")
+public class ArchiveOfflineVersionInfo extends BaseEntity {
+    private Long id;
+    private Long projectId;
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "发布时间")
+    private LocalDateTime uploadDate;
+    @ApiModelProperty(value = "文件路径")
+    private String fileUrl;
+    @ApiModelProperty(value = "文件名称")
+    private String fileName;
+    @ApiModelProperty(value = "文件大小")
+    private String fileSize;
+}

+ 5 - 4
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialMaterialMobilization.java

@@ -10,6 +10,7 @@ import org.springblade.core.mp.base.BaseEntity;
 
 
 import javax.validation.constraints.DecimalMax;
 import javax.validation.constraints.DecimalMax;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.Date;
 
 
@@ -65,15 +66,15 @@ public class TrialMaterialMobilization extends BaseEntity {
      * 材料单价
      * 材料单价
      */
      */
     @ApiModelProperty(value = "材料单价")
     @ApiModelProperty(value = "材料单价")
-    @DecimalMax(value = "10", message = "材料单价最大长度10个字符")
-    private BigDecimal materialPrice;
+    @Length(max = 100, message = "材料单价最大长度100个字符")
+    private String materialPrice;
 
 
     /**
     /**
      * 材料数量
      * 材料数量
      */
      */
     @ApiModelProperty(value = "材料数量")
     @ApiModelProperty(value = "材料数量")
-    @Max(value = 10, message = "材料数量最长10个字符")
-    private Integer materialCount;
+    @Length(max = 100, message = "材料数量最大长度100个字符")
+    private String materialCount;
 
 
     /**
     /**
      * 计算单位
      * 计算单位

+ 2 - 2
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialSampleInfo.java

@@ -61,13 +61,13 @@ public class TrialSampleInfo extends BaseEntity {
      * 试样数量
      * 试样数量
      */
      */
     @ApiModelProperty(value = "试样数量")
     @ApiModelProperty(value = "试样数量")
-    private Integer materialCount;
+    private String materialCount;
 
 
     /**
     /**
      * 代表数量
      * 代表数量
      */
      */
     @ApiModelProperty(value = "代表数量")
     @ApiModelProperty(value = "代表数量")
-    private Integer representativeCount;
+    private String representativeCount;
 
 
     /**
     /**
      * 计算单位
      * 计算单位

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java

@@ -61,4 +61,7 @@ public interface ArchiveFileClient {
 
 
     @PostMapping(API_PREFIX + "/getArchiveFileByArchivesId")
     @PostMapping(API_PREFIX + "/getArchiveFileByArchivesId")
     List<ArchiveFile> getArchiveFileByArchivesId(@RequestParam String archivesIds,@RequestParam String fileIds);
     List<ArchiveFile> getArchiveFileByArchivesId(@RequestParam String archivesIds,@RequestParam String fileIds);
+
+    @PostMapping(API_PREFIX + "/updateArchiveFileForCreateArchive")
+    void updateArchiveFileForCreateArchive(@RequestBody List<ArchiveFile> waitArchiveFiles);
 }
 }

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ArchiveTreeContractClient.java

@@ -21,4 +21,7 @@ public interface ArchiveTreeContractClient {
     List<ArchiveTreeContract> queryAllChildByAncestors(@RequestParam String id);
     List<ArchiveTreeContract> queryAllChildByAncestors(@RequestParam String id);
 
 
 
 
+    @PostMapping(API_PREFIX + "/getHavedFileNodeByProjectID")
+    List<ArchiveTreeContract> getHavedFileNodeByProjectID(@RequestParam Long projectId);
+
 }
 }

+ 74 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveOfflineVersionInfoController.java

@@ -0,0 +1,74 @@
+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.apache.commons.lang.StringUtils;
+import org.springblade.archive.entity.ArchiveOfflineVersionInfo;
+import org.springblade.archive.mapper.ArchiveOfflineVersionInfoMapper;
+import org.springblade.archive.service.IArchiveOfflineVersionInfoService;
+import org.springblade.common.utils.CommonUtil;
+import org.springblade.core.oss.model.BladeFile;
+import org.springblade.core.tool.api.R;
+import org.springblade.resource.vo.NewBladeFile;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.text.DecimalFormat;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/3/30 18:28
+ **/
+@RestController
+@AllArgsConstructor
+@RequestMapping("/archiveOfflineVersionInfo")
+@Api(value = "档案离线版本信息", tags = "档案离线版本信息")
+public class ArchiveOfflineVersionInfoController {
+
+    private final ArchiveOfflineVersionInfoMapper mapper;
+
+    /**
+     * 打包数据
+     */
+    @ApiOperation(value = "打包数据")
+    @GetMapping("/packData")
+    public R<String> packData(Long projectId){
+        //异步调用自动打包上传,完成后修改数据库信息
+        return R.data("最新数据后台自动打包中,打包完成后会更新打包日期");
+    }
+    /**
+     * 脱机载体工具
+     */
+    @ApiOperation(value = "脱机载体工具")
+    @GetMapping("/getVersionInfo")
+    public R<ArchiveOfflineVersionInfo> getVersionInfo(Long projectId){
+        ArchiveOfflineVersionInfo versionInfo = mapper.selectVersionInfo(111L);
+        String size = this.formatSize(Long.parseLong(versionInfo.getFileSize()));
+        versionInfo.setFileSize(size);
+        return R.data(versionInfo);
+    }
+    /**
+     * 根据字节返回文件大小
+     */
+    private String formatSize(long fileS) {
+        DecimalFormat df = new DecimalFormat("#.00");
+        String fileSizeString = "";
+        String wrongSize = "0B";
+        if (fileS == 0) {
+            return wrongSize;
+        }
+        if (fileS < 1024) {
+            fileSizeString = df.format((double) fileS) + "B";
+        } else if (fileS < 1048576) {
+            fileSizeString = df.format((double) fileS / 1024) + "KB";
+        } else if (fileS < 1073741824) {
+            fileSizeString = df.format((double) fileS / 1048576) + "MB";
+        } else {
+            fileSizeString = df.format((double) fileS / 1073741824) + "GB";
+        }
+        return fileSizeString;
+    }
+}

+ 14 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveOfflineVersionInfoMapper.java

@@ -0,0 +1,14 @@
+package org.springblade.archive.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.archive.entity.ArchiveOfflineVersionInfo;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/3/31 10:09
+ **/
+public interface ArchiveOfflineVersionInfoMapper extends BaseMapper<ArchiveOfflineVersionInfo> {
+    ArchiveOfflineVersionInfo selectVersionInfo(@Param("projectId") Long projectId);
+}

+ 20 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveOfflineVersionInfoMapper.xml

@@ -0,0 +1,20 @@
+<?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.ArchiveOfflineVersionInfoMapper">
+
+    <resultMap id="ResultMap" type="org.springblade.archive.entity.ArchiveOfflineVersionInfo">
+        <result column="id" property="id"/>
+        <result column="project_id" property="projectId"/>
+        <result column="upload_date" property="uploadDate"/>
+        <result column="file_url" property="fileUrl"/>
+        <result column="file_name" property="fileName"/>
+        <result column="file_size" property="fileSize"/>
+    </resultMap>
+    <select id="selectVersionInfo" resultMap="ResultMap">
+        SELECT id, project_id, upload_date, file_url, file_name, file_size
+        FROM bladex.u_archive_offline_version_info
+        where project_id = #{projectId}
+        order by upload_date desc
+        limit 1;
+    </select>
+</mapper>

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

@@ -0,0 +1,12 @@
+package org.springblade.archive.service;
+
+import org.springblade.archive.entity.ArchiveOfflineVersionInfo;
+import org.springblade.core.mp.base.BaseService;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/3/31 10:09
+ **/
+public interface IArchiveOfflineVersionInfoService extends BaseService<ArchiveOfflineVersionInfo> {
+}

+ 0 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java

@@ -41,6 +41,4 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 	IPage<ArchivesAutoVO> selectArchivesAutoFilePage(ArchivesAutoVO queryVo);
 	IPage<ArchivesAutoVO> selectArchivesAutoFilePage(ArchivesAutoVO queryVo);
 
 
 	boolean updateArchivesAutoFileByNodeId(String ids, String nodeId,String nodeSort);
 	boolean updateArchivesAutoFileByNodeId(String ids, String nodeId,String nodeSort);
-
-	void splitArchvies(Long projectId);
 }
 }

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

@@ -0,0 +1,16 @@
+package org.springblade.archive.service.impl;
+
+import org.springblade.archive.entity.ArchiveOfflineVersionInfo;
+import org.springblade.archive.mapper.ArchiveOfflineVersionInfoMapper;
+import org.springblade.archive.service.IArchiveOfflineVersionInfoService;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/3/31 10:09
+ **/
+@Service
+public class ArchiveOfflineVersionInfoServiceImpl extends BaseServiceImpl<ArchiveOfflineVersionInfoMapper, ArchiveOfflineVersionInfo> implements IArchiveOfflineVersionInfoService {
+}

+ 83 - 49
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -32,11 +32,13 @@ import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springblade.manager.feign.ArchiveTreeContractClient;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.feign.IDictBizClient;
 import org.springblade.system.feign.IDictBizClient;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
 
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.*;
 
 
 /**
 /**
@@ -51,6 +53,9 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 
 	private final IDictBizClient iDictBizClient;
 	private final IDictBizClient iDictBizClient;
 	private ArchiveFileClient archiveFileClient;
 	private ArchiveFileClient archiveFileClient;
+	private ArchiveTreeContractClient archiveTreeContractClient;
+
+
 	@Override
 	@Override
 	public IPage<ArchivesAutoVO> selectArchivesAutoPage(IPage<ArchivesAutoVO> page, ArchivesAutoVO archivesAuto) {
 	public IPage<ArchivesAutoVO> selectArchivesAutoPage(IPage<ArchivesAutoVO> page, ArchivesAutoVO archivesAuto) {
 		return page.setRecords(baseMapper.selectArchivesAutoPage(page, archivesAuto));
 		return page.setRecords(baseMapper.selectArchivesAutoPage(page, archivesAuto));
@@ -112,26 +117,34 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	}
 	}
 
 
 
 
-	/**
-	 * 自动归档前 将未锁定的案卷拆卷
-	 * @param projectId
-	 */
-	@Override
-	public void splitArchvies(Long projectId){
-		try{
-			baseMapper.splitArchvies(projectId);
-		}catch (Exception e){
-			e.printStackTrace();
-		}
-	}
-
-
 
 
-	public void archiveAutoMethod(){
+	public void archiveAutoMethod(Long projectId){
 		//步骤一:把项目下未锁定的案卷拆卷。
 		//步骤一:把项目下未锁定的案卷拆卷。
+		baseMapper.splitArchvies(projectId);
 		//步骤二:查询归档树节点。存在未归档文件的节点。
 		//步骤二:查询归档树节点。存在未归档文件的节点。
+		List<ArchiveTreeContract> list = archiveTreeContractClient.getHavedFileNodeByProjectID(projectId);
 		//步骤三:遍历归档树节点整理出 默认规则节点,分类并卷节点,单独组卷节点 三个集合。
 		//步骤三:遍历归档树节点整理出 默认规则节点,分类并卷节点,单独组卷节点 三个集合。
+		List<ArchiveTreeContract> list1= new ArrayList<>();
+		List<ArchiveTreeContract> list2= new ArrayList<>();
+		List<ArchiveTreeContract> list3= new ArrayList<>();
+		for(ArchiveTreeContract treeContract:list){
+			Integer archiveAutoType = treeContract.getArchiveAutoType();
+			switch (archiveAutoType){
+				case 1:
+					list1.add(treeContract);
+					break;
+				case 2:
+					list2.add(treeContract);
+					break;
+				case 3:
+					list3.add(treeContract);
+					break;
+			}
+		}
 		//步骤四:按照单独,分类,默认的顺序执行组卷流程。
 		//步骤四:按照单独,分类,默认的顺序执行组卷流程。
+		archiveAutoMethod3(list3);//单独组卷
+		archiveAutoMethod2(list2);//分类组卷
+		archiveAutoMethod1(list1);//默认组卷
 	}
 	}
 
 
 
 
@@ -171,46 +184,60 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		return null;
 		return null;
 	}
 	}
 
 
-	/**
-	 * 单独组卷规则组卷
-	 * @param waitArchiveFiles
-	 * @param node
-	 */
-	private void createArchive3(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node){
-		//1.创建新案卷
+	private ArchivesAuto builtArchives(ArchiveTreeContract node,int pageN,int fileN){
 		ArchivesAuto archivesAuto = new ArchivesAuto();
 		ArchivesAuto archivesAuto = new ArchivesAuto();
-		//archivesAuto.setProjectId();
-		//archivesAuto.setContractId();
-		//archivesAuto.setName();//案卷题名
-		//archivesAuto.setFileNumber();//档号
+		archivesAuto.setProjectId(node.getProjectId());
+		archivesAuto.setContractId(node.getContractId());
+		archivesAuto.setName("");//TODO 案卷题名
+		archivesAuto.setFileNumber("");//TODO 档号
 		//archivesAuto.setMicron();//微缩号
 		//archivesAuto.setMicron();//微缩号
-		//archivesAuto.setUnit();//单位
+		archivesAuto.setUnit("");//TODO 单位
 		//archivesAuto.setQuantity();//数量/单位
 		//archivesAuto.setQuantity();//数量/单位
-		//archivesAuto.setSpecification();//规格
-		//archivesAuto.setStartDate();
-		//archivesAuto.setEndDate();
-		//archivesAuto.setStorageTime();//保管时间
-		//archivesAuto.setSecretLevel();//保密级别
+		archivesAuto.setSpecification("");//TODO 规格 从节点规格获取
+		archivesAuto.setStartDate(null);//TODO 文件开始时间
+		archivesAuto.setEndDate(null);//TODO 文件结束时间
+		archivesAuto.setStorageTime("");//TODO 保管时间  从节点规格获取
+		archivesAuto.setSecretLevel("");//TODO 保密级别 从节点规格获取
 		//archivesAuto.setCarrierType();//载体类型
 		//archivesAuto.setCarrierType();//载体类型
 		//archivesAuto.setKeywords();//主题词
 		//archivesAuto.setKeywords();//主题词
 		//archivesAuto.setStorageLocation();//存放位置
 		//archivesAuto.setStorageLocation();//存放位置
-		//archivesAuto.setIsArchive(1);//已归档
+		archivesAuto.setIsArchive(1);//已归档
 		//archivesAuto.setRemark();//备注
 		//archivesAuto.setRemark();//备注
-		//archivesAuto.setRollDate();//立卷日期
-		//archivesAuto.setRollor();//立卷人
-		//archivesAuto.setNodeId();//归档树节点
-		//archivesAuto.setOutUrl();
-		//archivesAuto.setFileN();//文件数量
-		//archivesAuto.setPageN();//案卷页数
+		archivesAuto.setRollDate(null);// TODO 立卷日期
+		archivesAuto.setRollor("自动");//立卷人
+		archivesAuto.setNodeId(node.getId());//归档树节点
+		archivesAuto.setOutUrl("");//TODO 生成案卷的封面 目录 备考表,背级
+		archivesAuto.setFileN(fileN);//文件数量
+		archivesAuto.setPageN(pageN);//案卷页数
 		//archivesAuto.setMileage();
 		//archivesAuto.setMileage();
 		//archivesAuto.setFileType();
 		//archivesAuto.setFileType();
 		//archivesAuto.setSize();
 		//archivesAuto.setSize();
-		//archivesAuto.setTreeSort();
+		archivesAuto.setTreeSort(node.getTreeSort());
 		//archivesAuto.setIsOpen();
 		//archivesAuto.setIsOpen();
-		//archivesAuto.setIscheck();
-		//archivesAuto.setIsAutoFile();
+		archivesAuto.setIscheck(0);
+		archivesAuto.setIsAutoFile(0);//是否案卷收集上传的案卷
+		archivesAuto.setIsLock(0);//案卷锁定状态
+		baseMapper.insert(archivesAuto);
+		return archivesAuto;
+	}
 
 
+	/**
+	 * 单独组卷规则组卷
+	 * @param waitArchiveFiles
+	 * @param node
+	 */
+	private void createArchive3(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node,int pageN){
+
+		//1.创建新案卷
+		ArchivesAuto archivesAuto = builtArchives(node, pageN, waitArchiveFiles.size());
 		//2.设置文件所属案卷,组卷状态
 		//2.设置文件所属案卷,组卷状态
+		Long archivesAutoId = archivesAuto.getId();
+		for(ArchiveFile file:waitArchiveFiles){
+			file.setArchiveId(archivesAutoId);//设置文件所属案卷
+			file.setIsArchive(1);
+			//TODO 重新打页码文件
+		}
+		archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
 	}
 	}
 
 
 
 
@@ -240,8 +267,9 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 					//步骤5:判断文件是否存在分盒设置
 					//步骤5:判断文件是否存在分盒设置
 					if(file.getBoxNumber()!=null){
 					if(file.getBoxNumber()!=null){
 						//TODO 走分盒组卷流程
 						//TODO 走分盒组卷流程
-						if(archiveFilesSize==archiveFiles.size()){
-							//TODO 最后一个文件直接将waitArchiveFiles组卷
+						if(archiveFilesSize==archiveFiles.size() && waitArchiveFiles.size()>0){
+							//最后一个文件直接将waitArchiveFiles组卷
+							createArchive3(waitArchiveFiles,node,archivesSize);
 						}
 						}
 					}else{
 					}else{
 						//单独组卷流程
 						//单独组卷流程
@@ -254,7 +282,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 							waitArchiveFiles.add(file);
 							waitArchiveFiles.add(file);
 							//判断是否最后一个文件
 							//判断是否最后一个文件
 							if(archiveFilesSize==archiveFiles.size()){
 							if(archiveFilesSize==archiveFiles.size()){
-								//TODO 最后一个文件直接将waitArchiveFiles组卷
+								//最后一个文件直接将waitArchiveFiles组卷
+								createArchive3(waitArchiveFiles,node,archivesSize);
 							}else{
 							}else{
 								continue;
 								continue;
 							}
 							}
@@ -262,7 +291,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 						//步骤6.2达到规格 可以组一卷
 						//步骤6.2达到规格 可以组一卷
 						if(checkStatus==1){
 						if(checkStatus==1){
 							waitArchiveFiles.add(file);
 							waitArchiveFiles.add(file);
-							//TODO 将waitArchiveFiles组卷
+							//将waitArchiveFiles组卷
+							createArchive3(waitArchiveFiles,node,archivesSize);
 							//将待组卷文件集合,总页数还原初始值,
 							//将待组卷文件集合,总页数还原初始值,
 							waitArchiveFiles.clear();
 							waitArchiveFiles.clear();
 							archivesSize=0;
 							archivesSize=0;
@@ -271,7 +301,9 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 						if(checkStatus==-1){
 						if(checkStatus==-1){
 							//如果waitArchiveFiles集合size>0,先将集合中文件组卷。再将当前文件放入集合
 							//如果waitArchiveFiles集合size>0,先将集合中文件组卷。再将当前文件放入集合
 							if(waitArchiveFiles.size()>0){
 							if(waitArchiveFiles.size()>0){
-								//TODO 将waitArchiveFiles组卷,然后将待组卷文件集合,总页数还原初始值,
+								//将waitArchiveFiles组卷,
+								createArchive3(waitArchiveFiles,node,archivesSize);
+								//然后将待组卷文件集合,总页数还原初始值,
 								waitArchiveFiles.clear();
 								waitArchiveFiles.clear();
 								//保存当前文件进入待组卷集合,待组卷页数=当前文件页数
 								//保存当前文件进入待组卷集合,待组卷页数=当前文件页数
 								waitArchiveFiles.add(file);
 								waitArchiveFiles.add(file);
@@ -279,14 +311,16 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 
 								//判断是否最后一个文件
 								//判断是否最后一个文件
 								if(archiveFilesSize==archiveFiles.size()){
 								if(archiveFilesSize==archiveFiles.size()){
-									//TODO 如果当前文件最后一个文件直接将waitArchiveFiles组卷
+									//如果当前文件最后一个文件直接将waitArchiveFiles组卷
+									createArchive3(waitArchiveFiles,node,archivesSize);
 									waitArchiveFiles.clear();
 									waitArchiveFiles.clear();
 									archivesSize=0;
 									archivesSize=0;
 								}
 								}
 							}else{
 							}else{
 								//步骤6.3.2如果waitArchiveFiles集合size=0,说明当前文件已经超过规格,直接将当前文件组卷
 								//步骤6.3.2如果waitArchiveFiles集合size=0,说明当前文件已经超过规格,直接将当前文件组卷
 								waitArchiveFiles.add(file);
 								waitArchiveFiles.add(file);
-								//TODO 直接将waitArchiveFiles组卷
+								//直接将waitArchiveFiles组卷
+								createArchive3(waitArchiveFiles,node,archivesSize);
 								waitArchiveFiles.clear();
 								waitArchiveFiles.clear();
 								archivesSize=0;
 								archivesSize=0;
 							}
 							}

+ 5 - 2
blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java

@@ -13,6 +13,8 @@ import lombok.AllArgsConstructor;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import javax.validation.Valid;
 
 
+import org.apache.poi.openxml4j.opc.PackagePart;
+import org.apache.poi.openxml4j.opc.PackageRelationship;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.util.IOUtils;
 import org.apache.poi.util.IOUtils;
 import org.springblade.business.entity.ImageClassificationShow;
 import org.springblade.business.entity.ImageClassificationShow;
@@ -57,6 +59,7 @@ import org.springblade.business.service.IImageClassificationFileService;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartFile;
 
 
+import java.awt.image.BufferedImage;
 import java.io.*;
 import java.io.*;
 import java.net.URL;
 import java.net.URL;
 import java.net.URLConnection;
 import java.net.URLConnection;
@@ -210,11 +213,11 @@ public class ImageClassificationFileController extends BladeController {
                                                 float reduceMultiple = 0.5f;
                                                 float reduceMultiple = 0.5f;
                                                 bytes = FileUtils.resizeImage(bytes, reduceMultiple);
                                                 bytes = FileUtils.resizeImage(bytes, reduceMultiple);
                                             }
                                             }
-                                            //byte[] bytesNew = FileUtils.resizeImage(bytes, 0f);
                                             byte[] bytesNew = bytes;
                                             byte[] bytesNew = bytes;
 
 
                                             //创建图片
                                             //创建图片
-                                            drawing.createPicture(anchor, workbook.addPicture(bytesNew, Workbook.PICTURE_TYPE_JPEG));
+                                            drawing.createPicture(anchor, workbook.addPicture(bytesNew, Workbook.PICTURE_TYPE_PNG));
+
                                             //图片定位
                                             //图片定位
                                             FileUtils.imageOrientation(sheet, anchor, i == 1 ? new DataVO(1, 28) : new DataVO(0, 0));
                                             FileUtils.imageOrientation(sheet, anchor, i == 1 ? new DataVO(1, 28) : new DataVO(0, 0));
 
 

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialMaterialController.java

@@ -72,7 +72,7 @@ public class TrialMaterialController extends BladeController {
     @GetMapping("/mobilization/page")
     @GetMapping("/mobilization/page")
     @ApiOperationSupport(order = 3)
     @ApiOperationSupport(order = 3)
     @ApiOperation(value = "进场材料分页条件查询", notes = "传入Query、TrialMaterialMobilizationVO")
     @ApiOperation(value = "进场材料分页条件查询", notes = "传入Query、TrialMaterialMobilizationVO")
-    public R<IPage<TrialMaterialMobilizationVO>> mobilizationPage(Query query, TrialMaterialMobilizationVO obj) {
+    public R<IPage<TrialMaterialMobilizationVO>> mobilizationPage(Query query, TrialMaterialMobilizationVO obj) throws Exception {
         return R.data(iTrialMaterialMobilizationService.selectPage(Condition.getPage(query), obj));
         return R.data(iTrialMaterialMobilizationService.selectPage(Condition.getPage(query), obj));
     }
     }
 
 

+ 9 - 0
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java

@@ -85,4 +85,13 @@ public class ArchiveFileClientImpl implements ArchiveFileClient {
 
 
         return this.iArchiveFileService.getArchiveFileByArchivesId(archivesIds,fileIds);
         return this.iArchiveFileService.getArchiveFileByArchivesId(archivesIds,fileIds);
     }
     }
+
+    /**
+     * 组卷完成 设置文件对应案卷
+     * @param waitArchiveFiles
+     */
+    @Override
+    public void updateArchiveFileForCreateArchive(List<ArchiveFile> waitArchiveFiles) {
+        iArchiveFileService.updateBatchById(waitArchiveFiles);
+    }
 }
 }

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/ITrialMaterialMobilizationService.java

@@ -24,7 +24,7 @@ public interface ITrialMaterialMobilizationService extends BaseService<TrialMate
 
 
     boolean mobilizationCopy(List<TrialMaterialMobilizationDTO> dto);
     boolean mobilizationCopy(List<TrialMaterialMobilizationDTO> dto);
 
 
-    IPage<TrialMaterialMobilizationVO> selectPage(IPage<TrialMaterialMobilization> page, TrialMaterialMobilizationVO obj);
+    IPage<TrialMaterialMobilizationVO> selectPage(IPage<TrialMaterialMobilization> page, TrialMaterialMobilizationVO obj) throws Exception;
 
 
     List<TrialMaterialMobilization> selectList();
     List<TrialMaterialMobilization> selectList();
 
 

+ 2 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ArchiveFileServiceImpl.java

@@ -156,6 +156,7 @@ public class ArchiveFileServiceImpl extends BaseServiceImpl<ArchiveFileMapper, A
 		}
 		}
 	}
 	}
 
 
+
 	@Override
 	@Override
 	public IPage<ArchiveFileVO> selectArchiveFilePageByBoxName(ArchiveFileVO vo) {
 	public IPage<ArchiveFileVO> selectArchiveFilePageByBoxName(ArchiveFileVO vo) {
 		Query query = new Query();
 		Query query = new Query();
@@ -179,4 +180,5 @@ public class ArchiveFileServiceImpl extends BaseServiceImpl<ArchiveFileMapper, A
 
 
 		return iPage.setRecords(pageVoList);
 		return iPage.setRecords(pageVoList);
 	}
 	}
+
 }
 }

+ 52 - 6
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialDetectionDataServiceImpl.java

@@ -146,9 +146,29 @@ public class TrialDetectionDataServiceImpl extends BaseServiceImpl<TrialDetectio
             for (TrialDetectionData trialDetectionDatum : trialDetectionData) {
             for (TrialDetectionData trialDetectionDatum : trialDetectionData) {
                 TrialDetectionData obj = BeanUtil.copyProperties(trialDetectionDatum, TrialDetectionData.class);
                 TrialDetectionData obj = BeanUtil.copyProperties(trialDetectionDatum, TrialDetectionData.class);
                 if (obj != null) {
                 if (obj != null) {
-                    obj.setId(SnowFlakeUtil.getId());
+                    /*if (ObjectUtil.isNotEmpty(obj.getReportNo())) {
+                        Long row = baseMapper.selectCount(Wrappers.<TrialDetectionData>lambdaQuery()
+                                .eq(TrialDetectionData::getContractId, obj.getContractId())
+                                .eq(TrialDetectionData::getNodeId, obj.getNodeId())
+                                .eq(TrialDetectionData::getReportNo, obj.getReportNo()));
+                        if (row > 0) {
+                            throw new ServiceException("当前合同段该节点下已存在相同的报告编号,请重新填写");
+                        }
+                    }
+                    if (ObjectUtil.isNotEmpty(obj.getEntrustNo())) {
+                        Long row = baseMapper.selectCount(Wrappers.<TrialDetectionData>lambdaQuery()
+                                .eq(TrialDetectionData::getContractId, obj.getContractId())
+                                .eq(TrialDetectionData::getNodeId, obj.getNodeId())
+                                .eq(TrialDetectionData::getEntrustNo, obj.getEntrustNo()));
+                        if (row > 0) {
+                            throw new ServiceException("当前合同段该节点下已存在相同的委托编号,请重新填写");
+                        }
+                    }*/
+
+                    //批量复制不能前端不能重新填写编号,所以设null
                     obj.setEntrustNo(null);
                     obj.setEntrustNo(null);
                     obj.setReportNo(null);
                     obj.setReportNo(null);
+                    obj.setId(SnowFlakeUtil.getId());
                     insertData.add(obj);
                     insertData.add(obj);
                 }
                 }
             }
             }
@@ -158,9 +178,25 @@ public class TrialDetectionDataServiceImpl extends BaseServiceImpl<TrialDetectio
             //单条复制编辑新增保存
             //单条复制编辑新增保存
             TrialDetectionData obj = BeanUtil.copyProperties(dto, TrialDetectionData.class);
             TrialDetectionData obj = BeanUtil.copyProperties(dto, TrialDetectionData.class);
             if (obj != null) {
             if (obj != null) {
+                if (ObjectUtil.isNotEmpty(obj.getReportNo())) {
+                    Long row = baseMapper.selectCount(Wrappers.<TrialDetectionData>lambdaQuery()
+                            .eq(TrialDetectionData::getContractId, obj.getContractId())
+                            .eq(TrialDetectionData::getNodeId, obj.getNodeId())
+                            .eq(TrialDetectionData::getReportNo, obj.getReportNo()));
+                    if (row > 0) {
+                        throw new ServiceException("当前合同段该节点下已存在相同的报告编号,请重新填写");
+                    }
+                }
+                if (ObjectUtil.isNotEmpty(obj.getEntrustNo())) {
+                    Long row = baseMapper.selectCount(Wrappers.<TrialDetectionData>lambdaQuery()
+                            .eq(TrialDetectionData::getContractId, obj.getContractId())
+                            .eq(TrialDetectionData::getNodeId, obj.getNodeId())
+                            .eq(TrialDetectionData::getEntrustNo, obj.getEntrustNo()));
+                    if (row > 0) {
+                        throw new ServiceException("当前合同段该节点下已存在相同的委托编号,请重新填写");
+                    }
+                }
                 obj.setId(SnowFlakeUtil.getId());
                 obj.setId(SnowFlakeUtil.getId());
-                obj.setEntrustNo(null);
-                obj.setReportNo(null);
                 this.save(obj);
                 this.save(obj);
             }
             }
         }
         }
@@ -177,10 +213,10 @@ public class TrialDetectionDataServiceImpl extends BaseServiceImpl<TrialDetectio
         List<String> names = trialSampleInfoList.stream().map(TrialSampleInfo::getMaterialName).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
         List<String> names = trialSampleInfoList.stream().map(TrialSampleInfo::getMaterialName).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
         List<String> numbers = trialSampleInfoList.stream().map(TrialSampleInfo::getSpecificationNumber).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
         List<String> numbers = trialSampleInfoList.stream().map(TrialSampleInfo::getSpecificationNumber).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
         List<String> descriptions = trialSampleInfoList.stream().map(TrialSampleInfo::getSampleDescription).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
         List<String> descriptions = trialSampleInfoList.stream().map(TrialSampleInfo::getSampleDescription).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
-        List<Integer> counts = trialSampleInfoList.stream().map(TrialSampleInfo::getMaterialCount).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
+        List<String> counts = trialSampleInfoList.stream().map(TrialSampleInfo::getMaterialCount).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
+        List<Date> samplingDate = trialSampleInfoList.stream().map(TrialSampleInfo::getSamplingDate).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
 
 
         List<Map<String, String>> resultMapList = new ArrayList<>();
         List<Map<String, String>> resultMapList = new ArrayList<>();
-
         //获取当前合同段下的试验节点下的表
         //获取当前合同段下的试验节点下的表
         WbsTreePrivate trialNode = jdbcTemplate.query("select * from m_wbs_tree_private where p_key_id =" + nodePKeyId, new BeanPropertyRowMapper<>(WbsTreePrivate.class)).stream().findAny().orElse(null);
         WbsTreePrivate trialNode = jdbcTemplate.query("select * from m_wbs_tree_private where p_key_id =" + nodePKeyId, new BeanPropertyRowMapper<>(WbsTreePrivate.class)).stream().findAny().orElse(null);
         if (trialNode != null) {
         if (trialNode != null) {
@@ -196,6 +232,7 @@ public class TrialDetectionDataServiceImpl extends BaseServiceImpl<TrialDetectio
                     Elements ypNumber = doc.select("el-input[placeholder~=样品编号.*]");
                     Elements ypNumber = doc.select("el-input[placeholder~=样品编号.*]");
                     Elements ypCount = doc.select("el-input[placeholder~=样品数量.*]");
                     Elements ypCount = doc.select("el-input[placeholder~=样品数量.*]");
                     Elements ypMs = doc.select("el-input[placeholder~=样品描述.*]");
                     Elements ypMs = doc.select("el-input[placeholder~=样品描述.*]");
+                    Elements qyTime = doc.select("el-input[placeholder~=取样时间.*]");
 
 
                     //样品名称
                     //样品名称
                     if (ypName.size() >= 1) {
                     if (ypName.size() >= 1) {
@@ -220,7 +257,7 @@ public class TrialDetectionDataServiceImpl extends BaseServiceImpl<TrialDetectio
                         for (Element element : ypCount) {
                         for (Element element : ypCount) {
                             int trIndex = Integer.parseInt(element.attr("trindex"));
                             int trIndex = Integer.parseInt(element.attr("trindex"));
                             if (trIndex <= 6) {
                             if (trIndex <= 6) {
-                                map.put(element.attr("keyName"), ObjectUtils.isNotEmpty(counts) ? counts.stream().reduce(Integer::sum).orElse(0).toString() : "");
+                                map.put(element.attr("keyName"), ObjectUtils.isNotEmpty(counts) ? counts.stream().map(Integer::valueOf).reduce(Integer::sum).orElse(0).toString() : "");
                             }
                             }
                         }
                         }
                     }
                     }
@@ -233,6 +270,15 @@ public class TrialDetectionDataServiceImpl extends BaseServiceImpl<TrialDetectio
                             }
                             }
                         }
                         }
                     }
                     }
+                    //样品描述
+                    if (qyTime.size() >= 1) {
+                        for (Element element : qyTime) {
+                            int trIndex = Integer.parseInt(element.attr("trindex"));
+                            if (trIndex <= 6) {
+                                map.put(element.attr("keyName"), ObjectUtils.isNotEmpty(samplingDate) ? StringUtils.join(samplingDate, "、") : "");
+                            }
+                        }
+                    }
 
 
                     map.put("tabPKeyId", trialNodeTab.getPKeyId().toString());
                     map.put("tabPKeyId", trialNodeTab.getPKeyId().toString());
                     if (map.size() > 1) {
                     if (map.size() > 1) {

+ 2 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialMaterialMobilizationServiceImpl.java

@@ -118,7 +118,7 @@ public class TrialMaterialMobilizationServiceImpl extends BaseServiceImpl<TrialM
     }
     }
 
 
     @Override
     @Override
-    public IPage<TrialMaterialMobilizationVO> selectPage(IPage<TrialMaterialMobilization> page, TrialMaterialMobilizationVO obj) {
+    public IPage<TrialMaterialMobilizationVO> selectPage(IPage<TrialMaterialMobilization> page, TrialMaterialMobilizationVO obj) throws Exception {
         List<User> userList = iUserClient.selectUserAll();
         List<User> userList = iUserClient.selectUserAll();
         QueryWrapper<TrialMaterialMobilization> queryWrapper = Condition.getQueryWrapper(obj);
         QueryWrapper<TrialMaterialMobilization> queryWrapper = Condition.getQueryWrapper(obj);
         if (ObjectUtil.isNotEmpty(obj.getMaterialType())) {
         if (ObjectUtil.isNotEmpty(obj.getMaterialType())) {
@@ -142,6 +142,7 @@ public class TrialMaterialMobilizationServiceImpl extends BaseServiceImpl<TrialM
             for (User user : userList) {
             for (User user : userList) {
                 if (user.getId().equals(record.getUserId())) {
                 if (user.getId().equals(record.getUserId())) {
                     record.setUserName(user.getName());
                     record.setUserName(user.getName());
+                    break;
                 }
                 }
             }
             }
         }
         }

+ 4 - 4
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSampleInfoServiceImpl.java

@@ -145,10 +145,10 @@ public class TrialSampleInfoServiceImpl extends BaseServiceImpl<TrialSampleInfoM
         List<User> userList = iUserClient.selectUserAll();
         List<User> userList = iUserClient.selectUserAll();
         for (TrialSampleInfoVO record : records) {
         for (TrialSampleInfoVO record : records) {
             if (ObjectUtils.isEmpty(record.getMaterialCount())) {
             if (ObjectUtils.isEmpty(record.getMaterialCount())) {
-                record.setMaterialCount(0);
+                record.setMaterialCount("0");
             }
             }
             if (ObjectUtils.isEmpty(record.getRepresentativeCount())) {
             if (ObjectUtils.isEmpty(record.getRepresentativeCount())) {
-                record.setRepresentativeCount(0);
+                record.setRepresentativeCount("0");
             }
             }
 
 
             for (User user : userList) {
             for (User user : userList) {
@@ -177,10 +177,10 @@ public class TrialSampleInfoServiceImpl extends BaseServiceImpl<TrialSampleInfoM
         TrialSampleInfo trialSampleInfo = BeanUtil.copyProperties(obj, TrialSampleInfo.class);
         TrialSampleInfo trialSampleInfo = BeanUtil.copyProperties(obj, TrialSampleInfo.class);
         if (trialSampleInfo != null) {
         if (trialSampleInfo != null) {
             if (ObjectUtils.isEmpty(trialSampleInfo.getMaterialCount())) {
             if (ObjectUtils.isEmpty(trialSampleInfo.getMaterialCount())) {
-                trialSampleInfo.setMaterialCount(0);
+                trialSampleInfo.setMaterialCount("0");
             }
             }
             if (ObjectUtils.isEmpty(trialSampleInfo.getRepresentativeCount())) {
             if (ObjectUtils.isEmpty(trialSampleInfo.getRepresentativeCount())) {
-                trialSampleInfo.setRepresentativeCount(0);
+                trialSampleInfo.setRepresentativeCount("0");
             }
             }
             this.saveOrUpdate(trialSampleInfo);
             this.saveOrUpdate(trialSampleInfo);
 
 

+ 52 - 52
blade-service/blade-business/src/main/java/org/springblade/business/utils/FileUtils.java

@@ -5,9 +5,11 @@ import com.itextpdf.text.pdf.PdfCopy;
 import com.itextpdf.text.pdf.PdfReader;
 import com.itextpdf.text.pdf.PdfReader;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.poi.ss.usermodel.ClientAnchor;
 import org.apache.poi.ss.usermodel.ClientAnchor;
+import org.apache.poi.ss.usermodel.Picture;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.util.Units;
 import org.apache.poi.util.Units;
+import org.apache.poi.xssf.usermodel.XSSFPicture;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.vo.DataVO;
 import org.springblade.common.vo.DataVO;
 import org.springblade.core.tool.utils.IoUtil;
 import org.springblade.core.tool.utils.IoUtil;
@@ -26,12 +28,12 @@ import java.util.zip.ZipOutputStream;
 
 
 public class FileUtils {
 public class FileUtils {
 
 
-    public static void batchDownloadFileToZip(List<String> urls, HttpServletResponse response){
+    public static void batchDownloadFileToZip(List<String> urls, HttpServletResponse response) {
         // 设置压缩流:直接写入response,实现边压缩边下载
         // 设置压缩流:直接写入response,实现边压缩边下载
         ZipOutputStream zipos = null;
         ZipOutputStream zipos = null;
         // 循环将文件写入压缩流
         // 循环将文件写入压缩流
         DataOutputStream os = null;
         DataOutputStream os = null;
-        try{
+        try {
 
 
             // 响应头的设置
             // 响应头的设置
             response.reset();
             response.reset();
@@ -51,17 +53,17 @@ public class FileUtils {
                 e.printStackTrace();
                 e.printStackTrace();
             }
             }
 
 
-            if(zipos == null){
+            if (zipos == null) {
                 return;
                 return;
             }
             }
 
 
             InputStream inputStream = null;
             InputStream inputStream = null;
 
 
-            for(String url : urls){
-                if(StringUtils.isNotEmpty(url)){
-                    try{
+            for (String url : urls) {
+                if (StringUtils.isNotEmpty(url)) {
+                    try {
                         String fileName = null, symbol = "";
                         String fileName = null, symbol = "";
-                        if(url.contains("@@@")){
+                        if (url.contains("@@@")) {
                             String[] array = url.split("@@@");
                             String[] array = url.split("@@@");
                             url = array[0];
                             url = array[0];
                             fileName = array[1];
                             fileName = array[1];
@@ -73,7 +75,7 @@ public class FileUtils {
                         //转换
                         //转换
                         byte[] bytes = CommonUtil.InputStreamToBytes(inputStream);
                         byte[] bytes = CommonUtil.InputStreamToBytes(inputStream);
 
 
-                        if(StringUtils.isEmpty(fileName)){
+                        if (StringUtils.isEmpty(fileName)) {
                             fileName = url.substring(url.lastIndexOf("/") + 1);
                             fileName = url.substring(url.lastIndexOf("/") + 1);
                             symbol = "";
                             symbol = "";
                         }
                         }
@@ -83,7 +85,7 @@ public class FileUtils {
                         os.write(bytes);
                         os.write(bytes);
                         zipos.closeEntry();
                         zipos.closeEntry();
 
 
-                    }catch (Exception e){
+                    } catch (Exception e) {
                         e.printStackTrace();
                         e.printStackTrace();
                     } finally {
                     } finally {
                         IoUtil.closeQuietly(inputStream);
                         IoUtil.closeQuietly(inputStream);
@@ -91,7 +93,7 @@ public class FileUtils {
                 }
                 }
             }
             }
 
 
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
             e.printStackTrace();
         } finally {
         } finally {
             IoUtil.closeQuietly(os);
             IoUtil.closeQuietly(os);
@@ -103,26 +105,6 @@ public class FileUtils {
      * 压缩图片
      * 压缩图片
      */
      */
     public static byte[] resizeImage(byte[] srcImgData, float reduceMultiple) throws IOException {
     public static byte[] resizeImage(byte[] srcImgData, float reduceMultiple) throws IOException {
-        BufferedImage bi = ImageIO.read(new ByteArrayInputStream(srcImgData));
-        /*int width = (int) (bi.getWidth() * reduceMultiple);
-        int height = (int) (bi.getHeight() * reduceMultiple);*/
-        int width = 600;
-        int height = 800;
-        Image image = bi.getScaledInstance(width, height, Image.SCALE_SMOOTH);
-        BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
-        Graphics g = tag.getGraphics();
-        g.setColor(Color.RED);
-        g.drawImage(image, 0, 0, null);
-        g.dispose();
-        ByteArrayOutputStream bOut = new ByteArrayOutputStream();
-        ImageIO.write(tag, "JPEG", bOut);
-        return bOut.toByteArray();
-    }
-
-    /**
-     * 压缩图片2
-     */
-    public static byte[] resizeImage2(byte[] srcImgData, float reduceMultiple) throws IOException {
         BufferedImage bi = ImageIO.read(new ByteArrayInputStream(srcImgData));
         BufferedImage bi = ImageIO.read(new ByteArrayInputStream(srcImgData));
         int width = (int) (bi.getWidth() * reduceMultiple);
         int width = (int) (bi.getWidth() * reduceMultiple);
         int height = (int) (bi.getHeight() * reduceMultiple);
         int height = (int) (bi.getHeight() * reduceMultiple);
@@ -138,90 +120,108 @@ public class FileUtils {
     }
     }
 
 
     /**
     /**
-     * 图片定位
+     * 设置图片的定位、大小和合并单元格处理
+     *
+     * @param sheet  工作表对象
+     * @param anchor 锚点对象,表示图片的位置和大小
+     * @param dataVO 数据值对象,包含插入图片的单元格坐标
      */
      */
     public static void imageOrientation(Sheet sheet, ClientAnchor anchor, DataVO dataVO) {
     public static void imageOrientation(Sheet sheet, ClientAnchor anchor, DataVO dataVO) {
+        // 设置图片距左边和上边的偏移量
         anchor.setDx1(Units.pixelToEMU(5));
         anchor.setDx1(Units.pixelToEMU(5));
         anchor.setDy1(Units.pixelToEMU(5));
         anchor.setDy1(Units.pixelToEMU(5));
+        // 设置图片右下角所在单元格的行列号与左上角一致
         anchor.setCol2(anchor.getCol1());
         anchor.setCol2(anchor.getCol1());
         anchor.setRow2(anchor.getRow1());
         anchor.setRow2(anchor.getRow1());
-        int k = getMergedRegionIndex(sheet, CommonUtil.join(dataVO.getX(), dataVO.getY(), dataVO.getX(), dataVO.getY(),","));
-        if(k>-1){
-            /*如果是合并单元格,则锚点第二坐标设置为合并区右下角单元格坐标*/
+        // 判断当前单元格是否属于一个合并单元格
+        int k = getMergedRegionIndex(sheet, CommonUtil.join(dataVO.getX(), dataVO.getY(), dataVO.getX(), dataVO.getY(), ","));
+        if (k > -1) {
+            // 如果是合并单元格,则锚点第一坐标设置为合并区左上角单元格坐标,第二坐标设置为合并区右下角单元格坐标
             CellRangeAddress ca = sheet.getMergedRegion(k);
             CellRangeAddress ca = sheet.getMergedRegion(k);
             anchor.setCol1(ca.getFirstColumn());
             anchor.setCol1(ca.getFirstColumn());
             anchor.setRow1(ca.getFirstRow());
             anchor.setRow1(ca.getFirstRow());
             anchor.setCol2(ca.getLastColumn());
             anchor.setCol2(ca.getLastColumn());
             anchor.setRow2(ca.getLastRow());
             anchor.setRow2(ca.getLastRow());
         }
         }
-        int dx=(int)(sheet.getColumnWidthInPixels(anchor.getCol2())+3);
-        int dy=Units.pointsToPixel(sheet.getRow(anchor.getRow2()).getHeightInPoints())-5;
+        // 计算图片宽度和高度的像素值,并将像素值转换成EMUs(English Metric Units)
+        int dx = (int) (sheet.getColumnWidthInPixels(anchor.getCol2()) + 3);
+        int dy = Units.pointsToPixel(sheet.getRow(anchor.getRow2()).getHeightInPoints()) - 5;
         anchor.setDx2(Units.pixelToEMU(dx));
         anchor.setDx2(Units.pixelToEMU(dx));
         anchor.setDy2(Units.pixelToEMU(dy));
         anchor.setDy2(Units.pixelToEMU(dy));
     }
     }
 
 
+    /**
+     * 获取指定单元格所在的合并单元格的下标
+     *
+     * @param sheet  工作表对象
+     * @param coords 单元格坐标字符串,格式为"左上角行号,左上角列号,右下角行号,右下角列号"
+     * @return 返回指定单元格所在的合并单元格下标,如果不存在则返回-1
+     */
     public static int getMergedRegionIndex(Sheet sheet, String coords) {
     public static int getMergedRegionIndex(Sheet sheet, String coords) {
+        // 遍历所有合并单元格
         for (int i = 0; i < sheet.getNumMergedRegions(); i++) {
         for (int i = 0; i < sheet.getNumMergedRegions(); i++) {
             CellRangeAddress ca = sheet.getMergedRegion(i);
             CellRangeAddress ca = sheet.getMergedRegion(i);
             int firstColumn = ca.getFirstColumn();
             int firstColumn = ca.getFirstColumn();
             int lastColumn = ca.getLastColumn();
             int lastColumn = ca.getLastColumn();
             int firstRow = ca.getFirstRow();
             int firstRow = ca.getFirstRow();
             int lastRow = ca.getLastRow();
             int lastRow = ca.getLastRow();
-            Matcher mu = CommonUtil.matcher("(\\d{1,3}),(\\d{1,3}),(\\d{1,3}),(\\d{1,3})",coords);
-            /*合并单元格四个角坐标,只要任意一个在落在将要合并的区域里面意味着两者重合,就必须拆分前者*/
-            List<Integer[]> corners = Arrays.asList(new Integer[]{firstColumn,firstRow},new Integer[]{lastColumn,firstRow},new Integer[]{firstColumn,lastRow},new Integer[]{lastColumn,lastRow});
-            if(mu.find()){
+            // 解析指定单元格坐标字符串
+            Matcher mu = CommonUtil.matcher("(\\d{1,3}),(\\d{1,3}),(\\d{1,3}),(\\d{1,3})", coords);
+            // 判断是否有重叠部分,如果有则返回对应的合并单元格下标
+            List<Integer[]> corners = Arrays.asList(new Integer[]{firstColumn, firstRow}, new Integer[]{lastColumn, firstRow}, new Integer[]{firstColumn, lastRow}, new Integer[]{lastColumn, lastRow});
+            if (mu.find()) {
                 int firstColumn2 = mu.group(1) == null ? 0 : Integer.parseInt(mu.group(1));
                 int firstColumn2 = mu.group(1) == null ? 0 : Integer.parseInt(mu.group(1));
                 int lastColumn2 = mu.group(3) == null ? 0 : Integer.parseInt(mu.group(3));
                 int lastColumn2 = mu.group(3) == null ? 0 : Integer.parseInt(mu.group(3));
                 int firstRow2 = mu.group(2) == null ? 0 : Integer.parseInt(mu.group(2));
                 int firstRow2 = mu.group(2) == null ? 0 : Integer.parseInt(mu.group(2));
                 int lastRow2 = mu.group(4) == null ? 0 : Integer.parseInt(mu.group(4));
                 int lastRow2 = mu.group(4) == null ? 0 : Integer.parseInt(mu.group(4));
-                for(Integer[] corner:corners){
-                    if(firstColumn2<=corner[0]&&corner[0]<=lastColumn2&&firstRow2<=corner[1]&&corner[1]<=lastRow2){
+                for (Integer[] corner : corners) {
+                    if (firstColumn2 <= corner[0] && corner[0] <= lastColumn2 && firstRow2 <= corner[1] && corner[1] <= lastRow2) {
                         return i;
                         return i;
                     }
                     }
                 }
                 }
             }
             }
         }
         }
+        // 如果没有重叠部分,则返回-1
         return -1;
         return -1;
     }
     }
 
 
     /**
     /**
      * 合并方法
      * 合并方法
      */
      */
-    public static void mergePdfPublicMethods(List<String> urlList, String localImgUrl){
+    public static void mergePdfPublicMethods(List<String> urlList, String localImgUrl) {
         PdfReader reader = null;
         PdfReader reader = null;
 
 
         Document doc = new Document();
         Document doc = new Document();
         PdfCopy pdfCopy = null;
         PdfCopy pdfCopy = null;
-        try{
+        try {
             pdfCopy = new PdfCopy(doc, new FileOutputStream(localImgUrl));
             pdfCopy = new PdfCopy(doc, new FileOutputStream(localImgUrl));
             int pageCount;
             int pageCount;
             doc.open();
             doc.open();
 
 
-            for(String urlStr : urlList){
-                try{
+            for (String urlStr : urlList) {
+                try {
                     //获取OSS文件输入流
                     //获取OSS文件输入流
                     reader = new PdfReader(CommonUtil.getOSSInputStream(urlStr));
                     reader = new PdfReader(CommonUtil.getOSSInputStream(urlStr));
 
 
                     pageCount = reader.getNumberOfPages();
                     pageCount = reader.getNumberOfPages();
 
 
-                    for(int i = 0; i < pageCount; ++i){
+                    for (int i = 0; i < pageCount; ++i) {
                         int is = i + 1;
                         int is = i + 1;
-                        pdfCopy.addPage(pdfCopy.getImportedPage(reader,is));
+                        pdfCopy.addPage(pdfCopy.getImportedPage(reader, is));
                     }
                     }
-                }catch (Exception e){
+                } catch (Exception e) {
                     e.printStackTrace();
                     e.printStackTrace();
                 } finally {
                 } finally {
-                    if(reader != null){
+                    if (reader != null) {
                         reader.close();
                         reader.close();
                     }
                     }
                 }
                 }
             }
             }
 
 
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
             e.printStackTrace();
         } finally {
         } finally {
-            if(pdfCopy != null){
+            if (pdfCopy != null) {
                 pdfCopy.flush();
                 pdfCopy.flush();
                 pdfCopy.close();
                 pdfCopy.close();
             }
             }

+ 8 - 8
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java

@@ -162,16 +162,16 @@ public class ArchiveTreeContractController extends BladeController {
 	@ApiOperation(value = "逻辑删除", notes = "传入id")
 	@ApiOperation(value = "逻辑删除", notes = "传入id")
 	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String id) {
 	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String id) {
 		List<ArchiveTreeContract> archiveTrees = archiveTreeContractService.selectByParentIdOrId(id);
 		List<ArchiveTreeContract> archiveTrees = archiveTreeContractService.selectByParentIdOrId(id);
-		archiveTrees.forEach(archiveTree -> {
-			if (archiveTree.getParentId() == Long.parseLong(id)) {
-				throw new ServiceException("当前节点下存在子节点,删除失败");
-			}
-//			if (archiveTree.getIsUploadFileDisplayConfigurationTree() == 1) {
-//				throw new ServiceException("当前节点被引用中,删除失败");
+//		archiveTrees.forEach(archiveTree -> {
+//			if (archiveTree.getParentId() == Long.parseLong(id)) {
+//				throw new ServiceException("当前节点下存在子节点,删除失败");
 //			}
 //			}
-		});
+//
+//		});
+//
+//		return R.status(archiveTreeContractService.deleteLogic(Func.toLongList(id)));
 
 
-		return R.status(archiveTreeContractService.deleteLogic(Func.toLongList(id)));
+		return R.status(archiveTreeContractService.deleteTree(Long.parseLong(id)));
 	}
 	}
 
 
 
 

+ 16 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ArchiveTreeContractImpl.java

@@ -3,6 +3,7 @@ package org.springblade.manager.feign;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springblade.manager.mapper.ArchiveTreeContractMapper;
 import org.springblade.manager.service.IArchiveTreeContractService;
 import org.springblade.manager.service.IArchiveTreeContractService;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 
@@ -15,6 +16,8 @@ public class ArchiveTreeContractImpl implements ArchiveTreeContractClient {
 
 
     private final IArchiveTreeContractService archiveTreeContractService;
     private final IArchiveTreeContractService archiveTreeContractService;
 
 
+    private ArchiveTreeContractMapper archiveTreeContractMapper;
+
     @Override
     @Override
     public List<ArchiveTreeContract> queryAllChildByAncestors(String id) {
     public List<ArchiveTreeContract> queryAllChildByAncestors(String id) {
         List<ArchiveTreeContract> archiveTreeList = this.archiveTreeContractService.list(Wrappers.<ArchiveTreeContract>lambdaQuery().like(ArchiveTreeContract::getAncestors, id));
         List<ArchiveTreeContract> archiveTreeList = this.archiveTreeContractService.list(Wrappers.<ArchiveTreeContract>lambdaQuery().like(ArchiveTreeContract::getAncestors, id));
@@ -29,4 +32,17 @@ public class ArchiveTreeContractImpl implements ArchiveTreeContractClient {
 
 
         return archiveTreeList;
         return archiveTreeList;
     }
     }
+
+    /**
+     * 获取项目下存在未组卷文件的归档树节点
+     * @param projectId
+     * @return
+     */
+    @Override
+    public List<ArchiveTreeContract> getHavedFileNodeByProjectID(Long projectId) {
+        List<ArchiveTreeContract> list = archiveTreeContractMapper.getHavedFileNodeByProjectID(projectId);
+        return list;
+    }
+
+
 }
 }

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java

@@ -65,4 +65,7 @@ public interface ArchiveTreeContractMapper extends BaseMapper<ArchiveTreeContrac
 	int updateBatch2(@Param("diffRent") List<String> diffRent);
 	int updateBatch2(@Param("diffRent") List<String> diffRent);
 
 
 	int updateBatch3();
 	int updateBatch3();
+
+
+	List<ArchiveTreeContract> getHavedFileNodeByProjectID(@Param("projectId") Long projectId);
 }
 }

+ 28 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml

@@ -87,6 +87,7 @@
         <result column="isDisplayTree" property="isDisplayTree"/>
         <result column="isDisplayTree" property="isDisplayTree"/>
         <result column="isStorageNode" property="isStorageNode"/>
         <result column="isStorageNode" property="isStorageNode"/>
         <result column="isBuiltDrawing" property="isBuiltDrawing"/>
         <result column="isBuiltDrawing" property="isBuiltDrawing"/>
+        <result column="association_type" property="associationType"/>
         <result column="postType" property="postType"/>
         <result column="postType" property="postType"/>
         <result column="project_type" property="projectType"/>
         <result column="project_type" property="projectType"/>
         <result column="storage_type" property="storageType"/>
         <result column="storage_type" property="storageType"/>
@@ -180,6 +181,7 @@
         d.is_storage_node AS "isStorageNode",
         d.is_storage_node AS "isStorageNode",
         d.post_type AS postType,
         d.post_type AS postType,
         d.node_type AS nodeType,
         d.node_type AS nodeType,
+        d.association_type,
         d.project_type,
         d.project_type,
         d.storage_type,
         d.storage_type,
         d.ext_type,
         d.ext_type,
@@ -220,6 +222,7 @@
         is_built_drawing AS "isBuiltDrawing",
         is_built_drawing AS "isBuiltDrawing",
         post_type AS postType,
         post_type AS postType,
         node_type AS nodeType,
         node_type AS nodeType,
+        association_type,
         project_type,
         project_type,
         storage_type,
         storage_type,
         ext_type,
         ext_type,
@@ -283,4 +286,29 @@
         AND status = 1
         AND status = 1
     </update>
     </update>
 
 
+    <select id="getHavedFileNodeByProjectID" resultMap="archiveTreeContractResultMap">
+        SELECT
+            *
+        FROM
+            m_archive_tree_contract
+        WHERE
+            1 = 1
+          AND project_id = #{projectId}
+          AND is_deleted = 0
+          AND archive_auto_type IS NOT NULL
+          AND id IN (
+            SELECT
+                node_id
+            FROM
+                u_archive_file
+            WHERE
+                1 = 1
+              AND project_id = #{projectId}
+              AND is_deleted = 0
+              AND ( is_archive = 0 OR is_archive IS NULL )
+              AND node_id IS NOT NULL
+        )
+        order by tree_sort asc
+    </select>
+
 </mapper>
 </mapper>

+ 42 - 8
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java

@@ -9,12 +9,10 @@ import org.springblade.archive.feign.ArchiveAutoClient;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.Func;
-import org.springblade.manager.entity.ArchiveTree;
-import org.springblade.manager.entity.ArchiveTreeContract;
-import org.springblade.manager.entity.ContractInfo;
-import org.springblade.manager.entity.WbsTree;
+import org.springblade.manager.entity.*;
 import org.springblade.manager.feign.ProjectClient;
 import org.springblade.manager.feign.ProjectClient;
 import org.springblade.manager.service.IContractInfoService;
 import org.springblade.manager.service.IContractInfoService;
+import org.springblade.manager.service.IProjectInfoService;
 import org.springblade.manager.service.IWbsTreeService;
 import org.springblade.manager.service.IWbsTreeService;
 import org.springblade.manager.utils.ForestNodeMerger;
 import org.springblade.manager.utils.ForestNodeMerger;
 import org.springblade.manager.utils.ForestNodeMergerEx;
 import org.springblade.manager.utils.ForestNodeMergerEx;
@@ -35,6 +33,8 @@ public class ArTreeContractInitServiceImpl {
 
 
     private final ArchiveAutoClient archiveAutoClient;
     private final ArchiveAutoClient archiveAutoClient;
 
 
+    private final IProjectInfoService projectInfoService;
+
     /**
     /**
      *
      *
      * @param tenantId
      * @param tenantId
@@ -320,10 +320,40 @@ public class ArTreeContractInitServiceImpl {
         List<ArchiveTreeContract> addNodes = new ArrayList<>();
         List<ArchiveTreeContract> addNodes = new ArrayList<>();
         List<ArchiveTreeContractVO2> archiveTreeContractVO2s = new ArrayList<>();
         List<ArchiveTreeContractVO2> archiveTreeContractVO2s = new ArrayList<>();
         ForestNodeMergerEx.getTreeList(tree,archiveTreeContractVO2s);
         ForestNodeMergerEx.getTreeList(tree,archiveTreeContractVO2s);
-        Map<Long,ArchiveTreeContractVO2> map = new LinkedHashMap<>();
+//        Map<Long,ArchiveTreeContractVO2> map = new LinkedHashMap<>();
+//        for (ArchiveTreeContractVO2 ar : archiveTreeContractVO2s) {
+//            map.put(ar.getId(),ar);
+//        }
+
         for (ArchiveTreeContractVO2 ar : archiveTreeContractVO2s) {
         for (ArchiveTreeContractVO2 ar : archiveTreeContractVO2s) {
-            map.put(ar.getId(),ar);
+            //关联质检资料
+            if (ar.getAssociationType()!= null
+                    &&  ar.getAssociationType() == 1
+                    && ar.getDisplayHierarchy() != null ) {
+                List<ArchiveTreeContract> tmpList  = getTreeContractFromWbs(tenantId,projectId,wbsId,ar);
+                addNodes.addAll(tmpList);
+            }
         }
         }
+        return addNodes;
+    }
+
+
+    /**
+     * 获取节点
+     * @param tenantId
+     * @param projectId
+     * @param tree
+     * @return
+     */
+    public List<ArchiveTreeContract> getContractExtNodes(String tenantId, Long projectId,ArchiveTreeContractVO2 tree) {
+
+        List<ArchiveTreeContract> addNodes = new ArrayList<>();
+        List<ArchiveTreeContractVO2> archiveTreeContractVO2s = new ArrayList<>();
+        ForestNodeMergerEx.getTreeList(tree,archiveTreeContractVO2s);
+
+        ProjectInfo projectInfo = projectInfoService.getOne(projectId);
+        Long wbsId = projectInfo.getReferenceWbsTemplateId();
+
 
 
         for (ArchiveTreeContractVO2 ar : archiveTreeContractVO2s) {
         for (ArchiveTreeContractVO2 ar : archiveTreeContractVO2s) {
             //关联质检资料
             //关联质检资料
@@ -340,6 +370,7 @@ public class ArTreeContractInitServiceImpl {
 
 
 
 
 
 
+
     public List<ArchiveTreeContract> getTreeContractFromWbs(String tenantId, Long projectId, Long wbsId, ArchiveTreeContractVO2 subTree){
     public List<ArchiveTreeContract> getTreeContractFromWbs(String tenantId, Long projectId, Long wbsId, ArchiveTreeContractVO2 subTree){
         List<ArchiveTreeContract> archiveTreeContracts = new ArrayList<>();
         List<ArchiveTreeContract> archiveTreeContracts = new ArrayList<>();
 
 
@@ -370,6 +401,7 @@ public class ArTreeContractInitServiceImpl {
         Map<Long,ArchiveTreeContractVO2> extMap = new LinkedHashMap<>();
         Map<Long,ArchiveTreeContractVO2> extMap = new LinkedHashMap<>();
         Map<Long,Long> oldNewMap = new LinkedHashMap<>();
         Map<Long,Long> oldNewMap = new LinkedHashMap<>();
         //Map<Long,WbsTreeContractVO6> wbsMap = new LinkedHashMap<>();
         //Map<Long,WbsTreeContractVO6> wbsMap = new LinkedHashMap<>();
+        //以前增加的wbs节点映射 放在oldNewMap
         for (ArchiveTreeContractVO2 ar :treeContractVO2s) {
         for (ArchiveTreeContractVO2 ar :treeContractVO2s) {
             if (ar.getExtId() !=null ) {
             if (ar.getExtId() !=null ) {
                 extMap.put(ar.getExtId(),ar);
                 extMap.put(ar.getExtId(),ar);
@@ -397,6 +429,7 @@ public class ArTreeContractInitServiceImpl {
             addWbsNodes.add(wbsTreeVO2);
             addWbsNodes.add(wbsTreeVO2);
         }
         }
 
 
+        //本次要增加的 wbs节点映射 放在oldNewMap
         for (WbsTreeContractVO6 wbsTreeVO2:addWbsNodes) {
         for (WbsTreeContractVO6 wbsTreeVO2:addWbsNodes) {
             oldNewMap.put(wbsTreeVO2.getId(),SnowFlakeUtil.getId());
             oldNewMap.put(wbsTreeVO2.getId(),SnowFlakeUtil.getId());
         }
         }
@@ -454,9 +487,10 @@ public class ArTreeContractInitServiceImpl {
             contractMap.put(contractInfo.getId(),contractInfo);
             contractMap.put(contractInfo.getId(),contractInfo);
         }
         }
 
 
-
+        //只有存储节点并且是工序类,要生成一个默认案卷
         List<ArchiveTreeContract> storageList = archiveTreeContracts.stream()
         List<ArchiveTreeContract> storageList = archiveTreeContracts.stream()
-                .filter(e->e.getIsStorageNode()!= null && e.getIsStorageNode() == 1).collect(Collectors.toList());
+                .filter(e->e.getIsStorageNode()!= null && e.getIsStorageNode() == 1
+                && e.getExtType()!= null && e.getExtType() == 1).collect(Collectors.toList());
 
 
         for (ArchiveTreeContract storage: storageList) {
         for (ArchiveTreeContract storage: storageList) {
 
 

+ 105 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java

@@ -218,6 +218,7 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 			archiveTreeContractDTO.setTenantId(parent.getTenantId());
 			archiveTreeContractDTO.setTenantId(parent.getTenantId());
 			String ancestors = parent.getAncestors() + StringPool.COMMA + archiveTreeContractDTO.getParentId();
 			String ancestors = parent.getAncestors() + StringPool.COMMA + archiveTreeContractDTO.getParentId();
 			archiveTreeContractDTO.setAncestors(ancestors);
 			archiveTreeContractDTO.setAncestors(ancestors);
+			archiveTreeContractDTO.setTreeSort(parent.getTreeSort());
 		}
 		}
 
 
 		archiveTreeContractDTO.setIsDeleted(BladeConstant.DB_NOT_DELETED);
 		archiveTreeContractDTO.setIsDeleted(BladeConstant.DB_NOT_DELETED);
@@ -242,6 +243,11 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 				sort = max.get().getSort();
 				sort = max.get().getSort();
 			}
 			}
 			archiveTreeContractDTO.setSort(sort + 1);
 			archiveTreeContractDTO.setSort(sort + 1);
+			String treeSort = archiveTreeContractDTO.getTreeSort();
+			if (StringUtils.isNotEmpty(treeSort)) {
+				treeSort = treeSort + 100 + archiveTreeContractDTO.getSort();
+				archiveTreeContractDTO.setTreeSort(treeSort);
+			}
 		}
 		}
 
 
 		return save(archiveTreeContractDTO);
 		return save(archiveTreeContractDTO);
@@ -259,11 +265,44 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 	@Override
 	@Override
 	public boolean submitArchiveTreeSort(List<ArchiveTreeContractDTO> listSort) {
 	public boolean submitArchiveTreeSort(List<ArchiveTreeContractDTO> listSort) {
 		int sortNumber = 1;
 		int sortNumber = 1;
+		List<ArchiveTreeContract> changeList = new ArrayList<>();
+
+
+		ArchiveTreeContract parent = null;
 		for (ArchiveTreeContractDTO archiveTreeSortDTO : listSort) {
 		for (ArchiveTreeContractDTO archiveTreeSortDTO : listSort) {
-			archiveTreeSortDTO.setSort(sortNumber);
+			if (archiveTreeSortDTO.getSort() != sortNumber) {
+				ArchiveTreeContract archiveTreeContract = getById(archiveTreeSortDTO.getId());
+				if (archiveTreeContract!= null ) {
+					archiveTreeContract.setSort(sortNumber);
+					if (parent == null ) {
+						parent = getById(archiveTreeSortDTO.getParentId());
+					}
+					if (parent != null  && StringUtils.isNotEmpty(parent.getTreeSort())){
+						Integer sort = archiveTreeContract.getSort() + 100;
+						archiveTreeContract.setTreeSort(parent.getTreeSort() + sort);
+					}
+					changeList.add(archiveTreeContract);
+				}
+			}
 			sortNumber++;
 			sortNumber++;
-			baseMapper.updateById(archiveTreeSortDTO);
 		}
 		}
+
+		this.saveOrUpdateBatch(changeList);
+
+		//有子节点,并且父节点排序号不为空,则排序子节点
+		List<Long> changeIds = changeList.stream().map(s->s.getId()).collect(Collectors.toList());
+
+		List<ArchiveTreeContract> childrens =  baseMapper.selectList(Wrappers.<ArchiveTreeContract>query().lambda()
+					.in(ArchiveTreeContract::getParentId, changeIds)
+					.eq(ArchiveTreeContract::getIsDeleted, 0)
+			);
+		if (StringUtils.isNotEmpty(parent.getTreeSort()) &&
+				(childrens == null || childrens.size() == 0)) {
+			return true;
+		}
+
+		this.sortChildren(changeList);
+
 		return true;
 		return true;
 	}
 	}
 
 
@@ -372,6 +411,10 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		List<ContractInfo> contractInfos = contractInfoService.selectContractInfoPageByPid(dstNode.getProjectId().toString());
 		List<ContractInfo> contractInfos = contractInfoService.selectContractInfoPageByPid(dstNode.getProjectId().toString());
 		Map<Long,ContractInfo> contractMap = new LinkedHashMap<>();
 		Map<Long,ContractInfo> contractMap = new LinkedHashMap<>();
 
 
+		ProjectInfo projectInfo = projectInfoService.getOne(dstNode.getProjectId());
+		Long wbsId = projectInfo.getReferenceWbsTemplateId();
+
+
 		boolean bHasContract = true;
 		boolean bHasContract = true;
 		if (contractInfos == null || contractInfos.size() == 0) {
 		if (contractInfos == null || contractInfos.size() == 0) {
 			bHasContract = false;
 			bHasContract = false;
@@ -484,22 +527,32 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 							if (tmpSubTree == null) {
 							if (tmpSubTree == null) {
 								continue;
 								continue;
 							}
 							}
-							tmpSaveList = archiveTreeContractSync.getNormalSaveList(tmpSubTree.getId(),
+							tmpSaveList = archiveTreeContractSync.getNormalSaveList(srcNode.getId(),
 									tmpSubTree,dstNodeId,contractNode);
 									tmpSubTree,dstNodeId,contractNode);
 							saveList.addAll(tmpSaveList);
 							saveList.addAll(tmpSaveList);
+
+							//todo 同步wbs等扩展节点
+
+							List<ArchiveTreeContract> extSaveList = archiveTreeContractSync.getExtSaveList(dstNodeId,
+									contractNode,dstNode.getProjectId());
+							saveList.addAll(extSaveList);
+
+
 						}
 						}
 					}
 					}
 				}
 				}
 			}
 			}
 		}
 		}
 
 
+		//不是新增的,更新属性
 		ArchiveTreeVO2 subTree = ForestNodeMergerEx.getSubTree(srcTree,srcNode.getId());
 		ArchiveTreeVO2 subTree = ForestNodeMergerEx.getSubTree(srcTree,srcNode.getId());
 		UpdateByArchiveTree(dstNode.getProjectId(),subTree);
 		UpdateByArchiveTree(dstNode.getProjectId(),subTree);
 
 
 		//更新排序
 		//更新排序
 		archiveTreeContractSync.InitTreeSort(dstTree,saveList);
 		archiveTreeContractSync.InitTreeSort(dstTree,saveList);
 
 
-		//todo 同步wbs等扩展节点
+		//同步生成案卷
+		arTreeContractInitService.syncArchiveAutoList(saveList,contractInfos);
 
 
 		this.saveBatch(saveList);
 		this.saveBatch(saveList);
 		return true;
 		return true;
@@ -603,6 +656,54 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		return true;
 		return true;
 	}
 	}
 
 
+	/**
+	 * 递归设置
+	 * @param archiveTreeContracts
+	 */
+	void sortChildren(List<ArchiveTreeContract> archiveTreeContracts){
+
+		if (archiveTreeContracts == null || archiveTreeContracts.size() == 0) {
+			return;
+		}
+
+
+
+		List<ArchiveTreeContractVO2> trees = this.tree2Root(AuthUtil.getTenantId(),null,null,archiveTreeContracts.get(0).getProjectId(),null);
+		if (trees.size() == 0) {
+			return;
+		}
+		ArchiveTreeContractVO2  tree = trees.get(0);
+
+		ForestNodeMergerEx.InitTreeSort(tree,"");
+
+		List<ArchiveTreeContractVO2> changeList = new ArrayList<>();
+
+		for (ArchiveTreeContract ar:  archiveTreeContracts) {
+			ArchiveTreeContractVO2 subTree = ForestNodeMergerEx.getSubTree(tree,ar.getId());
+			List<ArchiveTreeContractVO2> tmpList = new ArrayList<>();
+			ForestNodeMergerEx.getTreeList(subTree,tmpList);
+			changeList.addAll(tmpList);
+		}
+
+		Map<Long,ArchiveTreeContractVO2>  map = new HashMap<>();
+		List<Long> ids = new ArrayList<>();
+		for (ArchiveTreeContractVO2 ar : changeList) {
+			ids.add(ar.getId());
+			map.put(ar.getId(),ar);
+		}
+
+		List<ArchiveTreeContract> changeArchiveList = baseMapper.selectBatchIds(ids);
+		for (ArchiveTreeContract changeNode: changeArchiveList) {
+			ArchiveTreeContractVO2 ar = map.get(changeNode.getId());
+			if (ar!= null ){
+				changeNode.setTreeSort(ar.getTreeSort());
+			}
+		}
+		this.saveOrUpdateBatch(changeArchiveList);
+	}
+
+
+
 
 
 
 
 
 

+ 20 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java

@@ -5,6 +5,7 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.manager.entity.ArchiveTree;
 import org.springblade.manager.entity.ArchiveTree;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.service.IProjectInfoService;
 import org.springblade.manager.utils.ForestNodeMergerEx;
 import org.springblade.manager.utils.ForestNodeMergerEx;
 import org.springblade.manager.vo.ArchiveTreeContractVO2;
 import org.springblade.manager.vo.ArchiveTreeContractVO2;
 import org.springblade.manager.vo.ArchiveTreeVO2;
 import org.springblade.manager.vo.ArchiveTreeVO2;
@@ -21,6 +22,8 @@ public class ArchiveTreeContractSyncImpl {
 
 
     private final ArTreeContractInitServiceImpl arTreeContractInitService;
     private final ArTreeContractInitServiceImpl arTreeContractInitService;
 
 
+    private final IProjectInfoService projectInfoService;
+
     /**
     /**
      * 普通同步
      * 普通同步
      * @param srcNodeId
      * @param srcNodeId
@@ -105,4 +108,21 @@ public class ArchiveTreeContractSyncImpl {
             }
             }
         }
         }
     }
     }
+
+    /**
+     * 普通同步
+     * @param dstNodeId
+     * @param dstTrees
+     * @return
+     */
+    public List<ArchiveTreeContract> getExtSaveList(Long dstNodeId,ArchiveTreeContractVO2 dstTrees,Long projectId){
+
+        ArchiveTreeContractVO2 dstTree = ForestNodeMergerEx.getSubTree(dstTrees,dstNodeId);
+
+        List<ArchiveTreeContract> saveList = new ArrayList<>();
+        //todo 等测试OK再打开
+        //saveList =arTreeContractInitService.getContractExtNodes(AuthUtil.getTenantId(),projectId,dstTree);
+
+        return saveList;
+    }
 }
 }

+ 2 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeServiceImpl.java

@@ -430,7 +430,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
     }
     }
 
 
     /**
     /**
-     * 归档树节点规则设置保存(系统级)
+     * 归档树节点规则设置保存
      * @param archiveAutoType
      * @param archiveAutoType
      * @param nodeIds
      * @param nodeIds
      * @return
      * @return
@@ -479,7 +479,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
     }
     }
 
 
     /**
     /**
-     * 归档树wbs节点规则设置保存(系统级)
+     * 归档树wbs节点规则设置保存
      * @param archiveAutoType
      * @param archiveAutoType
      * @param nodeIds
      * @param nodeIds
      * @return
      * @return

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -848,7 +848,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
 
 
     //新增独立表单库数据
     //新增独立表单库数据
     @Async
     @Async
-    private void insertDLTabAsync(WbsTreeContractDTO pawDTO) {
+    void insertDLTabAsync(WbsTreeContractDTO pawDTO) {
         //获取当前引用项目的独立表
         //获取当前引用项目的独立表
         List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateService.getBaseMapper().selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
         List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateService.getBaseMapper().selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
                 //.select(WbsTreePrivate::getId, WbsTreePrivate::getHtmlUrl, WbsTreePrivate::getNodeName, WbsTreePrivate::getTableType)
                 //.select(WbsTreePrivate::getId, WbsTreePrivate::getHtmlUrl, WbsTreePrivate::getNodeName, WbsTreePrivate::getTableType)