Эх сурвалжийг харах

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

yangyj 2 жил өмнө
parent
commit
bf98f2fd55
43 өөрчлөгдсөн 2159 нэмэгдсэн , 560 устгасан
  1. 1 1
      blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/OssEndpoint.java
  2. 2 2
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchivesAuto.java
  3. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/CopyContractTreeNodeVO.java
  4. 2 2
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTree.java
  5. 55 26
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTreeContract.java
  6. 27 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractAutoRuleVO.java
  7. 112 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO.java
  8. 156 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO2.java
  9. 29 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeVO.java
  10. 130 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeVO2.java
  11. 77 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TreeNodeVO2.java
  12. 7 1
      blade-service/blade-archive/pom.xml
  13. 47 4
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java
  14. 30 82
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  15. 0 49
      blade-service/blade-business/src/main/java/org/springblade/business/controller/MessageWarningController.java
  16. 5 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/MetadataController.java
  17. 303 284
      blade-service/blade-business/src/main/java/org/springblade/business/controller/UserOpinionController.java
  18. 5 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/MetadataClassificationMapper.xml
  19. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java
  20. 7 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/MetadataClassificationServiceImpl.java
  21. 60 29
      blade-service/blade-business/src/main/java/org/springblade/business/socket/WebSocket.java
  22. 197 0
      blade-service/blade-business/src/main/java/org/springblade/business/socket/WebSocketManager.java
  23. 137 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java
  24. 12 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeController.java
  25. 12 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FirstController.java
  26. 10 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ProjectInfoController.java
  27. 6 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  28. 16 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java
  29. 184 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  30. 3 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeMapper.java
  31. 105 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeMapper.xml
  32. 6 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProjectInfoMapper.xml
  33. 37 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeContractService.java
  34. 8 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeService.java
  35. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java
  36. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/SaveUserInfoByProjectService.java
  37. 286 22
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java
  38. 29 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeServiceImpl.java
  39. 33 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeSupportServiceImpl.java
  40. 3 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  41. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/SaveUserInfoByProjectServiceImpl.java
  42. 10 10
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsFormElementServiceImpl.java
  43. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

+ 1 - 1
blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/OssEndpoint.java

@@ -182,7 +182,7 @@ public class OssEndpoint {
 	 */
 	@SneakyThrows
 	@PostMapping("/upload-file")
-	public R<NewBladeFile> uploadFile(@RequestParam MultipartFile file){
+	public synchronized R<NewBladeFile> uploadFile(@RequestParam MultipartFile file){
 		//上传原文件
 		BladeFile bladeFile = ossBuilder.template().putFile(file.getOriginalFilename(), file.getInputStream());
 

+ 2 - 2
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchivesAuto.java

@@ -39,11 +39,11 @@ public class ArchivesAuto extends BaseEntity {
 	/**
 	* 项目ID
 	*/
-		private String projectId;
+		private Long projectId;
 	/**
 	* 合同段ID
 	*/
-		private String contractId;
+		private Long contractId;
 	/**
 	* 案卷提名
 	*/

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/CopyContractTreeNodeVO.java

@@ -27,6 +27,9 @@ public class CopyContractTreeNodeVO {
     @ApiModelProperty("所属方 1=施工 2=监理")
     private Integer tableOwner;
 
+    @ApiModelProperty("所属方,1=施工,2=监理,字符串拼接,复制数据")
+    private String classify;
+
     public void setCopyBatchToPaths(String primaryKeyId, String nodeName){
         this.copyBatchToPaths.add(new CopyBatch(primaryKeyId, nodeName));
     }

+ 2 - 2
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTree.java

@@ -120,9 +120,9 @@ public class ArchiveTree extends BaseEntity {
     @ApiModelProperty(value = "工程类型")
     private Integer projectType;
 	/**
-	* 关联类型
+	* 存储类型
 	*/
-    @ApiModelProperty(value = "关联类型")
+    @ApiModelProperty(value = "存储类型")
     private Integer storageType;
 	/**
 	* 扩展类型

+ 55 - 26
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTreeContract.java

@@ -18,9 +18,13 @@ package org.springblade.manager.entity;
 
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
+
 import org.springblade.core.mp.base.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.springblade.manager.vo.ArchiveTreeVO;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.BeansException;
 
 /**
  * 实体类
@@ -38,98 +42,99 @@ public class ArchiveTreeContract extends BaseEntity {
 	/**
 	* 项目ID
 	*/
-		private String projectId;
+	private Long projectId;
 	/**
 	* 合同段ID
 	*/
-		private String contractId;
+	private Long contractId;
 	/**
 	* 是否配置到上传文件显示配置树 '0'否 '1'是
 	*/
-		private Integer isUploadFileDisplayConfigurationTree;
+	private Integer isUploadFileDisplayConfigurationTree;
 	/**
 	* 父主键
 	*/
-		private Long parentId;
+	private Long parentId;
 	/**
 	* 祖级列表
 	*/
-		private String ancestors;
+	private String ancestors;
 	/**
 	* 节点名
 	*/
-		private String nodeName;
+	private String nodeName;
 	/**
 	* 节点全称
 	*/
-		private String fullName;
+	private String fullName;
 	/**
 	* 节点类型
 	*/
-		private Integer nodeType;
+	private Integer nodeType;
 	/**
 	* 岗位类型
 	*/
-		private String postType;
+	private String postType;
 	/**
 	* 关联类型
 	*/
-		private Integer associationType;
+	private Integer associationType;
 	/**
 	* 内业资料类型
 	*/
-		private String majorDataType;
+	private String majorDataType;
 	/**
 	* 显示层级
 	*/
-		private String displayHierarchy;
+	private String displayHierarchy;
 	/**
 	* 是否为存储节点 '0'否 '1'是
 	*/
-		private Integer isStorageNode;
+	private Integer isStorageNode;
 	/**
 	* 是否为竣工图 '0'否 '1'是
 	*/
-		private Integer isBuiltDrawing;
+	private Integer isBuiltDrawing;
 	/**
 	* 是否为接口节点 '0'否 '1'是
 	*/
-		private Integer isInterfaceNode;
+	private Integer isInterfaceNode;
 	/**
 	* 接口类型
 	*/
-		private Integer interfaceType;
+	private Integer interfaceType;
 	/**
 	* 排序
 	*/
-		private Integer sort;
+	private Integer sort;
 	/**
 	* 备注
 	*/
-		private String remark;
+	private String remark;
 	/**
 	* 工程类型
 	*/
-		private Integer projectType;
+	private Integer projectType;
 	/**
 	* 关联类型
 	*/
-		private Integer storageType;
+	private Integer storageType;
 	/**
 	* 扩展类型
 	*/
-		private Integer extType;
+	private Integer extType;
 	/**
-	* 扩展关联Id
+	* 扩展Id,如动态工序节点的wbsid
 	*/
-		private Long extId;
+	private Long extId;
+
 	/**
 	* 自动立卷类型
 	*/
-		private Integer archiveAutoType;
+	private Integer archiveAutoType;
 	/**
-	 * 自动立卷设置的节点ID
-	 */
+	* 自动立卷关联Id
+	*/
 	private Long archiveAutoNodeId;
 
 	/**
@@ -137,5 +142,29 @@ public class ArchiveTreeContract extends BaseEntity {
 	 */
 	private Integer archiveAutoSelect;
 
+	/**
+	 * 来源id,用于后续同步更新
+	 */
+	private Long fromId;
+	/**
+	 * 扩展Id铆钉的树节点id
+	 */
+	private Long extAttachId;
+
+
+	public ArchiveTreeContract() {
+	}
+
+	public ArchiveTreeContract(ArchiveTree archiveTree) {
+		if (archiveTree == null) {
+			return;
+		}
 
+		try {
+			BeanUtils.copyProperties(archiveTree,this);
+			this.fromId = archiveTree.getId();
+		} catch (BeansException e) {
+			e.printStackTrace();
+		}
+	}
 }

+ 27 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractAutoRuleVO.java

@@ -0,0 +1,27 @@
+package org.springblade.manager.vo;
+
+import lombok.Data;
+import org.springblade.manager.entity.ArchiveTreeContract;
+
+@Data
+public class ArchiveTreeContractAutoRuleVO implements Cloneable {
+
+    private Long nodeId;//节点id
+
+    private String allName; //全路经名
+
+    private Integer selectVo; //页面勾选标志 0未勾选  1勾选
+
+
+    @Override
+    public ArchiveTreeContractAutoRuleVO clone() {
+        try {
+            ArchiveTreeContractAutoRuleVO vo = (ArchiveTreeContractAutoRuleVO) super.clone();
+            return vo;
+        } catch (CloneNotSupportedException e) {
+            throw new AssertionError();
+        }
+    }
+
+
+}

+ 112 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO.java

@@ -16,10 +16,18 @@
  */
 package org.springblade.manager.vo;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import org.springblade.core.tool.node.INode;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 视图实体类
  *
@@ -28,7 +36,110 @@ import lombok.EqualsAndHashCode;
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
-public class ArchiveTreeContractVO extends ArchiveTreeContract {
+public class ArchiveTreeContractVO extends ArchiveTreeContract implements INode<ArchiveTreeContractVO> {
 	private static final long serialVersionUID = 1L;
 
+	/**
+	 * 主键ID
+	 */
+	@JsonSerialize(using = ToStringSerializer.class)
+	@ApiModelProperty(value = "主键id")
+	private Long id;
+
+	/**
+	 * 父节点ID
+	 */
+	@JsonSerialize(using = ToStringSerializer.class)
+	@ApiModelProperty(value = "父级id")
+	private Long parentId;
+
+	/**
+	 * title
+	 */
+	@JsonSerialize(using = ToStringSerializer.class)
+	@ApiModelProperty(value = "节点名称")
+	private String title;
+
+	/**
+	 * 子孙节点
+	 */
+	@JsonInclude(JsonInclude.Include.NON_EMPTY)
+	@ApiModelProperty(value = "子孙节点")
+	private List<ArchiveTreeContractVO> children;
+
+	/**
+	 * 是否有子孙节点
+	 */
+	@JsonInclude(JsonInclude.Include.NON_EMPTY)
+	@ApiModelProperty(value = "是否有子孙节点")
+	private Boolean hasChildren;
+
+	@Override
+	public List<ArchiveTreeContractVO> getChildren() {
+		if (this.children == null) {
+			this.children = new ArrayList<>();
+		}
+		return this.children;
+	}
+
+	/**
+	 * 内业资料类型(用于显示控制)
+	 */
+	@ApiModelProperty(value = "内业资料类型(用于显示控制)")
+	private String majorDataType;
+
+	/**
+	 * 显示层级(用于显示控制)
+	 */
+	@ApiModelProperty(value = "显示层级(用于显示控制)")
+	private String displayHierarchy;
+
+	/**
+	 * 是否为存储节点
+	 */
+	@ApiModelProperty(value = "是否为存储节点")
+	private Integer isStorageNode;
+
+	/**
+	 * 是否为显示树
+	 */
+	@ApiModelProperty(value = "是否为显示树")
+	private Integer isUploadFileDisplayConfigurationTree;
+
+	/**
+	 * 是否为竣工图 '0'否 '1'是
+	 */
+	@ApiModelProperty(value = "是否为竣工图 '0'否 '1'是")
+	private Integer isBuiltDrawing;
+
+	/**
+	 * 工程类型
+	 */
+	private Integer projectType;
+	/**
+	 * 关联类型
+	 */
+	private Integer storageType;
+
+	/**
+	 * 扩展类型
+	 */
+	@ApiModelProperty(value = "扩展类型")
+	private Integer extType;
+	/**
+	 * 扩展关联Id
+	 */
+	@ApiModelProperty(value = "扩展关联Id")
+	private Long extId;
+	/**
+	 * 自动立卷类型
+	 */
+	@ApiModelProperty(value = "自动立卷类型")
+	private Integer archiveAutoType;
+	/**
+	 * 自动立卷关联Id
+	 */
+	@ApiModelProperty(value = "自动立卷关联Id")
+	private Long archiveAutoNodeId;
+
 }

+ 156 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO2.java

@@ -0,0 +1,156 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.manager.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tool.node.INode;
+import org.springblade.manager.entity.ArchiveTreeContract;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 视图实体类
+ *
+ * @author 00
+ * @since 2023-02-18
+ */
+@Data
+public class ArchiveTreeContractVO2 implements INode<ArchiveTreeContractVO2> {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键ID
+	 */
+	@JsonSerialize(using = ToStringSerializer.class)
+	@ApiModelProperty(value = "主键id")
+	private Long id;
+
+	/**
+	 * 父节点ID
+	 */
+	@JsonSerialize(using = ToStringSerializer.class)
+	@ApiModelProperty(value = "父级id")
+	private Long parentId;
+
+	/**
+	 * title
+	 */
+	@JsonSerialize(using = ToStringSerializer.class)
+	@ApiModelProperty(value = "节点名称")
+	private String title;
+
+	/**
+	 * 子孙节点
+	 */
+	@JsonInclude(JsonInclude.Include.NON_EMPTY)
+	@ApiModelProperty(value = "子孙节点")
+	private List<ArchiveTreeContractVO2> children;
+
+	/**
+	 * 是否有子孙节点
+	 */
+	@JsonInclude(JsonInclude.Include.NON_EMPTY)
+	@ApiModelProperty(value = "是否有子孙节点")
+	private Boolean hasChildren;
+
+	@Override
+	public List<ArchiveTreeContractVO2> getChildren() {
+		if (this.children == null) {
+			this.children = new ArrayList<>();
+		}
+		return this.children;
+	}
+
+	/**
+	 * 内业资料类型(用于显示控制)
+	 */
+	@ApiModelProperty(value = "内业资料类型(用于显示控制)")
+	private String majorDataType;
+
+	/**
+	 * 显示层级(用于显示控制)
+	 */
+	@ApiModelProperty(value = "显示层级(用于显示控制)")
+	private String displayHierarchy;
+
+	/**
+	 * 是否为存储节点
+	 */
+	@ApiModelProperty(value = "是否为存储节点")
+	private Integer isStorageNode;
+
+	/**
+	 * 是否为显示树
+	 */
+	@ApiModelProperty(value = "是否为显示树")
+	private Integer isUploadFileDisplayConfigurationTree;
+
+	/**
+	 * 是否为竣工图 '0'否 '1'是
+	 */
+	@ApiModelProperty(value = "是否为竣工图 '0'否 '1'是")
+	private Integer isBuiltDrawing;
+
+	private Long key;
+	@JsonSerialize(
+			using = ToStringSerializer.class
+	)
+	private Long value;
+	/**
+	 * 是否显示
+	 */
+	private Integer isDisplayTree;
+
+	private String postType;
+
+	/**
+	 * 工程类型
+	 */
+	private Integer projectType;
+	/**
+	 * 关联类型
+	 */
+	private Integer storageType;
+
+	/**
+	 * 扩展类型
+	 */
+	@ApiModelProperty(value = "扩展类型")
+	private Integer extType;
+	/**
+	 * 扩展关联Id
+	 */
+	@ApiModelProperty(value = "扩展关联Id")
+	private Long extId;
+	/**
+	 * 自动立卷类型
+	 */
+	@ApiModelProperty(value = "自动立卷类型")
+	private Integer archiveAutoType;
+	/**
+	 * 自动立卷关联Id
+	 */
+	@ApiModelProperty(value = "自动立卷关联Id")
+	private Long archiveAutoNodeId;
+
+}

+ 29 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeVO.java

@@ -90,5 +90,34 @@ public class ArchiveTreeVO extends ArchiveTree implements INode<ArchiveTreeVO> {
     @ApiModelProperty(value = "是否为竣工图 '0'否 '1'是")
     private Integer isBuiltDrawing;
 
+    /**
+     * 工程类型
+     */
+    private Integer projectType;
+    /**
+     * 关联类型
+     */
+    private Integer storageType;
+
+    /**
+     * 扩展类型
+     */
+    @ApiModelProperty(value = "扩展类型")
+    private Integer extType;
+    /**
+     * 扩展关联Id
+     */
+    @ApiModelProperty(value = "扩展关联Id")
+    private Long extId;
+    /**
+     * 自动立卷类型
+     */
+    @ApiModelProperty(value = "自动立卷类型")
+    private Integer archiveAutoType;
+    /**
+     * 自动立卷关联Id
+     */
+    @ApiModelProperty(value = "自动立卷关联Id")
+    private Long archiveAutoNodeId;
 
 }

+ 130 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeVO2.java

@@ -0,0 +1,130 @@
+package org.springblade.manager.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.core.tool.node.INode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class ArchiveTreeVO2 implements INode<ArchiveTreeVO2> {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "主键id")
+    private Long id;
+
+    /**
+     * 父节点ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "父级id")
+    private Long parentId;
+
+    /**
+     * title
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "节点名称")
+    private String title;
+
+    /**
+     * 子孙节点
+     */
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    @ApiModelProperty(value = "子孙节点")
+    private List<ArchiveTreeVO2> children;
+
+    /**
+     * 是否有子孙节点
+     */
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    @ApiModelProperty(value = "是否有子孙节点")
+    private Boolean hasChildren;
+
+    @Override
+    public List<ArchiveTreeVO2> getChildren() {
+        if (this.children == null) {
+            this.children = new ArrayList<>();
+        }
+        return this.children;
+    }
+
+    /**
+     * 内业资料类型(用于显示控制)
+     */
+    @ApiModelProperty(value = "内业资料类型(用于显示控制)")
+    private String majorDataType;
+
+    /**
+     * 显示层级(用于显示控制)
+     */
+    @ApiModelProperty(value = "显示层级(用于显示控制)")
+    private String displayHierarchy;
+
+    /**
+     * 是否为存储节点
+     */
+    @ApiModelProperty(value = "是否为存储节点")
+    private Integer isStorageNode;
+
+    /**
+     * 是否为显示树
+     */
+    @ApiModelProperty(value = "是否为显示树")
+    private Integer isUploadFileDisplayConfigurationTree;
+
+    /**
+     * 是否为竣工图 '0'否 '1'是
+     */
+    @ApiModelProperty(value = "是否为竣工图 '0'否 '1'是")
+    private Integer isBuiltDrawing;
+
+    private Long key;
+    @JsonSerialize(
+            using = ToStringSerializer.class
+    )
+    private Long value;
+    /**
+     * 是否显示
+     */
+    private Integer isDisplayTree;
+
+    private String postType;
+
+    /**
+     * 工程类型
+     */
+    private Integer projectType;
+    /**
+     * 关联类型
+     */
+    private Integer storageType;
+    /**
+     * 扩展类型
+     */
+    @ApiModelProperty(value = "扩展类型")
+    private Integer extType;
+    /**
+     * 扩展关联Id
+     */
+    @ApiModelProperty(value = "扩展关联Id")
+    private Long extId;
+    /**
+     * 自动立卷类型
+     */
+    @ApiModelProperty(value = "自动立卷类型")
+    private Integer archiveAutoType;
+    /**
+     * 自动立卷关联Id
+     */
+    @ApiModelProperty(value = "自动立卷关联Id")
+    private Long archiveAutoNodeId;
+}

+ 77 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TreeNodeVO2.java

@@ -2,6 +2,7 @@ package org.springblade.manager.vo;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
 import org.springblade.core.tool.node.BaseNode;
 import org.springblade.core.tool.node.TreeNode;
 
@@ -48,6 +49,33 @@ public class TreeNodeVO2 extends BaseNode<TreeNode> {
 
     private String postType;
 
+    /**
+     * 工程类型
+     */
+    private Integer projectType;
+
+
+    /**
+     * 存储类型
+     */
+    private Integer storageType;
+    /**
+     * 扩展类型
+     */
+    private Integer extType;
+    /**
+     * 扩展关联Id
+     */
+    private Long extId;
+    /**
+     * 自动立卷类型
+     */
+    private Integer archiveAutoType;
+    /**
+     * 自动立卷关联Id
+     */
+    private Long archiveAutoNodeId;
+
     public TreeNodeVO2() {
     }
 
@@ -141,6 +169,55 @@ public class TreeNodeVO2 extends BaseNode<TreeNode> {
         this.isBuiltDrawing = isBuiltDrawing;
     }
 
+    public Integer getProjectType() {
+        return projectType;
+    }
+
+    public void setProjectType(Integer projectType) {
+        this.projectType = projectType;
+    }
+
+    public Integer getStorageType() {
+        return storageType;
+    }
+
+    public void setStorageType(Integer storageType) {
+        this.storageType = storageType;
+    }
+
+    public Integer getExtType() {
+        return extType;
+    }
+
+    public void setExtType(Integer extType) {
+        this.extType = extType;
+    }
+
+    public Long getExtId() {
+        return extId;
+    }
+
+    public void setExtId(Long extId) {
+        this.extId = extId;
+    }
+
+    public Integer getArchiveAutoType() {
+        return archiveAutoType;
+    }
+
+    public void setArchiveAutoType(Integer archiveAutoType) {
+        this.archiveAutoType = archiveAutoType;
+    }
+
+    public Long getArchiveAutoNodeId() {
+        return archiveAutoNodeId;
+    }
+
+    public void setArchiveAutoNodeId(Long archiveAutoNodeId) {
+        this.archiveAutoNodeId = archiveAutoNodeId;
+    }
+
+
     public String toString() {
         return "TreeNode(tenantId=" + this.getTenantId()
                 + ",ancestors" + this.getAncestors()

+ 7 - 1
blade-service/blade-archive/pom.xml

@@ -48,7 +48,13 @@
             <artifactId>blade-user-api</artifactId>
             <version>${bladex.project.version}</version>
         </dependency>
-
+        <!--调用OSS的API-->
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-resource-api</artifactId>
+            <version>2.9.1.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
         <dependency>
             <groupId>org.springblade</groupId>
             <artifactId>blade-core-cloud</artifactId>

+ 47 - 4
blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java

@@ -57,10 +57,10 @@ import org.springblade.business.service.IImageClassificationFileService;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.InputStream;
+import java.io.*;
+import java.net.URL;
+import java.net.URLConnection;
+import java.text.DecimalFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -583,6 +583,14 @@ public class ImageClassificationFileController extends BladeController {
         try {
             ImageClassificationFile newFile = this.copyBeanData(fileVO, true);
             this.setUserData(null, newFile, false);
+            String[] urls = fileVO.getImageUrl().split(",");
+            Long total = 0L;
+            for (String url : urls) {
+                long urlSize = getResourceLength(url);
+                total += urlSize;
+            }
+            String size = formatSize(total);
+            newFile.setFileSize(size);
             //落库数据
             return R.status(this.imageClassificationFileService.save(newFile));
         } catch (Exception e) {
@@ -680,4 +688,39 @@ public class ImageClassificationFileController extends BladeController {
         }
     }
 
+    /**
+     *
+     * @param urlStr
+     * @return  返回Url资源大小
+     * @throws IOException
+     */
+    public long getResourceLength(String urlStr) throws IOException {
+        URL url=new URL(urlStr);
+        URLConnection urlConnection=url.openConnection();
+        urlConnection.connect();
+        //返回响应报文头字段Content-Length的值
+        return urlConnection.getContentLength();
+    }
+    /**
+     * 根据字节返回文件大小
+     */
+    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;
+    }
+
 }

+ 30 - 82
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -29,6 +29,7 @@ import org.springblade.business.vo.*;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.oss.model.BladeFile;
@@ -351,13 +352,27 @@ public class InformationWriteQueryController extends BladeController {
     @ApiOperationSupport(order = 25)
     @ApiOperation(value = "复制节点填报数据")
     public R<Boolean> copyContractNodeSubmitBusinessData(@RequestBody CopyContractTreeNodeVO copyVO) {
+        if (StringUtils.isNotEmpty(copyVO.getClassify())) {
+            throw new ServiceException("请选择至少一个所属方");
+        }
         if (StringUtils.isNotEmpty(copyVO.getNeedCopyPrimaryKeyId()) && copyVO.getCopyBatchToPaths().size() > 0) {
             //查询被复制节点
             WbsTreeContract wbsTreeContract = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(copyVO.getNeedCopyPrimaryKeyId());
-            //获取被复制节点的表格
-            List<WbsTreeContract> tableList = this.wbsTreeContractClient.queryChildByParentId(wbsTreeContract, "queryTable", "");
-            if (tableList != null && tableList.size() > 0) {
+            String tabOwner;
+            if (("1,2").equals(copyVO.getClassify()) || ("2,1").equals(copyVO.getClassify())) {
+                tabOwner = "1,2,3,4,5,6";
+            } else {
+                if (("1").equals(copyVO.getClassify())) {
+                    tabOwner = "1,2,3";
+                } else {
+                    tabOwner = "4,5,6";
+                }
+            }
 
+            //获取被复制节点下的表格,根据所属方
+            String sqlContractNode = "select * from m_wbs_tree_contract where parent_id = " + wbsTreeContract.getId() + " and contract_id = " + wbsTreeContract.getContractId() + " and table_owner in(" + tabOwner + ") and is_deleted = 0";
+            List<WbsTreeContract> tableList = jdbcTemplate.query(sqlContractNode, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+            if (tableList.size() > 0) {
                 //获取表格的业务数据
                 Map<String, List<List<Map<String, Object>>>> tableBusinessDataMap = new HashMap<>();
                 for (WbsTreeContract treeContract : tableList) {
@@ -505,8 +520,8 @@ public class InformationWriteQueryController extends BladeController {
     public R<String> queryNodeStatus(@RequestParam String primaryKeyId, @RequestParam String classify) {
         //记录状态
         String status = "1";
-        //查询填报状态
-        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, primaryKeyId).eq(InformationQuery::getClassify, classify).ne(InformationQuery::getType, 3));
+        //查询填报状态,type=1资料填报
+        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, primaryKeyId).eq(InformationQuery::getClassify, classify).eq(InformationQuery::getType, 1));
         if (businessData != null) {
             switch (businessData.getStatus()) {
                 case 0:
@@ -561,8 +576,8 @@ public class InformationWriteQueryController extends BladeController {
     public R<String> queryNodeStatusTrial(@RequestParam String classify, @RequestParam String id) {
         //记录状态
         String status = "1";
-        //查询填报状态
-        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, id).eq(InformationQuery::getClassify, classify).ne(InformationQuery::getType, 3));
+        //查询填报状态,type=2试验
+        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, id).eq(InformationQuery::getClassify, classify).eq(InformationQuery::getType, 2));
         if (businessData != null) {
             switch (businessData.getStatus()) {
                 case 0:
@@ -1011,84 +1026,9 @@ public class InformationWriteQueryController extends BladeController {
     public R<Boolean> diySort(@RequestBody DiySortVO vo) {
         //对整棵树进行排序(资料查询需要同步显示排序)采用自增
         List<String> sortLists = vo.getSortList();
-
-        /*String id = sortLists.stream().map(String::valueOf).findAny().orElse(null);
-        WbsTreeContract wbsTreeContract = wbsTreeContractClient.getContractNodeByPrimaryKeyId(id);
-        //当前项目全部填报资料
-        List<InformationQuery> informationQueries = informationQueryService.getBaseMapper().selectList(Wrappers.<InformationQuery>lambdaQuery()
-                .eq(InformationQuery::getProjectId, wbsTreeContract.getProjectId())
-                .eq(InformationQuery::getContractId, wbsTreeContract.getContractId())
-        );
-
-        //获取合同段整棵树
-        List<WbsTreeContract> list = null;
-        if (ObjectUtil.isNotEmpty(wbsTreeContract)) {
-            list = informationQueryService.getContractWbsTreeAll(wbsTreeContract);
-        }
-
-        if (Objects.requireNonNull(list).size() > 0) {
-            //获取根节点
-            List<WbsTreeContract> rootNodes = list.stream().filter(f -> ObjectUtil.isNotEmpty(f.getParentId()) && f.getParentId() == 0).collect(Collectors.toList());
-            List<InformationQuery> infos = new ArrayList<>();
-            int sort = 2;
-            //this.diySortRecursion(list, rootNodes, sort, informationQueries, infos);
-
-            //修改资料查询sort、节点sort
-            for (InformationQuery info : infos) {
-                informationQueryService.updateById(info);
-            }
-            informationQueryService.updateBatchByPKeyId(list);
-
-            //获取排序集合 自定义当前同级排序
-            List<String> sortList = vo.getSortList();
-            if (sortList.size() > 0) {
-                for (int i = 1, l = sortList.size(); i < l; i++) {
-                    try {
-                        WbsTreeContract newData = new WbsTreeContract();
-                        newData.setPKeyId(Long.parseLong(sortList.get(i)));
-                        newData.setSort(i);
-                        //修改排序
-                        this.wbsTreeContractClient.updateContractNodeParameter(newData);
-
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
-                }
-            }
-            */
-
         return R.status(wbsTreeContractClient.diySort(sortLists));
     }
 
-    //递归排序
-    /*private void diySortRecursion(List<WbsTreeContract> list, List<WbsTreeContract> rootNodes, int sort, List<InformationQuery> informationQueries, List<InformationQuery> infos) {
-        if (ObjectUtil.isNotEmpty(rootNodes)) {
-            List<WbsTreeContract> parentNodes = new ArrayList<>();
-            for (WbsTreeContract wbsTreeContract : list) {
-                for (WbsTreeContract rootNode : rootNodes) {
-                    //获取子节点并排序
-                    if (wbsTreeContract.getParentId().equals(rootNode.getId())) {
-                        //资料填报数据排序
-                        InformationQuery informationQuery = informationQueries.stream().filter(f -> f.getWbsId().equals(wbsTreeContract.getPKeyId())).findAny().orElse(null);
-                        if (informationQuery != null) {
-                            informationQuery.setSort(sort);
-                            infos.add(informationQuery);
-                        }
-
-                        wbsTreeContract.setSort(sort++);
-
-                        //重构父级
-                        parentNodes.add(wbsTreeContract);
-                    }
-                }
-            }
-            //递归
-            if (parentNodes.size() > 0) {
-                this.diySortRecursion(list, parentNodes, sort, informationQueries, infos);
-            }
-        }
-    }*/
-
     /**
      * 复制节点
      */
@@ -1260,6 +1200,14 @@ public class InformationWriteQueryController extends BladeController {
                         //初始化PDF路径
                         newData.setPdfUrl(null);
 
+                        //获取当前所有复制的节点的最大sort
+                        String sql = "select sort from m_wbs_tree_contract where contract_id = '" + node.getContractId() + "' and (id = '" + node.getId() + "' or old_id = '" + node.getId() + "')";
+                        List<WbsTreeContract> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+                        List<Integer> collect = query.stream().map(WbsTreeContract::getSort).collect(Collectors.toList());
+                        Integer max = collect.stream().reduce(collect.get(0), Integer::max);
+                        //设置sort
+                        newData.setSort(max);
+
                         //重塑父节点关联关系
                         this.restoreParent(newData, oldToNewIdMap);
 

+ 0 - 49
blade-service/blade-business/src/main/java/org/springblade/business/controller/MessageWarningController.java

@@ -19,7 +19,6 @@ package org.springblade.business.controller;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -45,14 +44,12 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.feign.IDictBizClient;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.business.service.IMessageWarningService;
 import org.springblade.core.boot.ctrl.BladeController;
 
-import javax.websocket.Session;
 import java.io.IOException;
 import java.util.*;
 
@@ -254,50 +251,4 @@ public class MessageWarningController extends BladeController {
         return R.status(false);
     }
 
-
-    /***
-     * 定时重发任务消息WebSocket
-     */
-    @Scheduled(cron = "0 0/5 * * * ?")
-    public void reSendMessage() throws IOException {
-        Map<String, WebSocket> webSocketMap = WebSocket.getWebSocketMap();
-        Map<String, String> webSocketMessageMap = WebSocket.getWebSocketMessageMap();
-
-        if (webSocketMap.isEmpty() || webSocketMessageMap.isEmpty()) {
-            logger.error("定时重发消息WebSocket,reSendMessage()方法未执行,原因:客户端未建立WebSocket链接");
-            return;
-        }
-
-        logger.info("定时重发消息WebSocket,reSendMessage()方法执行成功,入参:webSocketMap->{},webSocketMessageMap->{}", webSocketMap, webSocketMessageMap);
-
-        Set<Map.Entry<String, String>> message = webSocketMessageMap.entrySet();
-
-        List<Map<String, String>> maps = new ArrayList<>();
-
-        for (Map.Entry<String, String> entry : message) {
-            String userId = entry.getKey();
-            String projectAndContractId = entry.getValue();
-            if (projectAndContractId.contains(",") && StringUtils.isNotEmpty(userId)) {
-                //客户端
-                String projectId = projectAndContractId.split(",")[0];
-                String contractId = projectAndContractId.split(",")[1];
-                Map<String, String> stringMap = iTaskService.getTaskCount(projectId, contractId, userId);
-                maps.add(stringMap);
-            } else {
-                //后管
-                Map<String, String> stringMap = iTaskService.getTaskCount(null, null, userId);
-                maps.add(stringMap);
-            }
-        }
-
-        for (Map<String, String> map : maps) {
-            String userId = map.get("userId");
-            webSocketMap.get(userId).sendMessage(JSON.toJSONString(map));
-            logger.info("给用户{}重发消息{}", userId, map);
-        }
-
-        logger.info("定时重发消息WebSocket,reSendMessage()方法执行结束");
-    }
-
-
 }

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

@@ -73,7 +73,11 @@ public class MetadataController extends BladeController {
     @ApiOperation(value = "元数据容器分类详情", notes = "传入分类类型")
     public R<IPage<MetadataClassification>> allocationDetail(@ApiIgnore @RequestParam String fileStorage, Query query) {
         QueryWrapper<MetadataClassification> metadata = new QueryWrapper<>();
-        metadata.lambda().ne(MetadataClassification :: getFileStorageType,fileStorage).eq(MetadataClassification::getIsDeleted,0);
+        if(fileStorage.isEmpty() || fileStorage.equals("0")){
+            metadata.lambda().eq(MetadataClassification::getIsDeleted,0);
+        }else{
+            metadata.lambda().notLike(MetadataClassification :: getFileStorageType,fileStorage).eq(MetadataClassification::getIsDeleted,0);
+        }
         IPage<MetadataClassification> page = iMetadataClassificationService.page(Condition.getPage(query), metadata);
         return R.data(page);
     }

+ 303 - 284
blade-service/blade-business/src/main/java/org/springblade/business/controller/UserOpinionController.java

@@ -8,6 +8,7 @@ import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
+
 import javax.validation.Valid;
 
 import org.apache.commons.lang.StringUtils;
@@ -17,6 +18,7 @@ import org.springblade.business.entity.UserOpinionGood;
 import org.springblade.business.feign.MessageWarningClient;
 import org.springblade.business.service.*;
 import org.springblade.business.socket.WebSocket;
+import org.springblade.business.socket.WebSocketManager;
 import org.springblade.business.vo.MessageWarningVO;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.mp.support.Condition;
@@ -61,288 +63,305 @@ import java.util.*;
 @Api(value = "用户意见表", tags = "用户意见表接口")
 public class UserOpinionController extends BladeController {
 
-	private final IUserOpinionService userOpinionService;
-
-	private final IUserOpinionFileService userOpinionFileService;
-
-	private final IUserOpinionFlowService userOpinionFlowService;
-
-	private final IDictBizClient dictBizClient;
-
-	private final ProjectAssignmentUserClient projectAssignmentUserClient;
-
-	private final IUserClient userClient;
-
-	private final IUserOpinionGoodService userOpinionGoodService;
-
-	private final MessageWarningClient messageWarningClient;
-
-	private final ContractClient contractClient;
-
-	private final ProjectClient projectClient;
-
-	private final ITaskService iTaskService;
-
-	private final WebSocket webSocket;
-
-	/**
-	 * 取消点赞
-	 * @param userOpinionId 工单ID
-	 * @return 结果
-	 */
-	@PostMapping("/cancelGood")
-	@ApiOperationSupport(order = 6)
-	@ApiOperation(value = "取消点赞")
-	@ApiImplicitParam(name = "userOpinionId", value = "工单ID")
-	public R<Boolean> cancelGood(@RequestParam String userOpinionId){
-		if(StringUtils.isNotEmpty(userOpinionId)){
-			UserOpinion opinion = this.userOpinionService.getById(userOpinionId);
-
-			//删除当前用户对当前工单的点赞信息
-			BladeUser user = AuthUtil.getUser();
-			this.userOpinionGoodService.update(Wrappers.<UserOpinionGood>lambdaUpdate().set(UserOpinionGood::getIsDeleted, 1).eq(UserOpinionGood::getCreateUser, user.getUserId()).eq(UserOpinionGood::getUserOpinionId, userOpinionId));
-
-			//获取原本的点赞数
-			Integer oldGood = opinion.getGoodNumber();
-			return R.data(this.userOpinionService.update(Wrappers.<UserOpinion>lambdaUpdate().set(UserOpinion::getGoodNumber, (oldGood - 1)).eq(UserOpinion::getId, userOpinionId)));
-		}
-		return R.data(-1, false, "数据操作失败");
-	}
-
-	/**
-	 * 获取工单服务相关数据字典
-	 * @return 结果
-	 */
-	@GetMapping("/queryDictBizList")
-	@ApiOperationSupport(order = 5)
-	@ApiOperation(value = "获取字典信息")
-	public R<List<DictBizVO>> queryDictBizList(){
-		//获取字典
-		List<DictBiz> dictList = this.dictBizClient.getList("opinion_type", "").getData();
-		//找到根节点
-		DictBiz root = null;
-		Iterator<DictBiz> iterator = dictList.iterator();
-		while (iterator.hasNext()){
-			DictBiz biz = iterator.next();
-			if(new Long("0").equals(biz.getParentId())){
-				root = biz;
-				iterator.remove();
-				break;
-			}
-		}
-
-		//首先找到父节点为0的
-		List<DictBizVO> result = new ArrayList<>();
-		Iterator<DictBiz> iterator1 = dictList.iterator();
-		while (iterator1.hasNext()){
-			DictBiz biz = iterator1.next();
-			if(root != null && root.getId().equals(biz.getParentId())){
-				DictBizVO vo = new DictBizVO();
-				BeanUtils.copyProperties(biz, vo);
-				result.add(vo);
-				iterator1.remove();
-			} else if(new Long("0").equals(biz.getParentId())){
-				DictBizVO vo = new DictBizVO();
-				BeanUtils.copyProperties(biz, vo);
-				result.add(vo);
-				iterator1.remove();
-			}
-		}
-		//组成相关结构树
-		result.forEach(vo -> {
-			List<DictBizVO> clientList = new ArrayList<>();
-			Iterator<DictBiz> iterator2 = dictList.iterator();
-			while (iterator2.hasNext()){
-				DictBiz biz = iterator2.next();
-				if(biz.getParentId().equals(vo.getId())){
-					//找到子节点
-					DictBizVO voClient = new DictBizVO();
-					BeanUtils.copyProperties(biz, voClient);
-					clientList.add(voClient);
-					iterator2.remove();
-				}
-			}
-			vo.setChildren(clientList);
-		});
-
-		return R.data(result);
-	}
-
-	/**
-	 * 获取当前用户提交的工单服务
-	 */
-	@PostMapping("/queryCurrentUserOpinionList")
-	@ApiOperationSupport(order = 4)
-	@ApiOperation(value = "获取当前用户提交的工单服务")
-	public R<List<UserOpinionVO>> queryCurrentUserOpinionList(){
-		return R.data(this.userOpinionService.queryCurrentUserOpinionList(AuthUtil.getUser()));
-	}
-
-	/**
-	 * 新增点赞
-	 * @param good 点赞数
-	 * @param userOpinionId 点赞的用户工单ID
-	 * @return 新增结果
-	 */
-	@PostMapping("/addGoodNumber")
-	@ApiOperationSupport(order = 3)
-	@ApiOperation(value = "点赞")
-	@ApiImplicitParams(value = {
-			@ApiImplicitParam(name = "good", value = "点赞量", required = true),
-			@ApiImplicitParam(name = "userOpinionId", value = "工单ID", required = true)
-	})
-	public R<Boolean> addGoodNumber(@RequestParam Integer good,@RequestParam String userOpinionId){
-		if(StringUtils.isNotEmpty(userOpinionId)){
-			UserOpinion opinion = this.userOpinionService.getById(userOpinionId);
-			//获取原本的点赞数
-			Integer oldGood = opinion.getGoodNumber();
-			opinion.setGoodNumber(oldGood == null || oldGood < 0 ? good : oldGood + good);
-
-			//获取当前用户信息
-			BladeUser user = AuthUtil.getUser();
-			Long deptId = user.getDeptId().contains(",") ? Long.parseLong(user.getDeptId().split(",")[0]) : Long.parseLong(user.getDeptId());
-			//保存点赞信息
-			this.userOpinionGoodService.save(new UserOpinionGood(opinion.getId(), user.getUserId(), deptId));
-
-			return R.data(this.userOpinionService.updateById(opinion));
-		}
-		return R.data(-1, false, "数据操作失败");
-	}
-
-	/**
-	 * 工单主页列表
-	 * @param query 分页信息
-	 * @return 列表数据
-	 */
-	@GetMapping("/queryUserOpinionPage")
-	@ApiOperationSupport(order = 2)
-	@ApiOperation(value = "获取工单服务列表")
-	public R<IPage<UserOpinionVO>> queryUserOpinionPage(Query query){
-		return R.data(this.userOpinionService.selectUserOpinionPage(Condition.getPage(query), new UserOpinionVO(), AuthUtil.getUser()));
-	}
-
-	/**
-	 * 新增 用户意见表
-	 */
-	@PostMapping("/saveUserOpinion")
-	@ApiOperationSupport(order = 1)
-	@ApiOperation(value = "新增工单服务信息", notes = "传入userOpinion")
-	public R<Boolean> saveUserOpinion(@Valid @RequestBody UserOpinionVO userOpinionVo) {
-		//设置用户信息
-		this.setUserData(userOpinionVo);
-		//生成主表ID
-		long idKey = SnowFlakeUtil.getId();
-		userOpinionVo.setId(idKey);
-
-		//获取附件信息
-		List<String> files = userOpinionVo.getReturnFiles();
-		if(files != null && files.size() != 0){
-			List<UserOpinionFile> saveFileList = new ArrayList<>();
-			//存在附件,执行上传后依次新增记录
-			for(String ossUrl : files){
-				try{
-					//上传附件
-					if(StringUtils.isNotEmpty(ossUrl)){
-						//新增附件信息
-						UserOpinionFile userOpinionFile = new UserOpinionFile();
-						//设置主表ID
-						userOpinionFile.setUserOpinionId(idKey);
-						//设置文件路径
-						userOpinionFile.setFileUrl(ossUrl);
-						saveFileList.add(userOpinionFile);
-					}
-				}catch (Exception e){
-					e.printStackTrace();
-				}
-			}
-			//新增附件信息
-			this.userOpinionFileService.saveBatch(saveFileList);
-		}
-		//获取当前项目合同段下分配的维护人员
-		String manageUserName = "admin", manegeUserPhone = "";
-		Long manageUser = 1123598821738675201L;
-		try{
-			List<SaveUserInfoByProjectDTO> assignmentUserList = this.projectAssignmentUserClient.queryCurrentProjectContractAssignmentUserList(userOpinionVo.getProjectId(), userOpinionVo.getContractId());
-			if(assignmentUserList != null && assignmentUserList.size() > 0){
-				//有分配人员,随机获取某一个人员
-				Random random = new Random();
-				//随机结果集长度下的数量
-				int ran = random.nextInt(assignmentUserList.size());
-				SaveUserInfoByProjectDTO userDto = assignmentUserList.get(ran);
-				User user = this.userClient.userInfoById(Long.parseLong(userDto.getUserId())).getData();
-				if(user != null){
-					manageUser = user.getId();
-					manageUserName = user.getRealName();
-					manegeUserPhone = user.getPhone();
-				}
-			}
-
-			ProjectInfo projectInfo = this.projectClient.queryProjectList(Func.toStrList(userOpinionVo.getProjectId().toString())).get(0);
-			ContractInfo contractInfo = this.contractClient.getContractById(userOpinionVo.getContractId());
-
-			//保存推送记录
-			this.messageWarningClient.savePushUserMessageWarning(new MessageWarningVO(
-					userOpinionVo.getProjectId(),
-					userOpinionVo.getContractId(),
-					4,
-					(StringUtils.isNotEmpty(projectInfo.getProjectAlias()) ? projectInfo.getProjectAlias() : projectInfo.getProjectName()) + contractInfo.getContractName() + "的用户" + AuthUtil.getNickName() + "向您提交的【" + userOpinionVo.getProblemType() + ":" + userOpinionVo.getOpinionContent() + "】工单反馈,请及时处理",
-					manageUser,
-					0
-			));
-
-			//通过WebSocket推送数量条数,推送到对应维护人的工单反馈中
-			if (ObjectUtil.isNotEmpty(userOpinionVo.getProjectId()) && ObjectUtil.isNotEmpty(userOpinionVo.getContractId()) && ObjectUtil.isNotEmpty(manageUser)) {
-				Map<String, String> stringMap = iTaskService.getTaskCount(userOpinionVo.getProjectId().toString(), userOpinionVo.getContractId().toString(), manageUser.toString());
-				try {
-					webSocket.sendMessageByUserId(manageUser.toString(), JSON.toJSONString(stringMap));
-				} catch (IOException e) {
-					e.printStackTrace();
-				}
-			}
-
-		}catch (Exception e){
-			e.printStackTrace();
-		}
-
-		//生成第一次流程
-		List<UserOpinionFlow> saveFlowList = new ArrayList<>();
-		Date nowDate = new Date();
-		//30分钟相应时间
-		String manageTime = DateUtil.format(DateUtil.plusMinutes(nowDate, 30), "yyyy-MM-dd HH:mm:ss");
-		//提交成功环节
-		saveFlowList.add(setUserData(new UserOpinionFlow(idKey, 2, 1, 1, "已提交", "已成功提交您的工单信息", manageTime, manageUser, manageUserName, manegeUserPhone)));
-		//分配维护人员环节
-		saveFlowList.add(setUserData(new UserOpinionFlow(idKey, 1, 1, 2, "已分配专属客服", "客服:" + manageUserName + "<br>电话:" + manegeUserPhone, manageTime, manageUser, manageUserName, manegeUserPhone)));
-		//进入人工预处理环节
-		saveFlowList.add(setUserData(new UserOpinionFlow(idKey, 0, 1, 3, "进入人工预处理环节", null, manageTime, manageUser, manageUserName, manegeUserPhone)));
-		//问题已解决
-		saveFlowList.add(setUserData(new UserOpinionFlow(idKey, 0, 1, 4, "问题已解决", null, manageTime, manageUser, manageUserName, manegeUserPhone)));
-		//新增处理环节
-		this.userOpinionFlowService.saveBatch(saveFlowList);
-		//最后新增主表数据
-		UserOpinion newUserOpinion = new UserOpinion();
-		BeanUtils.copyProperties(userOpinionVo, newUserOpinion);
-		newUserOpinion.setCreateTime(nowDate);
-
-		return R.status(this.userOpinionService.save(newUserOpinion));
-	}
-
-	//设置登录用户信息
-	private UserOpinionFlow setUserData(UserOpinionFlow userOpinionFlow){
-		//获取当前登录人
-		BladeUser user = AuthUtil.getUser();
-		//记录操作人信息
-		userOpinionFlow.setCreateUser(user.getUserId());
-		userOpinionFlow.setCreateDept(user.getDeptId().contains(",") ? Long.parseLong(user.getDeptId().split(",")[0]) : Long.parseLong(user.getDeptId()));
-		return userOpinionFlow;
-	}
-
-	//设置登录用户信息
-	private void setUserData(UserOpinion userOpinion){
-		//获取当前登录人
-		BladeUser user = AuthUtil.getUser();
-		userOpinion.setCreateUser(user.getUserId());
-		userOpinion.setCreateUserName(user.getNickName());
-		userOpinion.setCreateDept(user.getDeptId().contains(",") ? Long.parseLong(user.getDeptId().split(",")[0]) : Long.parseLong(user.getDeptId()));
-	}
+    private final IUserOpinionService userOpinionService;
+
+    private final IUserOpinionFileService userOpinionFileService;
+
+    private final IUserOpinionFlowService userOpinionFlowService;
+
+    private final IDictBizClient dictBizClient;
+
+    private final ProjectAssignmentUserClient projectAssignmentUserClient;
+
+    private final IUserClient userClient;
+
+    private final IUserOpinionGoodService userOpinionGoodService;
+
+    private final MessageWarningClient messageWarningClient;
+
+    private final ContractClient contractClient;
+
+    private final ProjectClient projectClient;
+
+    private final ITaskService iTaskService;
+
+    private final WebSocket webSocket;
+
+    private final WebSocketManager webSocketManager;
+
+    /**
+     * 取消点赞
+     *
+     * @param userOpinionId 工单ID
+     * @return 结果
+     */
+    @PostMapping("/cancelGood")
+    @ApiOperationSupport(order = 6)
+    @ApiOperation(value = "取消点赞")
+    @ApiImplicitParam(name = "userOpinionId", value = "工单ID")
+    public R<Boolean> cancelGood(@RequestParam String userOpinionId) {
+        if (StringUtils.isNotEmpty(userOpinionId)) {
+            UserOpinion opinion = this.userOpinionService.getById(userOpinionId);
+
+            //删除当前用户对当前工单的点赞信息
+            BladeUser user = AuthUtil.getUser();
+            this.userOpinionGoodService.update(Wrappers.<UserOpinionGood>lambdaUpdate().set(UserOpinionGood::getIsDeleted, 1).eq(UserOpinionGood::getCreateUser, user.getUserId()).eq(UserOpinionGood::getUserOpinionId, userOpinionId));
+
+            //获取原本的点赞数
+            Integer oldGood = opinion.getGoodNumber();
+            return R.data(this.userOpinionService.update(Wrappers.<UserOpinion>lambdaUpdate().set(UserOpinion::getGoodNumber, (oldGood - 1)).eq(UserOpinion::getId, userOpinionId)));
+        }
+        return R.data(-1, false, "数据操作失败");
+    }
+
+    /**
+     * 获取工单服务相关数据字典
+     *
+     * @return 结果
+     */
+    @GetMapping("/queryDictBizList")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "获取字典信息")
+    public R<List<DictBizVO>> queryDictBizList() {
+        //获取字典
+        List<DictBiz> dictList = this.dictBizClient.getList("opinion_type", "").getData();
+        //找到根节点
+        DictBiz root = null;
+        Iterator<DictBiz> iterator = dictList.iterator();
+        while (iterator.hasNext()) {
+            DictBiz biz = iterator.next();
+            if (new Long("0").equals(biz.getParentId())) {
+                root = biz;
+                iterator.remove();
+                break;
+            }
+        }
+
+        //首先找到父节点为0的
+        List<DictBizVO> result = new ArrayList<>();
+        Iterator<DictBiz> iterator1 = dictList.iterator();
+        while (iterator1.hasNext()) {
+            DictBiz biz = iterator1.next();
+            if (root != null && root.getId().equals(biz.getParentId())) {
+                DictBizVO vo = new DictBizVO();
+                BeanUtils.copyProperties(biz, vo);
+                result.add(vo);
+                iterator1.remove();
+            } else if (new Long("0").equals(biz.getParentId())) {
+                DictBizVO vo = new DictBizVO();
+                BeanUtils.copyProperties(biz, vo);
+                result.add(vo);
+                iterator1.remove();
+            }
+        }
+        //组成相关结构树
+        result.forEach(vo -> {
+            List<DictBizVO> clientList = new ArrayList<>();
+            Iterator<DictBiz> iterator2 = dictList.iterator();
+            while (iterator2.hasNext()) {
+                DictBiz biz = iterator2.next();
+                if (biz.getParentId().equals(vo.getId())) {
+                    //找到子节点
+                    DictBizVO voClient = new DictBizVO();
+                    BeanUtils.copyProperties(biz, voClient);
+                    clientList.add(voClient);
+                    iterator2.remove();
+                }
+            }
+            vo.setChildren(clientList);
+        });
+
+        return R.data(result);
+    }
+
+    /**
+     * 获取当前用户提交的工单服务
+     */
+    @PostMapping("/queryCurrentUserOpinionList")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "获取当前用户提交的工单服务")
+    public R<List<UserOpinionVO>> queryCurrentUserOpinionList() {
+        return R.data(this.userOpinionService.queryCurrentUserOpinionList(AuthUtil.getUser()));
+    }
+
+    /**
+     * 新增点赞
+     *
+     * @param good          点赞数
+     * @param userOpinionId 点赞的用户工单ID
+     * @return 新增结果
+     */
+    @PostMapping("/addGoodNumber")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "点赞")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "good", value = "点赞量", required = true),
+            @ApiImplicitParam(name = "userOpinionId", value = "工单ID", required = true)
+    })
+    public R<Boolean> addGoodNumber(@RequestParam Integer good, @RequestParam String userOpinionId) {
+        if (StringUtils.isNotEmpty(userOpinionId)) {
+            UserOpinion opinion = this.userOpinionService.getById(userOpinionId);
+            //获取原本的点赞数
+            Integer oldGood = opinion.getGoodNumber();
+            opinion.setGoodNumber(oldGood == null || oldGood < 0 ? good : oldGood + good);
+
+            //获取当前用户信息
+            BladeUser user = AuthUtil.getUser();
+            Long deptId = user.getDeptId().contains(",") ? Long.parseLong(user.getDeptId().split(",")[0]) : Long.parseLong(user.getDeptId());
+            //保存点赞信息
+            this.userOpinionGoodService.save(new UserOpinionGood(opinion.getId(), user.getUserId(), deptId));
+
+            return R.data(this.userOpinionService.updateById(opinion));
+        }
+        return R.data(-1, false, "数据操作失败");
+    }
+
+    /**
+     * 工单主页列表
+     *
+     * @param query 分页信息
+     * @return 列表数据
+     */
+    @GetMapping("/queryUserOpinionPage")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "获取工单服务列表")
+    public R<IPage<UserOpinionVO>> queryUserOpinionPage(Query query) {
+        return R.data(this.userOpinionService.selectUserOpinionPage(Condition.getPage(query), new UserOpinionVO(), AuthUtil.getUser()));
+    }
+
+    /**
+     * 新增 用户意见表
+     */
+    @PostMapping("/saveUserOpinion")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "新增工单服务信息", notes = "传入userOpinion")
+    public R<Boolean> saveUserOpinion(@Valid @RequestBody UserOpinionVO userOpinionVo) {
+        //设置用户信息
+        this.setUserData(userOpinionVo);
+        //生成主表ID
+        long idKey = SnowFlakeUtil.getId();
+        userOpinionVo.setId(idKey);
+
+        //获取附件信息
+        List<String> files = userOpinionVo.getReturnFiles();
+        if (files != null && files.size() != 0) {
+            List<UserOpinionFile> saveFileList = new ArrayList<>();
+            //存在附件,执行上传后依次新增记录
+            for (String ossUrl : files) {
+                try {
+                    //上传附件
+                    if (StringUtils.isNotEmpty(ossUrl)) {
+                        //新增附件信息
+                        UserOpinionFile userOpinionFile = new UserOpinionFile();
+                        //设置主表ID
+                        userOpinionFile.setUserOpinionId(idKey);
+                        //设置文件路径
+                        userOpinionFile.setFileUrl(ossUrl);
+                        saveFileList.add(userOpinionFile);
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+            //新增附件信息
+            this.userOpinionFileService.saveBatch(saveFileList);
+        }
+        //获取当前项目合同段下分配的维护人员
+        String manageUserName = "admin", manegeUserPhone = "";
+        Long manageUser = 1123598821738675201L;
+        try {
+            List<SaveUserInfoByProjectDTO> assignmentUserList = this.projectAssignmentUserClient.queryCurrentProjectContractAssignmentUserList(userOpinionVo.getProjectId(), userOpinionVo.getContractId());
+            if (assignmentUserList != null && assignmentUserList.size() > 0) {
+                //有分配人员,随机获取某一个人员
+                Random random = new Random();
+                //随机结果集长度下的数量
+                int ran = random.nextInt(assignmentUserList.size());
+                SaveUserInfoByProjectDTO userDto = assignmentUserList.get(ran);
+                User user = this.userClient.userInfoById(Long.parseLong(userDto.getUserId())).getData();
+                if (user != null) {
+                    manageUser = user.getId();
+                    manageUserName = user.getRealName();
+                    manegeUserPhone = user.getPhone();
+                }
+            }
+
+            ProjectInfo projectInfo = this.projectClient.queryProjectList(Func.toStrList(userOpinionVo.getProjectId().toString())).get(0);
+            ContractInfo contractInfo = this.contractClient.getContractById(userOpinionVo.getContractId());
+
+            //保存推送记录
+            this.messageWarningClient.savePushUserMessageWarning(new MessageWarningVO(
+                    userOpinionVo.getProjectId(),
+                    userOpinionVo.getContractId(),
+                    4,
+                    (StringUtils.isNotEmpty(projectInfo.getProjectAlias()) ? projectInfo.getProjectAlias() : projectInfo.getProjectName()) + contractInfo.getContractName() + "的用户" + AuthUtil.getNickName() + "向您提交的【" + userOpinionVo.getProblemType() + ":" + userOpinionVo.getOpinionContent() + "】工单反馈,请及时处理",
+                    manageUser,
+                    0
+            ));
+
+            //通过WebSocket推送数量条数,推送到对应维护人客户端的工单反馈中
+            if (ObjectUtil.isNotEmpty(userOpinionVo.getProjectId()) && ObjectUtil.isNotEmpty(userOpinionVo.getContractId()) && ObjectUtil.isNotEmpty(manageUser)) {
+                Map<String, String> stringMap = iTaskService.getTaskCount(userOpinionVo.getProjectId().toString(), userOpinionVo.getContractId().toString(), manageUser.toString());
+                try {
+                    webSocket.sendMessageByUserId(manageUser.toString(), JSON.toJSONString(stringMap));
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+
+            //通过WebSocket推送数量条数,推送到对应维护人后管的消息区我的消息中
+            if (ObjectUtil.isNotEmpty(manageUser)) {
+                Map<String, String> stringMap = iTaskService.getTaskCount(null, null, manageUser.toString());
+                try {
+                    webSocketManager.sendMessageByUserId(manageUser.toString(), JSON.toJSONString(stringMap));
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        //生成第一次流程
+        List<UserOpinionFlow> saveFlowList = new ArrayList<>();
+        Date nowDate = new Date();
+        //30分钟相应时间
+        String manageTime = DateUtil.format(DateUtil.plusMinutes(nowDate, 30), "yyyy-MM-dd HH:mm:ss");
+        //提交成功环节
+        saveFlowList.add(setUserData(new UserOpinionFlow(idKey, 2, 1, 1, "已提交", "已成功提交您的工单信息", manageTime, manageUser, manageUserName, manegeUserPhone)));
+        //分配维护人员环节
+        saveFlowList.add(setUserData(new UserOpinionFlow(idKey, 1, 1, 2, "已分配专属客服", "客服:" + manageUserName + "<br>电话:" + manegeUserPhone, manageTime, manageUser, manageUserName, manegeUserPhone)));
+        //进入人工预处理环节
+        saveFlowList.add(setUserData(new UserOpinionFlow(idKey, 0, 1, 3, "进入人工预处理环节", null, manageTime, manageUser, manageUserName, manegeUserPhone)));
+        //问题已解决
+        saveFlowList.add(setUserData(new UserOpinionFlow(idKey, 0, 1, 4, "问题已解决", null, manageTime, manageUser, manageUserName, manegeUserPhone)));
+        //新增处理环节
+        this.userOpinionFlowService.saveBatch(saveFlowList);
+        //最后新增主表数据
+        UserOpinion newUserOpinion = new UserOpinion();
+        BeanUtils.copyProperties(userOpinionVo, newUserOpinion);
+        newUserOpinion.setCreateTime(nowDate);
+
+        return R.status(this.userOpinionService.save(newUserOpinion));
+    }
+
+    //设置登录用户信息
+    private UserOpinionFlow setUserData(UserOpinionFlow userOpinionFlow) {
+        //获取当前登录人
+        BladeUser user = AuthUtil.getUser();
+        //记录操作人信息
+        userOpinionFlow.setCreateUser(user.getUserId());
+        userOpinionFlow.setCreateDept(user.getDeptId().contains(",") ? Long.parseLong(user.getDeptId().split(",")[0]) : Long.parseLong(user.getDeptId()));
+        return userOpinionFlow;
+    }
+
+    //设置登录用户信息
+    private void setUserData(UserOpinion userOpinion) {
+        //获取当前登录人
+        BladeUser user = AuthUtil.getUser();
+        userOpinion.setCreateUser(user.getUserId());
+        userOpinion.setCreateUserName(user.getNickName());
+        userOpinion.setCreateDept(user.getDeptId().contains(",") ? Long.parseLong(user.getDeptId().split(",")[0]) : Long.parseLong(user.getDeptId()));
+    }
 }

+ 5 - 1
blade-service/blade-business/src/main/java/org/springblade/business/mapper/MetadataClassificationMapper.xml

@@ -73,6 +73,10 @@
 
     <update id="updateMetadataBytype">
         update u_metadata_classification set file_storage_type = CONCAT(file_storage_type, ',', #{type})
-        where id in(${ids}) and locate(#{type},file_storage_type) = 0
+        where id in
+        <foreach collection="ids" item="ids" index="ids" open="(" separator="," close=")">
+            ${ids}
+        </foreach>
+        and locate(#{type},file_storage_type) = 0
     </update>
 </mapper>

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

@@ -489,7 +489,7 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
                             this.integrationMethod(vor, linkTasks);
                         }
                         //设置上报批次
-                        //vor.setReportNumber(String.valueOf(tasks.get(0).getBatch()));
+                        vor.setReportNumber(String.valueOf(tasks.get(0).getBatch()));
                     }
                 }
 

+ 7 - 2
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/MetadataClassificationServiceImpl.java

@@ -90,7 +90,12 @@ public class MetadataClassificationServiceImpl
 
     @Override
     public boolean updateMetadataBytype(List<Long> ids, String type) {
-        baseMapper.updateMetadataBytype(ids,type);
-        return false;
+        try {
+            baseMapper.updateMetadataBytype(ids,type);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+        return true;
     }
 }

+ 60 - 29
blade-service/blade-business/src/main/java/org/springblade/business/socket/WebSocket.java

@@ -5,8 +5,9 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.springblade.business.service.ITaskService;
-import org.springblade.core.secure.utils.AuthUtil;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 import cn.hutool.core.util.StrUtil;
 import org.springframework.web.bind.annotation.CrossOrigin;
@@ -15,12 +16,16 @@ import javax.websocket.*;
 import javax.websocket.server.PathParam;
 import javax.websocket.server.ServerEndpoint;
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 @Component
 @CrossOrigin
 @ServerEndpoint(value = "/websocket/{userId}")
+@Scope("prototype")
 public class WebSocket {
 
     private static ITaskService iTaskService;
@@ -54,8 +59,8 @@ public class WebSocket {
         this.userId = userId;
         //加入map
         webSocketMap.put(userId, this);
-        addOnlineCount();           //在线数加1
-        logger.info("用户{}连接成功,当前在线人数为{}", userId, getOnlineCount());
+        addOnlineCount();//在线数加1
+        logger.info("用户:{}连接成功,当前在线人数为{}人", userId, getOnlineCount());
         try {
             sendMessage(String.valueOf(this.session.getQueryString()));
         } catch (IOException e) {
@@ -69,7 +74,7 @@ public class WebSocket {
         webSocketMap.remove(userId);
         webSocketMessageMap.remove(userId);
         subOnlineCount(); //在线数减1
-        logger.info("用户{}关闭连接!当前在线人数为{}", userId, getOnlineCount());
+        logger.info("用户{}关闭连接!当前在线人数为{}", userId, getOnlineCount());
     }
 
     /**
@@ -79,34 +84,23 @@ public class WebSocket {
      */
     @OnMessage
     public void onMessage(String message, Session session) {
-        webSocketMessageMap.put(userId, message);
-        logger.info("来自客户端用户:{} 消息:{}", userId, message);
-
-        String projectId = "";
-        String contractId = "";
-        if (message.contains(",")) {
-            projectId = message.split(",")[0];
-            contractId = message.split(",")[1];
-        } else {
-            //后管处理userId
-            userId = AuthUtil.getUserId().toString();
-            //userId = "1123598821738675201";
-        }
+        if (StringUtils.isNotEmpty(userId)) {
+            webSocketMessageMap.put(userId, message);
 
-        Map<String, String> stringMap;
-        if (StringUtils.isNotEmpty(projectId) && StringUtils.isNotEmpty(contractId) && StringUtils.isNotEmpty(userId)) {
+            logger.info("来自客户端用户:{} 消息:{}", userId, message);
+            String projectId = message.split(",")[0];
+            String contractId = message.split(",")[1];
             //客户端
-            stringMap = iTaskService.getTaskCount(projectId, contractId, userId);
-        } else {
-            //后管
-            stringMap = iTaskService.getTaskCount(null, null, userId);
-        }
+            Map<String, String> stringMap = iTaskService.getTaskCount(projectId, contractId, userId);
 
-        //客户端切换项目合同段、后管推送消息
-        try {
-            webSocketMap.get(userId).sendMessage(JSON.toJSONString(stringMap));
-        } catch (IOException e) {
-            e.printStackTrace();
+            try {
+                webSocketMap.get(userId).sendMessage(JSON.toJSONString(stringMap));
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+
+        } else {
+            logger.info("未获取到用户信息,接收消息失败");
         }
     }
 
@@ -167,6 +161,43 @@ public class WebSocket {
         WebSocket.onlineCount--;
     }
 
+    /***
+     * 定时重发任务消息WebSocket - 客户端
+     */
+    @Scheduled(cron = "0 0/5 * * * ?")
+    public void reSendMessage() throws IOException {
+        if (webSocketMap.isEmpty() || webSocketMessageMap.isEmpty()) {
+            logger.error("定时重发消息WebSocket,reSendMessage()方法未执行,原因:客户端未建立WebSocket链接");
+            return;
+        }
+
+        logger.info("定时重发消息WebSocket,reSendMessage()方法执行成功,入参:webSocketMap->{},webSocketMessageMap->{}", webSocketMap, webSocketMessageMap);
+
+        Set<Map.Entry<String, String>> message = webSocketMessageMap.entrySet();
+
+        List<Map<String, String>> maps = new ArrayList<>();
+
+        for (Map.Entry<String, String> entry : message) {
+            String userId = entry.getKey();
+            String projectAndContractId = entry.getValue();
+            if (projectAndContractId.contains(",") && StringUtils.isNotEmpty(userId)) {
+                //客户端
+                String projectId = projectAndContractId.split(",")[0];
+                String contractId = projectAndContractId.split(",")[1];
+                Map<String, String> stringMap = iTaskService.getTaskCount(projectId, contractId, userId);
+                maps.add(stringMap);
+            }
+        }
+
+        for (Map<String, String> map : maps) {
+            String userId = map.get("userId");
+            webSocketMap.get(userId).sendMessage(JSON.toJSONString(map));
+            logger.info("给用户{}重发消息{}", userId, map);
+        }
+
+        logger.info("定时重发消息WebSocket,reSendMessage()方法执行结束");
+    }
+
 }
 
 

+ 197 - 0
blade-service/blade-business/src/main/java/org/springblade/business/socket/WebSocketManager.java

@@ -0,0 +1,197 @@
+package org.springblade.business.socket;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import org.apache.commons.lang.StringUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springblade.business.service.ITaskService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.CrossOrigin;
+
+import javax.websocket.*;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Component
+@CrossOrigin
+@ServerEndpoint(value = "/websocket/manager/{userId}")
+@Scope("prototype")
+public class WebSocketManager {
+
+    private static ITaskService iTaskService;
+
+    private final static Logger logger = LogManager.getLogger(WebSocketManager.class);
+    private static int onlineCount = 0;
+    private static ConcurrentHashMap<String, WebSocketManager> webSocketMap2 = new ConcurrentHashMap<>();
+    private static ConcurrentHashMap<String, String> webSocketMessageMap2 = new ConcurrentHashMap<>();
+    private Session session;
+    private String userId;
+
+    /**
+     * 注入service
+     */
+    @Autowired
+    public void setApplicationContext(ITaskService iTaskService) {
+        WebSocketManager.iTaskService = iTaskService;
+    }
+
+    public static Map<String, WebSocketManager> getWebSocketMap() {
+        return webSocketMap2;
+    }
+
+    public static Map<String, String> getWebSocketMessageMap() {
+        return webSocketMessageMap2;
+    }
+
+    @OnOpen
+    public void onOpen(Session session, @PathParam("userId") String userId) {
+        this.session = session;
+        this.userId = userId;
+        //加入map
+        webSocketMap2.put(userId, this);
+        addOnlineCount();//在线数加1
+        logger.info("用户:{}连接成功,当前在线人数为{}人", userId, getOnlineCount());
+        try {
+            sendMessage(String.valueOf(this.session.getQueryString()));
+        } catch (IOException e) {
+            logger.error("IO异常");
+        }
+    }
+
+    @OnClose
+    public void onClose() {
+        //从map中删除
+        webSocketMap2.remove(userId);
+        webSocketMessageMap2.remove(userId);
+        subOnlineCount(); //在线数减1
+        logger.info("用户:{}关闭了连接!当前在线人数为{}人", userId, getOnlineCount());
+    }
+
+    /**
+     * 收到后管消息后调用的方法
+     *
+     * @param message 后管发送过来的消息
+     */
+    @OnMessage
+    public void onMessage(String message, Session session) {
+        if (StringUtils.isNotEmpty(userId)) {
+            webSocketMessageMap2.put(userId, message);
+            logger.info("来自后管用户:{} 消息:{}", userId, message);
+            userId = message;
+
+            //后管
+            Map<String, String> stringMap = iTaskService.getTaskCount(null, null, userId);
+
+            try {
+                webSocketMap2.get(userId).sendMessage(JSON.toJSONString(stringMap));
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+
+        } else {
+            logger.info("未获取到用户信息,接收消息失败");
+        }
+    }
+
+    /**
+     * 发生错误时调用
+     */
+    @OnError
+    public void onError(Session session, Throwable error) {
+        logger.error("用户错误:" + this.userId + ",原因:" + error.getMessage());
+        error.printStackTrace();
+    }
+
+    /**
+     * 向客户端发送消息
+     */
+    public void sendMessage(String message) throws IOException {
+        //同步
+        //this.session.getBasicRemote().sendText(message);
+
+        //异步
+        this.session.getAsyncRemote().sendText(message);
+    }
+
+    /**
+     * 通过userId向客户端发送消息
+     */
+    public void sendMessageByUserId(String userId, String message) throws IOException {
+        logger.info("服务端发送消息到{},消息:{}", userId, message);
+        if (StrUtil.isNotBlank(userId) && webSocketMap2.containsKey(userId)) {
+            webSocketMap2.get(userId).sendMessage(message);
+        } else {
+            logger.error("用户{}不在线", userId);
+        }
+    }
+
+    /**
+     * 群发自定义消息
+     */
+    public static void sendInfo(String message) throws IOException {
+        for (String item : webSocketMap2.keySet()) {
+            try {
+                webSocketMap2.get(item).sendMessage(message);
+            } catch (IOException e) {
+                continue;
+            }
+        }
+    }
+
+    public static synchronized int getOnlineCount() {
+        return onlineCount;
+    }
+
+    public static synchronized void addOnlineCount() {
+        WebSocketManager.onlineCount++;
+    }
+
+    public static synchronized void subOnlineCount() {
+        WebSocketManager.onlineCount--;
+    }
+
+    /***
+     * 定时重发任务消息WebSocket - 后管
+     */
+    @Scheduled(cron = "0 0/6 * * * ?")
+    public void reSendMessageManager() throws IOException {
+        if (webSocketMap2.isEmpty() || webSocketMessageMap2.isEmpty()) {
+            logger.error("定时重发消息WebSocket,reSendMessageManager()方法未执行,原因:客户端未建立WebSocket链接");
+            return;
+        }
+
+        logger.info("定时重发消息WebSocket,reSendMessageManager()方法执行成功,入参:webSocketMap->{},webSocketMessageMap->{}", webSocketMap2, webSocketMessageMap2);
+
+        Set<Map.Entry<String, String>> message = webSocketMessageMap2.entrySet();
+
+        List<Map<String, String>> maps = new ArrayList<>();
+
+        for (Map.Entry<String, String> entry : message) {
+            String userId = entry.getKey();
+            //后管
+            Map<String, String> stringMap = iTaskService.getTaskCount(null, null, userId);
+            maps.add(stringMap);
+        }
+
+        for (Map<String, String> map : maps) {
+            String userId = map.get("userId");
+            webSocketMap2.get(userId).sendMessage(JSON.toJSONString(map));
+            logger.info("给用户{}重发消息{}", userId, map);
+        }
+
+        logger.info("定时重发消息WebSocket,reSendMessageManager()方法执行结束");
+    }
+
+}
+
+

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

@@ -16,17 +16,24 @@
  */
 package org.springblade.manager.controller;
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
+import com.mixsmart.utils.StringUtils;
+import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 import javax.validation.Valid;
 
+import org.checkerframework.checker.units.qual.A;
+import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.entity.ArchiveTree;
+import org.springblade.manager.service.IArchiveTreeService;
+import org.springblade.manager.vo.ArchiveTreeContractAutoRuleVO;
+import org.springblade.manager.vo.ArchiveTreeContractVO2;
+import org.springblade.manager.vo.ArchiveTreeVO;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -36,6 +43,11 @@ import org.springblade.manager.wrapper.ArchiveTreeContractWrapper;
 import org.springblade.manager.service.IArchiveTreeContractService;
 import org.springblade.core.boot.ctrl.BladeController;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 /**
  *  控制器
  *
@@ -44,12 +56,14 @@ import org.springblade.core.boot.ctrl.BladeController;
  */
 @RestController
 @AllArgsConstructor
-@RequestMapping("/archivetreecontract")
+@RequestMapping("/archiveTreeContract")
 @Api(value = "", tags = "接口")
 public class ArchiveTreeContractController extends BladeController {
 
 	private final IArchiveTreeContractService archiveTreeContractService;
 
+	private final IArchiveTreeService archiveTreeService;
+
 	/**
 	 * 详情
 	 */
@@ -125,5 +139,123 @@ public class ArchiveTreeContractController extends BladeController {
 		return R.status(archiveTreeContractService.deleteLogic(Func.toLongList(ids)));
 	}
 
-	
+
+	/**
+	 * 懒加载树形结构
+	 */
+	@GetMapping("/lazy-tree")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "懒加载树形结构", notes = "传入父级id")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "parentId", value = "父级id", required = true),
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+	})
+	public R<List<ArchiveTreeContractVO2>> lazyTree(Long parentId,Long projectId) {
+		if (projectId == null) {
+			projectId = 1578599210897772545L;
+		}
+		List<ArchiveTreeContractVO2> tree = archiveTreeContractService.lazyTree2(AuthUtil.getTenantId(), parentId,projectId);
+		if (tree != null && tree.size() > 0) {
+			return R.data(tree);
+		}
+		return R.fail(200, "未查询到信息");
+	}
+
+
+	/**
+	 * 全加载树形结构/显示树
+	 */
+	@GetMapping("/tree")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "全加载树形结构/显示树", notes = "disPlayTree、nodeType")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "disPlayTree", value = "是否加载显示树 'null'=不加载 '1'=加载"),
+			@ApiImplicitParam(name = "nodeType", value = "'null'=全加载 '1'=关联电子原生文件类型树 '2'=文件上传类型树"),
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+	})
+	public R<List<ArchiveTreeContractVO2>> tree(Integer disPlayTree, Integer nodeType,Long projectId){
+		if (projectId == null) {
+			projectId = 1578599210897772545L;
+		}
+		List<ArchiveTreeContractVO2> tree = archiveTreeContractService.tree2(AuthUtil.getTenantId(), disPlayTree, nodeType,projectId);
+		if (tree != null && tree.size() > 0) {
+			return R.data(tree);
+		}
+
+		return R.fail(200, "未查询到信息");
+	}
+
+
+
+	@GetMapping("/test")
+	public R test(){
+		Long projectId = 1578599210897772545L;
+		List<ArchiveTree> trees = archiveTreeService.treeList(AuthUtil.getTenantId(), null, null);
+
+		archiveTreeContractService.initTree(AuthUtil.getTenantId(),projectId,trees);
+
+		return R.fail(200, "初始化成功");
+	}
+
+	@GetMapping("/test1")
+	public R test1(){
+		Long projectId = 1578599210897772545L;
+		List<ArchiveTreeContractVO> tree = archiveTreeContractService.tree(AuthUtil.getTenantId(), null, null,projectId);
+		if (tree != null && tree.size() > 0) {
+			return R.data(tree);
+		}
+
+		return R.fail(200, "初始化成功");
+	}
+
+
+	/**
+	 * 保存立卷规则设置
+	 */
+	@PostMapping("/saveArchiveAutoRule")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "保存立卷规则设置", notes = "传入archiveAutoType规则类型,nodeIds逗号拼接选择节点id")
+	public R saveArchiveAutoRule(@ApiParam(value = "立卷规则", required = true) @RequestParam Integer archiveAutoType,
+					@ApiParam(value = "主键集合", required = true) @RequestParam String nodeIds) {
+		return R.status(archiveTreeContractService.saveArchiveAutoRule(archiveAutoType,nodeIds));
+	}
+
+
+	/**
+	 * 查看立卷规则设置
+	 */
+	@PostMapping("/getArchiveAutoRule")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "修改立卷规则设置", notes = "传入节点id")
+	public R getArchiveAutoRule(@ApiParam(value = "主键", required = true) @RequestParam Long id) {
+		Map<Integer, List<ArchiveTreeContractAutoRuleVO>> ruleMap=archiveTreeContractService.getArchiveAutoRule(id);
+		return R.data(ruleMap);
+	}
+
+	/**
+	 * 修改立卷规则设置
+	 */
+	@PostMapping("/updateArchiveAutoRule")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "修改立卷规则设置", notes = "传入修改的archiveAutoType规则类型,nodeIds逗号拼接选择节点id")
+	public R updateArchiveAutoRule(@ApiParam(value = "立卷规则", required = true) @RequestParam Integer archiveAutoType,
+					@ApiParam(value = "主键集合", required = true) @RequestParam String nodeIds) {
+		return R.status(archiveTreeContractService.updateArchiveAutoRule(archiveAutoType,nodeIds));
+	}
+
+
+	/**
+	 * 初始化归档树根节点
+	 */
+	@PostMapping("/initTree")
+	@ApiOperationSupport(order = 10)
+	@ApiOperation(value = "初始化项目级归档树", notes = "传入token")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+	})
+	public R<ArchiveTree> initTree(Long projectId) {
+		List<ArchiveTree> trees = archiveTreeService.treeList(AuthUtil.getTenantId(), null, null);
+		archiveTreeContractService.initTree(AuthUtil.getTenantId(), projectId,trees);
+		return R.fail(200, "初始化创建成功");
+	}
 }

+ 12 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeController.java

@@ -15,6 +15,7 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.dto.ArchiveTreeDTO;
 import org.springblade.manager.dto.ArchiveTreeSortDTO;
+import org.springblade.manager.vo.ArchiveTreeVO2;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springblade.manager.entity.ArchiveTree;
@@ -112,8 +113,8 @@ public class ArchiveTreeController extends BladeController {
     @ApiImplicitParams(value = {
             @ApiImplicitParam(name = "parentId", value = "父级id", required = true)
     })
-    public R<List<ArchiveTreeVO>> lazyTree(Long parentId) {
-        List<ArchiveTreeVO> tree = archiveTreeService.lazyTree(AuthUtil.getTenantId(), parentId);
+    public R<List<ArchiveTreeVO2>> lazyTree(Long parentId) {
+        List<ArchiveTreeVO2> tree = archiveTreeService.lazyTree2(AuthUtil.getTenantId(), parentId);
         if (tree != null && tree.size() > 0) {
             return R.data(tree);
         }
@@ -130,8 +131,8 @@ public class ArchiveTreeController extends BladeController {
             @ApiImplicitParam(name = "disPlayTree", value = "是否加载显示树 'null'=不加载 '1'=加载"),
             @ApiImplicitParam(name = "nodeType", value = "'null'=全加载 '1'=关联电子原生文件类型树 '2'=文件上传类型树")
     })
-    public R<List<ArchiveTreeVO>> tree(Integer disPlayTree, Integer nodeType) {
-        List<ArchiveTreeVO> tree = archiveTreeService.tree(AuthUtil.getTenantId(), disPlayTree, nodeType);
+    public R<List<ArchiveTreeVO2>> tree(Integer disPlayTree, Integer nodeType) {
+        List<ArchiveTreeVO2> tree = archiveTreeService.tree2(AuthUtil.getTenantId(), disPlayTree, nodeType);
         if (tree != null && tree.size() > 0) {
             return R.data(tree);
         }
@@ -171,5 +172,12 @@ public class ArchiveTreeController extends BladeController {
         return R.status(archiveTreeService.submitArchiveTreeSort(listSort));
     }
 
+    @GetMapping("/test")
+    public R test(){
+
+
+        return R.fail(200, "初始化成功");
+    }
+
 
 }

+ 12 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FirstController.java

@@ -223,7 +223,7 @@ public class FirstController extends BladeController {
 
                     //获取填报数据
                     List<Map<String, Object>> firstBusinessDataInfos = this.getFirstBusinessDataImpl2(firstId, tableNode.getContractId());
-
+                    ProjectInfo projectInfo = projectInfoService.getById(tableNode.getProjectId());
                     try {
                         //处理数据
                         for (Map<String, Object> dataMap : firstBusinessDataInfos) {
@@ -241,6 +241,17 @@ public class FirstController extends BladeController {
                                     Document doc = Jsoup.parse(htmlString);
                                     Element table = doc.select("table").first();
                                     Elements trs = table.select("tr");
+                                    //添加标题
+                                    CellRange[] columns = sheet.getMergedCells();
+                                    for (int i = 0; i < columns.length; i++) {
+                                        CellRange cellRange = columns[i];
+                                        System.out.println(cellRange.getStyle().getFont().getSize());
+                                        if (cellRange.getStyle().getFont().getSize() >= 12) {
+                                            cellRange.setText(projectInfo.getProjectName());
+                                            cellRange.getStyle().getFont().setSize(20);
+                                            break;
+                                        }
+                                    }
 
                                     if (ObjectUtil.isNotEmpty(dataMap)) {
                                         for (String val : dataMap.keySet()) {

+ 10 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ProjectInfoController.java

@@ -19,6 +19,8 @@ import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.service.*;
 import org.springblade.manager.vo.*;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springblade.manager.entity.ProjectInfo;
@@ -40,6 +42,7 @@ public class ProjectInfoController extends BladeController {
     private final IWbsTreePrivateService wbsTreePrivateService;
     private final IContractInfoService iContractInfoService;
     private final SaveUserInfoByProjectService saveUserInfoByProjectService;
+    private final JdbcTemplate jdbcTemplate;
 
     /**
      * 详情
@@ -142,16 +145,17 @@ public class ProjectInfoController extends BladeController {
     @ApiOperationSupport(order = 8)
     @ApiOperation(value = "逻辑删除", notes = "传入ids")
     public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
-        List<ContractInfo> infos = iContractInfoService.findContractInProject(ids);
-        if (infos.size() > 0) {
+        String sql = "select id from m_contract_info where is_deleted = 0 and p_id = " + ids;
+        List<ContractInfo> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ContractInfo.class));
+        if (query.size() > 0) {
             return R.fail("当前项目有合同段,删除失败");
         }
-        List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateService.findWbsTreePrivate(ids);
-        if (wbsTreePrivates.size() > 0) {
+        Long count1 = wbsTreePrivateService.findWbsTreePrivate(ids);
+        if (count1 > 0) {
             return R.fail("当前项目存在WBS私有树,删除失败");
         }
-        List<SaveUserInfoByProjectDTO> list = saveUserInfoByProjectService.selectList(ids);
-        if (list.size() > 0) {
+        Long count2 = saveUserInfoByProjectService.selectList(ids);
+        if (count2 > 0) {
             return R.fail("当前项目被用户关联中,删除失败");
         }
         return R.status(projectInfoService.deleteLogic(Func.toLongList(ids)));

+ 6 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java

@@ -1,5 +1,6 @@
 package org.springblade.manager.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
@@ -19,13 +20,11 @@ import org.springblade.core.tool.support.Kv;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.manager.dto.WbsTreePrivateDTO2;
 import org.springblade.manager.dto.WbsTreePrivateDTO3;
-import org.springblade.manager.entity.ProjectInfo;
-import org.springblade.manager.entity.WbsTree;
-import org.springblade.manager.entity.WbsTreeContract;
-import org.springblade.manager.entity.WbsTreePrivate;
+import org.springblade.manager.entity.*;
 import org.springblade.manager.mapper.WbsTreeContractMapper;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.service.IProjectInfoService;
+import org.springblade.manager.service.IWbsFormElementService;
 import org.springblade.manager.service.IWbsTreePrivateService;
 import org.springblade.manager.service.IWbsTreeService;
 import org.springblade.manager.vo.*;
@@ -52,6 +51,7 @@ public class WbsTreePrivateController extends BladeController {
     private final WbsTreePrivateMapper wbsTreePrivateMapper;
     private final IWbsTreeService wbsTreeService;
     private final IProjectInfoService projectInfoService;
+    private final IWbsFormElementService wbsFormElementService;
 
     /**
      * 保存项目日志划分
@@ -321,6 +321,8 @@ public class WbsTreePrivateController extends BladeController {
                     WbsTree wbsTree = wbsTreeService.getById(r.getId());
                     if (wbsTree != null){
                         r.setInitTableId(wbsTree.getInitTableId().toString());
+                        r.setElementTotal(Math.toIntExact(wbsFormElementService.count(
+                                new LambdaQueryWrapper<WbsFormElement>().eq(WbsFormElement::getFId, r.getInitTableId()))));
                     }
                 }
             }

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

@@ -16,11 +16,15 @@
  */
 package org.springblade.manager.mapper;
 
+
 import org.apache.ibatis.annotations.Param;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.manager.vo.ArchiveTreeContractVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.manager.vo.ArchiveTreeContractVO2;
+import org.springblade.manager.vo.ArchiveTreeVO;
+
 import java.util.List;
 
 /**
@@ -39,7 +43,13 @@ public interface ArchiveTreeContractMapper extends BaseMapper<ArchiveTreeContrac
 	 * @return
 	 */
 	List<ArchiveTreeContractVO> selectArchiveTreeContractPage(IPage page, ArchiveTreeContractVO archiveTreeContract);
+	List<ArchiveTreeContractVO> lazyTree(@Param("tenantId") String tenantId, @Param("parentId") Long parentId, @Param("projectId") Long projectId);
+
+	List<ArchiveTreeContractVO> tree(@Param("tenantId") String tenantId, @Param("disPlayTree") Integer disPlayTree, @Param("nodeType") Integer nodeType, @Param("projectId") Long projectId);
+
+	List<ArchiveTreeContractVO2> lazyTree2(@Param("tenantId") String tenantId, @Param("parentId") Long parentId, @Param("projectId") Long projectId);
 
+	List<ArchiveTreeContractVO2> tree2(@Param("tenantId") String tenantId, @Param("disPlayTree") Integer disPlayTree, @Param("nodeType") Integer nodeType, @Param("projectId") Long projectId);
 	/**
 	 * 自动组卷规则设置节点下所有子节点
 	 * @param treeContract
@@ -47,4 +57,10 @@ public interface ArchiveTreeContractMapper extends BaseMapper<ArchiveTreeContrac
 	 */
 	int updateAllSonNodeIdsForArchiveAutoRule(@Param("treeContract") ArchiveTreeContract treeContract);
 
+	/**
+	 * 获取节点下所有设置规则节点
+	 * @param treeContract
+	 * @return
+	 */
+	List<ArchiveTreeContract> getAllSonNodeIdsForArchiveAutoRuleSelected(@Param("treeContract")ArchiveTreeContract treeContract);
 }

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

@@ -36,6 +36,7 @@
         <result column="ext_id" property="extId"/>
         <result column="archive_auto_type" property="archiveAutoType"/>
         <result column="archive_auto_node_id" property="archiveAutoNodeId"/>
+        <result column="archive_auto_select" property="archiveAutoSelect"/>
     </resultMap>
 
 
@@ -43,6 +44,181 @@
         select * from m_archive_tree_contract where is_deleted = 0
     </select>
 
+    <resultMap id="treeNodeResultMap" type="org.springblade.manager.vo.TreeNodeVO2">
+        <id column="id" property="id"/>
+        <result column="parent_id" property="parentId"/>
+        <result column="title" property="title"/>
+        <result column="value" property="value"/>
+        <result column="key" property="key"/>
+        <result column="has_children" property="hasChildren"/>
+        <result column="displayHierarchy" property="displayHierarchy"/>
+        <result column="majorDataType" property="majorDataType"/>
+        <result column="isStorageNode" property="isStorageNode"/>
+        <result column="isDisplayTree" property="isDisplayTree"/>
+        <result column="isStorageNode" property="isStorageNode"/>
+        <result column="isBuiltDrawing" property="isBuiltDrawing"/>
+        <result column="postType" property="postType"/>
+        <result column="project_type" property="projectType"/>
+        <result column="storage_type" property="storageType"/>
+        <result column="ext_type" property="extType"/>
+        <result column="ext_id" property="extId"/>
+        <result column="archive_auto_type" property="archiveAutoType"/>
+        <result column="archive_auto_node_id" property="archiveAutoNodeId"/>
+        <result column="from_id" property="fromId"/>
+        <result column="ext_attach_id" property="extAttachId"/>
+    </resultMap>
+
+    <resultMap id="ArchiveTreeContractVO2ResultMap" type="org.springblade.manager.vo.ArchiveTreeContractVO2">
+        <id column="id" property="id"/>
+        <result column="parent_id" property="parentId"/>
+        <result column="title" property="title"/>
+        <result column="value" property="value"/>
+        <result column="key" property="key"/>
+        <result column="has_children" property="hasChildren"/>
+        <result column="displayHierarchy" property="displayHierarchy"/>
+        <result column="majorDataType" property="majorDataType"/>
+        <result column="isStorageNode" property="isStorageNode"/>
+        <result column="isDisplayTree" property="isDisplayTree"/>
+        <result column="isStorageNode" property="isStorageNode"/>
+        <result column="isBuiltDrawing" property="isBuiltDrawing"/>
+        <result column="postType" property="postType"/>
+        <result column="project_type" property="projectType"/>
+        <result column="storage_type" property="storageType"/>
+        <result column="ext_type" property="extType"/>
+        <result column="ext_id" property="extId"/>
+        <result column="archive_auto_type" property="archiveAutoType"/>
+        <result column="archive_auto_node_id" property="archiveAutoNodeId"/>
+    </resultMap>
+
+    <select id="lazyTree" resultMap="treeNodeResultMap">
+        SELECT
+        d.id,
+        d.parent_id,
+        d.node_name AS title,
+        d.id AS "value",
+        d.id AS "key",
+        d.major_data_type AS "majorDataType",
+        d.display_hierarchy AS "displayHierarchy",
+        d.is_storage_node AS "isStorageNode",
+        d.post_type AS postType,
+        d.project_type,
+        d.storage_type,
+        d.ext_type,
+        d.ext_id,
+        d.archive_auto_type,
+        d.archive_auto_node_id,
+        (SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_archive_tree_contract WHERE parent_id = d.id and is_deleted = 0 and project_id = #{projectId})
+        AS "has_children"
+        FROM
+        m_archive_tree_contract d
+        WHERE
+        d.parent_id = #{parentId} AND d.is_deleted = 0 and project_id = #{projectId}
+        <if test="tenantId!=null and tenantId!=''">
+            AND d.tenant_id = #{tenantId}
+        </if>
+        ORDER BY d.sort
+    </select>
+
+
+    <select id="tree" resultMap="treeNodeResultMap">
+        SELECT
+        id,
+        parent_id,
+        node_name AS title,
+        id AS "value",
+        id AS "key",
+        major_data_type AS "majorDataType",
+        display_hierarchy AS "displayHierarchy",
+        is_storage_node AS "isStorageNode",
+        is_upload_file_display_configuration_tree AS "isDisplayTree",
+        is_built_drawing AS "isBuiltDrawing",
+        post_type AS postType,
+        project_type,
+        storage_type,
+        ext_type,
+        ext_id,
+        archive_auto_type,
+        archive_auto_node_id
+        FROM m_archive_tree_contract
+        WHERE is_deleted = 0 and project_id = #{projectId}
+        <if test=" tenantId!=null and tenantId!='' ">
+            AND tenant_id = #{tenantId}
+        </if>
+        <if test=" disPlayTree!=null and disPlayTree!='' ">
+            AND is_upload_file_display_configuration_tree = 1
+        </if>
+        <if test=" nodeType !=null and nodeType !='' ">
+            /*根节点=0 关联电子原生文件=1 数字化上传文件=2*/
+            AND node_type in (0,#{nodeType})
+        </if>
+        OR parent_id = 0
+        ORDER BY sort
+    </select>
+
+    <select id="lazyTree2" resultMap="ArchiveTreeContractVO2ResultMap">
+        SELECT
+        d.id,
+        d.parent_id,
+        d.node_name AS title,
+        d.id AS "value",
+        d.id AS "key",
+        d.major_data_type AS "majorDataType",
+        d.display_hierarchy AS "displayHierarchy",
+        d.is_storage_node AS "isStorageNode",
+        d.post_type AS postType,
+        d.project_type,
+        d.storage_type,
+        d.ext_type,
+        d.ext_id,
+        d.archive_auto_type,
+        d.archive_auto_node_id,
+        (SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_archive_tree_contract WHERE parent_id = d.id and is_deleted = 0 and project_id = #{projectId})
+        AS "has_children"
+        FROM
+        m_archive_tree_contract d
+        WHERE
+        d.parent_id = #{parentId} AND d.is_deleted = 0 and project_id = #{projectId}
+        <if test="tenantId!=null and tenantId!=''">
+            AND d.tenant_id = #{tenantId}
+        </if>
+        ORDER BY d.sort
+    </select>
+
+
+    <select id="tree2" resultMap="ArchiveTreeContractVO2ResultMap">
+        SELECT
+        id,
+        parent_id,
+        node_name AS title,
+        id AS "value",
+        id AS "key",
+        major_data_type AS "majorDataType",
+        display_hierarchy AS "displayHierarchy",
+        is_storage_node AS "isStorageNode",
+        is_upload_file_display_configuration_tree AS "isDisplayTree",
+        is_built_drawing AS "isBuiltDrawing",
+        post_type AS postType,
+        project_type,
+        storage_type,
+        ext_type,
+        ext_id,
+        archive_auto_type,
+        archive_auto_node_id
+        FROM m_archive_tree_contract
+        WHERE is_deleted = 0 and project_id = #{projectId}
+        <if test=" tenantId!=null and tenantId!='' ">
+            AND tenant_id = #{tenantId}
+        </if>
+        <if test=" disPlayTree!=null and disPlayTree!='' ">
+            AND is_upload_file_display_configuration_tree = 1
+        </if>
+        <if test=" nodeType !=null and nodeType !='' ">
+            /*根节点=0 关联电子原生文件=1 数字化上传文件=2*/
+            AND node_type in (0,#{nodeType})
+        </if>
+        OR parent_id = 0
+        ORDER BY sort
+    </select>
     <update id="updateAllSonNodeIdsForArchiveAutoRule">
         update m_archive_tree_contract
         set
@@ -60,4 +236,12 @@
             </if>
     </update>
 
+    <select id="getAllSonNodeIdsForArchiveAutoRuleSelected" resultMap="archiveTreeContractResultMap">
+        select * from m_archive_tree_contract
+        where is_deleted = 0
+        and ancestors like concat('', #{treeContract.ancestors}, '%')
+        and archive_auto_select=1
+        order by ancestors asc,sort asc
+    </select>
+
 </mapper>

+ 3 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeMapper.java

@@ -5,15 +5,16 @@ import org.springblade.manager.entity.ArchiveTree;
 import org.springblade.manager.vo.ArchiveTreeVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.manager.vo.ArchiveTreeVO2;
 
 import java.util.List;
 
 public interface ArchiveTreeMapper extends BaseMapper<ArchiveTree> {
 
     List<ArchiveTreeVO> lazyTree(@Param("tenantId") String tenantId, @Param("parentId") Long parentId);
-
+    List<ArchiveTreeVO2> lazyTree2(@Param("tenantId") String tenantId, @Param("parentId") Long parentId);
     List<ArchiveTreeVO> tree(@Param("tenantId") String tenantId, @Param("disPlayTree") Integer disPlayTree, @Param("nodeType") Integer nodeType);
-
+    List<ArchiveTreeVO2> tree2(@Param("tenantId") String tenantId, @Param("disPlayTree") Integer disPlayTree, @Param("nodeType") Integer nodeType);
     int updateBatch(@Param("diffRent") List<String> diffRent);
 
     int updateBatch2(@Param("diffRent") List<String> diffRent);

+ 105 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeMapper.xml

@@ -36,6 +36,28 @@
         <result column="is_upload_file_display_configuration_tree" property="isUploadFileDisplayConfigurationTree"/>
     </resultMap>
 
+    <resultMap id="ArchiveTreeVOResultMap" type="org.springblade.manager.vo.ArchiveTreeVO2">
+        <id column="id" property="id"/>
+        <result column="parent_id" property="parentId"/>
+        <result column="title" property="title"/>
+        <result column="value" property="value"/>
+        <result column="key" property="key"/>
+        <result column="has_children" property="hasChildren"/>
+        <result column="displayHierarchy" property="displayHierarchy"/>
+        <result column="majorDataType" property="majorDataType"/>
+        <result column="isStorageNode" property="isStorageNode"/>
+        <result column="isDisplayTree" property="isDisplayTree"/>
+        <result column="isStorageNode" property="isStorageNode"/>
+        <result column="isBuiltDrawing" property="isBuiltDrawing"/>
+        <result column="postType" property="postType"/>
+        <result column="project_type" property="projectType"/>
+        <result column="storage_type" property="storageType"/>
+        <result column="ext_type" property="extType"/>
+        <result column="ext_id" property="extId"/>
+        <result column="archive_auto_type" property="archiveAutoType"/>
+        <result column="archive_auto_node_id" property="archiveAutoNodeId"/>
+    </resultMap>
+
     <resultMap id="treeNodeResultMap" type="org.springblade.manager.vo.TreeNodeVO2">
         <id column="id" property="id"/>
         <result column="parent_id" property="parentId"/>
@@ -49,6 +71,12 @@
         <result column="isDisplayTree" property="isDisplayTree"/>
         <result column="isStorageNode" property="isStorageNode"/>
         <result column="isBuiltDrawing" property="isBuiltDrawing"/>
+        <result column="project_type" property="projectType"/>
+        <result column="storage_type" property="storageType"/>
+        <result column="ext_type" property="extType"/>
+        <result column="ext_id" property="extId"/>
+        <result column="archive_auto_type" property="archiveAutoType"/>
+        <result column="archive_auto_node_id" property="archiveAutoNodeId"/>
         <result column="postType" property="postType"/>
     </resultMap>
 
@@ -93,6 +121,12 @@
         d.display_hierarchy AS "displayHierarchy",
         d.is_storage_node AS "isStorageNode",
         d.post_type AS postType,
+        d.project_type,
+        d.storage_type,
+        d.ext_type,
+        d.ext_id,
+        d.archive_auto_type,
+        d.archive_auto_node_id,
         (SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_archive_tree WHERE parent_id = d.id and is_deleted = 0)
         AS "has_children"
         FROM
@@ -117,7 +151,77 @@
         is_storage_node AS "isStorageNode",
         is_upload_file_display_configuration_tree AS "isDisplayTree",
         is_built_drawing AS "isBuiltDrawing",
-        post_type AS postType
+        post_type AS postType,
+        project_type,
+        storage_type,
+        ext_type,
+        ext_id,
+        archive_auto_type,
+        archive_auto_node_id
+        FROM m_archive_tree
+        WHERE is_deleted = 0
+        <if test=" tenantId!=null and tenantId!='' ">
+            AND tenant_id = #{tenantId}
+        </if>
+        <if test=" disPlayTree!=null and disPlayTree!='' ">
+            AND is_upload_file_display_configuration_tree = 1
+        </if>
+        <if test=" nodeType !=null and nodeType !='' ">
+            /*根节点=0 关联电子原生文件=1 数字化上传文件=2*/
+            AND node_type in (0,#{nodeType})
+        </if>
+        OR parent_id = 0
+        ORDER BY sort
+    </select>
+
+    <select id="lazyTree2" resultMap="ArchiveTreeVOResultMap">
+        SELECT
+        d.id,
+        d.parent_id,
+        d.node_name AS title,
+        d.id AS "value",
+        d.id AS "key",
+        d.major_data_type AS "majorDataType",
+        d.display_hierarchy AS "displayHierarchy",
+        d.is_storage_node AS "isStorageNode",
+        d.post_type AS postType,
+        d.project_type,
+        d.storage_type,
+        d.ext_type,
+        d.ext_id,
+        d.archive_auto_type,
+        d.archive_auto_node_id,
+        (SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_archive_tree WHERE parent_id = d.id and is_deleted = 0)
+        AS "has_children"
+        FROM
+        m_archive_tree d
+        WHERE
+        d.parent_id = #{parentId} AND d.is_deleted = 0
+        <if test="tenantId!=null and tenantId!=''">
+            AND d.tenant_id = #{tenantId}
+        </if>
+        ORDER BY d.sort
+    </select>
+
+    <select id="tree2" resultMap="ArchiveTreeVOResultMap">
+        SELECT
+        id,
+        parent_id,
+        node_name AS title,
+        id AS "value",
+        id AS "key",
+        major_data_type AS "majorDataType",
+        display_hierarchy AS "displayHierarchy",
+        is_storage_node AS "isStorageNode",
+        is_upload_file_display_configuration_tree AS "isDisplayTree",
+        is_built_drawing AS "isBuiltDrawing",
+        post_type AS postType,
+        project_type,
+        storage_type,
+        ext_type,
+        ext_id,
+        archive_auto_type,
+        archive_auto_node_id
         FROM m_archive_tree
         WHERE is_deleted = 0
         <if test=" tenantId!=null and tenantId!='' ">

+ 6 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProjectInfoMapper.xml

@@ -56,9 +56,12 @@
     <select id="queryProjectUserAmount" resultMap="projectUserAmount">
         select
             mpi.project_alias,
-            (select count(id) end from m_project_assignment_user where project_id = mpi.id and role_id in(select id from blade_role where id = '1537247986361782274' or parent_id = '1537247986361782274')) as contractor,
-            (select count(id) end from m_project_assignment_user where project_id = mpi.id and role_id in(select id from blade_role where id = '1537246384519335938' or parent_id = '1537246384519335938')) as supervision,
-            (select count(id) end from m_project_assignment_user where project_id = mpi.id and role_id in(select id from blade_role where id = '1537246243393589249' or parent_id = '1537246243393589249')) as owner
+            (select count(1) end from m_project_assignment_user where is_deleted = 0 and project_id = mpi.id and role_id in
+                (select id from blade_role where is_deleted = 0 and (id = '1537247986361782274' or parent_id = '1537247986361782274' ))) as contractor,
+            (select count(1) end from m_project_assignment_user where is_deleted = 0 and project_id = mpi.id and role_id in
+                (select id from blade_role where is_deleted = 0 and (id = '1537246384519335938' or parent_id = '1537246384519335938'))) as supervision,
+            (select count(1) end from m_project_assignment_user where is_deleted = 0 and project_id = mpi.id and role_id in
+                (select id from blade_role where is_deleted = 0 and (id = '1537246243393589249' or parent_id = '1537246243393589249'))) as owner
         from
             m_project_info as mpi
     </select>

+ 37 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeContractService.java

@@ -16,10 +16,20 @@
  */
 package org.springblade.manager.service;
 
+import feign.Param;
+import org.springblade.manager.entity.ArchiveTree;
 import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springblade.manager.vo.ArchiveTreeContractAutoRuleVO;
 import org.springblade.manager.vo.ArchiveTreeContractVO;
 import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.manager.vo.ArchiveTreeContractVO2;
+import org.springblade.manager.vo.ArchiveTreeVO;
+
+import java.util.List;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  *  服务类
@@ -38,10 +48,37 @@ public interface IArchiveTreeContractService extends BaseService<ArchiveTreeCont
 	 */
 	IPage<ArchiveTreeContractVO> selectArchiveTreeContractPage(IPage<ArchiveTreeContractVO> page, ArchiveTreeContractVO archiveTreeContract);
 
+	/**
+	 * 初始化项目级归档树
+	 * @param tenantId
+	 * @param projectId
+	 * @return
+	 */
+	boolean initTree(String tenantId, Long projectId, List<ArchiveTree> trees);
+
+	List<ArchiveTreeContractVO> lazyTree(String tenantId, Long parentId,Long projectId);
+
+	List<ArchiveTreeContractVO> tree(String tenantI,Integer disPlayTree,Integer nodeType,Long projectId);
+
+	List<ArchiveTreeContractVO2> lazyTree2(String tenantId, Long parentId, Long projectId);
+
+	List<ArchiveTreeContractVO2> tree2(String tenantI,Integer disPlayTree,Integer nodeType,Long projectId);
 
 	/**
 	 *项目级立卷规则新增
 	 * @return
 	 */
 	boolean saveArchiveAutoRule(Integer archiveAutoType,String nodeIds);
+
+
+
+	Map<Integer, List<ArchiveTreeContractAutoRuleVO>> getArchiveAutoRule(Long id);
+
+	/**
+	 *项目级立卷规则更新
+	 * @return
+	 */
+	boolean updateArchiveAutoRule(Integer archiveAutoType,String nodeIds);
+
+
 }

+ 8 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeService.java

@@ -6,6 +6,7 @@ import org.springblade.manager.entity.ArchiveTree;
 import org.springblade.manager.vo.ArchiveTreeVO;
 import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.manager.vo.ArchiveTreeVO2;
 
 import java.util.List;
 
@@ -16,8 +17,10 @@ public interface IArchiveTreeService extends BaseService<ArchiveTree> {
 	boolean submit(ArchiveTreeDTO archiveTreeDTO);
 
 	List<ArchiveTreeVO> lazyTree(String tenantId, Long parentId);
+	List<ArchiveTreeVO2> lazyTree2(String tenantId, Long parentId);
 
-	List<ArchiveTreeVO> tree(String tenantI,Integer disPlayTree,Integer nodeType);
+	List<ArchiveTreeVO> tree(String tenantI, Integer disPlayTree, Integer nodeType);
+	List<ArchiveTreeVO2> tree2(String tenantI, Integer disPlayTree, Integer nodeType);
 
 	List<ArchiveTree> selectByParentIdOrId(String id);
 
@@ -27,9 +30,9 @@ public interface IArchiveTreeService extends BaseService<ArchiveTree> {
 
 	boolean submitArchiveTreeSort(List<ArchiveTreeSortDTO> listSort);
 
-	/**
-	 * 系统级立卷规则新增
-	 * @return
-	 */
+	List<ArchiveTree> treeList(String tenantI,Integer disPlayTree,Integer nodeType);
+	
+
+
 	boolean saveAechiveAutoRule(Integer archiveAutoType,String nodeIds);
 }

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

@@ -38,7 +38,7 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
 
     int deleteLogicBypKeyId(String pKeyId);
 
-    List<WbsTreePrivate> findWbsTreePrivate(String ids);
+    Long findWbsTreePrivate(String ids);
 
     boolean updateBatchByPid(List<WbsTreePrivateDTO3> wbsTreePrivates);
 

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

@@ -15,7 +15,7 @@ public interface SaveUserInfoByProjectService extends BaseService<SaveUserInfoBy
 
     List<SaveUserInfoByProjectDTO> queryProjectBusinessUser(Long projectId, Long contractId);
 
-    List<SaveUserInfoByProjectDTO> selectList(String ids);
+    Long selectList(String ids);
 
     boolean deleteBatchByIdsList(List<Long> idsList);
 

+ 286 - 22
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java

@@ -16,14 +16,26 @@
  */
 package org.springblade.manager.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.mixsmart.utils.StringUtils;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.node.ForestNodeMerger;
+import org.springblade.manager.entity.ArchiveTree;
 import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springblade.manager.vo.ArchiveTreeContractAutoRuleVO;
 import org.springblade.manager.vo.ArchiveTreeContractVO;
 import org.springblade.manager.mapper.ArchiveTreeContractMapper;
 import org.springblade.manager.service.IArchiveTreeContractService;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.manager.vo.ArchiveTreeContractVO2;
+import org.springblade.manager.vo.ArchiveTreeVO;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
+import java.util.*;
+
 /**
  *  服务实现类
  *
@@ -37,41 +49,293 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 	public IPage<ArchiveTreeContractVO> selectArchiveTreeContractPage(IPage<ArchiveTreeContractVO> page, ArchiveTreeContractVO archiveTreeContract) {
 		return page.setRecords(baseMapper.selectArchiveTreeContractPage(page, archiveTreeContract));
 	}
+	@Override
+	public boolean initTree(String tenantId, Long projectId, List<ArchiveTree> trees){
+
+		//清理旧的项目归档树,待补充
+		clearProjectTree(tenantId,projectId);
+
+		//建立父子关系,祖先关系
+		List<ArchiveTreeContract> archiveTreeContracts = new ArrayList<>();
+		Map<Long,Long> oldNewMap = new LinkedHashMap<>();
+
+		Map<Long,ArchiveTree> archiveMap = new LinkedHashMap<>();
+
+		for (ArchiveTree archiveTreeVO :trees) {
+			oldNewMap.put(archiveTreeVO.getId(), SnowFlakeUtil.getId());
+			archiveMap.put(archiveTreeVO.getId(), archiveTreeVO);
+		}
+		oldNewMap.put(0L,0L);
+
+		for (ArchiveTree archiveTreeVO :trees) {
+
+			ArchiveTreeContract archiveTree = new ArchiveTreeContract(archiveTreeVO);
+			archiveTree.setId(oldNewMap.get(archiveTreeVO.getId()));
+			archiveTree.setParentId(oldNewMap.get(archiveTreeVO.getParentId()));
+			archiveTree.setCreateUser(AuthUtil.getUserId());
+			archiveTree.setProjectId(projectId);
+
+			String anCenstors = archiveTreeVO.getAncestors();
+			if (StringUtils.isNotEmpty(anCenstors)) {
+				String newAnCenstors = "";
+				String arrAnCenstor[] = anCenstors.split(",");
+				if (arrAnCenstor.length > 0) {
+
+					for (String anCenstor: arrAnCenstor) {
+						Long anCenstorId = Long.parseLong(anCenstor);
+						Long newAnCenstorId = oldNewMap.get(anCenstorId);
+						if (newAnCenstorId!= null) {
+							if (newAnCenstors.length() == 0) {
+								newAnCenstors += newAnCenstorId;
+							}else {
+								newAnCenstors += (","+ newAnCenstorId);
+							}
+						}
+					}
+				}
+				archiveTree.setAncestors(newAnCenstors);
+			}
+
+			archiveTreeContracts.add(archiveTree);
+		}
+
+		//扩展动态节点
+
+		//处理丽娟规则
+
+		this.saveBatch(archiveTreeContracts);
+		return true;
+	}
 
+	@Override
+	public List<ArchiveTreeContractVO> lazyTree(String tenantId, Long parentId,Long projectId) {
+		if (AuthUtil.isAdministrator()) {
+			tenantId = StringPool.EMPTY;
+		}
+		return ForestNodeMerger.merge(baseMapper.lazyTree(tenantId, parentId,projectId));
+	}
+
+	@Override
+	public List<ArchiveTreeContractVO> tree(String tenantId, Integer disPlayTree, Integer nodeType, Long projectId) {
+		return ForestNodeMerger.merge(baseMapper.tree(tenantId, disPlayTree, nodeType,projectId));
+	}
+
+	@Override
+	public List<ArchiveTreeContractVO2> lazyTree2(String tenantId, Long parentId, Long projectId) {
+		if (AuthUtil.isAdministrator()) {
+			tenantId = StringPool.EMPTY;
+		}
+		return ForestNodeMerger.merge(baseMapper.lazyTree2(tenantId, parentId,projectId));
+	}
+
+	@Override
+	public List<ArchiveTreeContractVO2> tree2(String tenantId, Integer disPlayTree, Integer nodeType, Long projectId) {
+		return ForestNodeMerger.merge(baseMapper.tree2(tenantId, disPlayTree, nodeType,projectId));
+	}
+
+	/**
+	 * 保存组卷规则设置
+	 * @param archiveAutoType
+	 * @param nodeIds
+	 * @return
+	 */
 	@Override
 	public boolean saveArchiveAutoRule(Integer archiveAutoType, String nodeIds) {
 		//项目级不需要考虑是否为wbs节点,已经同步出来了都属于归档树节点,直接按归档树节点处理
+		try{
+			//步骤1保存选择节点的立卷规则。
+			String[] ids = nodeIds.split(",");
 
-		//步骤1保存选择节点的立卷规则。
-		String[] ids = nodeIds.split(",");
+			Long archiveAutoNodeId=null;
+
+			//分类并卷规则的需要生成个随机数,作为同一个分类赋值archiveAutoNodeId
+			if(archiveAutoType==2){
+				double ran=(Math.random()*100000000) + 1;
+				archiveAutoNodeId=Long.parseLong(System.currentTimeMillis()+""+ran);
+			}
+			for(String nodeId:ids){
+				long nodeIdLong = Long.parseLong(nodeId);
+				ArchiveTreeContract archiveTreeContract = baseMapper.selectById(nodeIdLong);
+				archiveTreeContract.setArchiveAutoSelect(1);
+				archiveTreeContract.setArchiveAutoType(archiveAutoType);
+				if(archiveAutoType==2){
+					//分类并卷规则 提交都是一个分类类型
+					archiveTreeContract.setArchiveAutoNodeId(archiveAutoNodeId);
+				}else{
+					//最高并卷规则 选择节点的ID
+					archiveTreeContract.setArchiveAutoNodeId(nodeIdLong);
+				}
+				baseMapper.updateById(archiveTreeContract);
+
+				//TODO 步骤2保存选择节点下所有子节点的立卷规则。注意立卷规则优先级覆盖原则。(单独组卷>分类并卷>最高并卷)
+				baseMapper.updateAllSonNodeIdsForArchiveAutoRule(archiveTreeContract);
+			}
 
-		Long archiveAutoNodeId=null;
+			return true;
 
-		//分类并卷规则的需要生成个随机数,作为同一个分类赋值archiveAutoNodeId
-		if(archiveAutoType==2){
-			double ran=(Math.random()*100000000) + 1;
-			archiveAutoNodeId=Long.parseLong(System.currentTimeMillis()+""+ran);
+		}catch (Exception e){
+			e.printStackTrace();
+			return false;
 		}
-		for(String nodeId:ids){
-			long nodeIdLong = Long.parseLong(nodeId);
-			ArchiveTreeContract archiveTreeContract = baseMapper.selectById(nodeIdLong);
-			archiveTreeContract.setArchiveAutoSelect(1);
-			archiveTreeContract.setArchiveAutoType(archiveAutoType);
+	}
+
+
+	/**
+	 * 获取节点规则查看
+	 * @param id
+	 * @return
+	 */
+	@Override
+	public Map<Integer, List<ArchiveTreeContractAutoRuleVO>> getArchiveAutoRule(Long id) {
+
+		Map<Integer, List<ArchiveTreeContractAutoRuleVO>> map= new HashMap<>();
+		List<ArchiveTreeContractAutoRuleVO> voList_1 = new ArrayList<>();//最高规则显示节点及节点下有设置的节点(archive_auto_select=1)
+		List<ArchiveTreeContractAutoRuleVO> voList_2 = new ArrayList<>();//分类并卷的tab显示当前节点的相同分类节点
+		List<ArchiveTreeContractAutoRuleVO> voList_3 = new ArrayList<>();//单独组卷的显示节点及节点下有设置的节点(archive_auto_select=1)
+
+		ArchiveTreeContract archiveTreeContract = baseMapper.selectById(id);
+
+		Map<Long,String> nodeNameMap = new HashMap<>();//单个节点名称缓存
+
+		//获取当前节点下所有设置的节点
+		List<ArchiveTreeContract> list=baseMapper.getAllSonNodeIdsForArchiveAutoRuleSelected(archiveTreeContract);
+		//找出最高规则和单独规则列表
+		for(ArchiveTreeContract node:list){
+			Integer archiveAutoType = node.getArchiveAutoType();
+			if(archiveAutoType !=null && archiveAutoType!=2){
+				ArchiveTreeContractAutoRuleVO vo = new ArchiveTreeContractAutoRuleVO();
+				vo.setNodeId(node.getId());
+				StringBuffer allName= new StringBuffer();
+				String ancestors = node.getAncestors();
+				String[] ancestorssplit = ancestors.split(",");//全路径ID
+				for(String pId:ancestorssplit){
+					long pIdLong = Long.parseLong(pId);
+					if(nodeNameMap.containsKey(pIdLong)){
+						allName.append(nodeNameMap.get(pIdLong)+"/");
+					}else{
+						ArchiveTreeContract pIdNode = baseMapper.selectById(pIdLong);
+						nodeNameMap.put(pIdNode.getId(),pIdNode.getNodeName());
+						allName.append(pIdNode.getNodeName()+"/");
+					}
+				}
+				allName.append(node.getNodeName());
+				vo.setAllName(allName.toString());
+
+				if(archiveAutoType==3){
+					vo.setSelectVo(1);
+					voList_3.add(vo);
+
+					ArchiveTreeContractAutoRuleVO vo1 = vo.clone();
+					vo1.setSelectVo(0);
+					voList_1.add(vo1);
+				}
+
+				if(archiveAutoType==1){
+					vo.setSelectVo(0);
+					voList_3.add(vo);
+
+					ArchiveTreeContractAutoRuleVO vo1 = vo.clone();
+					vo1.setSelectVo(1);
+					voList_1.add(vo1);
+				}
+
+
+			}
+		}
+		//找出分类并卷规则 与当前节点同一分类的节点
+		if(archiveTreeContract.getArchiveAutoType()!=null && archiveTreeContract.getArchiveAutoType()==2){
+
+			//设置同一分类的节点 archiveAutoSelect=1的,不是范围内的所有子节点
+			List<ArchiveTreeContract> list2= baseMapper.selectList(Wrappers.<ArchiveTreeContract>lambdaQuery()
+					.eq(ArchiveTreeContract::getArchiveAutoNodeId, archiveTreeContract.getArchiveAutoNodeId())
+					.eq(ArchiveTreeContract::getArchiveAutoSelect, 1).orderByAsc(ArchiveTreeContract::getSort));
+			for(ArchiveTreeContract node:list2){
+				ArchiveTreeContractAutoRuleVO vo = new ArchiveTreeContractAutoRuleVO();
+				vo.setNodeId(node.getId());
+				StringBuffer allName= new StringBuffer();
+				String ancestors = node.getAncestors();
+				String[] ancestorssplit = ancestors.split(",");//全路径ID
+				for(String pId:ancestorssplit){
+					long pIdLong = Long.parseLong(pId);
+					if(nodeNameMap.containsKey(pIdLong)){
+						allName.append(nodeNameMap.get(pIdLong)+"/");
+					}else{
+						ArchiveTreeContract pIdNode = baseMapper.selectById(pIdLong);
+						nodeNameMap.put(pIdNode.getId(),pIdNode.getNodeName());
+						allName.append(pIdNode.getNodeName()+"/");
+					}
+				}
+				allName.append(node.getNodeName());
+				vo.setAllName(allName.toString());
+				vo.setSelectVo(1);
+				voList_2.add(vo);
+			}
+		}
+
+		map.put(1,voList_1);
+		map.put(2,voList_2);
+		map.put(3,voList_3);
+		return map;
+	}
+
+
+	@Override
+	public boolean updateArchiveAutoRule(Integer archiveAutoType, String nodeIds) {
+		//项目级不需要考虑是否为wbs节点,已经同步出来了都属于归档树节点,直接按归档树节点处理
+
+
+		String[] ids = nodeIds.split(",");
+		Set<String> idsSet=new HashSet<>(Arrays.asList(ids));
+
+		//判断修改的原来是否是分类并卷规则类型
+		List<ArchiveTreeContract> archiveTreeContracts_db=null;
+		long nodeId_0_Long = Long.parseLong(ids[0]);
+		ArchiveTreeContract archiveTreeContract0 = baseMapper.selectById(nodeId_0_Long);
+		Integer archiveAutoType_db = archiveTreeContract0.getArchiveAutoType();
+		if(archiveAutoType_db==2){
+			//获取分类ID
+			Long archiveAutoNodeId_db = archiveTreeContract0.getArchiveAutoNodeId();
+			//获取该分类下的设置选择节点 archiveAutoSelect=1的,不是范围内的所有子节点
+			archiveTreeContracts_db = baseMapper.selectList(Wrappers.<ArchiveTreeContract>lambdaQuery()
+					.eq(ArchiveTreeContract::getArchiveAutoNodeId, archiveAutoNodeId_db)
+					.eq(ArchiveTreeContract::getArchiveAutoSelect, 1)
+			);
+		}else{
+			//原来是最高,单独规则类型的
+
 			if(archiveAutoType==2){
-				//分类并卷规则 提交都是一个分类类型
-				archiveTreeContract.setArchiveAutoNodeId(archiveAutoNodeId);
-			}else{
-				//最高并卷规则 选择节点的ID
-				archiveTreeContract.setArchiveAutoNodeId(nodeIdLong);
+				//修改成分类并卷
+			}
+			if(archiveAutoType==1){
+				//修改成最高
+			}
+			if(archiveAutoType==3){
+				//修改成单独
+				for(String nodeId:ids){
+					//步骤1更新选择节点的立卷规则。
+					long nodeIdLong = Long.parseLong(nodeId);
+					ArchiveTreeContract archiveTreeContract = baseMapper.selectById(nodeIdLong);
+					archiveTreeContract.setArchiveAutoSelect(1);
+					archiveTreeContract.setArchiveAutoType(archiveAutoType);
+					archiveTreeContract.setArchiveAutoNodeId(nodeIdLong);//最高/单独规则 选择节点的ID
+					baseMapper.updateById(archiveTreeContract);
+					//步骤2保存选择节点下所有子节点的立卷规则。注意立卷规则优先级覆盖原则。(单独组卷>分类并卷>最高并卷)
+					baseMapper.updateAllSonNodeIdsForArchiveAutoRule(archiveTreeContract);
+				}
 			}
-			baseMapper.updateById(archiveTreeContract);
 		}
 
-		//TODO 步骤2保存选择节点下所有子节点的立卷规则。注意立卷规则优先级覆盖原则。(单独组卷>分类并卷>最高并卷)
-		/*
-		* 测试覆盖
-		* */
+
 		return false;
 	}
 
+	/**
+	 * 清理旧的项目归档树
+	 * @param tenantId
+	 * @param projectId
+	 */
+	void clearProjectTree(String tenantId, Long projectId){
+
+	}
+
 }

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

@@ -18,6 +18,7 @@ import org.springblade.manager.vo.ArchiveTreeVO;
 import org.springblade.manager.mapper.ArchiveTreeMapper;
 import org.springblade.manager.service.IArchiveTreeService;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.manager.vo.ArchiveTreeVO2;
 import org.springframework.stereotype.Service;
 
 import java.util.*;
@@ -60,9 +61,30 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
         return ForestNodeMerger.merge(baseMapper.lazyTree(tenantId, parentId));
     }
 
+    @Override
+    public List<ArchiveTreeVO2> lazyTree2(String tenantId, Long parentId) {
+        if (AuthUtil.isAdministrator()) {
+            tenantId = StringPool.EMPTY;
+        }
+        return ForestNodeMerger.merge(baseMapper.lazyTree2(tenantId, parentId));
+    }
+
     @Override
     public List<ArchiveTreeVO> tree(String tenantId, Integer disPlayTree, Integer nodeType) {
-        return ForestNodeMerger.merge(baseMapper.tree(tenantId, disPlayTree, nodeType));
+        List<ArchiveTreeVO> archiveTreeVOList = baseMapper.tree(tenantId, disPlayTree, nodeType);
+//        for (ArchiveTreeVO vo:archiveTreeVOList) {
+//            System.out.println();
+//        }
+        return ForestNodeMerger.merge(archiveTreeVOList);
+    }
+
+    @Override
+    public List<ArchiveTreeVO2> tree2(String tenantId, Integer disPlayTree, Integer nodeType) {
+        List<ArchiveTreeVO2> archiveTreeVOList = baseMapper.tree2(tenantId, disPlayTree, nodeType);
+//        for (ArchiveTreeVO2 vo2:archiveTreeVOList) {
+//            System.out.println();
+//        }
+        return ForestNodeMerger.merge(archiveTreeVOList);
     }
 
     @Override
@@ -166,6 +188,12 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
         return save(archiveTreeDTO);
     }
 
+    @Override
+    public List<ArchiveTree> treeList(String tenantId, Integer disPlayTree, Integer nodeType) {
+        return          baseMapper.selectList(Wrappers.<ArchiveTree>query().lambda()
+                .eq(ArchiveTree::getTenantId, tenantId).eq(ArchiveTree::getIsDeleted,0).orderByAsc(ArchiveTree::getSort));
+    }
+
 
     @Override
     public boolean saveAechiveAutoRule(Integer archiveAutoType, String nodeIds) {

+ 33 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeSupportServiceImpl.java

@@ -0,0 +1,33 @@
+package org.springblade.manager.service.impl;
+
+import lombok.AllArgsConstructor;
+import org.springblade.manager.entity.ArchiveTree;
+import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springblade.manager.entity.WbsTree;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+@AllArgsConstructor
+public class ArchiveTreeSupportServiceImpl {
+
+
+    public List<ArchiveTree> getProcArchiveTree(ArchiveTree rootNode,String displayHierarchy,List<WbsTree> nodes)
+    {
+        List<ArchiveTree> archiveTreeList = new ArrayList<>();
+        for (WbsTree node: nodes) {
+            ArchiveTree archiveTree = new ArchiveTree();
+            archiveTree.setExtType(1);
+            archiveTree.setExtId(node.getId());
+            archiveTree.setAncestors(rootNode.getId().toString());
+            archiveTreeList.add(archiveTree);
+        }
+
+        //设置pid
+
+        return archiveTreeList;
+    }
+
+}

+ 3 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -1047,9 +1047,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
     @Override
     public R getBussPdfInfo(Long pkeyId) throws Exception {
-
-        //String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-        String file_path = "C:\\Users\\泓创开发\\Desktop";//ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        //String file_path = "C:\\Users\\泓创开发\\Desktop";
 
         WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
                 .eq(WbsTreeContract::getPKeyId, pkeyId));
@@ -1331,7 +1330,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
     @Override
     public void getBussPdfs(String nodeId, String classify, String contractId, String projectId) throws Exception {
         String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-        //String file_path = "/Users/hongchuangyanfa/Desktop/";//ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        //String file_path = "/Users/hongchuangyanfa/Desktop/";
         // 获取有权限的节点信息
         List<AppWbsTreeContractVO> wbsTreeContractList = wbsTreeContractService.searchNodeAllTable(nodeId, classify, contractId, projectId);
         List<String> data = new ArrayList<>();

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

@@ -45,8 +45,8 @@ public class SaveUserInfoByProjectServiceImpl extends BaseServiceImpl<SaveUserIn
     }
 
     @Override
-    public List<SaveUserInfoByProjectDTO> selectList(String ids) {
-        return baseMapper.selectList(Wrappers.<SaveUserInfoByProjectDTO>query().lambda().eq(SaveUserInfoByProjectDTO::getProjectId, ids));
+    public Long selectList(String ids) {
+        return baseMapper.selectCount(Wrappers.<SaveUserInfoByProjectDTO>query().lambda().eq(SaveUserInfoByProjectDTO::getProjectId, ids));
     }
 
     @Override

+ 10 - 10
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsFormElementServiceImpl.java

@@ -359,16 +359,16 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean submitBatch(WbsFormElementVO2 wbsFormElementVO2) {
-        if (StringUtils.isEmpty(wbsFormElementVO2.getInitTableName())) {
-            throw new ServiceException("未获取到实体表名称,操作失败");
-        }
-        WbsTree wbsTree = new WbsTree();
-        wbsTree.setInitTableName(wbsFormElementVO2.getInitTableName());
-        Integer integer = baseMapper.showShowTabLike(wbsTree);
-        if (integer != 1) {
-            throw new ServiceException("实体信息表不存在");
-        }
-        WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getProjectId, wbsFormElementVO2.getProjectId()).eq(WbsTreePrivate::getId, wbsFormElementVO2.getId()));
+//        if (StringUtils.isEmpty(wbsFormElementVO2.getInitTableName())) {
+//            throw new ServiceException("未获取到实体表名称,操作失败");
+//        }
+//        WbsTree wbsTree = new WbsTree();
+//        wbsTree.setInitTableName(wbsFormElementVO2.getInitTableName());
+//        Integer integer = baseMapper.showShowTabLike(wbsTree);
+//        if (integer != 1) {
+//            throw new ServiceException("实体信息表不存在");
+//        }
+        WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getProjectId, wbsFormElementVO2.getProjectId()).eq(WbsTreePrivate::getPKeyId, wbsFormElementVO2.getId()));
         if (wbsTreePrivate != null && ObjectUtil.isNotEmpty(wbsTreePrivate.getInitTableId())) {
             //获取当前表所有元素
             List<WbsFormElement> wbsFormElements = baseMapper.selectList(Wrappers.<WbsFormElement>query().lambda()

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

@@ -260,8 +260,8 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     }
 
     @Override
-    public List<WbsTreePrivate> findWbsTreePrivate(String ids) {
-        return baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getProjectId, ids));
+    public Long findWbsTreePrivate(String ids) {
+        return baseMapper.selectCount(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getProjectId, ids));
     }
 
     @Override