Bladeren bron

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

yangyj 2 jaren geleden
bovenliggende
commit
1c361644a2
26 gewijzigde bestanden met toevoegingen van 1017 en 389 verwijderingen
  1. 18 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/ArchiveTreeContractAutoRuleMapDTO.java
  2. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTree.java
  3. 31 4
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTreeContract.java
  4. 26 10
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractAutoRuleVO.java
  5. 8 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO.java
  6. 19 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO2.java
  7. 28 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeVO2.java
  8. 17 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsParamVO.java
  9. 49 16
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  10. 4 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.java
  11. 58 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml
  12. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java
  13. 8 19
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java
  14. 13 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java
  15. 105 9
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  16. 20 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeMapper.xml
  17. 4 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsParamMapper.java
  18. 5 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeContractService.java
  19. 0 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java
  20. 313 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java
  21. 159 120
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java
  22. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeServiceImpl.java
  23. 0 84
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeSupportServiceImpl.java
  24. 28 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsParamServiceImpl.java
  25. 73 77
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  26. 22 36
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

+ 18 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/ArchiveTreeContractAutoRuleMapDTO.java

@@ -0,0 +1,18 @@
+package org.springblade.manager.dto;
+
+import lombok.Data;
+
+@Data
+public class ArchiveTreeContractAutoRuleMapDTO {
+
+    private Integer archiveAutoType;//规则类型
+
+    private Long nodeId;//节点id
+
+    private Long archiveAutoNodeId;//规则关联节点/分类
+
+    private Long archiveAutoGroupId;
+
+    private String selectNodeIds; //分类并卷设置选择的节点(鼠标点着的节点,不要父节点和子节点)
+
+}

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

@@ -151,5 +151,11 @@ public class ArchiveTree extends BaseEntity {
     @ApiModelProperty(value = "是否为设置的节点")
     private Integer archiveAutoSelect;
 
+    /**
+     * 试验资料类型
+     */
+    @ApiModelProperty(value = "试验资料类型,‘使用逗号拼接’")
+    private String expDataType;
+
 
 }

+ 31 - 4
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTreeContract.java

@@ -19,10 +19,12 @@ package org.springblade.manager.entity;
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
 
+import io.swagger.annotations.ApiModelProperty;
 import org.springblade.core.mp.base.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.manager.vo.ArchiveTreeVO;
+import org.springblade.manager.vo.ArchiveTreeVO2;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.BeansException;
 
@@ -129,18 +131,23 @@ public class ArchiveTreeContract extends BaseEntity {
 	private Long extId;
 
 	/**
-	* 自动立卷类型
+	* 自动立卷类型 1最高 2分类并卷 3单独组卷   说明:1规则下可以有2或3;2和3两种规则互斥,2下不能有3,3下不能有2;
 	*/
 	private Integer archiveAutoType;
 	/**
-	* 自动立卷关联Id
+	* 默认组卷设置的最高并卷节点Id  当archiveAutoType不为2,和3时用来限制范围
 	*/
 	private Long archiveAutoNodeId;
 
 	/**
-	 * 是否自动立卷规则选择设置的节点 选中的节点设为1 方便页面显示列表
+	 * 分类并卷的分类ID,当archiveAutoType=2时,用来确定同一类型。新增时随机生成,一同提交设置的节点都是同一类。 编辑时 采用已有的
 	 */
-	private Integer archiveAutoSelect;
+	private Long archiveAutoGroupId;
+
+	/**
+	 * 设置分类并卷选择的节点设为1,其下范围内节点设为0
+	 */
+	private Integer archiveAutoGroupSelect;
 
 	/**
 	 * 来源id,用于后续同步更新
@@ -151,6 +158,11 @@ public class ArchiveTreeContract extends BaseEntity {
 	 */
 	private Long extAttachId;
 
+	/**
+	 * 试验资料类型
+	 */
+	private String expDataType;
+
 
 	public ArchiveTreeContract() {
 	}
@@ -167,4 +179,19 @@ public class ArchiveTreeContract extends BaseEntity {
 			e.printStackTrace();
 		}
 	}
+
+	public ArchiveTreeContract(ArchiveTreeVO2 archiveTree) {
+		if (archiveTree == null) {
+			return;
+		}
+
+		try {
+			BeanUtils.copyProperties(archiveTree,this);
+			this.fromId = archiveTree.getId();
+			this.nodeName = archiveTree.getTitle();
+			this.isUploadFileDisplayConfigurationTree = archiveTree.getIsDisplayTree();
+		} catch (BeansException e) {
+			e.printStackTrace();
+		}
+	}
 }

+ 26 - 10
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractAutoRuleVO.java

@@ -1,27 +1,43 @@
 package org.springblade.manager.vo;
 
 import lombok.Data;
-import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springblade.core.tool.node.INode;
+
+import java.util.ArrayList;
+import java.util.List;
 
 @Data
-public class ArchiveTreeContractAutoRuleVO implements Cloneable {
+public class ArchiveTreeContractAutoRuleVO implements INode<ArchiveTreeContractAutoRuleVO> {
 
     private Long nodeId;//节点id
 
+    private Long parentId; //父节点ID
+
+    private String nodeName; //节点名
+
     private String allName; //全路经名
 
-    private Integer selectVo; //页面勾选标志 0未勾选  1勾选
+    private Integer archiveAutoType; //规则类型
+    private Long archiveAutoNodeId;
+
+    private Long archiveAutoGroupId;
+
+    private Integer archiveAutoGroupSelect;
 
+    private List<ArchiveTreeContractAutoRuleVO> children=new ArrayList<>();
 
     @Override
-    public ArchiveTreeContractAutoRuleVO clone() {
-        try {
-            ArchiveTreeContractAutoRuleVO vo = (ArchiveTreeContractAutoRuleVO) super.clone();
-            return vo;
-        } catch (CloneNotSupportedException e) {
-            throw new AssertionError();
-        }
+    public Long getId() {
+        return nodeId;
     }
 
+    @Override
+    public Long getParentId() {
+        return parentId;
+    }
 
+    @Override
+    public List<ArchiveTreeContractAutoRuleVO> getChildren() {
+        return children;
+    }
 }

+ 8 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO.java

@@ -142,4 +142,12 @@ public class ArchiveTreeContractVO extends ArchiveTreeContract implements INode<
 	@ApiModelProperty(value = "自动立卷关联Id")
 	private Long archiveAutoNodeId;
 
+	public boolean isConstructionRoot(){
+		return (getNodeName()!=null && getNodeName().equals("施工单位归档资料"));
+	}
+
+	public boolean isSupervisionRoot(){
+		return (getNodeName()!=null && getNodeName().equals("监理单位归档资料"));
+	}
+
 }

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

@@ -153,4 +153,23 @@ public class ArchiveTreeContractVO2 implements INode<ArchiveTreeContractVO2> {
 	@ApiModelProperty(value = "自动立卷关联Id")
 	private Long archiveAutoNodeId;
 
+	@ApiModelProperty(value = "祖级列表id")
+	private String ancestors;
+
+	private String expDataType;
+
+	public String toString() {
+		return "TreeNode(parentId=" + this.getParentId()
+				+ ",ancestors" + this.getAncestors()
+				+ ",majorDataType" + this.getMajorDataType()
+				+ ",displayHierarchy" + this.getDisplayHierarchy()
+				+ ",isStorageNode" + this.getIsStorageNode()
+				+ ",isDisplayTree" + this.getIsDisplayTree()
+				+ ",postType" + this.getPostType()
+				+ ", title=" + this.getTitle()
+				+ ", key=" + this.getKey()
+				+ ", value=" + this.getValue()
+				+ ")";
+	}
+
 }

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

@@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springblade.core.tool.node.INode;
+import org.springblade.manager.entity.ArchiveTree;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -97,6 +98,12 @@ public class ArchiveTreeVO2 implements INode<ArchiveTreeVO2> {
      */
     private Integer isDisplayTree;
 
+    /**
+     * 节点类型
+     */
+    @ApiModelProperty(value = "节点类型")
+    private Integer nodeType;
+
     private String postType;
 
     /**
@@ -133,4 +140,25 @@ public class ArchiveTreeVO2 implements INode<ArchiveTreeVO2> {
      */
     @ApiModelProperty(value = "自动立卷关联Id")
     private Long archiveAutoNodeId;
+
+    @ApiModelProperty(value = "是否为设置的节点")
+    private Integer archiveAutoSelect;
+
+    /**
+     * 是否为接口节点 '0'否 '1'是
+     */
+    @ApiModelProperty(value = "是否为接口节点 '0'否 '1'是")
+    private Integer isInterfaceNode;
+
+    /**
+     * 接口类型
+     */
+    @ApiModelProperty(value = "接口类型")
+    private Integer interfaceType;
+
+    @ApiModelProperty(value = "排序")
+    private Integer sort;
+
+    private String expDataType;
+
 }

+ 17 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsParamVO.java

@@ -0,0 +1,17 @@
+package org.springblade.manager.vo;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.manager.entity.WbsParam;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class WbsParamVO extends WbsParam {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 数据源节点参数的id
+     */
+    private  Long oldId;
+
+}

+ 49 - 16
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -3,6 +3,7 @@ package org.springblade.business.controller;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
@@ -21,9 +22,7 @@ import org.springblade.business.feign.MessageWarningClient;
 import org.springblade.business.feign.OperationLogClient;
 import org.springblade.business.feign.RecycleBinClient;
 import org.springblade.business.feign.TaskClient;
-import org.springblade.business.service.IConstructionLedgerService;
-import org.springblade.business.service.IInformationQueryFileService;
-import org.springblade.business.service.ITaskService;
+import org.springblade.business.service.*;
 import org.springblade.business.socket.WebSocket;
 import org.springblade.business.utils.FileUtils;
 import org.springblade.business.vo.*;
@@ -53,7 +52,6 @@ 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.business.service.IInformationQueryService;
 import org.springblade.core.boot.ctrl.BladeController;
 
 import java.io.IOException;
@@ -108,6 +106,8 @@ public class InformationWriteQueryController extends BladeController {
 
     private final TableFileClient tableFileClient;
 
+    private final ITreeContractFirstService treeContractFirstService;
+
     /**
      * 获取文件题名
      */
@@ -535,6 +535,23 @@ public class InformationWriteQueryController extends BladeController {
         return R.data(300, false, "废除失败,未找到业务数据");
     }
 
+    /**
+     * 单个废除-首件
+     */
+    @PostMapping("/abolishOne-sj")
+    @ApiOperationSupport(order = 24)
+    @ApiOperation(value = "单个废除-首件")
+    public R<Boolean> abolishOneSJ(@RequestParam String primaryKeyId,@RequestParam String id) {
+        //查询填报状态
+        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery()
+                .eq(InformationQuery::getId, id));
+        if (businessData != null) {
+            //使用批量废除接口
+            return this.batchAbolish(businessData.getId().toString(), primaryKeyId);
+        }
+        return R.data(300, false, "废除失败,未找到业务数据");
+    }
+
     /**
      * 查询节点状态
      */
@@ -1880,7 +1897,7 @@ public class InformationWriteQueryController extends BladeController {
         if (saveList.size() > 0) {
             //保存施工日志
             if (saveLedger.size() > 0) {
-                this.constructionLedgerService.saveBatch(saveLedger);
+                this.constructionLedgerService.saveBatch(saveLedger,1000);
             }
 
             try {
@@ -2094,28 +2111,44 @@ public class InformationWriteQueryController extends BladeController {
             //这一步主要是为了兼容监理合同段
             node = this.wbsTreeContractClient.getContractWbsTreeByContractIdAndId(vo.getWbsId(), Long.parseLong(vo.getContractIdRelation()));
         }
-
+        List<QueryProcessDataVO> queryDataResult = new ArrayList<>();
         if (!new Integer("6").equals(node.getNodeType()) && !Arrays.asList("1,2,3,4".split(",")).contains(node.getMajorDataType().toString())) {
             //不是工序,则查询当前节点下的所有填报节点
             if (node.getParentId() == 0) {
                 String contractId = node.getContractId();
                 List<WbsTreeContract> treeS = wbsTreeContractClient.getContractWbsTreeByParentId(node.getId().toString(), contractId);
                 for (WbsTreeContract tree : treeS) {
-                    List<QueryProcessDataVO> queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractId(tree.getId().toString(), contract.getContractType(), StringUtils.isNotEmpty(vo.getContractIdRelation()) ? vo.getContractIdRelation() : vo.getContractId().toString());
-                    if (queryDataResult != null && queryDataResult.size() > 0) {
-                        submitNodeKeyIds.addAll(queryDataResult.stream().map(QueryProcessDataVO::getPrimaryKeyId).distinct().collect(Collectors.toList()));
-                        queryDataResult.clear();
+                    List<QueryProcessDataVO> Result = this.informationQueryService.queryProcessDataByParentIdAndContractIdTwo(tree.getId().toString(), contract.getContractType(), StringUtils.isNotEmpty(vo.getContractIdRelation()) ? vo.getContractIdRelation() : vo.getContractId().toString());
+                    if (Result != null && Result.size() > 0) {
+                        queryDataResult.addAll(Result);
+                        Result.clear();
                     }
                 }
             } else {
-                List<QueryProcessDataVO> queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractId(node.getId().toString(), contract.getContractType(), StringUtils.isNotEmpty(vo.getContractIdRelation()) ? vo.getContractIdRelation() : vo.getContractId().toString());
-                if (StringUtils.isNotEmpty(vo.getIsFirst())) {
-                    //如果是首件列表请求,则删掉没有标记为首件的数据
-                    queryDataResult.removeIf(data -> StringUtils.isEmpty(data.getFirstId()));
+                List<QueryProcessDataVO> Result = this.informationQueryService.queryProcessDataByParentIdAndContractIdTwo(node.getId().toString(), contract.getContractType(), StringUtils.isNotEmpty(vo.getContractIdRelation()) ? vo.getContractIdRelation() : vo.getContractId().toString());
+                if (Result != null && Result.size() > 0) {
+                    queryDataResult.addAll(Result);
+                    Result.clear();
                 }
-                if (queryDataResult != null && queryDataResult.size() > 0) {
-                    submitNodeKeyIds.addAll(queryDataResult.stream().map(QueryProcessDataVO::getPrimaryKeyId).distinct().collect(Collectors.toList()));
+            }
+            //如果是首件列表请求,则删掉没有标记为首件的数据
+            if (queryDataResult != null && queryDataResult.size() > 0) {
+                if (StringUtils.isNotEmpty(vo.getIsFirst())) {
+                    List<String> treeIds = queryDataResult.stream().map(QueryProcessDataVO::getPrimaryKeyId).distinct().collect(Collectors.toList());
+                    //通过合同段主键在首件关联表中查询出所有数据
+                    List<TreeContractFirst> firstList = treeContractFirstService.list(new LambdaQueryWrapper<TreeContractFirst>().in(TreeContractFirst::getWbsNodeId, treeIds));
+                    List<String> list = firstList.stream().map(fl -> (fl.getWbsNodeId()+"")).collect(Collectors.toList());
+                    queryDataResult = queryDataResult.stream().filter(qdr->list.contains(qdr.getPrimaryKeyId())).collect(Collectors.toList());
+//                    for (QueryProcessDataVO queryProcessDataVO : queryDataResult) {
+//                        TreeContractFirst first = treeContractFirstService.getOne(new LambdaQueryWrapper<TreeContractFirst>()
+//                                .eq(TreeContractFirst::getWbsNodeId, queryProcessDataVO.getPrimaryKeyId()));
+//                        if (first != null){
+//                            queryProcessDataVO.setFirstId(first.getId()+"");
+//                        }
+//                    }
+//                    queryDataResult.removeIf(data -> StringUtils.isEmpty(data.getFirstId()));
                 }
+                submitNodeKeyIds.addAll(queryDataResult.stream().map(QueryProcessDataVO::getPrimaryKeyId).distinct().collect(Collectors.toList()));
             }
         }
         //设置进集合中

+ 4 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.java

@@ -82,6 +82,10 @@ public interface InformationQueryMapper extends BaseMapper<InformationQuery> {
 	 * 自定义分页
 	 */
 	List<InformationQuery> selectInformationQueryPage(@Param("current") Long current, @Param("size") Long size, @Param("query") InformationQueryVO informationQuery);
+	/**
+	 * 自定义分页,因为information的批次字段数据不全
+	 */
+	List<InformationQuery> selectInformationQueryPageTwo(@Param("current") Long current, @Param("size") Long size, @Param("query") InformationQueryVO informationQuery);
 
 	List<WbsTreeContract> getContractNodeByPrimaryKeyIds(String ids);
 

+ 58 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml

@@ -441,6 +441,64 @@
         limit #{current}, #{size}
     </select>
 
+    <select id="selectInformationQueryPageTwo" resultMap="informationQueryResultMap">
+        select
+        query.wbs_id,
+        query.id,
+        query.name,
+        query.number,
+        query.create_time,
+        query.status,
+        query.report_number,
+        query.file_user_id_and_name,
+        query.pdf_url,
+        query.e_visa_pdf_url,
+        query.sj_record_ids
+        from
+        (
+        select
+        iq.sort,
+        iq.id,
+        iq.name,
+        iq.number,
+        iq.create_time,
+        iq.status,
+        (case iq.STATUS when 0 THEN null else t.batch end) as report_number,
+        iq.file_user_id_and_name,
+        date_format(iq.create_time,'%Y-%m-%d') as createTimes,
+        iq.pdf_url,
+        iq.e_visa_pdf_url,
+        iq.wbs_id,
+        iq.sj_record_ids
+        from u_information_query iq left join (select  * from u_task k where k.status!=3 and k.contract_id = #{query.contractId}) t on iq.id = t.form_data_id  and t.is_deleted = 0
+        where
+        iq.is_deleted = 0
+        and iq.classify = #{query.classify}
+        and iq.contract_id = #{query.contractId}
+        <if test="query.taskStatus != null and query.taskStatus != ''"> and iq.status = #{query.taskStatus} </if>
+        <if test="query.sourceType != null and query.sourceType != ''"> and iq.source_type = #{query.sourceType} </if>
+        <if test="query.reportNumber != null and query.reportNumber != ''"> and t.batch = #{query.reportNumber} </if>
+        <if test="query.fileUserIdAndName != null and query.fileUserIdAndName != ''"> and iq.file_user_id_and_name like concat('%',#{query.fileUserIdAndName},'%') </if>
+        <if test="query.queryValue != null and query.queryValue != ''"> and (iq.name like concat('%',#{query.queryValue},'%') OR iq.number like concat('%',#{query.queryValue},'%')) </if>
+        <if test="query.firstTitle != null and query.firstTitle != ''"> and iq.type = 3 </if>
+        <if test="query.firstTitle == null or query.firstTitle == ''"> and iq.type != 3 </if>
+        <if test="query.wbsIds != null">
+            and iq.wbs_id in
+            <foreach collection="query.wbsIds" item="wbsIdc" open="(" separator="," close=")">
+                #{wbsIdc}
+            </foreach>
+        </if>
+        ) AS query
+        where
+        1 = 1
+        <if test="query.reportNumber != null and query.reportNumber != ''"> and report_number = #{query.reportNumber} </if>
+        <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
+            and query.createTimes between #{query.startTime} and #{query.endTime}
+        </if>
+        order by create_time desc
+        limit #{current}, #{size}
+    </select>
+
     <select id="getContractNodeByPrimaryKeyIds" resultType="org.springblade.manager.entity.WbsTreeContract">
         select * from m_wbs_tree_contract where p_key_id in (${ids}) and is_deleted = 0 order by ancestors,sort
     </select>

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

@@ -463,7 +463,7 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
         Integer count = this.baseMapper.countInformationQuery(vo);
 
         //获取数据
-        List<InformationQuery> result = this.baseMapper.selectInformationQueryPage(current, page.getSize(), vo);
+        List<InformationQuery> result = this.baseMapper.selectInformationQueryPageTwo(current, page.getSize(), vo);
 
         //转换VO
         if (result != null && result.size() != 0) {

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

@@ -29,6 +29,7 @@ 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.dto.ArchiveTreeContractAutoRuleMapDTO;
 import org.springblade.manager.entity.ArchiveTree;
 import org.springblade.manager.service.IArchiveTreeService;
 import org.springblade.manager.vo.ArchiveTreeContractAutoRuleVO;
@@ -154,6 +155,7 @@ public class ArchiveTreeContractController extends BladeController {
 		if (projectId == null) {
 			projectId = 1578599210897772545L;
 		}
+
 		List<ArchiveTreeContractVO2> tree = archiveTreeContractService.lazyTree2(AuthUtil.getTenantId(), parentId,projectId);
 		if (tree != null && tree.size() > 0) {
 			return R.data(tree);
@@ -177,6 +179,7 @@ public class ArchiveTreeContractController extends BladeController {
 		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);
@@ -192,18 +195,7 @@ public class ArchiveTreeContractController extends BladeController {
 		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);
-		}
+		archiveTreeContractService.initTree2(AuthUtil.getTenantId(),projectId);
 
 		return R.fail(200, "初始化成功");
 	}
@@ -226,9 +218,9 @@ public class ArchiveTreeContractController extends BladeController {
 	 */
 	@PostMapping("/getArchiveAutoRule")
 	@ApiOperationSupport(order = 9)
-	@ApiOperation(value = "修改立卷规则设置", notes = "传入节点id")
+	@ApiOperation(value = "查看立卷规则设置", notes = "传入节点id")
 	public R getArchiveAutoRule(@ApiParam(value = "主键", required = true) @RequestParam Long id) {
-		Map<Integer, List<ArchiveTreeContractAutoRuleVO>> ruleMap=archiveTreeContractService.getArchiveAutoRule(id);
+		Map<String, Object> ruleMap=archiveTreeContractService.getArchiveAutoRule(id);
 		return R.data(ruleMap);
 	}
 
@@ -236,11 +228,8 @@ public class ArchiveTreeContractController extends BladeController {
 	 * 修改立卷规则设置
 	 */
 	@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));
+	public R updateArchiveAutoRule(ArchiveTreeContractAutoRuleMapDTO dto) {
+		return R.status(archiveTreeContractService.updateArchiveAutoRule(dto));
 	}
 
 

+ 13 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java

@@ -19,6 +19,7 @@ package org.springblade.manager.mapper;
 
 import org.apache.ibatis.annotations.Param;
 import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springblade.manager.vo.ArchiveTreeContractAutoRuleVO;
 import org.springblade.manager.vo.ArchiveTreeContractVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -58,9 +59,19 @@ public interface ArchiveTreeContractMapper extends BaseMapper<ArchiveTreeContrac
 	int updateAllSonNodeIdsForArchiveAutoRule(@Param("treeContract") ArchiveTreeContract treeContract);
 
 	/**
-	 * 获取节点下所有设置规则节点
+	 * 删除立卷规则设置
 	 * @param treeContract
 	 * @return
 	 */
-	List<ArchiveTreeContract> getAllSonNodeIdsForArchiveAutoRuleSelected(@Param("treeContract")ArchiveTreeContract treeContract);
+	int removeAllSonNodeIdsForArchiveAutoRule_1(@Param("treeContract") ArchiveTreeContract treeContract);
+	int removeAllSonNodeIdsForArchiveAutoRule_2(@Param("treeContract") ArchiveTreeContract treeContract);
+	int removeAllSonNodeIdsForArchiveAutoRule_3(@Param("treeContract") ArchiveTreeContract treeContract);
+	int removeNodeForArchiveAutoRule_Group(@Param("archiveAutoGroupId") Long archiveAutoGroupId);
+	/**
+	 * 查看分类并卷规则-获取大类所有节点
+	 * @param ancestors
+	 * @param groupId
+	 * @return
+	 */
+	List<ArchiveTreeContractAutoRuleVO> getAllSonNodeforGroupView(@Param("ancestors")String ancestors, @Param("groupId")Long groupId);
 }

+ 105 - 9
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml

@@ -34,9 +34,11 @@
         <result column="storage_type" property="storageType"/>
         <result column="ext_type" property="extType"/>
         <result column="ext_id" property="extId"/>
+        <result column="exp_data_type" property="expDataType"/>
         <result column="archive_auto_type" property="archiveAutoType"/>
         <result column="archive_auto_node_id" property="archiveAutoNodeId"/>
-        <result column="archive_auto_select" property="archiveAutoSelect"/>
+        <result column="archive_auto_group_select" property="archiveAutoGroupSelect"/>
+        <result column="archive_auto_group_id" property="archiveAutoGroupId"/>
     </resultMap>
 
 
@@ -86,10 +88,21 @@
         <result column="storage_type" property="storageType"/>
         <result column="ext_type" property="extType"/>
         <result column="ext_id" property="extId"/>
+        <result column="exp_data_type" property="expDataType"/>
         <result column="archive_auto_type" property="archiveAutoType"/>
         <result column="archive_auto_node_id" property="archiveAutoNodeId"/>
     </resultMap>
 
+    <resultMap id="getAllSonNodeforGroupViewResultMap" type="org.springblade.manager.vo.ArchiveTreeContractAutoRuleVO">
+        <id column="id" property="nodeId"/>
+        <result column="parent_id" property="parentId"/>
+        <result column="node_name" property="nodeName"/>
+        <result column="archive_auto_type" property="archiveAutoType"/>
+        <result column="archive_auto_node_id" property="archiveAutoNodeId"/>
+        <result column="archive_auto_group_id" property="archiveAutoGroupId"/>
+        <result column="archive_auto_group_select" property="archiveAutoGroupSelect"/>
+    </resultMap>
+
     <select id="lazyTree" resultMap="treeNodeResultMap">
         SELECT
         d.id,
@@ -119,7 +132,6 @@
         ORDER BY d.sort
     </select>
 
-
     <select id="tree" resultMap="treeNodeResultMap">
         SELECT
         id,
@@ -166,10 +178,12 @@
         d.display_hierarchy AS "displayHierarchy",
         d.is_storage_node AS "isStorageNode",
         d.post_type AS postType,
+        d.node_type AS nodeType,
         d.project_type,
         d.storage_type,
         d.ext_type,
         d.ext_id,
+        d.exp_data_type,
         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})
@@ -184,7 +198,6 @@
         ORDER BY d.sort
     </select>
 
-
     <select id="tree2" resultMap="ArchiveTreeContractVO2ResultMap">
         SELECT
         id,
@@ -198,10 +211,12 @@
         is_upload_file_display_configuration_tree AS "isDisplayTree",
         is_built_drawing AS "isBuiltDrawing",
         post_type AS postType,
+        node_type AS nodeType,
         project_type,
         storage_type,
         ext_type,
         ext_id,
+        exp_data_type,
         archive_auto_type,
         archive_auto_node_id
         FROM m_archive_tree_contract
@@ -216,14 +231,27 @@
             /*根节点=0 关联电子原生文件=1 数字化上传文件=2*/
             AND node_type in (0,#{nodeType})
         </if>
-        OR parent_id = 0
+        OR ( parent_id = 0 AND project_id = #{projectId} )
         ORDER BY sort
     </select>
+
     <update id="updateAllSonNodeIdsForArchiveAutoRule">
+
+        <if test="treeContract.archiveAutoType ==1 ">
+            update m_archive_tree_contract
+            set
+            archive_auto_node_id = #{treeContract.archiveAutoNodeId}
+            where
+            is_deleted = 0 and ancestors like concat('', #{treeContract.ancestors}, '%');
+        </if>
+
         update m_archive_tree_contract
         set
             archive_auto_type= #{treeContract.archiveAutoType},
-            archive_auto_node_id = #{treeContract.archive_auto_node_id}
+            <if test="treeContract.archiveAutoType ==2 ">
+                archive_auto_group_id=#{treeContract.archiveAutoGroupId},
+                archive_auto_group_select=0
+            </if>
         where
             is_deleted = 0 and ancestors like concat('', #{treeContract.ancestors}, '%')
             /*最高并卷规则不能覆盖 分类并卷规则,单独组卷规则*/
@@ -236,11 +264,79 @@
             </if>
     </update>
 
-    <select id="getAllSonNodeIdsForArchiveAutoRuleSelected" resultMap="archiveTreeContractResultMap">
-        select * from m_archive_tree_contract
-        where is_deleted = 0
+    <update id="removeAllSonNodeIdsForArchiveAutoRule_1">
+        update m_archive_tree_contract
+        set
+        archive_auto_node_id = NULL
+        where
+        is_deleted = 0
+        and ancestors like concat('', #{treeContract.ancestors}, '%');
+
+
+        update m_archive_tree_contract
+        set
+            archive_auto_type = NULL
+        where
+        is_deleted = 0
         and ancestors like concat('', #{treeContract.ancestors}, '%')
-        and archive_auto_select=1
+        /*取消规则 只取消规则与自己一致的*/
+        and archive_auto_type = #{treeContract.archiveAutoType} ;
+    </update>
+
+    <update id="removeAllSonNodeIdsForArchiveAutoRule_3">
+        update m_archive_tree_contract
+        set
+            /*取消规则 恢复默认规则 不需要设置为null,如果最高并卷节点取消规则,archive_auto_node_id会为空,相当于无规则不会进到自动组卷流程*/
+            archive_auto_type = 1
+        where
+        is_deleted = 0
+        and ancestors like concat('', #{treeContract.ancestors}, '%')
+        /*取消规则 只取消规则与自己一致的*/
+        and archive_auto_type = #{treeContract.archiveAutoType}
+    </update>
+    <update id="removeAllSonNodeIdsForArchiveAutoRule_2">
+        /*取消单个节点的分类并卷规则*/
+        update m_archive_tree_contract
+        set
+            /*取消规则 恢复默认规则 不需要设置为null,如果最高并卷节点取消规则,archive_auto_node_id会为空,相当于无规则不会进到自动组卷流程*/
+            archive_auto_type = 1 ,
+            archive_auto_group_id = NULL,
+            archive_auto_group_select =NULL
+        where
+          is_deleted = 0
+          and ancestors like concat('', #{treeContract.ancestors}, '%')
+            /*取消规则 只取消规则与自己一致的*/
+          and archive_auto_type = #{treeContract.archiveAutoType}
+    </update>
+
+    <update id="removeNodeForArchiveAutoRule_Group">
+        /**取消同一组的分类并卷规则*/
+        update m_archive_tree_contract
+        set
+            archive_auto_type = 1 ,
+            archive_auto_group_id = NULL,
+            archive_auto_group_select =NULL
+        where
+            is_deleted = 0
+            and archive_auto_group_id = #{archiveAutoGroupId}
+    </update>
+
+    <select id="getAllSonNodeforGroupView" resultMap="getAllSonNodeforGroupViewResultMap">
+        SELECT
+            id,
+            parent_id,
+            node_name,
+            archive_auto_type,
+            archive_auto_node_id,
+            archive_auto_group_id,
+            archive_auto_group_select
+        FROM m_archive_tree_contract
+        where is_deleted = 0
+          and ancestors like concat('', #{ancestors}, '%')
+          and archive_auto_type !=3
+          and id not in (
+                select id from m_archive_tree_contract where archive_auto_type=2 and archive_auto_group_id != #{groupId}
+          )
         order by ancestors asc,sort asc
     </select>
 

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

@@ -31,6 +31,7 @@
         <result column="storage_type" property="storageType"/>
         <result column="ext_type" property="extType"/>
         <result column="ext_id" property="extId"/>
+        <result column="exp_data_type" property="expDataType"/>
         <result column="archive_auto_type" property="archiveAutoType"/>
         <result column="archive_auto_node_id" property="archiveAutoNodeId"/>
         <result column="archive_auto_select" property="archiveAutoSelect"/>
@@ -51,6 +52,7 @@
         <result column="isStorageNode" property="isStorageNode"/>
         <result column="isBuiltDrawing" property="isBuiltDrawing"/>
         <result column="association_type" property="associationType"/>
+        <result column="exp_data_type" property="expDataType"/>
         <result column="postType" property="postType"/>
         <result column="project_type" property="projectType"/>
         <result column="storage_type" property="storageType"/>
@@ -58,6 +60,10 @@
         <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"/>
+        <result column="is_interface_node" property="isInterfaceNode"/>
+        <result column="interface_type" property="interfaceType"/>
+        <result column="sort" property="sort"/>
     </resultMap>
 
     <resultMap id="treeNodeResultMap" type="org.springblade.manager.vo.TreeNodeVO2">
@@ -159,7 +165,7 @@
         ext_type,
         ext_id,
         archive_auto_type,
-        archive_auto_node_id
+        archive_auto_node_id,
         FROM m_archive_tree
         WHERE is_deleted = 0
         <if test=" tenantId!=null and tenantId!='' ">
@@ -187,12 +193,18 @@
         d.display_hierarchy AS "displayHierarchy",
         d.is_storage_node AS "isStorageNode",
         d.post_type AS postType,
+        d.node_type AS nodeType,
         d.project_type,
         d.storage_type,
         d.ext_type,
         d.ext_id,
+        d.exp_data_type,
         d.archive_auto_type,
         d.archive_auto_node_id,
+        d.archive_auto_select,
+        d.is_interface_node,
+        d.interface_type,
+        d.sort,
         (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
@@ -218,12 +230,18 @@
         is_upload_file_display_configuration_tree AS "isDisplayTree",
         is_built_drawing AS "isBuiltDrawing",
         post_type AS postType,
+        node_type AS nodeType,
         project_type,
         storage_type,
         ext_type,
         ext_id,
+        exp_data_type,
         archive_auto_type,
-        archive_auto_node_id
+        archive_auto_node_id,
+        archive_auto_select,
+        is_interface_node,
+        interface_type,
+        sort
         FROM m_archive_tree
         WHERE is_deleted = 0
         <if test=" tenantId!=null and tenantId!='' ">

+ 4 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsParamMapper.java

@@ -1,7 +1,9 @@
 package org.springblade.manager.mapper;
 
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.springblade.manager.entity.WbsParam;
+import org.springblade.manager.injector.EasyBaseMapper;
+
+public interface WbsParamMapper extends EasyBaseMapper<WbsParam> {
 
-public interface WbsParamMapper extends BaseMapper<WbsParam> {
 }
+

+ 5 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeContractService.java

@@ -17,6 +17,7 @@
 package org.springblade.manager.service;
 
 import feign.Param;
+import org.springblade.manager.dto.ArchiveTreeContractAutoRuleMapDTO;
 import org.springblade.manager.entity.ArchiveTree;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.manager.vo.ArchiveTreeContractAutoRuleVO;
@@ -56,6 +57,8 @@ public interface IArchiveTreeContractService extends BaseService<ArchiveTreeCont
 	 */
 	boolean initTree(String tenantId, Long projectId, List<ArchiveTree> trees);
 
+	boolean initTree2(String tenantId, Long projectId);
+
 	List<ArchiveTreeContractVO> lazyTree(String tenantId, Long parentId,Long projectId);
 
 	List<ArchiveTreeContractVO> tree(String tenantI,Integer disPlayTree,Integer nodeType,Long projectId);
@@ -72,13 +75,13 @@ public interface IArchiveTreeContractService extends BaseService<ArchiveTreeCont
 
 
 
-	Map<Integer, List<ArchiveTreeContractAutoRuleVO>> getArchiveAutoRule(Long id);
+	Map<String,Object> getArchiveAutoRule(Long id);
 
 	/**
 	 *项目级立卷规则更新
 	 * @return
 	 */
-	boolean updateArchiveAutoRule(Integer archiveAutoType,String nodeIds);
+	boolean updateArchiveAutoRule(ArchiveTreeContractAutoRuleMapDTO dto);
 
 
 }

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

@@ -72,5 +72,4 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
     List<WbsTreePrivate> searchNodeAllTable(String primaryKeyId, String type, String tableType, String contractId, String projectId, Integer isAdd, Long id);
 
     Object getExcelHtml(String primaryKeyId) throws IOException;
-
 }

+ 313 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java

@@ -0,0 +1,313 @@
+package org.springblade.manager.service.impl;
+
+import com.mixsmart.utils.StringUtils;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.entity.ArchiveTree;
+import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.entity.WbsTree;
+import org.springblade.manager.feign.ProjectClient;
+import org.springblade.manager.service.IContractInfoService;
+import org.springblade.manager.service.IWbsTreeService;
+import org.springblade.manager.utils.ForestNodeMerger;
+import org.springblade.manager.vo.*;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+@Service
+@AllArgsConstructor
+public class ArTreeContractInitServiceImpl {
+    private final IWbsTreeService wbsTreeService;
+
+    private final IContractInfoService contractInfoService;
+
+    private final ProjectClient projectClient;
+
+    /**
+     * 按照层次获取公共归档树
+     * @param parentId
+     * @param wbsId
+     * @param tenantId
+     * @param type
+     * @param level 层次,1,单位工程,2
+     * @return
+     */
+    public List<ArchiveTree> getWbsArchiveTree(Long parentId, String wbsId, String tenantId, String type,Long level)
+    {
+        List<ArchiveTree> archiveTreeList = new ArrayList<>();
+
+        List<WbsTreeVO2> wbsTreeVO2s = wbsTreeService.tree(wbsId, tenantId, type);
+
+        //遍历构建
+        for (WbsTreeVO2 wbsTreeVO2:wbsTreeVO2s) {
+            //只展示指定层级之上的
+            if (wbsTreeVO2.getNodeType() > level){
+                continue;
+            }
+
+            ArchiveTree archiveTree = new ArchiveTree();
+            archiveTree.setId(SnowFlakeUtil.getId());
+            archiveTree.setParentId(parentId);
+            archiveTree.setNodeName(wbsTreeVO2.getTitle());
+            archiveTree.setExtId(wbsTreeVO2.getId());
+            archiveTree.setDisplayHierarchy(level.toString());
+            archiveTreeList.add(archiveTree);
+        }
+
+        //设置pid
+
+        return archiveTreeList;
+    }
+
+    /**
+     *
+     * @param tenantId
+     * @param projectId
+     * @param projectName
+     * @param tree
+     * @param archiveTreeContracts
+     * @param contracts
+     */
+    public void copyTree(String tenantId, Long projectId, String projectName, ArchiveTreeVO2 tree, List<ArchiveTreeContract> archiveTreeContracts,
+                                              List<ContractInfo> contracts){
+
+        //合同段信息表
+        Map<Long,ContractInfo> contractMap = new LinkedHashMap<>();
+        //新旧ID对照表
+        Map<Long,Long> oldNewMap = new LinkedHashMap<>();
+
+        boolean bHasCon = false;
+        boolean bHasSup = false;
+        for (ContractInfo contractInfo: contracts) {
+            contractMap.put(contractInfo.getId(),contractInfo);
+            if (contractInfo.getContractType() == 1) {
+                bHasCon = true;
+            }
+            if (contractInfo.getContractType() == 2) {
+                bHasSup = true;
+            }
+        }
+
+        ArchiveTreeContract archiveTreeContract = new ArchiveTreeContract(tree);
+        archiveTreeContract.setNodeName(projectName);
+        archiveTreeContract.setProjectId(projectId);
+        archiveTreeContract.setId(SnowFlakeUtil.getId());
+        archiveTreeContract.setParentId(0L);
+        oldNewMap.put(tree.getId(),archiveTreeContract.getId());
+        archiveTreeContracts.add(archiveTreeContract);
+
+        //拷贝第一层
+        copyChild(tenantId,projectId,null,archiveTreeContract.getId(),tree.getChildren(),archiveTreeContracts,oldNewMap);
+
+        //拷贝
+        for (ArchiveTreeVO2 child: tree.getChildren()) {
+            if (child.getTitle().indexOf("施工") >= 0 && bHasCon) {
+                for (ContractInfo contractInfo:contracts) {
+                    if (contractInfo.getContractType() == 1) {
+                        copyContractTree(tenantId,projectId,contractInfo,oldNewMap.get(child.getId()),child.getChildren(),archiveTreeContracts,oldNewMap);
+                    }
+                }
+
+            }
+            else if (child.getTitle().indexOf("监理") >= 0  && bHasSup) {
+                for (ContractInfo contractInfo:contracts) {
+                    if (contractInfo.getContractType() == 2) {
+                        copyContractTree(tenantId,projectId,contractInfo,oldNewMap.get(child.getId()),child.getChildren(),archiveTreeContracts,oldNewMap);
+                    }
+                }
+            }else {
+                copyNormalTree(tenantId,projectId,null,oldNewMap.get(child.getId()),child.getChildren(),archiveTreeContracts,oldNewMap);
+            }
+        }
+
+        //设置祖先id
+        InitAncestors(archiveTreeContracts);
+
+        return;
+
+    }
+
+    /**
+     *
+     * @param tenantId
+     * @param projectId
+     * @param contractInfo
+     * @param newRootId
+     * @param child
+     * @param archiveTreeContracts
+     * @param oldNewMap
+     */
+    public void copyContractTree(String tenantId, Long projectId, ContractInfo contractInfo ,Long newRootId,
+                          List<ArchiveTreeVO2> child,List<ArchiveTreeContract> archiveTreeContracts,Map<Long,Long> oldNewMap){
+        ArchiveTreeContract contractNode = new ArchiveTreeContract();
+        contractNode.setNodeName(contractInfo.getContractName());
+        contractNode.setId(SnowFlakeUtil.getId());
+        //TODO
+        contractNode.setExtType(2);
+        contractNode.setNodeType(0);
+        contractNode.setIsUploadFileDisplayConfigurationTree(1);
+        contractNode.setParentId(newRootId);
+        contractNode.setProjectId(projectId);
+        contractNode.setContractId(contractInfo.getId());
+        contractNode.setIsDeleted(0);
+        archiveTreeContracts.add(contractNode);
+
+        if (child == null || child.size() == 0) {
+            return;
+        }
+
+        List<ArchiveTreeVO2> childList = new ArrayList<>();
+        for (ArchiveTreeVO2 archiveTreeVO2:child) {
+            List<ArchiveTreeVO2> tmpList = new ArrayList<>();
+            ForestNodeMerger.getTreeList(archiveTreeVO2,tmpList);
+            childList.addAll(tmpList);
+        }
+
+        copyChild(tenantId,projectId,contractInfo.getId(),contractNode.getId(),childList,archiveTreeContracts,null);
+    }
+
+    /**
+     *
+     * @param tenantId
+     * @param projectId
+     * @param contractId
+     * @param newRootId
+     * @param child
+     * @param archiveTreeContracts
+     * @param oldNewMap
+     */
+    public void copyNormalTree(String tenantId, Long projectId, Long contractId, Long newRootId, List<ArchiveTreeVO2> child,
+                          List<ArchiveTreeContract> archiveTreeContracts, Map<Long,Long> oldNewMap){
+
+        List<ArchiveTreeVO2> childList = new ArrayList<>();
+        for (ArchiveTreeVO2 archiveTreeVO2:child) {
+            List<ArchiveTreeVO2> tmpList = new ArrayList<>();
+            ForestNodeMerger.getTreeList(archiveTreeVO2,tmpList);
+            childList.addAll(tmpList);
+        }
+        //newRootId = oldNewMap.get(newRootId);
+        copyChild(tenantId,projectId,contractId,newRootId,childList,archiveTreeContracts,oldNewMap);
+
+    }
+
+
+    /**
+     *
+     * @param tenantId
+     * @param projectId
+     * @param contractId
+     * @param newRootId
+     * @param child
+     * @param archiveTreeContracts
+     * @param oldNewMap
+     */
+    public void copyChild(String tenantId, Long projectId, Long contractId, Long newRootId, List<ArchiveTreeVO2> child,
+                          List<ArchiveTreeContract> archiveTreeContracts, Map<Long,Long> oldNewMap){
+
+        if (oldNewMap == null ) {
+            oldNewMap = new LinkedHashMap<>();
+        }
+        if (child == null ) {
+            return;
+        }
+        for (ArchiveTreeVO2 archiveTree :child) {
+            oldNewMap.put(archiveTree.getId(), SnowFlakeUtil.getId());
+        }
+
+        for (ArchiveTreeVO2 archiveTreeVO :child) {
+
+            ArchiveTreeContract archiveTreeContract = new ArchiveTreeContract(archiveTreeVO);
+            archiveTreeContract.setId(oldNewMap.get(archiveTreeVO.getId()));
+            Long pid = oldNewMap.get(archiveTreeVO.getParentId());
+            if (pid == null ) {
+                pid = newRootId;
+            }
+            archiveTreeContract.setParentId(pid);
+            archiveTreeContract.setCreateUser(AuthUtil.getUserId());
+            archiveTreeContract.setProjectId(projectId);
+
+            if (contractId != null ) {
+                archiveTreeContract.setContractId(contractId);
+            }
+
+            archiveTreeContracts.add(archiveTreeContract);
+        }
+
+    }
+
+    /**
+     *
+     * @param archiveTreeContracts
+     */
+    public void InitAncestors(List<ArchiveTreeContract> archiveTreeContracts) {
+        List<ArchiveTreeContractVO2> archiveTreeContractVO2List = new ArrayList<>();
+        Map<Long,ArchiveTreeContractVO2> vo2Map = new LinkedHashMap<>();
+        for (ArchiveTreeContract archiveTreeContract:archiveTreeContracts) {
+            ArchiveTreeContractVO2 treeContractVO2 = new ArchiveTreeContractVO2();
+            treeContractVO2.setId(archiveTreeContract.getId());
+            treeContractVO2.setParentId(archiveTreeContract.getParentId());
+            treeContractVO2.setTitle(archiveTreeContract.getNodeName());
+            archiveTreeContractVO2List.add(treeContractVO2);
+            vo2Map.put(treeContractVO2.getId(),treeContractVO2);
+        }
+
+        List<ArchiveTreeContractVO2> trees = ForestNodeMerger.merge(archiveTreeContractVO2List);
+
+        InitAncestors(trees.get(0),"0");
+
+        for (ArchiveTreeContract archiveTreeContract:archiveTreeContracts) {
+            ArchiveTreeContractVO2 tmp = vo2Map.get(archiveTreeContract.getId());
+            if (tmp != null ) {
+                archiveTreeContract.setAncestors(tmp.getAncestors());
+            }
+        }
+    }
+
+    /**
+     *
+     * @param tree
+     * @param ancestors
+     */
+    public void InitAncestors(ArchiveTreeContractVO2 tree, String ancestors) {
+        String localAncestors = ancestors + "," + tree.getId();
+        tree.setAncestors(ancestors);
+
+        List<ArchiveTreeContractVO2> childrens = tree.getChildren();
+        if (childrens!= null) {
+            for (ArchiveTreeContractVO2 child :childrens) {
+                InitAncestors(child,localAncestors);
+            }
+        }
+    }
+
+
+
+
+
+
+    public List<ArchiveTreeContract> getTreeContractFromWbs(String tenantId, Long projectId, Long wbsId, Long contractId,Long level,ArchiveTreeContractVO2 subTree){
+        List<ArchiveTreeContract> archiveTreeContracts = new ArrayList<>();
+
+        //1. 获取子树链表
+        List<ArchiveTreeContractVO2> treeContractVO2s = new ArrayList<>();
+        ForestNodeMerger.getTreeList(subTree,treeContractVO2s);
+
+        //2. 获取对应合同的树
+        List<WbsTreeContractVO6> wbsTreeContractVO6s =  contractInfoService.tree6List(wbsId.toString(),projectId.toString(),contractId.toString());
+        Iterator<WbsTreeContractVO6> iterator = wbsTreeContractVO6s.iterator();
+        while (iterator.hasNext()) {
+            WbsTreeContractVO6 treeContractVO6 = iterator.next();
+            if (treeContractVO6.getNodeType() > level) {
+                iterator.remove();
+            }
+        }
+
+         return archiveTreeContracts;
+    }
+
+}

+ 159 - 120
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java

@@ -25,16 +25,19 @@ import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.node.ForestNodeMerger;
+import org.springblade.manager.dto.ArchiveTreeContractAutoRuleMapDTO;
 import org.springblade.manager.entity.ArchiveTree;
 import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.entity.ProjectInfo;
 import org.springblade.manager.mapper.ArchiveTreeMapper;
-import org.springblade.manager.vo.ArchiveTreeContractAutoRuleVO;
-import org.springblade.manager.vo.ArchiveTreeContractVO;
+import org.springblade.manager.service.IArchiveTreeService;
+import org.springblade.manager.service.IContractInfoService;
+import org.springblade.manager.service.IProjectInfoService;
+import org.springblade.manager.vo.*;
 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.springblade.manager.wrapper.ArchiveTreeContractWrapper;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -53,6 +56,14 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 
 	private final ArchiveTreeContractMapper archiveTreeContractMapper;
 
+	private final IArchiveTreeService archiveTreeService;
+
+	private final IContractInfoService contractInfoService;
+
+	private final ArTreeContractInitServiceImpl arTreeContractInitService;
+
+	private final IProjectInfoService projectInfoService;
+
 
 	@Override
 	public IPage<ArchiveTreeContractVO> selectArchiveTreeContractPage(IPage<ArchiveTreeContractVO> page, ArchiveTreeContractVO archiveTreeContract) {
@@ -75,9 +86,9 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		}
 
 
-		//清理旧的项目归档树,待补充
-		clearProjectTree(tenantId,projectId);
-		//判断是否
+		//todo 同步新增节点
+
+
 
 		//系统模板的
 		List<ArchiveTreeContract> archiveTreeContracts = new ArrayList<>();
@@ -123,15 +134,18 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 			archiveTreeContracts.add(archiveTree);
 		}
 
+		//todo 同步合同划分
+
 		//todo 生成动态节点
 		List<ArchiveTreeContractVO2> archiveTreeContractVO2List = this.tree2(tenantId,1,null,projectId);
 
+		//todo 遍历找到关联质检资料的节点,取出合同段
 
 		//todo 处理文件提名
 
 		//todo 立卷规则
 
-		//todo 生成动态节点的同名案卷
+		//todo 同步划分树节点到案卷列表
 
 
 
@@ -139,6 +153,39 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		return true;
 	}
 
+
+	@Override
+	public boolean initTree2(String tenantId, Long projectId){
+
+		List<ArchiveTreeVO2> tree = archiveTreeService.tree2(AuthUtil.getTenantId(), null, null);
+		if (tree == null || tree.size() == 0) {
+			return false;
+		}
+
+		ProjectInfo projectInfo = projectInfoService.getOne(projectId);
+
+		List<ArchiveTreeContract> archiveTreeContracts = new ArrayList<>();
+
+
+		List<ContractInfo> contractInfoVOS = contractInfoService.selectContractInfoPageByPid(projectId.toString());
+
+		arTreeContractInitService.copyTree(tenantId,projectId,projectInfo.getProjectName(),tree.get(0),archiveTreeContracts,contractInfoVOS);
+
+	    //todo 同步动态节点
+
+		//todo 遍历找到关联质检资料的节点,取出合同段
+
+		//todo 处理文件提名
+
+		//todo 立卷规则
+
+		//todo 同步划分树节点到案卷列表
+
+		this.saveBatch(archiveTreeContracts);
+		return true;
+	}
+
+
 	@Override
 	public List<ArchiveTreeContractVO> lazyTree(String tenantId, Long parentId,Long projectId) {
 		if (AuthUtil.isAdministrator()) {
@@ -178,28 +225,29 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 			//步骤1保存选择节点的立卷规则。
 			String[] ids = nodeIds.split(",");
 
-			Long archiveAutoNodeId=null;
+			Long archiveAutoGroupId=null;
 
 			//分类并卷规则的需要生成个随机数,作为同一个分类赋值archiveAutoNodeId
 			if(archiveAutoType==2){
 				double ran=(Math.random()*100000000) + 1;
-				archiveAutoNodeId=Long.parseLong(System.currentTimeMillis()+""+ran);
+				archiveAutoGroupId=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{
+				if(archiveAutoType==1){
 					//最高并卷规则 选择节点的ID
 					archiveTreeContract.setArchiveAutoNodeId(nodeIdLong);
 				}
+				if(archiveAutoType==2){
+					//分类并卷规则 提交都是一个分类类型
+					archiveTreeContract.setArchiveAutoGroupId(archiveAutoGroupId);
+					archiveTreeContract.setArchiveAutoGroupSelect(1);
+				}
 				baseMapper.updateById(archiveTreeContract);
 
-				//TODO 步骤2保存选择节点下所有子节点的立卷规则。注意立卷规则优先级覆盖原则。(单独组卷>分类并卷>最高并卷)
+				//步骤2保存选择节点下所有子节点的立卷规则。注意立卷规则优先级覆盖原则。(单独组卷>分类并卷>最高并卷)
 				baseMapper.updateAllSonNodeIdsForArchiveAutoRule(archiveTreeContract);
 			}
 
@@ -218,145 +266,136 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 	 * @return
 	 */
 	@Override
-	public Map<Integer, List<ArchiveTreeContractAutoRuleVO>> getArchiveAutoRule(Long id) {
+	public Map<String,Object> 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)
+		Map<String,Object> map= new HashMap<>();
 
 		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());
+		Integer archiveAutoType = archiveTreeContract.getArchiveAutoType();
+		if(archiveAutoType!=null){
+			if(archiveAutoType==1){
+				//最高并卷层级 默认规则的节点 显示最高并卷层级节点
+				Long archiveAutoNodeId = archiveTreeContract.getArchiveAutoNodeId();
+				ArchiveTreeContract archiveAutoNode = baseMapper.selectById(archiveAutoNodeId);
 				StringBuffer allName= new StringBuffer();
-				String ancestors = node.getAncestors();
+				String ancestors = archiveAutoNode.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()+"/");
-					}
+					ArchiveTreeContract pIdNode = baseMapper.selectById(pIdLong);
+					allName.append(pIdNode.getNodeName()+"/");
 				}
-				allName.append(node.getNodeName());
+				allName.append(archiveAutoNode.getNodeName());
+				ArchiveTreeContractAutoRuleVO vo= new ArchiveTreeContractAutoRuleVO();
 				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);
+				vo.setNodeId(archiveAutoNode.getId());
+				vo.setArchiveAutoType(archiveAutoType);
+				map.put("type",archiveAutoType);
+				map.put("data",vo);
+				return map;
+			}
+			if(archiveAutoType==2){
+				//分类并卷显示所在大类下树结构,过滤单独规则,其他分类并卷规则组节点 本节点分类组显示打钩
+				//找出当前节点大类
+				String ancestors = archiveTreeContract.getAncestors();
+				String[] ancestorssplit = ancestors.split(",");//全路径ID
+				String nodeAncestors = ancestorssplit[0]+","+ancestorssplit[1]; //大类的ancestors
+				//获取大类下所有节点,过滤单独规则,其他分类并卷规则组节点
+				List<ArchiveTreeContractAutoRuleVO> nodetree = ForestNodeMerger.merge(baseMapper.getAllSonNodeforGroupView(nodeAncestors, archiveTreeContract.getArchiveAutoNodeId()));
+				//获取与当前节点同一分类的节点
+				List<ArchiveTreeContract> listGroup= baseMapper.selectList(Wrappers.<ArchiveTreeContract>lambdaQuery()
+						.eq(ArchiveTreeContract::getArchiveAutoGroupId, archiveTreeContract.getArchiveAutoGroupId())
+						.orderByAsc(ArchiveTreeContract::getSort));
+				StringBuffer nodeSelect = new StringBuffer();
+
+				for(ArchiveTreeContract node:listGroup){
+					nodeSelect.append(node.getId()+",");
 				}
-
-
+				map.put("type",archiveAutoType);
+				map.put("tree",nodetree);
+				map.put("data",nodeSelect.toString());
+				return map;
 			}
-		}
-		//找出分类并卷规则 与当前节点同一分类的节点
-		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());
+			if(archiveAutoType==3){
+				//单独组卷规则 显示当前节点
 				StringBuffer allName= new StringBuffer();
-				String ancestors = node.getAncestors();
+				String ancestors = archiveTreeContract.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()+"/");
-					}
+					ArchiveTreeContract pIdNode = baseMapper.selectById(pIdLong);
+					allName.append(pIdNode.getNodeName()+"/");
 				}
-				allName.append(node.getNodeName());
+				allName.append(archiveTreeContract.getNodeName());
+				ArchiveTreeContractAutoRuleVO vo= new ArchiveTreeContractAutoRuleVO();
 				vo.setAllName(allName.toString());
-				vo.setSelectVo(1);
-				voList_2.add(vo);
+				vo.setNodeId(archiveTreeContract.getId());
+				vo.setArchiveAutoType(archiveAutoType);
+				map.put("type",archiveAutoType);
+				map.put("data",vo);
+				return map;
 			}
 		}
-
-		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节点,已经同步出来了都属于归档树节点,直接按归档树节点处理
+	public void removeArchiveAutoRule(Long nodeId){
+		ArchiveTreeContract node = baseMapper.selectById(nodeId);
+		Integer archiveAutoType = node.getArchiveAutoType();
+		if(archiveAutoType!=null){
+			//删除默认规则
+			if(archiveAutoType==1){
+				baseMapper.removeAllSonNodeIdsForArchiveAutoRule_1(node);
+			}
+			//删除节点及所有子节点 分类并卷规则
+			if(archiveAutoType==2){
+				//删除规则
+				baseMapper.removeAllSonNodeIdsForArchiveAutoRule_2(node);
+				//TODO 验证节点的父节点是否为分类并卷规则,如是则取消。若无其他兄弟节点,继续往上验证。
+			}
+			//删除节点及所有子节点 单独并卷规则
+			if(archiveAutoType==3){
+				baseMapper.removeAllSonNodeIdsForArchiveAutoRule_3(node);
+			}
+		}
+
+	}
 
 
-		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{
-			//原来是最高,单独规则类型的
+	@Override
+	public boolean updateArchiveAutoRule(ArchiveTreeContractAutoRuleMapDTO dto) {
+		//项目级不需要考虑是否为wbs节点,已经同步出来了都属于归档树节点,直接按归档树节点处理
 
+		Integer archiveAutoType = dto.getArchiveAutoType();
+		if(archiveAutoType!=null){
 			if(archiveAutoType==2){
-				//修改成分类并卷
-			}
-			if(archiveAutoType==1){
-				//修改成最高
-			}
-			if(archiveAutoType==3){
-				//修改成单独
-				for(String nodeId:ids){
-					//步骤1更新选择节点的立卷规则。
+				Long groupId = dto.getArchiveAutoGroupId();
+				String selectNodeIds = dto.getSelectNodeIds();
+				List<String> selectNodeIdlist = Arrays.asList(selectNodeIds);
+				//先将同一分类的节点删除配置,。
+				baseMapper.removeNodeForArchiveAutoRule_Group(groupId);
+				//然后再按照选择节点保存新的设置
+				for(String nodeId:selectNodeIdlist){
 					long nodeIdLong = Long.parseLong(nodeId);
 					ArchiveTreeContract archiveTreeContract = baseMapper.selectById(nodeIdLong);
-					archiveTreeContract.setArchiveAutoSelect(1);
 					archiveTreeContract.setArchiveAutoType(archiveAutoType);
-					archiveTreeContract.setArchiveAutoNodeId(nodeIdLong);//最高/单独规则 选择节点的ID
+					//分类并卷规则 提交都是一个分类类型
+					archiveTreeContract.setArchiveAutoGroupId(groupId);
+					archiveTreeContract.setArchiveAutoGroupSelect(1);
 					baseMapper.updateById(archiveTreeContract);
-					//步骤2保存选择节点下所有子节点的立卷规则。注意立卷规则优先级覆盖原则。(单独组卷>分类并卷>最高并卷)
+					//保存选择节点下所有子节点的立卷规则。注意立卷规则优先级覆盖原则。(单独组卷>分类并卷>最高并卷)
 					baseMapper.updateAllSonNodeIdsForArchiveAutoRule(archiveTreeContract);
 				}
 			}
-		}
+			if(archiveAutoType==1){
+
+			}
+			if(archiveAutoType==3){
 
+			}
+
+		}
 
 		return false;
 	}

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

@@ -29,7 +29,7 @@ import java.util.stream.Collectors;
 public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, ArchiveTree> implements IArchiveTreeService {
 
     private final ArchiveTreeMapper archiveTreeMapper;
-    private final ArchiveTreeSupportServiceImpl archiveTreeSupportService;
+    private final ArTreeContractInitServiceImpl archiveTreeContractInitService;
 
     @Override
     public boolean initArchiveTree() {
@@ -74,7 +74,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
         if (extId != null && level != null) {
             //从wbs树获取
             String wbsId = extId.toString();
-            archiveTreeSupportService.getWbsArchiveTree(parentId,wbsId,tenantId,"1",level);
+            archiveTreeContractInitService.getWbsArchiveTree(parentId,wbsId,tenantId,"1",level);
 
         }//征程流程
         else {

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

@@ -1,84 +0,0 @@
-package org.springblade.manager.service.impl;
-
-import lombok.AllArgsConstructor;
-import org.springblade.common.utils.SnowFlakeUtil;
-import org.springblade.core.tool.utils.Func;
-import org.springblade.manager.entity.ArchiveTree;
-import org.springblade.manager.entity.ArchiveTreeContract;
-import org.springblade.manager.entity.WbsTree;
-import org.springblade.manager.service.IContractInfoService;
-import org.springblade.manager.service.IWbsTreeService;
-import org.springblade.manager.utils.ForestNodeMerger;
-import org.springblade.manager.vo.ArchiveTreeContractVO2;
-import org.springblade.manager.vo.WbsTreeContractVO6;
-import org.springblade.manager.vo.WbsTreeVO2;
-import org.springframework.stereotype.Service;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-@Service
-@AllArgsConstructor
-public class ArchiveTreeSupportServiceImpl {
-    private final IWbsTreeService wbsTreeService;
-
-    private final IContractInfoService contractInfoService;
-
-    /**
-     * 按照层次获取公共归档树
-     * @param parentId
-     * @param wbsId
-     * @param tenantId
-     * @param type
-     * @param level 层次,1,单位工程,2
-     * @return
-     */
-    public List<ArchiveTree> getWbsArchiveTree(Long parentId, String wbsId, String tenantId, String type,Long level)
-    {
-        List<ArchiveTree> archiveTreeList = new ArrayList<>();
-
-        List<WbsTreeVO2> wbsTreeVO2s = wbsTreeService.tree(wbsId, tenantId, type);
-
-        //遍历构建
-        for (WbsTreeVO2 wbsTreeVO2:wbsTreeVO2s) {
-            //只展示指定层级之上的
-            if (wbsTreeVO2.getNodeType() > level){
-                continue;
-            }
-
-            ArchiveTree archiveTree = new ArchiveTree();
-            archiveTree.setId(SnowFlakeUtil.getId());
-            archiveTree.setParentId(parentId);
-            archiveTree.setNodeName(wbsTreeVO2.getTitle());
-            archiveTree.setExtId(wbsTreeVO2.getId());
-            archiveTree.setDisplayHierarchy(level.toString());
-            archiveTreeList.add(archiveTree);
-        }
-
-        //设置pid
-
-        return archiveTreeList;
-    }
-
-    public List<ArchiveTreeContract> getTreeContractFromWbs(String tenantId, Long projectId, Long wbsId, Long contractId,Long level,ArchiveTreeContractVO2 subTree){
-        List<ArchiveTreeContract> archiveTreeContracts = new ArrayList<>();
-
-        //1. 获取子树链表
-        List<ArchiveTreeContractVO2> treeContractVO2s = new ArrayList<>();
-        ForestNodeMerger.getTreeList(subTree,treeContractVO2s);
-
-        //2. 获取对应合同的树
-        List<WbsTreeContractVO6> wbsTreeContractVO6s =  contractInfoService.tree6List(wbsId.toString(),projectId.toString(),contractId.toString());
-        Iterator<WbsTreeContractVO6> iterator = wbsTreeContractVO6s.iterator();
-        while (iterator.hasNext()) {
-            WbsTreeContractVO6 treeContractVO6 = iterator.next();
-            if (treeContractVO6.getNodeType() > level) {
-                iterator.remove();
-            }
-        }
-
-         return archiveTreeContracts;
-    }
-
-}

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

@@ -9,14 +9,15 @@ import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.entity.WbsParam;
 import org.springblade.manager.entity.WbsTreeContract;
+import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.mapper.WbsParamMapper;
 import org.springblade.manager.service.IWbsParamService;
 import org.springblade.manager.service.IWbsTreeContractService;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Collections;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -83,6 +84,31 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
         return nodes;
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insertBatch(Collection<WbsParam> entityList, int batchSize) {
+        try {
+            int size = entityList.size();
+            int idxLimit = Math.min(batchSize, size);
+            int i = 1;
+            //保存单批提交的数据集合
+            List<WbsParam> oneBatchList = new ArrayList<>();
+            for (Iterator<WbsParam> var1 = entityList.iterator(); var1.hasNext(); ++i) {
+                WbsParam element = var1.next();
+                oneBatchList.add(element);
+                if (i == idxLimit) {
+                    baseMapper.insertBatchSomeColumn(oneBatchList);
+                    //每次提交后清空集合数据
+                    oneBatchList.clear();
+                    idxLimit = Math.min(idxLimit + batchSize, size);
+                }
+            }
+        } catch (Exception e) {
+            log.error("保存失败", e);
+            return false;
+        }
+        return true;
+    }
+
 
 }
 

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

@@ -27,10 +27,7 @@ import org.springblade.manager.entity.*;
 import org.springblade.manager.mapper.*;
 import org.springblade.manager.service.ITableInfoService;
 import org.springblade.manager.service.IWbsTreePrivateService;
-import org.springblade.manager.vo.TreeNodeVOByTabType;
-import org.springblade.manager.vo.WbsNodeTabAndParamVO;
-import org.springblade.manager.vo.WbsNodeTableVO;
-import org.springblade.manager.vo.WbsTreePrivateVO;
+import org.springblade.manager.vo.*;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -516,11 +513,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         //获取该节点下所有表单
         List<WbsNodeTableVO> list = baseMapper.selectNodeTabAndParamList(id, wbsId, projectId);
         //获取节点信息
-        WbsTreePrivate nodeInfo = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda()
-                .eq(WbsTreePrivate::getId, id)
-                .eq(WbsTreePrivate::getWbsId, wbsId)
-                .eq(WbsTreePrivate::getProjectId, projectId)
-        );
+        WbsTreePrivate nodeInfo = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getId, id).eq(WbsTreePrivate::getWbsId, wbsId).eq(WbsTreePrivate::getProjectId, projectId));
         //获取节点参数,此处使用pKeyId与参数表的wbsId做的绑定才能确定唯一;
         List<WbsParam> paramList = wbsParamServiceImpl.findByNodeId(nodeInfo.getPKeyId());
         resultList.setTabData(list);
@@ -554,43 +547,30 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
     public boolean syncNodeParam(String projectId) {
         if (StringUtils.isNotEmpty(projectId)) {
             //获取项目节点树
-            List<WbsTreePrivate> wbsTreePrivateAllNow = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                    .eq(WbsTreePrivate::getProjectId, projectId)
-                    .eq(WbsTreePrivate::getStatus, 1)
-                    .eq(WbsTreePrivate::getType, 1)
-            );
-            String wbsId = "";
-            for (WbsTreePrivate wbsTreePrivate : wbsTreePrivateAllNow) {
-                wbsId = wbsTreePrivate.getWbsId();
-                break;
-            }
+            List<WbsTreePrivate> wbsTreePrivateAllNow = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getProjectId, projectId).eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getType, 1));
+            String wbsId = wbsTreePrivateAllNow.stream().map(WbsTreePrivate::getWbsId).findAny().orElse(null);
             if (StringUtils.isNotEmpty(wbsId)) {
-                //获取当前参数表的所有业务数据
-                List<WbsParam> wbsParamListAll = wbsParamMapper.selectList(Wrappers.<WbsParam>query().lambda().eq(WbsParam::getType, 1).isNotNull(WbsParam::getNodeId).ne(WbsParam::getNodeId, -1));
 
-                List<WbsParam> paramListData = new ArrayList<>();
+                List<WbsParamVO> paramListData = new ArrayList<>();
                 //获取公有树
-                List<WbsTree> treePublicNodeAll = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
-                        .eq(WbsTree::getWbsId, wbsId)
-                        .eq(WbsTree::getStatus, 1)
-                        .eq(WbsTree::getType, 1)
-                );
+                List<WbsTree> treePublicNodeAll = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda().eq(WbsTree::getWbsId, wbsId).eq(WbsTree::getStatus, 1).eq(WbsTree::getType, 1));
 
                 if (treePublicNodeAll.size() > 0) {
                     //公有引用
                     for (WbsTreePrivate wbsTreePrivate : wbsTreePrivateAllNow) {
                         for (WbsTree wbsTree : treePublicNodeAll) {
                             if (wbsTree.getId().equals(wbsTreePrivate.getId())) {
+                                String sql = "select * from m_wbs_param where node_id = " + wbsTree.getId();
+                                List<WbsParam> wbsParamList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsParam.class));
                                 //获取公有节点参数
-                                List<WbsParam> wbsParamList = wbsParamListAll.stream().filter(f -> f.getNodeId().equals(wbsTree.getId())).collect(Collectors.toList());
                                 if (wbsParamList.size() > 0) {
                                     for (WbsParam wbsParam : wbsParamList) {
-                                        WbsParam param = BeanUtil.copyProperties(wbsParam, WbsParam.class);
+                                        WbsParamVO param = BeanUtil.copyProperties(wbsParam, WbsParamVO.class);
                                         if (param != null) {
+                                            param.setOldId(wbsParam.getId());
                                             param.setNodeId(wbsTreePrivate.getPKeyId());
                                             param.setId(SnowFlakeUtil.getId());
                                             paramListData.add(param);
@@ -603,28 +583,19 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
 
                 } else {
                     //私有引用 - 获取原始引用私有树
-                    WbsTreePrivate treePrivateRootNode = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda()
-                            .eq(WbsTreePrivate::getPKeyId, wbsId)
-                            .eq(WbsTreePrivate::getParentId, 0L)
-                            .eq(WbsTreePrivate::getStatus, 1)
-                            .eq(WbsTreePrivate::getType, 1)
-                    );
-                    List<WbsTreePrivate> treePrivateNodeAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                            .eq(WbsTreePrivate::getWbsId, treePrivateRootNode.getWbsId())
-                            .eq(WbsTreePrivate::getProjectId, treePrivateRootNode.getProjectId())
-                            .eq(WbsTreePrivate::getStatus, 1)
-                            .eq(WbsTreePrivate::getType, 1)
-                    );
+                    WbsTreePrivate treePrivateRootNode = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, wbsId).eq(WbsTreePrivate::getParentId, 0L).eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getType, 1));
+                    List<WbsTreePrivate> treePrivateNodeAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getWbsId, treePrivateRootNode.getWbsId()).eq(WbsTreePrivate::getProjectId, treePrivateRootNode.getProjectId()).eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getType, 1));
 
                     for (WbsTreePrivate wbsTreePrivate : wbsTreePrivateAllNow) {
                         for (WbsTreePrivate wbsTreePrivateYS : treePrivateNodeAll) {
                             if (wbsTreePrivateYS.getId().equals(wbsTreePrivate.getId())) {
-                                //获取公有节点参数
-                                List<WbsParam> wbsParamList = wbsParamListAll.stream().filter(f -> f.getNodeId().equals(wbsTreePrivateYS.getPKeyId())).collect(Collectors.toList());
+                                String sql = "select * from m_wbs_param where node_id = " + wbsTreePrivateYS.getPKeyId();
+                                List<WbsParam> wbsParamList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsParam.class));
                                 if (wbsParamList.size() > 0) {
                                     for (WbsParam wbsParam : wbsParamList) {
-                                        WbsParam param = BeanUtil.copyProperties(wbsParam, WbsParam.class);
+                                        WbsParamVO param = BeanUtil.copyProperties(wbsParam, WbsParamVO.class);
                                         if (param != null) {
+                                            param.setOldId(wbsParam.getId());
                                             param.setNodeId(wbsTreePrivate.getPKeyId());
                                             param.setId(SnowFlakeUtil.getId());
                                             paramListData.add(param);
@@ -636,22 +607,68 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     }
                 }
 
+                List<WbsParam> updateList = new ArrayList<>();
+                List<WbsParam> insertList = new ArrayList<>();
                 //判断是否存在
-                Iterator<WbsParam> iterator = paramListData.iterator();
+                Iterator<WbsParamVO> iterator = paramListData.iterator();
                 while (iterator.hasNext()) {
-                    WbsParam next = iterator.next();
-                    List<WbsParam> collect = wbsParamListAll.stream().filter(f ->
-                            (StringUtils.isNotEmpty(f.getK()) && f.getK().equals(next.getK()))
-                                    && (StringUtils.isNotEmpty(f.getV()) && f.getV().equals(next.getV()))
-                                    && (StringUtils.isNotEmpty(f.getName()) && f.getName().equals(next.getName()))
-                                    && (ObjectUtils.isNotEmpty(f.getNodeId()) && f.getNodeId().equals(next.getNodeId())))
-                            .collect(Collectors.toList());
-                    if (collect.size() > 0) {
-                        iterator.remove();
+                    WbsParamVO next = iterator.next();
+
+                    //获取引用的节点上的源参数信息
+                    String sql1 = "select * from m_wbs_param where id = " + next.getOldId();
+                    WbsParam oldObj = jdbcTemplate.query(sql1, new BeanPropertyRowMapper<>(WbsParam.class)).stream().findAny().orElse(null);
+
+                    //获取被引用的节点上的现参数信息
+                    String sql2 = "select * from m_wbs_param where name = '" + next.getName() + "' and k = '" + next.getK() + "' and v = '" + next.getV() + "' and node_id = " + next.getNodeId() + " and remark = '" + next.getRemark() + "' and is_deleted = 0 and status = 1";
+                    WbsParam newObj = jdbcTemplate.query(sql2, new BeanPropertyRowMapper<>(WbsParam.class)).stream().findAny().orElse(null);
+
+                    if (oldObj != null && newObj != null) {
+                        //如果源节点参数与现节点参数名称、K、V、备注一致,那么就跳过
+                        if (oldObj.getName().equals(newObj.getName()) && oldObj.getK().equals(newObj.getK()) && oldObj.getV().equals(newObj.getV()) && oldObj.getRemark().equals(newObj.getRemark())) {
+                            iterator.remove();
+
+                            //如果源节点参数与现节点参数名称、K一致,V、备注不一致,那么就修改当前名称下的节点参数
+                        } else if (oldObj.getName().equals(newObj.getName()) && oldObj.getK().equals(newObj.getK()) && (!oldObj.getV().equals(newObj.getV()) || !oldObj.getRemark().equals(newObj.getRemark()))) {
+                            newObj.setName(oldObj.getName());
+                            newObj.setK(oldObj.getK());
+                            newObj.setV(oldObj.getV());
+                            newObj.setRemark(oldObj.getRemark());
+                            updateList.add(newObj);
+
+                            //如果源节点参数与现节点参数名称不一致,那么新增
+                        } else if (!oldObj.getName().equals(newObj.getName())) {
+                            insertList.add(next);
+                        }
+
+                    } else if (oldObj != null) {
+                        //二次过滤,节点名称、节点id相同,修改
+                        String sql3 = "select * from m_wbs_param where name = '" + next.getName() + "' and node_id = " + next.getNodeId() + " and is_deleted = 0 and status = 1";
+                        List<WbsParam> query = jdbcTemplate.query(sql3, new BeanPropertyRowMapper<>(WbsParam.class));
+                        if (query.size() > 0) {
+                            for (WbsParam wbsParam : query) {
+                                if (oldObj.getName().equals(wbsParam.getName())) {
+                                    //修改
+                                    wbsParam.setName(next.getName());
+                                    wbsParam.setK(next.getK());
+                                    wbsParam.setV(next.getV());
+                                    wbsParam.setRemark(next.getRemark());
+                                    updateList.add(wbsParam);
+                                }
+                            }
+                        } else {
+                            //新增
+                            insertList.add(next);
+                        }
                     }
+
                 }
 
-                wbsParamServiceImpl.saveBatch(paramListData, 1000);
+                if (updateList.size() > 0) {
+                    this.wbsParamServiceImpl.updateBatchById(updateList, 1000);
+                }
+                if (insertList.size() > 0) {
+                    this.wbsParamServiceImpl.saveBatch(insertList, 1000);
+                }
                 return true;
             }
         }
@@ -659,7 +676,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
     public boolean syncNodeTable(String primaryKeyId) {
         if (StringUtils.isNotEmpty(primaryKeyId)) {
             //获取当前节点对应节点信息
@@ -1610,26 +1626,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         return true;
     }
 
-
-    public void insertDLTab(WbsTreeContractDTO pawDTO) {
-        //获取当前引用项目的独立库表单
-        List<WbsTreePrivate> wbsTreePrivates = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getProjectId, pawDTO.getReferencePrivateWbsProjectId()).eq(WbsTreePrivate::getType, 10));
-        List<WbsTreePrivate> wbsTreePrivatesNew = new ArrayList<>();
-        if (wbsTreePrivates.size() > 0) {
-            for (WbsTreePrivate wbsTreePrivate : wbsTreePrivates) {
-                WbsTreePrivate wbsTreePrivateNew = BeanUtil.copyProperties(wbsTreePrivate, WbsTreePrivate.class);
-                if (wbsTreePrivateNew != null) {
-                    Long id = SnowFlakeUtil.getId();
-                    wbsTreePrivateNew.setPKeyId(id);
-                    wbsTreePrivateNew.setId(id);
-                    wbsTreePrivateNew.setProjectId(pawDTO.getProjectId());
-                    wbsTreePrivatesNew.add(wbsTreePrivateNew);
-                }
-            }
-        }
-        this.insertBatch(wbsTreePrivatesNew, 1000);
-    }
-
     /**
      * 修改initTableId
      */

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

@@ -399,7 +399,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
     }
 
     @Override
-    public List<WbsFormElementVO> selectFormElements(String id,Integer type) {
+    public List<WbsFormElementVO> selectFormElements(String id, Integer type) {
         List<WbsFormElementVO> wbsFormElements = wbsTreeMapper.selectFormElements(id);
         ;
 //        if (Func.isEmpty(wbsFormElements)) {
@@ -416,18 +416,18 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         String elementIds = wbsFormElements.stream().map(WbsFormElement::getId).map(String::valueOf).collect(Collectors.joining(","));
         if (Func.isNotEmpty(elementIds)) {
             /*TYPE==1就是WBS级别*/
-            Integer scopeA= com.mixsmart.utils.StringUtils.isEquals(type,1)? FormulaBean.WBS_GLOBAL:FormulaBean.PRO_GLOBAL;
-            Integer scopeB=com.mixsmart.utils.StringUtils.isEquals(type,1)? FormulaBean.WBS_PART:FormulaBean.PRO_PART;
-            List<Long> longs = this.jdbcTemplate.queryForList("select a.id from m_wbs_form_element a inner join m_element_formula_mapping b on a.id=b.element_id where a.id in(" + elementIds + ") and b.scope="+scopeA, Long.class);
+            Integer scopeA = com.mixsmart.utils.StringUtils.isEquals(type, 1) ? FormulaBean.WBS_GLOBAL : FormulaBean.PRO_GLOBAL;
+            Integer scopeB = com.mixsmart.utils.StringUtils.isEquals(type, 1) ? FormulaBean.WBS_PART : FormulaBean.PRO_PART;
+            List<Long> longs = this.jdbcTemplate.queryForList("select a.id from m_wbs_form_element a inner join m_element_formula_mapping b on a.id=b.element_id where a.id in(" + elementIds + ") and b.scope=" + scopeA, Long.class);
             wbsFormElements.forEach(e -> {
                 e.setGlobalFormula(longs.contains(e.getId()) ? 1 : 0);
             });
             String sql;
-            if(com.mixsmart.utils.StringUtils.isEquals(type,1)){
-                sql="select c.element_id from m_wbs_tree a INNER JOIN m_wbs_tree b on a.parent_id=b.id INNER JOIN m_element_formula_mapping c on b.id=c.node_id where  a.id=" + id + " and c.scope="+scopeB+" and c.element_id in(" + elementIds + ")";
-            }else{
-                WbsTreePrivate treePrivate= this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId,id));
-                sql="select c.element_id from m_wbs_tree_private a INNER JOIN m_wbs_tree b on a.parent_id=b.id INNER JOIN m_element_formula_mapping c on b.id=c.node_id where  a.p_key_id=" + id + " and c.scope="+scopeB+" and c.element_id in(" + elementIds + ")  and c.project_id="+treePrivate.getProjectId();
+            if (com.mixsmart.utils.StringUtils.isEquals(type, 1)) {
+                sql = "select c.element_id from m_wbs_tree a INNER JOIN m_wbs_tree b on a.parent_id=b.id INNER JOIN m_element_formula_mapping c on b.id=c.node_id where  a.id=" + id + " and c.scope=" + scopeB + " and c.element_id in(" + elementIds + ")";
+            } else {
+                WbsTreePrivate treePrivate = this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, id));
+                sql = "select c.element_id from m_wbs_tree_private a INNER JOIN m_wbs_tree b on a.parent_id=b.id INNER JOIN m_element_formula_mapping c on b.id=c.node_id where  a.p_key_id=" + id + " and c.scope=" + scopeB + " and c.element_id in(" + elementIds + ")  and c.project_id=" + treePrivate.getProjectId();
             }
             List<Long> longs2 = this.jdbcTemplate.queryForList(sql, Long.class);
             wbsFormElements.forEach(e -> {
@@ -566,18 +566,6 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
 
             //1.同步私有电签默认信息
             if (saveIds.size() == 0 && delIds.size() == 0) {
-                /*if (pawDTO.getReferenceType().equals("public")) {
-                    //获取公有wbs树所有的节点、元素表
-                    List<WbsTree> wbsTreeListAll = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda().eq(WbsTree::getWbsId, Long.parseLong(pawDTO.getWbsId())).eq(WbsTree::getStatus, 1));
-
-                    //获取项目私有wbs树下所有的节点、元素表
-                    List<WbsTreePrivate> wbsTreePrivatesAll = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getWbsId, Long.parseLong(pawDTO.getWbsId())).eq(WbsTreePrivate::getProjectId, Long.parseLong(pawDTO.getProjectId())).eq(WbsTreePrivate::getStatus, 1));
-
-                    //修改公有wbs节点信息、元素表基础信息到项目级wbs、合同段wbs
-                    this.updateWbsInfoPrivateAsync(wbsTreeListAll, wbsTreePrivatesAll, pawDTO.getProjectId());
-
-                }*/
-
                 if (pawDTO.getReferenceType().equals("private")) {
 
                     //新增独立表单库数据
@@ -601,10 +589,6 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
 
                     //同步私有-电签匹配数据、默认信息数据
                     this.insertTextDictInfoAsync(WbsTreePrivateTables, wbsTreePrivateNowTables);
-
-                    //同步私有wbs节点信息、元素表基础信息到项目级wbs、合同段wbs
-                    //this.updateWbsInfoContractAsync(wbsTreePrivateAllOld, wbsTreePrivatesAllNow, pawDTO.getProjectId(), pawDTO.getPrimaryKeyId());
-
                 }
 
             } else {
@@ -688,8 +672,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                     if (pawDTO.getReferenceType().equals("public")) {
                         List<WbsTree> addListData = new ArrayList<>();
                         //获取当前wbs树下所有节点、表信息
-                        List<WbsTree> treesAll = baseMapper.selectList(Wrappers.<WbsTree>query().lambda().eq(WbsTree::getWbsId, pawDTO.getWbsId()));
-
+                        List<WbsTree> treesAll = baseMapper.selectList(Wrappers.<WbsTree>lambdaQuery().eq(WbsTree::getWbsId, pawDTO.getWbsId()).eq(WbsTree::getStatus, 1));
                         for (WbsTree wbsTree : treesAll) {
                             for (String id : saveIds) {
                                 if (Long.parseLong(id) == (wbsTree.getId())) {
@@ -719,23 +702,26 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                         Map<Long, List<TextdictInfo>> textDictInfoData = new HashMap<>();
 
                         //查询出当前wbs树下所有节点、表信息(type=10独立表)
-                        List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateMapper.selectNodeAndTable(null, pawDTO.getWbsId(), pawDTO.getReferencePrivateWbsProjectId());
-
-                        //获取当前项目下的所有独立表
-                        List<WbsTreePrivate> wbsTreePrivatesTableDL = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
-                                .eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId())
-                                .eq(WbsTreePrivate::getType, 10)
-                                .eq(WbsTreePrivate::getParentId, -10)
+                        List<WbsTreePrivate> wbsTreePrivatesNodeAndTab = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
                                 .eq(WbsTreePrivate::getStatus, 1)
+                                .eq(WbsTreePrivate::getProjectId, pawDTO.getReferencePrivateWbsProjectId())
+                                .eq(WbsTreePrivate::getWbsId, pawDTO.getWbsId())
+                                .and(obj -> obj.eq(WbsTreePrivate::getType, 1).or().eq(WbsTreePrivate::getType,2))
                         );
 
+                        List<WbsTreePrivate> wbsTreePrivatesTableDLOld = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getProjectId, pawDTO.getReferencePrivateWbsProjectId()).eq(WbsTreePrivate::getType, 10).eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getParentId, -10).isNull(WbsTreePrivate::getWbsId));
+                        wbsTreePrivatesNodeAndTab.addAll(wbsTreePrivatesTableDLOld);
+
+                        //获取当前项目下的所有独立表
+                        List<WbsTreePrivate> wbsTreePrivatesTableDL = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId()).eq(WbsTreePrivate::getType, 10).eq(WbsTreePrivate::getParentId, -10).eq(WbsTreePrivate::getStatus, 1));
+
                         //查询对应电签位置配置信息的pKeyIds
-                        List<Long> pIdsDL = wbsTreePrivates.stream().filter(f -> f.getType().equals(10) || f.getType().equals(2)).collect(Collectors.toList()).stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
+                        List<Long> pIdsDL = wbsTreePrivatesNodeAndTab.stream().filter(f -> f.getType().equals(10) || f.getType().equals(2)).collect(Collectors.toList()).stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
                         String pKeyIds = StringUtils.join(pIdsDL, ",");
                         String sql = "select `id`,`name`,`type`,tab_id,col_key,sig_role_id,is_deleted,sig_role_name,col_name,pyzbx,pyzby from m_textdict_info where tab_id in (" + pKeyIds + ") and is_deleted = 0";
                         List<TextdictInfo> textDictInfosAll = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TextdictInfo.class));
 
-                        for (WbsTreePrivate wbsTreePrivate : wbsTreePrivates) {
+                        for (WbsTreePrivate wbsTreePrivate : wbsTreePrivatesNodeAndTab) {
                             if (wbsTreePrivate.getType() == 1 || wbsTreePrivate.getType() == 2) {
                                 for (String id : saveIds) {
                                     if (Long.parseLong(id) == (wbsTreePrivate.getId())) {