Parcourir la source

Merge branch 'master' of http://47.110.251.215:3000/java_org/bladex

huangtf il y a 2 ans
Parent
commit
f2f94add4d
39 fichiers modifiés avec 917 ajouts et 170 suppressions
  1. 25 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchivesAutoVO.java
  2. 10 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/InformationQueryClient.java
  3. 1 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/MetadataClassificationClient.java
  4. 5 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/MetadataClassificationVO.java
  5. 5 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ContractInfo.java
  6. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ArchiveTreeContractClient.java
  7. 2 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ContractClient.java
  8. 13 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/InsertDataVO.java
  9. 2 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java
  10. 47 10
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  11. 7 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java
  12. 136 16
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  13. 5 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java
  14. 160 10
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  15. 4 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ArchiveFileController.java
  16. 11 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/InformationQueryClientImpl.java
  17. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/MetadataClassificationClientImpl.java
  18. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml
  19. 3 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.java
  20. 16 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml
  21. 3 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/IInformationQueryService.java
  22. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/IMetadataClassificationService.java
  23. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java
  24. 9 5
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/MetadataClassificationServiceImpl.java
  25. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsParamController.java
  26. 1 14
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java
  27. 14 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  28. 14 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ArchiveTreeContractImpl.java
  29. 7 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ContractClientImpl.java
  30. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java
  31. 10 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  32. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.java
  33. 3 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml
  34. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java
  35. 5 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  36. 3 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java
  37. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java
  38. 368 99
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  39. 7 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

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

@@ -123,11 +123,36 @@ public class ArchivesAutoVO extends ArchivesAuto {
 	 */
 	private Long destroyUser;
 
+	/**
+	 * 列表类型,1案卷列表2档案柜
+	 */
+	private Integer listType;
+
+	/**
+	 * 档案柜的档案类型,1业主档案2施工档案3监理档案
+	 */
+	private Integer archiveType;
+
 	/**
 	 * 案卷合同类型,C施工、S监理、空业主
 	 */
 	private String contractType;
 
+	/**
+	 * 柜子编号
+	 */
+	private Integer cabinetNumber;
+
+	/**
+	 * 案卷在柜子里的状态
+	 */
+	private Integer isSelect;
+
+	/**
+	 * 柜子内部搜索
+	 */
+	private String innerSearch;
+
 	@ApiModelProperty("批量保存")
 	private List<ArchivesAutoVO> list;
 	/**

+ 10 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/InformationQueryClient.java

@@ -2,6 +2,7 @@ package org.springblade.business.feign;
 
 import com.alibaba.fastjson.JSONObject;
 import org.springblade.business.entity.InformationQuery;
+import org.springblade.business.vo.QueryProcessDataVO;
 import org.springblade.common.constant.BusinessConstant;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -76,4 +77,13 @@ public interface InformationQueryClient {
     @PostMapping(API_PREFIX + "/getFirstInfoByWbsId")
     InformationQuery getFirstInfoByWbsId(@RequestParam String WbsId);
 
+    //查询质检表有数据的字段
+    @PostMapping(API_PREFIX + "/getNodeChildTabColsWithValueByTabName")
+    List<QueryProcessDataVO> getNodeChildTabColsWithValueByTabName(@RequestParam String initTabName, @RequestParam String pKeyId);
+
+    //查询监理表全部字段
+    @PostMapping(API_PREFIX + "/getNodeChildTabColsAllByTabName")
+    List<QueryProcessDataVO> getNodeChildTabColsAllByTabName(@RequestParam String initTabName);
+
+
 }

+ 1 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/MetadataClassificationClient.java

@@ -24,5 +24,5 @@ public interface MetadataClassificationClient {
     List<MetadataClassificationVO> getMetadataFile(@RequestParam Long fileId);
 
     @PostMapping(API_PREFIX + "/updateMetadata")
-    boolean updateMetadata(@RequestBody List<MetadataClassificationVO> vos);
+    boolean updateMetadata(@RequestBody MetadataClassificationVO vo);
 }

+ 5 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/MetadataClassificationVO.java

@@ -16,10 +16,13 @@
  */
 package org.springblade.business.vo;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.business.entity.MetadataClassification;
 
+import java.util.List;
+
 
 /**
  * 视图实体类
@@ -41,4 +44,6 @@ public class MetadataClassificationVO extends MetadataClassification {
      * 文件id
      */
     private Long fileId;
+    @ApiModelProperty("批量保存")
+    private List<MetadataClassificationVO> list;
 }

+ 5 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ContractInfo.java

@@ -158,6 +158,11 @@ public class ContractInfo extends BaseEntity {
     @ApiModelProperty(value = "是否引用编号 '0'否 '1'是")
     private Integer isReferenceNumber;
 
+    /**
+     * 是否正在自动组卷中  0否  1是
+     */
+    private Integer isArchivesAuto;
+
 
     public String archivesUnit() {
 

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

@@ -41,4 +41,7 @@ public interface ArchiveTreeContractClient {
 
     @PostMapping(API_PREFIX + "/getArchiveTreeContractListByIds")
     List<ArchiveTreeContract> getArchiveTreeContractListByIds(@RequestParam String ids);
+
+    @PostMapping(API_PREFIX + "/getFirstNodeByTreeCode")
+    ArchiveTreeContract getFirstNodeByTreeCode(@RequestParam Long projectId,@RequestParam Integer type);
 }

+ 2 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ContractClient.java

@@ -67,5 +67,7 @@ public interface ContractClient {
     @GetMapping(API_PREFIX + "/getContractListByProjectId")
     List<ContractInfo> getContractListByProjectId(@RequestParam Long projectId);
 
+    @GetMapping(API_PREFIX + "/updateIsArchivesAutoById")
+    void updateIsArchivesAutoById(@RequestParam Long id, @RequestParam Integer isArchivesAuto);
 
 }

+ 13 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/InsertDataVO.java

@@ -0,0 +1,13 @@
+package org.springblade.manager.vo;
+
+import lombok.Data;
+
+@Data
+public class InsertDataVO {
+
+    private String pKeyId;
+    private String initTabName;
+    private String key;
+    private String Data;
+
+}

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

@@ -396,9 +396,9 @@ public class ArchiveFileController extends BladeController {
     @PostMapping("/updateMetadata")
     @ApiOperationSupport(order = 17)
     @ApiOperation(value = "编辑")
-    public R<Boolean> updateMetadata(@RequestBody List<MetadataClassificationVO> vos) {
+    public R<Boolean> updateMetadata(@RequestBody MetadataClassificationVO vo) {
         try {
-            this.metadataClassificationClient.updateMetadata(vos);
+            this.metadataClassificationClient.updateMetadata(vo);
         } catch (Exception e) {
             e.printStackTrace();
             return R.data(false);

+ 47 - 10
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -35,8 +35,10 @@ import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.ProjectInfo;
 import org.springblade.manager.feign.ArchiveTreeContractClient;
+import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.feign.ProjectClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -72,6 +74,8 @@ public class ArchivesAutoController extends BladeController {
 	private final IArchiveAutoPdfService archiveAutoPdfService;
 	private final ArchiveTreeContractClient archiveTreeContractClient;
 	private ProjectClient projectClient;
+	private ContractClient contractClient;
+
 	@Autowired
 	private ExecutorService executorService;
 	/**
@@ -135,9 +139,22 @@ public class ArchivesAutoController extends BladeController {
 			@ApiImplicitParam(name = "searchType", value = "搜索类型1案卷2文件"),
 			@ApiImplicitParam(name = "nodeIds", value = "搜索树的节点id集合")
 	})
-	public R<IPage<ArchivesAutoVO>> pageByArchivesAuto(ArchivesAutoVO archivesAuto) {
-		IPage<ArchivesAutoVO> pages = archivesAutoService.pageByArchivesAuto(archivesAuto);
-		return R.data(pages);
+	public R pageByArchivesAuto(ArchivesAutoVO archivesAuto) {
+		if (archivesAuto.getListType() == 1) {
+			IPage<ArchivesAutoVO> pages = archivesAutoService.pageByArchivesAuto(archivesAuto);
+			return R.data(pages);
+		}else {
+			//档案柜
+			if(archivesAuto.getCabinetNumber() == null) {
+				List<Map<String, List<Map<String, String>>>> lists = archivesAutoService.getArchivesCabinet(archivesAuto);
+				return R.data(lists);
+			}else {
+				//查询具体柜子里的数据
+				archivesAuto.setSize(160);
+				archivesAuto.setCurrent(archivesAuto.getCabinetNumber());
+				return archivesAutoService.pageByArchivesAuto2(archivesAuto);
+			}
+		}
 	}
 
 	/**
@@ -323,6 +340,24 @@ public class ArchivesAutoController extends BladeController {
 	}
 
 
+	@PostMapping("/archiveAutoPercentComplete")
+	public R archiveAutoPercentComplete(Long projectId,Long contractId,Long nodeId) {
+		try{
+			//先验证当前项目是否在自动组卷中,组卷中直接返回
+			//ProjectInfo projectInfo = projectClient.getById(String.valueOf(projectId));
+			ContractInfo contract = contractClient.getContractById(contractId);
+			Integer isArchivesAuto = contract.getIsArchivesAuto();
+			if(isArchivesAuto==-1 || isArchivesAuto==null || isArchivesAuto==0){
+				isArchivesAuto=100;
+			}
+			return R.data(isArchivesAuto);
+		}catch (Exception e){
+			e.printStackTrace();
+			return R.fail(e.getMessage());
+		}
+
+	}
+
 	/**
 	 * 自动组卷入口
 	 * projectId 为当前项目
@@ -335,14 +370,16 @@ public class ArchivesAutoController extends BladeController {
 	public R archiveAutoMethod(Long projectId,Long contractId,Long nodeId) {
 		try{
 			//先验证当前项目是否在自动组卷中,组卷中直接返回
-			ProjectInfo projectInfo = projectClient.getById(String.valueOf(projectId));
-			Integer isArchivesAuto = projectInfo.getIsArchivesAuto();
-			if(isArchivesAuto!=null && isArchivesAuto!=0){
-				return R.fail("当前项目已经在自动组卷中,请耐心等待");
+			//ProjectInfo projectInfo = projectClient.getById(String.valueOf(projectId));
+			ContractInfo contract = contractClient.getContractById(contractId);
+
+			Integer isArchivesAuto = contract.getIsArchivesAuto();
+			if(isArchivesAuto!=-1 && isArchivesAuto!=null && isArchivesAuto!=0){
+				return R.fail("当前合同段已经在自动组卷中,请耐心等待");
 			}
 			log.info("开始自动组卷....");
 			//设置自动组卷中
-			projectClient.updateIsArchivesAutoById(projectId,1);
+			contractClient.updateIsArchivesAutoById(contractId,1);
 
 			archivesAutoService.archiveAutoMethodThread(projectId,contractId,nodeId);
 			return R.data("自动组卷中,请耐心等待");
@@ -350,7 +387,7 @@ public class ArchivesAutoController extends BladeController {
 			e.printStackTrace();
 			log.error("自动组卷保错。"+e.getMessage()+"--projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId);
 			//设置自动组卷结束
-			projectClient.updateIsArchivesAutoById(projectId,0);
+			contractClient.updateIsArchivesAutoById(contractId,0);
 			return R.fail(e.getMessage());
 		}
 
@@ -471,7 +508,7 @@ public class ArchivesAutoController extends BladeController {
 	@ApiOperation(value = "修改", notes = "传入review")
 	public R review(@RequestParam Long id) {
 		ArchivesAuto archivesAuto = archivesAutoService.getById(id);
-		if (archivesAuto == null) {
+		if (archivesAuto != null) {
 			archivesAuto.setIsReviewed(1);
 			return R.status(archivesAutoService.updateById(archivesAuto));
 		}

+ 7 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java

@@ -125,4 +125,11 @@ public interface ArchivesAutoMapper extends BaseMapper<ArchivesAuto> {
 	List<User> getArchiveDestroyUser();
 
     String getUserRoleName(@Param("projectId") Long projectId, @Param("contractId") Long contractId, @Param("userId") Long userId);
+
+    List<ArchivesAutoVO> getArchivesCabinet(@Param("vo") ArchivesAutoVO archivesAuto);
+
+	List<ArchivesAutoVO> pageByArchivesAuto3(IPage page, @Param("vo") ArchivesAutoVO vo);
+
+	List<ArchivesAutoVO> pageByArchivesAuto4(@Param("vo") ArchivesAutoVO vo);
+
 }

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

@@ -169,18 +169,21 @@
             select id
             from u_archives_auto
             where project_id = #{projectId}
-              and is_auto_file
-            !=1
-          and is_deleted=0
-          and is_lock!=1
-          and node_id in (
-            SELECT id FROM m_archive_tree_contract
-            WHERE is_deleted = 0
-          AND project_id = #{projectId}
-          AND ( contract_id = #{contractId}
-           OR tree_code = #{treeCode} )
-            )
-            );
+                and is_auto_file!=1
+                and is_deleted=0
+                and is_lock!=1
+                and node_id in (
+                    SELECT id FROM m_archive_tree_contract
+                    WHERE is_deleted = 0
+                    AND project_id = #{projectId}
+                    <if test="contractId == null">
+                        AND ( contract_id is null OR tree_code = #{treeCode} )
+                    </if>
+                    <if test="contractId != null">
+                        AND ( contract_id = #{contractId} OR tree_code = #{treeCode} )
+                    </if>
+                )
+          );
 
         update u_archives_auto
         set is_deleted=1
@@ -191,8 +194,12 @@
             and node_id in (
                 SELECT id FROM m_archive_tree_contract
                 WHERE is_deleted = 0 AND project_id = #{projectId}
-          AND ( contract_id = #{contractId}
-           OR tree_code = #{treeCode} )
+                <if test="contractId == null">
+                    AND ( contract_id is null OR tree_code = #{treeCode} )
+                </if>
+                <if test="contractId != null">
+                    AND ( contract_id = #{contractId} OR tree_code = #{treeCode} )
+                </if>
             );
     </update>
 
@@ -322,8 +329,13 @@
             and node_id in (
                 SELECT id FROM m_archive_tree_contract
                 WHERE is_deleted = 0 AND project_id = #{projectId}
-          AND ( contract_id = #{contractId}
-           OR tree_code = #{treeCode} )
+                <if test="contractId == null">
+                    AND ( contract_id is null OR tree_code = #{treeCode} )
+                </if>
+                <if test="contractId != null">
+                    AND ( contract_id = #{contractId} OR tree_code = #{treeCode} )
+                </if>
+
             )
     </select>
 
@@ -409,6 +421,7 @@
             </foreach>
         </if>
         GROUP BY uaa.id
+        order by uaa.tree_sort,uaa.auto_file_sort,uaa.file_number asc
     </select>
 
     <select id="pageByArchivesAuto2" resultMap="archivesAutoResultMap">
@@ -461,6 +474,112 @@
             </foreach>
         </if>
         GROUP BY uaa.id
+        order by uaa.tree_sort,uaa.auto_file_sort,uaa.file_number asc
+    </select>
+
+    <select id="pageByArchivesAuto3" resultMap="archivesAutoResultMap">
+        select uaa.* from
+        (SELECT id FROM m_archive_tree_contract WHERE project_id =#{vo.projectId}
+        and  ancestors like concat('%',#{vo.nodeId},'%')
+        ) matc left join u_archives_auto uaa on matc.id = uaa.node_id left join u_archive_file uaf on uaa.id =
+        uaf.archive_id
+        where uaa.is_deleted = 0 and uaa.is_archive = 1
+        GROUP BY uaa.id
+        order by uaa.tree_sort,uaa.auto_file_sort,uaa.file_number asc
+    </select>
+
+    <select id="pageByArchivesAuto4" resultMap="archivesAutoResultMap">
+        select uaa.id from
+        (SELECT id FROM m_archive_tree_contract WHERE project_id =#{vo.projectId}
+        and  ancestors like concat('%',#{vo.nodeId},'%')
+        ) matc left join u_archives_auto uaa on matc.id = uaa.node_id left join u_archive_file uaf on uaa.id =
+        uaf.archive_id
+        where uaa.is_deleted = 0 and uaa.is_archive = 1
+        <if test="vo.searchType == 1 and vo.queryValue != null and vo.queryValue != ''">
+            and uaa.name like concat('%',#{vo.queryValue},'%')
+        </if>
+        <if test="vo.searchType == 2 and vo.queryValue != null and vo.queryValue != ''">
+            and uaf.file_name like concat('%',#{vo.queryValue},'%')
+        </if>
+        <if test="vo.storageTimes != null and vo.storageTimes != ''">
+            and uaa.storage_time in
+            <foreach collection="vo.storageTimes" item="storageTime" open="(" separator="," close=")">
+                #{storageTime}
+            </foreach>
+        </if>
+        <if test="vo.secretLevels != null and vo.secretLevels != ''">
+            and uaa.secret_level in
+            <foreach collection="vo.secretLevels" item="secretLevel" open="(" separator="," close=")">
+                #{secretLevel}
+            </foreach>
+        </if>
+        <if test="vo.carrierTypes != null and vo.carrierTypes != ''">
+            and uaa.carrier_type in
+            <foreach collection="vo.carrierTypes" item="carrierType" open="(" separator="," close=")">
+                #{carrierType}
+            </foreach>
+        </if>
+        <if test="vo.years != null and vo.years != ''">
+            and
+            <foreach collection="vo.years" item="year" separator=" or" open="(" close=")">
+                #{year} BETWEEN DATE_FORMAT(uaa.start_date,'%Y') and DATE_FORMAT(uaa.end_date ,'%Y')
+            </foreach>
+        </if>
+        <if test="vo.months != null and vo.months != ''">
+            and
+            <foreach collection="vo.months" item="month" separator=" or" open="(" close=")">
+                #{month} BETWEEN DATE_FORMAT(uaa.start_date,'%c') and DATE_FORMAT(uaa.end_date ,'%c')
+            </foreach>
+        </if>
+        GROUP BY uaa.id
+        order by uaa.tree_sort,uaa.auto_file_sort,uaa.file_number asc
+    </select>
+
+    <select id="getArchivesCabinet" resultMap="archivesAutoResultMap">
+        select uaa.* from
+        (SELECT id FROM m_archive_tree_contract WHERE project_id =#{vo.projectId}
+        and  ancestors like concat('%',#{vo.nodeId},'%')
+        ) matc left join u_archives_auto uaa on matc.id = uaa.node_id left join u_archive_file uaf on uaa.id =
+        uaf.archive_id
+        where uaa.is_deleted = 0 and uaa.is_archive = 1
+        <if test="vo.searchType == 1 and vo.queryValue != null and vo.queryValue != ''">
+            and uaa.name like concat('%',#{vo.queryValue},'%')
+        </if>
+        <if test="vo.searchType == 2 and vo.queryValue != null and vo.queryValue != ''">
+            and uaf.file_name like concat('%',#{vo.queryValue},'%')
+        </if>
+        <if test="vo.storageTimes != null and vo.storageTimes != ''">
+            and uaa.storage_time in
+            <foreach collection="vo.storageTimes" item="storageTime" open="(" separator="," close=")">
+                #{storageTime}
+            </foreach>
+        </if>
+        <if test="vo.secretLevels != null and vo.secretLevels != ''">
+            and uaa.secret_level in
+            <foreach collection="vo.secretLevels" item="secretLevel" open="(" separator="," close=")">
+                #{secretLevel}
+            </foreach>
+        </if>
+        <if test="vo.carrierTypes != null and vo.carrierTypes != ''">
+            and uaa.carrier_type in
+            <foreach collection="vo.carrierTypes" item="carrierType" open="(" separator="," close=")">
+                #{carrierType}
+            </foreach>
+        </if>
+        <if test="vo.years != null and vo.years != ''">
+            and
+            <foreach collection="vo.years" item="year" separator=" or" open="(" close=")">
+                #{year} BETWEEN DATE_FORMAT(uaa.start_date,'%Y') and DATE_FORMAT(uaa.end_date ,'%Y')
+            </foreach>
+        </if>
+        <if test="vo.months != null and vo.months != ''">
+            and
+            <foreach collection="vo.months" item="month" separator=" or" open="(" close=")">
+                #{month} BETWEEN DATE_FORMAT(uaa.start_date,'%c') and DATE_FORMAT(uaa.end_date ,'%c')
+            </foreach>
+        </if>
+        GROUP BY uaa.id
+        order by uaa.tree_sort,uaa.auto_file_sort,uaa.file_number asc
     </select>
 
     <select id="getAllArchiveByContractType" resultType="org.springblade.archive.vo.ArchivesAutoVO">
@@ -524,6 +643,7 @@
 
         </if>
         and uaa.is_archive = 1
+        order by uaa.tree_sort,uaa.auto_file_sort,uaa.file_number asc
     </select>
     <select id="getFilingUnitList" resultType="java.lang.String">
         SELECT unit

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

@@ -20,6 +20,7 @@ import org.springblade.archive.entity.ArchivesAuto;
 import org.springblade.archive.vo.ArchivesAutoVO;
 import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.core.tool.api.R;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.user.entity.User;
@@ -83,4 +84,8 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 	void archiveAutoMethodThread(Long projectId, Long contractId, Long nodeId);
 
 	List<User> getArchiveDestroyUser();
+
+	List<Map<String,List<Map<String,String>>>> getArchivesCabinet(ArchivesAutoVO archivesAuto);
+
+	R pageByArchivesAuto2(ArchivesAutoVO archivesAuto);
 }

+ 160 - 10
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -37,6 +37,7 @@ import org.springblade.archive.mapper.ArchivesAutoMapper;
 import org.springblade.archive.service.IArchivesAutoService;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.feign.ArchiveFileClient;
+import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Condition;
@@ -44,6 +45,7 @@ import org.springblade.core.mp.support.Query;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.manager.entity.ArchiveTreeContract;
@@ -155,6 +157,132 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		return page.setRecords(archivesAutos);
 	}
 
+	@Override
+	public R pageByArchivesAuto2(ArchivesAutoVO vo) {
+		IPage<ArchivesAutoVO> page = new Page<>(vo.getCurrent(),vo.getSize());
+		if (StringUtils.isNotBlank(vo.getStorageTime())) {
+			vo.setStorageTimes(Arrays.asList(vo.getStorageTime().split(",")));
+		}
+		if (StringUtils.isNotBlank(vo.getSecretLevel())){
+			vo.setSecretLevels(Arrays.asList(vo.getSecretLevel().split(",")));
+		}
+		if (StringUtils.isNotBlank(vo.getCarrierType())) {
+			vo.setCarrierTypes(Arrays.asList(vo.getCarrierType().split(",")));
+		}
+		if (StringUtils.isNotBlank(vo.getYear())) {
+			vo.setYears(Arrays.asList(vo.getYear().split(",")));
+		}
+		if (StringUtils.isNotBlank(vo.getMonth())) {
+			vo.setMonths(Arrays.asList(vo.getMonth().split(",")));
+		}
+		if (StringUtils.isNotBlank(vo.getCarrierType())) {
+			vo.setCarrierTypes(Arrays.asList(vo.getCarrierType().split(",")));
+		}
+		//获取单位首节点
+		ArchiveTreeContract	contract = archiveTreeContractClient.getFirstNodeByTreeCode(vo.getProjectId(),vo.getArchiveType());
+		vo.setNodeId(contract.getId());
+		//根据单位查询出当前箱子所有档案,最大为160条
+		List<ArchivesAutoVO> archivesAutos = baseMapper.pageByArchivesAuto3(page, vo);
+		//根据条件筛选
+		if (vo.getInnerSearch() != null){
+			vo.setQueryValue(vo.getInnerSearch());
+			vo.setSearchType(1);
+			vo.setStorageTimes(null);
+			vo.setSecretLevels(null);
+			vo.setCarrierTypes(null);
+			vo.setYears(null);
+			vo.setMonths(null);
+		}
+		List<ArchivesAutoVO> selectAutos = baseMapper.pageByArchivesAuto4(vo);
+		List<Long> ids = new ArrayList<>();
+		if (selectAutos != null && selectAutos.size() > 0) {
+			ids = selectAutos.stream().map(l -> l.getId()).collect(Collectors.toList());
+		}else {
+			ids.add(-1L);
+		}
+		if (archivesAutos != null && archivesAutos.size() >0) {
+			for (ArchivesAutoVO aa : archivesAutos) {
+				if (ids.contains(aa.getId())){
+					aa.setIsSelect(1);
+				}else {
+					aa.setIsSelect(0);
+				}
+				if (StringUtils.isNotBlank(aa.getStorageTime())) {
+					aa.setStorageTimeValue("3".equals(aa.getStorageTime()) ? "永久" : ("2".equals(aa.getStorageTime()) ? "30年" : "10年"));
+				}
+				if (StringUtils.isNotBlank(aa.getSecretLevel())) {
+					aa.setSecretLevelValue("1".equals(aa.getSecretLevel()) ? "机密" : ("2".equals(aa.getSecretLevel()) ? "绝密" : "秘密"));
+				}
+			}
+			//格式
+			List<List<ArchivesAutoVO>> listList = CommonUtil.splitList(archivesAutos, 8);
+			//一页,所有格子
+			List<Map<String, List<ArchivesAutoVO>>> allCell = new ArrayList<>();
+			//
+			for (List<ArchivesAutoVO> list : listList) {
+				//一个格子
+				List<ArchivesAutoVO> oneCell = new ArrayList<>();
+				oneCell.addAll(list);
+				Map<String, List<ArchivesAutoVO>> map = new HashMap<>();
+				map.put("children",oneCell);
+				allCell.add(map);
+			}
+			return R.data(allCell);
+		}else {
+			return null;
+		}
+	}
+
+	/**
+	 * 根据搜索获取档案柜
+	 * @param archivesAuto
+	 * @return
+	 */
+	@Override
+	public List<Map<String,List<Map<String,String>>>> getArchivesCabinet(ArchivesAutoVO archivesAuto) {
+		//获取单位首节点
+		ArchiveTreeContract	contract = archiveTreeContractClient.getFirstNodeByTreeCode(archivesAuto.getProjectId(),archivesAuto.getArchiveType());
+		archivesAuto.setNodeId(contract.getId());
+		//根据单位查询所有档案
+		List<ArchivesAutoVO> archivesAutos = baseMapper.getArchivesCabinet(archivesAuto);
+		if (archivesAutos != null && archivesAutos.size() > 0) {
+			List<List<ArchivesAutoVO>> listList = CommonUtil.splitList(archivesAutos, 160);
+			//所有页,所有柜子
+			List<Map<String, List<Map<String, String>>>> allPageCabinet = new ArrayList<>();
+			//所有的柜子
+			List<Map<String,String>> allCabinet = new ArrayList<>();
+			int CabinetTotal = 1;
+			//把所有档案分成柜子
+			for (List<ArchivesAutoVO> list : listList) {
+				//一个柜子
+				Map<String, String> map = new HashMap<>();
+				map.put("id",CabinetTotal+"");
+				if (CabinetTotal < 10){
+					map.put("name","0"+CabinetTotal);
+				}else {
+					map.put("name",CabinetTotal+"");
+				}
+				String[] min = list.get(0).getFileNumber().split("_");
+				String[] max = list.get(list.size()-1).getFileNumber().split("_");
+				map.put("content","档号"+min[min.length-1]+"~"+"档号"+max[max.length-1]);
+				//把每一个柜子都添加
+				allCabinet.add(map);
+			}
+			//把所有柜子按页分隔,每页4个
+			List<List<Map<String, String>>> lists = CommonUtil.splitList(allCabinet, 4);
+			//区分页数
+			for (List<Map<String, String>> list : lists) {
+				Map<String,List<Map<String,String>>> listMap = new HashMap<>();
+				listMap.put("children",list);
+				allPageCabinet.add(listMap);
+			}
+			return allPageCabinet;
+
+		}else {
+			return null;
+		}
+	}
+
 	@Override
 	public IPage<ArchivesAutoVO> selectArchivesAutoFilePage(ArchivesAutoVO vo) {
 		Query query = new Query();
@@ -336,8 +464,15 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			}else{
 				//没节点的按合同段
 				log.info("[自动组卷-拆卷]{}","对合同段下未锁定案卷拆卷。projectId:"+projectId+"-contractId:"+contractId+"-treeCode:"+treeCode);
+
+				List<String> archivesOutUrlList =null;
 				//清除案卷封面等pdf
-				List<String> archivesOutUrlList = baseMapper.getArchivesOutUrlListByContract(projectId,contractId,treeCode);
+				if(StringUtils.isEmpty(treeCode)){
+					archivesOutUrlList = baseMapper.getArchivesOutUrlListByContract(projectId,null,treeCode);
+				}else{
+					archivesOutUrlList = baseMapper.getArchivesOutUrlListByContract(projectId,contractId,treeCode);
+				}
+
 				if(archivesOutUrlList!=null && archivesOutUrlList.size()>0){
 					for(String outUrl:archivesOutUrlList){
 						String[] splits = outUrl.split(",");
@@ -364,8 +499,14 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 					log.info("[自动组卷-拆卷]{}","删除旧封面,页码文件结束"+removeFiles);
 				});
 
-				//没节点的按合同段
-				baseMapper.splitArchviesByContract(projectId,contractId,treeCode);
+				if(StringUtils.isEmpty(treeCode)){
+					//没节点的按合同段
+					baseMapper.splitArchviesByContract(projectId,null,treeCode);
+				}else{
+					//没节点的按合同段
+					baseMapper.splitArchviesByContract(projectId,contractId,treeCode);
+				}
+
 			}
 
 		}
@@ -1608,14 +1749,22 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	public List<ArchiveTreeContract> archiveTreeContractFilter(List<ArchiveTreeContract> archiveTreeContracts, String treeCode, String nodeId,Long contractId) {
 		List<ArchiveTreeContract> result = new ArrayList<>();
 
-		if (StringUtils.isEmpty(treeCode) && StringUtils.isEmpty(nodeId)) {
+		if (contractId==null) {
 			return archiveTreeContracts;
 		}
 
 		for (ArchiveTreeContract contract : archiveTreeContracts) {
 			if (StringUtils.isEmpty(treeCode)) {
-				if (StringUtils.isNotEmpty(contract.getAncestors()) && contract.getAncestors().contains(nodeId)) {
-					result.add(contract);
+				//业主合同段时treeCode为空串
+				if(StringUtils.isNotEmpty(nodeId)){
+					//如果还选择了节点
+					if (StringUtils.isNotEmpty(contract.getAncestors()) && contract.getAncestors().contains(nodeId)) {
+						result.add(contract);
+					}
+				}else{
+					if (StringUtils.isEmpty(contract.getTreeCode()) || contractId.toString().equals(contract.getTreeCode())) {
+						result.add(contract);
+					}
 				}
 			} else {
 				if (treeCode.equals(contract.getTreeCode()) || contractId.toString().equals(contract.getTreeCode())) {
@@ -1655,13 +1804,13 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 				log.info("[自动组卷]{}","开始对未锁定案卷拆卷。projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId);
 				splitArchvies(projectId,contractId,nodeId);
 				//设置完成度10%
-				projectClient.updateIsArchivesAutoById(projectId,10);
+				contractClient.updateIsArchivesAutoById(contractId,10);
 
 				//项目自动组卷入口
 				log.info("[自动组卷]{}","开始自动组卷。projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId);
 				archiveAutoMethod(projectId,contractId,nodeId);
 				//设置完成度80%
-				projectClient.updateIsArchivesAutoById(projectId,80);
+				contractClient.updateIsArchivesAutoById(contractId,80);
 
 				//刷新项目档号
 				log.info("[自动组卷]{}","开始刷新组卷档号。projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId);
@@ -1669,13 +1818,13 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 
 				//设置自动组卷结束
-				projectClient.updateIsArchivesAutoById(projectId,0);
+				contractClient.updateIsArchivesAutoById(contractId,0);
 				log.info("[自动组卷]{}","自动组卷完成。projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId);
 			}catch (Exception e){
 				e.printStackTrace();
 				log.error("自动组卷报错。"+e.getMessage()+"--projectId:"+projectId+"-contractId:"+contractId+"-nodeId:"+nodeId);
 				//设置自动组卷结束
-				projectClient.updateIsArchivesAutoById(projectId,0);
+				contractClient.updateIsArchivesAutoById(contractId,0);
 			}
 		});
 	}
@@ -1684,4 +1833,5 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		return autoMapper.getArchiveDestroyUser();
 	}
 
+
 }

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

@@ -382,9 +382,12 @@ public class ArchiveFileController extends BladeController {
         list.stream().forEach(l -> {
             if (l.getIsNeedCertification() == 0) {
                 l.setIsCertification(1);
-            } else {
+            }else {
                 l.setIsCertification(0);
             }
+            if (l.getIsApproval() == 0){
+                l.setStatus(2);
+            }
         });
         return R.data(this.archiveFileService.updateBatchById(list));
     }

+ 11 - 0
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/InformationQueryClientImpl.java

@@ -9,6 +9,7 @@ import org.springblade.business.entity.InformationQueryFile;
 import org.springblade.business.feign.InformationQueryClient;
 import org.springblade.business.service.IInformationQueryFileService;
 import org.springblade.business.service.IInformationQueryService;
+import org.springblade.business.vo.QueryProcessDataVO;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -91,4 +92,14 @@ public class InformationQueryClientImpl implements InformationQueryClient {
         return iInformationQueryService.getFirstInfoByWbsId(WbsId);
     }
 
+    @Override
+    public List<QueryProcessDataVO> getNodeChildTabColsWithValueByTabName(String initTabName,String pKeyId) {
+        return iInformationQueryService.getNodeChildTabColsWithValueByTabName(initTabName,pKeyId);
+    }
+
+    @Override
+    public List<QueryProcessDataVO> getNodeChildTabColsAllByTabName(String initTabName) {
+        return iInformationQueryService.getNodeChildTabColsAllByTabName(initTabName);
+    }
+
 }

+ 2 - 2
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/MetadataClassificationClientImpl.java

@@ -27,7 +27,7 @@ public class MetadataClassificationClientImpl implements MetadataClassificationC
     }
 
     @Override
-    public boolean updateMetadata(List<MetadataClassificationVO> vos) {
-        return iMetadataClassificationService.updateMetadata(vos);
+    public boolean updateMetadata(MetadataClassificationVO vo) {
+        return iMetadataClassificationService.updateMetadata(vo);
     }
 }

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

@@ -333,7 +333,7 @@
     <select id="getAllArchiveFileByContractType" resultType="org.springblade.business.vo.ArchiveFileVO">
         SELECT uaf.*, matc.tree_code as 'contractType'
         FROM u_archive_file uaf
-                 inner join m_archive_tree_contract matc on uaf.node_id = matc.id
+                 left join m_archive_tree_contract matc on uaf.node_id = matc.id
         WHERE uaf.project_id = #{projectId} and uaf.is_deleted = 0
             and (uaf.is_auto_file is null or uaf.is_auto_file != 1);
     </select>

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

@@ -123,5 +123,8 @@ public interface InformationQueryMapper extends BaseMapper<InformationQuery> {
     // 获取当前节点下,所有表单的字段数据,根据表名
     List<QueryProcessDataVO> getNodeChildTabColsAllByTabName(String tabName);
 
+    // 查询当前节点下,表单的有值的字段数据,根据表名
+    List<QueryProcessDataVO> getNodeChildTabColsWithValueByTabName(String tabName, String pKeyId);
+
     List<InformationQuery> selectChildrenNodeInfo(@Param("node") WbsTreeContract node);
 }

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

@@ -846,6 +846,22 @@
                   in (#{tabName})
         GROUP BY table_name
     </select>
+
+    <!--获取当前节点下,表单的有值的字段数据-->
+    <select id="getNodeChildTabColsWithValueByTabName" resultMap="queryProcessDataMap">
+        SELECT
+            table_name AS queryType,
+            GROUP_CONCAT(COLUMN_name) AS ancestors
+        FROM
+            information_schema.COLUMNS
+        WHERE
+            table_name IN (#{tabName}) AND
+            CONCAT_WS('', COALESCE(COLUMN_NAME, ''), COALESCE(DATA_TYPE, ''), COALESCE(CHARACTER_MAXIMUM_LENGTH, '')) IS NOT NULL
+        GROUP BY
+            table_name
+    </select>
+
+
     <select id="selectChildrenNodeInfo" resultType="org.springblade.business.entity.InformationQuery">
         SELECT *
         FROM u_information_query

+ 3 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/IInformationQueryService.java

@@ -150,4 +150,7 @@ public interface IInformationQueryService extends BaseService<InformationQuery>
     InformationQuery getFirstInfoByWbsId(String wbsId);
 
     List<InformationQuery> selectChildrenNodeInfo(WbsTreeContract node);
+
+    List<QueryProcessDataVO> getNodeChildTabColsWithValueByTabName(String initTabName, String pKeyId);
+
 }

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

@@ -23,5 +23,5 @@ public interface IMetadataClassificationService extends BaseService<MetadataClas
 
     List<MetadataClassificationVO> getMetadataFile(Long fileId);
 
-    boolean updateMetadata(List<MetadataClassificationVO> vos);
+    boolean updateMetadata(MetadataClassificationVO vo);
 }

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

@@ -883,4 +883,9 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
         return this.baseMapper.selectChildrenNodeInfo(node);
     }
 
+    @Override
+    public List<QueryProcessDataVO> getNodeChildTabColsWithValueByTabName(String initTabName,String pKeyId) {
+        return baseMapper.getNodeChildTabColsWithValueByTabName(initTabName,pKeyId);
+    }
+
 }

+ 9 - 5
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/MetadataClassificationServiceImpl.java

@@ -197,19 +197,23 @@ public class MetadataClassificationServiceImpl
     }
 
     @Override
-    public boolean updateMetadata(List<MetadataClassificationVO> vos) {
+    public boolean updateMetadata(MetadataClassificationVO vo) {
         try {
             BladeUser user = AuthUtil.getUser();
             StringBuilder sqlBuild = new StringBuilder();
             sqlBuild.append("update u_metadata_file set ");
-            for (MetadataClassificationVO key : vos) {
-                if (key.getFileId() != null) {
-                    sqlBuild.append(" " + key.getFieldKey() + " = '" + key.getKeyValue() + "' , ");
+            for (MetadataClassificationVO key : vo.getList()) {
+                if (key.getFileId() != null && key.getKeyValue() != null && key.getKeyValue() != "") {
+                    if(key.getFieldType().equals("4")){
+                        sqlBuild.append(" " + key.getFieldKey() + " = " + key.getKeyValue() + " , ");
+                    }else {
+                        sqlBuild.append(" " + key.getFieldKey() + " = '" + key.getKeyValue() + "' , ");
+                    }
                 }
             }
             sqlBuild.append(" update_user = '" + user.getUserId() + "' , ");
             sqlBuild.append(" update_time = '" + DateUtil.formatDateTime(new Date()) + "' ");
-            sqlBuild.append(" where file_id = " + vos.get(0).getFileId());
+            sqlBuild.append(" where file_id = " + vo.getList().get(0).getFileId());
             jdbcTemplate.execute(sqlBuild.toString());
         } catch (DataAccessException e) {
             e.printStackTrace();

+ 2 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsParamController.java

@@ -158,14 +158,14 @@ public class WbsParamController {
                     for (WbsParamBean b : updateList) {
                         WbsParam old = this.service.getById(b.getId());
                         if (pb.isCommon()) {
-                            if (old != null && !old.getK().equals(b.getK())) {
+                            if (old != null && (!old.getV().equals(b.getV())||StringUtils.isNotEquals(old.getRemark(),b.getRemark()))) {
                                 /*只有公式内容变化的时候才需要更新*/
                                 old.setIsDeleted(0);
                                 BeanUtils.copyProperties(b, old);
                                 ul.add(old);
                             }
                         } else {
-                            if (old != null && !old.getV().equals(b.getV())) {
+                            if (old != null && (!old.getV().equals(b.getV())||StringUtils.isNotEquals(old.getRemark(),b.getRemark()))) {
                                 /*只有公式内容变化的时候才需要更新*/
                                 old.setIsDeleted(0);
                                 BeanUtils.copyProperties(b, old);

+ 1 - 14
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java

@@ -157,19 +157,6 @@ public class WbsTreeContractController extends BladeController {
                 .eq(WbsTreeContract::getPKeyId, id).eq(WbsTreeContract::getIsDeleted, 0)));
     }
 
-    /**
-     * 同步项目下当前表的所有htmlUrl
-     */
-    @GetMapping("/syncCurrentFormInProject")
-    @ApiOperationSupport(order = 8)
-    @ApiOperation(value = "同步项目下当前表的所有htmlUrl", notes = "同步项目下当前表的所有htmlUrl")
-    @ApiImplicitParams(value = {
-            @ApiImplicitParam(name = "pKeyId", value = "主键id", required = true),
-    })
-    public R syncCurrentFormInProject(@RequestParam("pKeyId") Long pKeyId) {
-        iWbsTreeContractService.syncCurrentFormInProject(pKeyId);
-        return R.success("同步成功");
-    }
 
     /**
      * 资料填报 - 同步相同表数据(同一节点下,把施工表数据同步到监理表中)
@@ -180,7 +167,7 @@ public class WbsTreeContractController extends BladeController {
     @ApiImplicitParams(value = {
             @ApiImplicitParam(name = "pKeyId", value = "节点pKeyId", required = true)
     })
-    public R syncTabData(@RequestParam("pKeyId") String pKeyId) {
+    public R syncTabData(@RequestParam("pKeyId") String pKeyId) throws Exception {
         return R.status(iWbsTreeContractService.syncTabData(pKeyId));
     }
 

+ 14 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java

@@ -692,4 +692,18 @@ public class WbsTreePrivateController extends BladeController {
         return R.status(true);
     }
 
+    /**
+     * 同步项目下当前表的所有htmlUrl
+     */
+    @GetMapping("/syncCurrentFormInProject")
+    @ApiOperationSupport(order = 8)
+    @ApiOperation(value = "同步项目下当前表的所有htmlUrl", notes = "同步项目下当前表的所有htmlUrl")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "pKeyId", value = "主键id", required = true),
+    })
+    public R syncCurrentFormInProject(@RequestParam("pKeyId") Long pKeyId) {
+        wbsTreePrivateService.syncCurrentFormInProject(pKeyId);
+        return R.success("同步成功");
+    }
+
 }

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

@@ -2,6 +2,7 @@ package org.springblade.manager.feign;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
+import org.springblade.archive.vo.ArchivesAutoVO;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.manager.mapper.ArchiveTreeContractMapper;
 import org.springblade.manager.service.IArchiveTreeContractService;
@@ -82,5 +83,18 @@ public class ArchiveTreeContractImpl implements ArchiveTreeContractClient {
         return archiveTreeContractService.getArchiveTreeContractListByIds(ids);
     }
 
+    @Override
+    public ArchiveTreeContract getFirstNodeByTreeCode(Long projectId,Integer type) {
+        ArchiveTreeContract contract = new ArchiveTreeContract();
+        if (type == 1){
+            contract = archiveTreeContractMapper.getFirstNodeByTreeCode(projectId);
+        }else if (type == 2){
+            contract = archiveTreeContractMapper.getFirstNodeByTreeCode2(projectId,"C");
+        }else {
+            contract = archiveTreeContractMapper.getFirstNodeByTreeCode2(projectId,"S");
+        }
+        return contract;
+    }
+
 
 }

+ 7 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ContractClientImpl.java

@@ -86,5 +86,12 @@ public class ContractClientImpl implements ContractClient {
         return list;
     }
 
+    @Override
+    public void updateIsArchivesAutoById(Long id, Integer isArchivesAuto) {
+        ContractInfo contractInfo = contractInfoService.getById(id);
+        contractInfo.setIsArchivesAuto(isArchivesAuto);
+        contractInfoService.updateById(contractInfo);
+    }
+
 
 }

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

@@ -92,4 +92,8 @@ public interface ArchiveTreeContractMapper extends BaseMapper<ArchiveTreeContrac
     String getUserRoleName(@Param("projectId") Long projectId, @Param("contractId") Long contractId, @Param("userId") Long userId);
 
     ArchiveTreeContract getArchiveTreeContractByNodeName(@Param("nodeName") String nodeName);
+
+    ArchiveTreeContract getFirstNodeByTreeCode(@Param("projectId") Long projectId);
+
+    ArchiveTreeContract getFirstNodeByTreeCode2(@Param("projectId") Long projectId,@Param("type") String type);
 }

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

@@ -438,4 +438,14 @@
         FROM  m_archive_tree_contract
         WHERE node_name = #{nodeName} and is_deleted = 0
     </select>
+    <select id="getFirstNodeByTreeCode" resultType="org.springblade.manager.entity.ArchiveTreeContract">
+        select * from m_archive_tree_contract
+        WHERE parent_id = (select id from m_archive_tree_contract WHERE parent_id = 0 and project_id = #{projectId})
+          and tree_code is NULL
+    </select>
+    <select id="getFirstNodeByTreeCode2" resultType="org.springblade.manager.entity.ArchiveTreeContract">
+        select * from m_archive_tree_contract
+        WHERE parent_id = (select id from m_archive_tree_contract WHERE parent_id = 0 and project_id = #{projectId})
+          and tree_code = #{type}
+    </select>
 </mapper>

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

@@ -86,5 +86,5 @@ public interface WbsTreeContractMapper extends EasyBaseMapper<WbsTreeContract> {
 
     Long getAllTableFileSize(@Param("projectId") Long projectId);
 
-    void syncCurrentFormInProject(@Param("node") WbsTreeContract node);
+    void syncCurrentFormToAllContract(@Param("wbsTreePrivate") WbsTreePrivate wbsTreePrivate);
 }

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

@@ -608,10 +608,10 @@
             #{ids}
         </foreach>
     </update>
-    <update id="syncCurrentFormInProject">
+    <update id="syncCurrentFormToAllContract">
         UPDATE m_wbs_tree_contract
-        SET html_url = #{node.htmlUrl}
-        WHERE project_id = #{node.projectId} and excel_id = #{node.excelId}
+        SET html_url = #{wbsTreePrivate.htmlUrl} , init_table_name = #{wbsTreePrivate.initTableName}
+        WHERE project_id = #{wbsTreePrivate.projectId} and excel_id = #{wbsTreePrivate.excelId}
     </update>
 
     <select id="selectQueryValueLikeNodeName" resultMap="ResultMap">

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

@@ -94,4 +94,5 @@ public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
 
     List<WbsTreePrivateVO5> treeRecordTrial(String wbsId, String projectId, Integer wbsType);
 
+    void syncCurrentFormInProject(@Param("wbsTreePrivate") WbsTreePrivate wbsTreePrivate);
 }

+ 5 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml

@@ -312,6 +312,11 @@
             where p_key_id = #{item.pKeyId}
         </foreach>
     </update>
+    <update id="syncCurrentFormInProject">
+        UPDATE m_wbs_tree_private
+        SET html_url = #{wbsTreePrivate.htmlUrl} , init_table_name = #{wbsTreePrivate.initTableName} , init_table_id = #{wbsTreePrivate.initTableId}
+        WHERE project_id = #{wbsTreePrivate.projectId} and excel_id = #{wbsTreePrivate.excelId}
+    </update>
 
     <select id="lazyTree" resultMap="treeNodeResultMap">
         SELECT

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

@@ -57,6 +57,7 @@ public interface IWbsTreeContractService extends BaseService<WbsTreeContract> {
     // 频率设计值  添加表单
     boolean addTabInfoByRan(RangeInfo info, List<Object> moreData, String[] excLenght) throws FileNotFoundException;
 
-    boolean syncTabData(String pKeyId);
-    void syncCurrentFormInProject(Long pKeyId);
+    boolean syncTabData(String pKeyId) throws Exception;
+
+    void syncCurrentFormToAllContract(WbsTreePrivate wbsTreePrivate);
 }

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

@@ -90,4 +90,5 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
 
     Map<String, List<Object>> treeRecordTrial(String wbsId, String projectId, String pKeyId);
 
+    void syncCurrentFormInProject(Long pKeyId);
 }

+ 368 - 99
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -7,18 +7,27 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.google.common.collect.Lists;
+import jodd.util.ArraysUtil;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.ObjectUtils;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
 import org.springblade.business.entity.ConstructionLedger;
 import org.springblade.business.feign.ConstructionLedgerFeignClient;
 import org.springblade.business.feign.InformationQueryClient;
+import org.springblade.business.vo.QueryProcessDataVO;
+import org.springblade.common.constant.CommonConstant;
+import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.FileUtils;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.*;
 import org.springblade.manager.dto.RangeInfo;
@@ -33,16 +42,15 @@ import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.service.IWbsTreeContractService;
 import org.springblade.manager.utils.DiffListUtil;
 import org.springblade.manager.vo.*;
+import org.springblade.system.cache.ParamCache;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.LinkedCaseInsensitiveMap;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
+import java.io.*;
 import java.util.*;
 import java.util.function.Function;
 import java.util.regex.Matcher;
@@ -539,24 +547,27 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
     }
 
     @Override
-    public void syncCurrentFormInProject(Long pKeyId) {
-        WbsTreeContract node = this.getOne(new LambdaQueryWrapper<WbsTreeContract>().eq(WbsTreeContract::getPKeyId, pKeyId));
-        baseMapper.syncCurrentFormInProject(node);
+    public void syncCurrentFormToAllContract(WbsTreePrivate wbsTreePrivate) {
+        baseMapper.syncCurrentFormToAllContract(wbsTreePrivate);
     }
 
     @Override
-    public boolean syncTabData(String pKeyId) {
+    public boolean syncTabData(String pKeyId) throws Exception {
         WbsTreeContract node = baseMapper.selectOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, pKeyId));
         if (node != null) {
+            //表maps
+            Map<String, String> sgTabMaps = new LinkedHashMap<>();
+            Map<String, String> jlTabMaps = new LinkedHashMap<>();
+
             List<WbsTreeContract> tabs = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getParentId, node.getId())
-                    .select(WbsTreeContract::getNodeName, WbsTreeContract::getTableOwner, WbsTreeContract::getPKeyId, WbsTreeContract::getInitTableName, WbsTreeContract::getSort, WbsTreeContract::getFullName, WbsTreeContract::getUpdateTime, WbsTreeContract::getOldId)
+                    .select(WbsTreeContract::getNodeName, WbsTreeContract::getTableOwner, WbsTreeContract::getPKeyId, WbsTreeContract::getInitTableName, WbsTreeContract::getSort, WbsTreeContract::getFullName, WbsTreeContract::getUpdateTime)
                     .eq(WbsTreeContract::getContractId, node.getContractId()).eq(WbsTreeContract::getType, 2)
                     .eq(WbsTreeContract::getWbsId, node.getWbsId()).eq(WbsTreeContract::getWbsType, node.getWbsType())
                     .eq(WbsTreeContract::getStatus, 1));
 
+            //初始化表
             List<WbsTreeContract> sgTab = tabs.stream().filter(f -> "1,2,3".contains(f.getTableOwner())).collect(Collectors.toList());
             List<WbsTreeContract> jlTab = tabs.stream().filter(f -> "4,5,6".contains(f.getTableOwner())).collect(Collectors.toList());
-
             List<WbsTreeContract> sgTabSort = sgTab.stream()
                     .sorted((a, b) -> {
                         Integer aSort = a.getSort() != null ? a.getSort() : 0;
@@ -579,41 +590,6 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                         return aUpdateTime.compareTo(bUpdateTime);
                     })
                     .collect(Collectors.toList());
-
-            Map<String, String> sgYsNodeMaps = new HashMap<>();
-            Map<String, String> jlYsNodeMaps = new HashMap<>();
-            Map<String, String> plYsMaps = new HashMap<>();
-
-            Map<String, String> sgCopyNodeMaps = new HashMap<>();
-            Map<String, String> jlCopyNodeMaps = new HashMap<>();
-            Map<String, String> plJlNodeMaps = new HashMap<>();
-
-            for (WbsTreeContract wbsTreeContract : sgTabSort) {
-                if (wbsTreeContract.getOldId() == null) {
-                    //施工原始表
-                    String s = extractAlphameric(wbsTreeContract.getNodeName());
-                    if (StringUtils.isNotEmpty(s)) {
-                        sgYsNodeMaps.put(s + "---" + wbsTreeContract.getPKeyId(), wbsTreeContract.getInitTableName());
-                    }
-                } else {
-                    //复制表
-                    if (wbsTreeContract.getNodeName().contains("__")) {
-                        String s = extractAlphameric(wbsTreeContract.getNodeName());
-                        if (StringUtils.isNotEmpty(s)) {
-                            sgCopyNodeMaps.put(s + "---" + wbsTreeContract.getPKeyId(), wbsTreeContract.getInitTableName());
-                        }
-                    }
-                    //原始频率表
-                    if (wbsTreeContract.getNodeName().contains("_PL_")) {
-                        String s = extractAlphameric(wbsTreeContract.getNodeName());
-                        if (StringUtils.isNotEmpty(s)) {
-                            plYsMaps.put(s + "---" + wbsTreeContract.getPKeyId(), wbsTreeContract.getInitTableName());
-                        }
-                    }
-                }
-
-            }
-
             List<WbsTreeContract> jlTabSort = jlTab.stream()
                     .sorted((a, b) -> {
                         Integer aSort = a.getSort() != null ? a.getSort() : 0;
@@ -637,79 +613,359 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                     })
                     .collect(Collectors.toList());
 
+            for (WbsTreeContract wbsTreeContract : sgTabSort) {
+                //质检表
+                String s = extractAlphameric(wbsTreeContract.getNodeName());
+                if (StringUtils.isNotEmpty(s)) {
+                    sgTabMaps.put(s + "---" + wbsTreeContract.getPKeyId(), wbsTreeContract.getInitTableName());
+                }
+            }
             for (WbsTreeContract wbsTreeContract : jlTabSort) {
-                if (wbsTreeContract.getOldId() == null) {
-                    //监理原始表
-                    String s = extractAlphameric(wbsTreeContract.getNodeName());
-                    if (StringUtils.isNotEmpty(s)) {
-                        jlYsNodeMaps.put(s + "---" + wbsTreeContract.getPKeyId(), wbsTreeContract.getInitTableName());
+                //监理表
+                String s = extractAlphameric(wbsTreeContract.getNodeName());
+                if (StringUtils.isNotEmpty(s)) {
+                    jlTabMaps.put(s + "---" + wbsTreeContract.getPKeyId(), wbsTreeContract.getInitTableName());
+                }
+            }
+
+            //构造表数据
+            List<InsertDataVO> resultData = new LinkedList<>();
+            this.syncTabDataImpl(sgTabMaps, jlTabMaps, resultData);
+
+            //入库处理
+            if (resultData.size() > 0) {
+                List<String> resultSQLS = new ArrayList<>();
+                Map<String, List<InsertDataVO>> maps = resultData.stream().filter(f -> f.getKey().contains("key_")).collect(Collectors.groupingBy(InsertDataVO::getInitTabName));
+
+                //对应入库的监理表的所有有效字段
+                Map<String, List<String>> filedTabMaps = new LinkedHashMap<>();
+                Set<String> initTabNames = maps.keySet();
+                for (String initTabName : initTabNames) {
+                    List<QueryProcessDataVO> tabColsAllByTabName = informationQueryClient.getNodeChildTabColsAllByTabName(initTabName);
+                    List<String> keys = tabColsAllByTabName.stream().map(QueryProcessDataVO::getAncestors).collect(Collectors.toList());
+                    if (keys.size() > 0) {
+                        filedTabMaps.put(initTabName, keys);
                     }
-                } else {
-                    //复制表
-                    if (wbsTreeContract.getNodeName().contains("__")) {
-                        String s = extractAlphameric(wbsTreeContract.getNodeName());
-                        if (StringUtils.isNotEmpty(s)) {
-                            jlCopyNodeMaps.put(s + "---" + wbsTreeContract.getPKeyId(), wbsTreeContract.getInitTableName());
+                }
+
+                //数据处理
+                for (Map.Entry<String, List<InsertDataVO>> oneTabData : maps.entrySet()) {
+                    String initTabName = oneTabData.getKey();
+                    List<InsertDataVO> dataValue = oneTabData.getValue();
+                    //监理表的所有有效字段
+                    List<String> keysAll = Func.toStrList(filedTabMaps.get(initTabName).get(0));
+
+                    //一张实体表中,多组数据,复制表共用同一张实体表,只是pKeyId不同
+                    Map<String, List<InsertDataVO>> oneTab = dataValue.stream().collect(Collectors.groupingBy(InsertDataVO::getPKeyId));
+
+                    for (Map.Entry<String, List<InsertDataVO>> tab : oneTab.entrySet()) {
+                        String tabPKeyId = tab.getKey();
+                        List<InsertDataVO> tabData = tab.getValue();
+                        StringBuilder dataSql = new StringBuilder();
+                        List<String> keys = new LinkedList<>();
+                        List<String> values = new LinkedList<>();
+                        for (InsertDataVO vo : tabData) {
+                            String key = vo.getKey();
+                            if (!keysAll.contains(key)) {
+                                continue;  //如果key不在监理表keysAll中,就跳过
+                            }
+                            if (!keys.contains(key)) { //解决重复key值问题
+                                keys.add(key);
+                                String data = vo.getData();
+                                values.add(data);
+                            }
                         }
-                    }
-                    //频率表
-                    if (wbsTreeContract.getNodeName().contains("_PL_")) {
-                        String s = extractAlphameric(wbsTreeContract.getNodeName());
-                        if (StringUtils.isNotEmpty(s)) {
-                            plJlNodeMaps.put(s + "---" + wbsTreeContract.getPKeyId(), wbsTreeContract.getInitTableName());
+                        if (keys.size() > 0 && values.size() > 0 && keys.size() == values.size()) {
+                            //delete SQL(删除旧数据,去重)
+                            String delSql = "delete from " + initTabName + " where p_key_id = " + tabPKeyId + ";";
+                            //insert SQL(新增)
+                            dataSql.append(delSql).append("insert into ")
+                                    .append(initTabName).append(" (id,p_key_id,group_id,")
+                                    .append(String.join(",", keys))
+                                    .append(") values (")
+                                    .append(SnowFlakeUtil.getId()).append(",")
+                                    .append(tabPKeyId).append(",null,")
+                                    .append(values.stream()
+                                            .map(s -> "'" + s + "'")
+                                            .collect(Collectors.joining(",")))
+                                    .append(");");
+
+                            resultSQLS.add(dataSql.toString());
                         }
                     }
                 }
+
+                //入库
+                if (resultSQLS.size() > 0) {
+                    List<List<String>> partition = Lists.partition(resultSQLS, 10);
+                    for (List<String> strings : partition) {
+                        jdbcTemplate.execute(StringUtils.join(strings, " "));
+                    }
+                }
             }
+            return true;
 
+        } else {
+            throw new ServiceException("未获取到当前节点信息,请联系管理员");
         }
-        return false;
     }
 
-    private void syncTabDataImpl(Map<String, String> sgData, Map<String, String> jlData, WbsTreeContract node) {
-        for (Map.Entry<String, String> sgTab : sgData.entrySet()) {
+    /**
+     * 构造数据
+     *
+     * @param sgData
+     * @param jlData
+     * @param resultData
+     * @throws Exception
+     */
+    private void syncTabDataImpl
+    (Map<String, String> sgData, Map<String, String> jlData, List<InsertDataVO> resultData) throws
+            Exception {
+        for (Map.Entry<String, String> sgTab : sgData.entrySet()) { //质检表
             String[] split = sgTab.getKey().split("---");
             String nodeNameRe = split[0];
             String pKeyId = split[1];
             String initTabName = sgTab.getValue();
-            for (Map.Entry<String, String> jlTab : jlData.entrySet()) {
+
+            String htmlString = this.getHtmlString(pKeyId);
+
+            for (Map.Entry<String, String> jlTab : jlData.entrySet()) { //监理表
                 String[] splitJl = jlTab.getKey().split("---");
                 String nodeNameReJL = splitJl[0];
                 String pKeyIdJL = splitJl[1];
                 String initTabNameJL = jlTab.getValue();
 
-                //相同,复制数据
+                //表的代码名称相同,复制数据,例如:G10=G10
                 if (nodeNameRe.equals(nodeNameReJL)) {
-                    //当前原始施工表
-                    WbsTreeContract wbsTreeContract = baseMapper.selectOne(Wrappers.<WbsTreeContract>lambdaQuery()
-                            .eq(WbsTreeContract::getPKeyId, pKeyId).eq(WbsTreeContract::getStatus, 1).eq(WbsTreeContract::getIsBussShow, 1));
-                    if (wbsTreeContract != null) {
-                        //获取initTabId,获取表字段
-                        WbsTreePrivate initTabId = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery()
-                                .select(WbsTreePrivate::getInitTableId)
-                                .eq(WbsTreePrivate::getProjectId, node.getProjectId())
-                                .eq(WbsTreePrivate::getWbsId, node.getWbsId())
-                                .eq(WbsTreePrivate::getNodeName, node.getNodeName())
-                                .eq(WbsTreePrivate::getId, node.getId())
-                                .eq(WbsTreePrivate::getWbsType, node.getWbsType())
-                                .eq(WbsTreePrivate::getType, 2)
-                                .eq(WbsTreePrivate::getStatus, 1));
-
-                        if (initTabId != null) { //表元素字段
-                            List<WbsFormElement> elementList = jdbcTemplate.query("select * from m_wbs_form_element where f_id = " + initTabId.getInitTableId(), new BeanPropertyRowMapper<>(WbsFormElement.class));
-                        }
-                        //TODO
 
-                    }
+                    String htmlStringJL = this.getHtmlString(pKeyIdJL);
+
+                    //获取质检实体表对应数据
+                    List<Map<String, Object>> mapsList = jdbcTemplate.queryForList("select * from " + initTabName + " where p_key_id = " + pKeyId);
+                    if (mapsList.size() > 0) {
+                        LinkedCaseInsensitiveMap<Object> maps = (LinkedCaseInsensitiveMap<Object>) mapsList.get(0);
+                        LinkedHashMap<String, Object> resultMaps = new LinkedHashMap<>(maps);
+                        resultMaps.entrySet().removeIf(entry -> entry.getValue() == null || entry.getValue().toString().trim().isEmpty()); //排除空串
+
+                        for (Map.Entry<String, Object> obj : resultMaps.entrySet()) {
+                            String key = obj.getKey();
+                            Object value = obj.getValue();
+
+                            //非跨单元格(一个单元格)
+                            if (value.toString().contains("_^_") && !value.toString().contains("☆")) {
+                                String[] fieldArr = value.toString().split("_\\^_");
+                                String data = fieldArr[0];
+                                String index = fieldArr[1];
+                                String findIndex = key + "__" + index;
+
+                                if (StringUtils.isNotEmpty(htmlString)) {
+                                    Document doc = Jsoup.parse(htmlString);
+                                    Elements td = doc.select("el-input[keyname~=" + findIndex + ".*]");
+                                    if (td.size() == 0) {
+                                        //日期格式
+                                        td = doc.select("el-date-picker[keyname~=" + findIndex + ".*]");
+                                    }
+                                    if (td.size() == 0) {
+                                        //图片格式
+                                        td = doc.select("hc-table-form-upload[keyname~=" + findIndex + ".*]");
+                                    }
+                                    if (td.size() == 0) {
+                                        //复选框
+                                        td = doc.select("hc-form-checkbox-group[keyname~=" + findIndex + ".*]");
+                                    }
+                                    if (td.size() == 0) {
+                                        //下拉框
+                                        td = doc.select("el-select[keyname~=" + findIndex + ".*]");
+                                    }
+                                    String placeholderValue = "";
+                                    if (td.size() >= 1) {
+                                        for (Element element : td) {
+                                            placeholderValue = element.attr("placeholderxx");
+                                            break;
+                                        }
+                                    }
 
-                    //复制完直接跳过
-                    break;
+                                    //警告,空串跳过
+                                    if (!placeholderValue.contains("警告") && StringUtils.isNotEmpty(placeholderValue)) {
+                                        if (StringUtils.isNotEmpty(htmlStringJL)) {
+                                            Document docJL = Jsoup.parse(htmlStringJL);
+                                            Elements tdJL = docJL.select("el-input[placeholderxx~=" + this.escapeRegex(placeholderValue) + ".*]");
+                                            if (tdJL.size() == 0) {
+                                                //日期格式
+                                                tdJL = docJL.select("el-date-picker[placeholderxx~=" + this.escapeRegex(placeholderValue) + ".*]");
+                                            }
+                                            if (tdJL.size() == 0) {
+                                                //图片格式
+                                                tdJL = docJL.select("hc-table-form-upload[placeholderxx~=" + this.escapeRegex(placeholderValue) + ".*]");
+                                            }
+                                            if (tdJL.size() == 0) {
+                                                //复选框
+                                                tdJL = docJL.select("hc-form-checkbox-group[placeholderxx~=" + this.escapeRegex(placeholderValue) + ".*]");
+                                            }
+                                            if (tdJL.size() == 0) {
+                                                //下拉框
+                                                tdJL = docJL.select("el-select[placeholderxx~=" + this.escapeRegex(placeholderValue) + ".*]");
+                                            }
+                                            if (tdJL.size() >= 1) {
+                                                for (Element element : tdJL) {
+                                                    String keyname = element.attr("keyname");
+                                                    if (StringUtils.isNotEmpty(keyname)) {
+                                                        String[] keynameJL = keyname.split("__");
+                                                        String keyJL = keynameJL[0];
+                                                        String keyJLIndex = keynameJL[1];
+
+                                                        InsertDataVO vo = new InsertDataVO();
+                                                        vo.setPKeyId(pKeyIdJL);
+                                                        vo.setInitTabName(initTabNameJL);
+                                                        if (keyJL.length() > 3) { //排除key=key的时候,也就是找不到key值,正常为key_X
+                                                            vo.setKey(keyJL);
+                                                            vo.setData(data + "_^_" + keyJLIndex);
+                                                            resultData.add(vo);
+                                                        }
+                                                    }
+                                                    break;
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+
+                                //跨单元格(多个单元格)
+                            } else if (value.toString().contains("_^_") && value.toString().contains("☆")) {
+                                String[] oneCells = value.toString().split("☆"); //一个单元格
+
+                                List<String> values = new ArrayList<>();
+
+                                for (String cell : oneCells) {
+                                    String[] fieldArr = cell.split("_\\^_");
+                                    String data = fieldArr[0];
+                                    String index = fieldArr[1];
+                                    String findIndex = key + "__" + index;
+
+                                    if (StringUtils.isNotEmpty(htmlString)) {
+                                        Document doc = Jsoup.parse(htmlString);
+                                        Elements td = doc.select("el-input[keyname~=" + findIndex + ".*]");
+                                        if (td.size() == 0) {
+                                            //日期格式
+                                            td = doc.select("el-date-picker[keyname~=" + findIndex + ".*]");
+                                        }
+                                        if (td.size() == 0) {
+                                            //图片格式
+                                            td = doc.select("hc-table-form-upload[keyname~=" + findIndex + ".*]");
+                                        }
+                                        if (td.size() == 0) {
+                                            //复选框
+                                            td = doc.select("hc-form-checkbox-group[keyname~=" + findIndex + ".*]");
+                                        }
+                                        if (td.size() == 0) {
+                                            //下拉框
+                                            td = doc.select("el-select[keyname~=" + findIndex + ".*]");
+                                        }
+                                        String placeholderValue = "";
+                                        if (td.size() >= 1) {
+                                            for (Element element : td) {
+                                                placeholderValue = element.attr("placeholderxx");
+                                                break;
+                                            }
+                                        }
+
+                                        //警告,空串跳过
+                                        if (!placeholderValue.contains("警告") && StringUtils.isNotEmpty(placeholderValue)) {
+                                            if (StringUtils.isNotEmpty(htmlStringJL)) {
+                                                Document docJL = Jsoup.parse(htmlStringJL);
+                                                Elements tdJL = docJL.select("el-input[placeholderxx~=" + this.escapeRegex(placeholderValue) + ".*]");
+                                                if (tdJL.size() == 0) {
+                                                    //日期格式
+                                                    tdJL = docJL.select("el-date-picker[keyname~=" + this.escapeRegex(placeholderValue) + ".*]");
+                                                }
+                                                if (tdJL.size() == 0) {
+                                                    //图片格式
+                                                    tdJL = docJL.select("hc-table-form-upload[placeholderxx~=" + this.escapeRegex(placeholderValue) + ".*]");
+                                                }
+                                                if (tdJL.size() == 0) {
+                                                    //复选框
+                                                    tdJL = docJL.select("hc-form-checkbox-group[placeholderxx~=" + this.escapeRegex(placeholderValue) + ".*]");
+                                                }
+                                                if (tdJL.size() == 0) {
+                                                    //下拉框
+                                                    tdJL = docJL.select("el-select[placeholderxx~=" + this.escapeRegex(placeholderValue) + ".*]");
+                                                }
+                                                if (tdJL.size() >= 1) {
+                                                    for (Element element : tdJL) {
+                                                        String keyname = element.attr("keyname");
+                                                        if (StringUtils.isNotEmpty(keyname)) {
+                                                            String[] keynameJL = keyname.split("__");
+                                                            String keyJL = keynameJL[0];
+                                                            if (keyJL.length() > 3) { //排除key=key的时候,也就是找不到key值,正常为key_X
+                                                                String keyJLIndex = keynameJL[1];
+                                                                if (keyJLIndex.equals(index)) { //位置相同才复制
+                                                                    values.add(data + "_^_" + keyJLIndex + "---" + keyJL);
+                                                                    break;
+                                                                }
+                                                            }
+                                                        }
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+
+                                Set<String> dataResult = new HashSet<>();
+                                Set<String> keyResult = new HashSet<>();
+                                for (String v : values) {
+                                    String[] split1 = v.split("---");
+                                    dataResult.add(split1[0]);
+                                    keyResult.add(split1[1]);
+                                }
+                                if (dataResult.size() > 0 && keyResult.size() > 0) {
+                                    InsertDataVO vo = new InsertDataVO();
+                                    vo.setPKeyId(pKeyIdJL);
+                                    vo.setInitTabName(initTabNameJL);
+                                    vo.setKey(keyResult.stream().findAny().orElse(null));
+                                    vo.setData(StringUtils.join(dataResult, "☆"));
+                                    resultData.add(vo);
+                                }
+                            }
+                        }
+                    }
                 }
             }
         }
-
     }
 
+    /**
+     * 获取html页面信息
+     *
+     * @param pkeyId
+     * @return
+     * @throws Exception
+     */
+    private String getHtmlString(String pkeyId) throws Exception {
+        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        String sys_file_net_url = ParamCache.getValue(CommonConstant.SYS_FILE_NET_URL);
+        WbsTreeContract wbsTreeContract = baseMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda()
+                .select(WbsTreeContract::getHtmlUrl)
+                .eq(WbsTreeContract::getPKeyId, pkeyId));
+        if (wbsTreeContract == null || wbsTreeContract.getHtmlUrl() == null) {
+            return "";
+        }
+
+        String fileUrl = wbsTreeContract.getHtmlUrl();
+        File file1 = ResourceUtil.getFile(fileUrl);
+        InputStream fileInputStream;
+        if (file1.exists()) {
+            fileInputStream = new FileInputStream(file1);
+        } else {
+            String path = sys_file_net_url + fileUrl.replaceAll("//", "/").replaceAll(file_path, "");
+            fileInputStream = CommonUtil.getOSSInputStream(path);
+        }
+
+        String htmlString = IoUtil.readToString(fileInputStream);
+        htmlString = htmlString.replaceAll("placeholder", "placeholderxx");
+        Document doc = Jsoup.parse(htmlString);
+        return doc.select("table").first() + "";
+    }
 
     /**
      * 截取字符串中的英文和数字,返回处理后的字符串
@@ -721,18 +977,26 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         if (str == null) {
             return "";
         }
-
         Pattern pattern = Pattern.compile("[a-zA-Z0-9\\.]+");
         Matcher matcher = pattern.matcher(str);
-
         StringBuilder resultBuilder = new StringBuilder();
         while (matcher.find()) {
-            resultBuilder.append(matcher.group());
+            String match = matcher.group();
+            match = match.replace(".", "");
+            resultBuilder.append(match);
         }
-
         return resultBuilder.toString();
     }
 
+    /**
+     * 转义字符串
+     *
+     * @param input
+     * @return
+     */
+    private String escapeRegex(String input) {
+        return Pattern.quote(input);
+    }
 
     @Override
     public List<WbsTreeContract> updateAllNodeTabById(WbsTreePrivate aPrivate) {
@@ -820,7 +1084,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public WbsTreeContractVO4 importWbsContract(MultipartFile excelFile, String primaryKeyId, Integer isSplicingNumber) throws IOException {
+    public WbsTreeContractVO4 importWbsContract(MultipartFile excelFile, String primaryKeyId, Integer
+            isSplicingNumber) throws IOException {
         File file = FileUtils.convert(excelFile);
         String canonicalPath = file.getCanonicalPath();
         try {
@@ -843,7 +1108,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return null;
     }
 
-    private WbsTreeContractVO4 importSubmitWbsContractNodes(ArrayList<Map<String, String>> result, String primaryKeyId, Integer isSplicingNumber) {
+    private WbsTreeContractVO4 importSubmitWbsContractNodes(ArrayList<Map<String, String>> result, String
+            primaryKeyId, Integer isSplicingNumber) {
         WbsTreeContract wbsTreeContractRoot = baseMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda().eq(WbsTreeContract::getPKeyId, primaryKeyId));
         //获取当前节点下所有子节点
         List<WbsTreeContractVO> wbsTreeContractVOS = contractInfoMapper.tree4(wbsTreeContractRoot.getContractId(), String.valueOf(wbsTreeContractRoot.getId()));
@@ -1020,7 +1286,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return list;
     }
 
-    private List<WbsTreeContractVO> buildFailDataTree(List<WbsTreeContractVO> failData, List<WbsTreeContractVO> successData, Long parentIdRoot) {
+    private List<WbsTreeContractVO> buildFailDataTree
+            (List<WbsTreeContractVO> failData, List<WbsTreeContractVO> successData, Long parentIdRoot) {
         List<WbsTreeContractVO> resultData = new ArrayList<>();
         resultData.addAll(successData);
         resultData.addAll(failData);
@@ -1079,7 +1346,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         }
     }
 
-    private List<Map<Integer, String>> getResultList(ArrayList<Map<String, String>> result, Integer isSplicingNumber) {
+    private List<Map<Integer, String>> getResultList(ArrayList<Map<String, String>> result, Integer
+            isSplicingNumber) {
         List<Map<Integer, String>> resultList = new ArrayList<>();
         String str = "\\s*|\r|\n|\t";
         for (Map<String, String> map : result) {
@@ -1163,7 +1431,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return resultList;
     }
 
-    private List<WbsTreeContract> findAllNodeList(String wbsTreeIds, String projectId, String contractId, String wbsId) {
+    private List<WbsTreeContract> findAllNodeList(String wbsTreeIds, String projectId, String contractId, String
+            wbsId) {
         String[] ids = wbsTreeIds.split(",");
         List<WbsTreeContract> list = new ArrayList<>();
         for (String id : ids) {

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

@@ -1767,6 +1767,13 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         return null;
     }
 
+    @Override
+    public void syncCurrentFormInProject(Long pKeyId) {
+        WbsTreePrivate treePrivate = this.getOne(new LambdaQueryWrapper<WbsTreePrivate>().eq(WbsTreePrivate::getPKeyId,pKeyId));
+        baseMapper.syncCurrentFormInProject(treePrivate);
+        wbsTreeContractService.syncCurrentFormToAllContract(treePrivate);
+    }
+
     private List<WbsTreePrivateVO5> buildWbsTreeByStreamTrial(List<WbsTreePrivateVO5> wbsTreeVO2s) {
         List<WbsTreePrivateVO5> list = wbsTreeVO2s.stream().filter(f -> f.getParentId() == 0L).collect(Collectors.toList());
         Map<Long, List<WbsTreePrivateVO5>> map = wbsTreeVO2s.stream().collect(Collectors.groupingBy(WbsTreePrivateVO5::getParentId));