huangtf 2 years ago
parent
commit
b97a4888d2
50 changed files with 2020 additions and 860 deletions
  1. 1 1
      blade-common/src/main/java/org/springblade/common/utils/AsyncConfigurer.java
  2. 3 2
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/OssBuilder.java
  3. 18 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchivesAutoVO.java
  4. 2 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TaskBatch.java
  5. 0 2
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/TrialSelfInspectionRecordClient.java
  6. 14 4
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/CopyContractTreeNodeVO.java
  7. 1 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTree.java
  8. 5 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateVO.java
  9. 42 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateVO5.java
  10. 23 4
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  11. 2 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java
  12. 65 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  13. 66 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/EVisaTaskCheckController.java
  14. 489 103
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  15. 0 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  16. 4 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.java
  17. 491 405
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml
  18. 1 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskBatchMapper.xml
  19. 3 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/IInformationQueryService.java
  20. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITaskBatchService.java
  21. 5 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java
  22. 75 9
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  23. 12 12
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java
  24. 12 3
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java
  25. 11 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  26. 18 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FirstController.java
  27. 28 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ProjectInfoController.java
  28. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TableFileController.java
  29. 27 27
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java
  30. 14 19
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java
  31. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java
  32. 13 11
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/TableElementConverter.java
  33. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml
  34. 4 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.xml
  35. 4 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java
  36. 26 12
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  37. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IExcelTabService.java
  38. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java
  39. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java
  40. 254 10
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveAutoRuleSyncImpl.java
  41. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java
  42. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java
  43. 22 10
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeServiceImpl.java
  44. 72 44
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  45. 4 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  46. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsFormElementServiceImpl.java
  47. 72 56
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  48. 95 13
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  49. 0 46
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/AsyncConfigurer.java
  50. 3 34
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/test.java

+ 1 - 1
blade-common/src/main/java/org/springblade/common/utils/AsyncConfigurer.java

@@ -25,7 +25,7 @@ public class AsyncConfigurer {
     @Bean("taskExecutor1")
     public ThreadPoolExecutor getAsyncExecutor() {
         return new ThreadPoolMonitor(cpuNum
-                , 3
+                , 6
                 , 60
                 , TimeUnit.SECONDS
                 , new LinkedBlockingQueue<>(2000)

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

@@ -25,6 +25,7 @@ import org.springblade.core.oss.OssTemplate;
 import org.springblade.core.oss.enums.OssEnum;
 import org.springblade.core.oss.enums.OssStatusEnum;
 import org.springblade.core.oss.props.OssProperties;
+import org.springblade.core.oss.rule.BladeOssRule;
 import org.springblade.core.oss.rule.OssRule;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.utils.*;
@@ -98,9 +99,9 @@ public class OssBuilder {
                          * @create 2023-03-31
                          * @deprecated 重写BladeOssRule-》BladeOssRuleRe 修改文件名UUID -》原始名
                          */
-                        ossRule = new BladeOssRuleRe(Boolean.TRUE);
+                        ossRule = new BladeOssRule(Boolean.TRUE);
                     } else {
-                        ossRule = new BladeOssRuleRe(Boolean.FALSE);
+                        ossRule = new BladeOssRule(Boolean.FALSE);
                     }
                     if (oss.getCategory() == OssEnum.MINIO.getCategory()) {
                         template = MinioOssBuilder.template(oss, ossRule);

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

@@ -47,6 +47,24 @@ public class ArchivesAutoVO extends ArchivesAuto {
 	@ApiModelProperty("当前页显示条数")
 	private Integer size;
 
+	/**
+	 * 搜索类型
+	 */
+	@ApiModelProperty("搜索类型1案卷2文件")
+	private Integer searchType;
+
+	/**
+	 * 年
+	 */
+	@ApiModelProperty("年")
+	private String year;
+
+	/**
+	 * 年
+	 */
+	@ApiModelProperty("月")
+	private String month;
+
 	/**
 	 * 输入框查询条件
 	 */

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

@@ -47,6 +47,8 @@ public class TaskBatch extends BaseEntity {
 
     private String jsonData;
 
+    private String nickName;
+
     public TaskBatch(String taskParallelId, String jsonData){
         this.setId(SnowFlakeUtil.getId());
         this.taskParallelId = taskParallelId;

+ 0 - 2
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/TrialSelfInspectionRecordClient.java

@@ -15,6 +15,4 @@ public interface TrialSelfInspectionRecordClient {
 
     @PostMapping(API_PREFIX + "/updateURL")
     void updateURL(@RequestParam String url, @RequestParam String pKeyId);
-
-
 }

+ 14 - 4
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/CopyContractTreeNodeVO.java

@@ -30,11 +30,18 @@ public class CopyContractTreeNodeVO {
     @ApiModelProperty("所属方,1=施工,2=监理,字符串拼接,复制数据")
     private String classify;
 
-    @ApiModelProperty("划分编号,单份复制")
+    @ApiModelProperty("所属方,1=施工,2=监理,字符串拼接,复制数据," +
+            "不知道之前的接口为什么会入参这个值,有个接口单独用的,懒得叫前端改了")
+    private String classifyType;
+
+    @ApiModelProperty("是否需要复制数据 0=否1=是")
+    private Integer isCopyData;
+
+    @ApiModelProperty("划分编号")
     private String partitionCode;
 
-    public void setCopyBatchToPaths(String primaryKeyId, String nodeName, String partitionCode) {
-        this.copyBatchToPaths.add(new CopyBatch(primaryKeyId, nodeName, partitionCode));
+    public void setCopyBatchToPaths(String primaryKeyId, String nodeName, String partitionCode, Integer isSameNode) {
+        this.copyBatchToPaths.add(new CopyBatch(primaryKeyId, nodeName, partitionCode, isSameNode));
     }
 
     @Data
@@ -46,13 +53,16 @@ public class CopyContractTreeNodeVO {
 
         private String partitionCode;
 
+        private Integer isSameNode; //是否同节点(多份复制 同节点=1,不同节点/跨节点=0)
+
         public CopyBatch() {
         }
 
-        public CopyBatch(String primaryKeyId, String nodeName, String partitionCode) {
+        public CopyBatch(String primaryKeyId, String nodeName, String partitionCode, Integer isSameNode) {
             this.primaryKeyId = primaryKeyId;
             this.nodeName = nodeName;
             this.partitionCode = partitionCode;
+            this.isSameNode = isSameNode;
         }
 
     }

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

@@ -157,7 +157,7 @@ public class ArchiveTree extends BaseEntity {
     private Long archiveAutoGroupId;
 
     /**
-     * 是否自动立卷规则选择设置的节点 选中的节点设为1 方便页面显示列表
+     * 是否自动立卷规则选择设置的节点 选中的节点设为1 方便页面显示列表,方便同步判断
      */
     @ApiModelProperty(value = "是否为设置的节点")
     private Integer archiveAutoGroupSelect;

+ 5 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateVO.java

@@ -63,4 +63,9 @@ public class WbsTreePrivateVO extends WbsTreePrivate implements INode<WbsTreePri
      */
     private String title;
 
+    /**
+     * 勾选状态 0=未勾选 1=已勾选
+     */
+    private Integer checkStatus = 0;
+
 }

+ 42 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateVO5.java

@@ -0,0 +1,42 @@
+package org.springblade.manager.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class WbsTreePrivateVO5 implements Serializable {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long parentId;
+
+    private String title;
+
+    private Integer checkStatus = 0;
+
+    private Integer nodeType;
+
+    private Integer wbsType;
+
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private List<WbsTreePrivateVO5> children;
+
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private Boolean hasChildren;
+
+    public List<WbsTreePrivateVO5> getChildren() {
+        if (this.children == null) {
+            this.children = new ArrayList<>();
+        }
+        return this.children;
+    }
+
+}

+ 23 - 4
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -16,9 +16,7 @@
  */
 package org.springblade.archive.controller;
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 import javax.validation.Valid;
@@ -46,7 +44,7 @@ import org.springblade.core.boot.ctrl.BladeController;
 @RestController
 @AllArgsConstructor
 @RequestMapping("/archivesauto")
-@Api(value = "", tags = "接口")
+@Api(value = "", tags = "档案接口")
 public class ArchivesAutoController extends BladeController {
 
 	private final IArchivesAutoService archivesAutoService;
@@ -87,6 +85,27 @@ public class ArchivesAutoController extends BladeController {
 		return R.data(pages);
 	}
 
+	/**
+	 * 档案利用-档案查询
+	 */
+	@GetMapping("/pageByArchivesAuto")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "档案利用-档案查询分页", notes = "传入archivesAuto")
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true),
+			@ApiImplicitParam(name = "year", value = "年"),
+			@ApiImplicitParam(name = "month", value = "yue"),
+			@ApiImplicitParam(name = "storageTime", value = "保管期限"),
+			@ApiImplicitParam(name = "secretLevel", value = "保密级别"),
+			@ApiImplicitParam(name = "carrierType", value = "类别"),
+			@ApiImplicitParam(name = "queryValue", value = "输入框模糊搜索"),
+			@ApiImplicitParam(name = "searchType", value = "搜索类型1案卷2文件")
+	})
+	public R<IPage<ArchivesAuto>> pageByArchivesAuto(ArchivesAutoVO archivesAuto) {
+		IPage<ArchivesAuto> pages = archivesAutoService.pageByArchivesAuto(archivesAuto);
+		return R.data(pages);
+	}
+
 	/**
 	 * 新增 
 	 */

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

@@ -38,6 +38,8 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 	 */
 	IPage<ArchivesAutoVO> selectArchivesAutoPage(IPage<ArchivesAutoVO> page, ArchivesAutoVO archivesAuto);
 
+	IPage<ArchivesAuto> pageByArchivesAuto(ArchivesAutoVO archivesAuto);
+
 	IPage<ArchivesAutoVO> selectArchivesAutoFilePage(ArchivesAutoVO queryVo);
 
 	boolean updateArchivesAutoFileByNodeId(String ids, String nodeId,String nodeSort);

+ 65 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -18,7 +18,9 @@ package org.springblade.archive.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.archive.entity.ArchivesAuto;
@@ -40,6 +42,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  *  服务实现类
@@ -64,6 +67,68 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		return page.setRecords(baseMapper.selectArchivesAutoPage(page, archivesAuto));
 	}
 
+	@Override
+	public IPage<ArchivesAuto> pageByArchivesAuto(ArchivesAutoVO vo) {
+		IPage<ArchivesAuto> page = new Page<>(vo.getCurrent(),vo.getSize());
+		LambdaQueryWrapper<ArchivesAuto> lqw = new LambdaQueryWrapper<>();
+		lqw.eq(ArchivesAuto::getProjectId,vo.getProjectId());
+		//过滤日期
+		if (StringUtils.isNotBlank(vo.getYear())){
+			if (StringUtils.isNotBlank(vo.getMonth())){
+				int day;
+				if (Arrays.asList("1,3,5,7,8,10,12".split(",")).contains(vo.getMonth())){
+					day = 31;
+				}else if (Arrays.asList("1,3,5,7,8,10,12".split(",")).contains(vo.getMonth())){
+					day = 30;
+				}else {
+					if (Integer.parseInt(vo.getYear()) % 4 == 0){
+						day = 29;
+					}else {
+						day = 28;
+					}
+				}
+				lqw.ge(ArchivesAuto::getStartDate,LocalDateTime.of(Integer.parseInt(vo.getYear()), Integer.parseInt(vo.getMonth()), 1, 0, 0, 0));
+				lqw.le(ArchivesAuto::getEndDate,LocalDateTime.of(Integer.parseInt(vo.getYear()), Integer.parseInt(vo.getMonth()), day, 0, 0, 0));
+			}else {
+				lqw.ge(ArchivesAuto::getStartDate,LocalDateTime.of(Integer.parseInt(vo.getYear()), 1, 1, 0, 0, 0));
+				lqw.ge(ArchivesAuto::getEndDate,LocalDateTime.of(Integer.parseInt(vo.getYear()), 12, 31, 0, 0, 0));
+			}
+		}else if (StringUtils.isNotBlank(vo.getMonth())){
+			throw new RuntimeException("请选择年");
+		}
+		lqw.eq(StringUtils.isNotBlank(vo.getStorageTime()),ArchivesAuto::getStorageTime,vo.getStorageTime())
+				.eq(StringUtils.isNotBlank(vo.getSecretLevel()),ArchivesAuto::getSecretLevel,vo.getSecretLevel())
+					.eq(StringUtils.isNotBlank(vo.getCarrierType()),ArchivesAuto::getCarrierType,vo.getCarrierType());
+		//按案卷搜索完成,判断是否按文件搜索
+		if (vo.getSearchType() == 1){
+			lqw.like(StringUtils.isNotBlank(vo.getQueryValue()),ArchivesAuto::getName,vo.getQueryValue());
+			this.page(page,lqw);
+			return page;
+		}else {
+			List<ArchivesAuto> list = this.list(lqw);
+			list = list.stream().filter(auto -> {
+				List<ArchiveFile> files = archiveFileClient.getArchiveFileByArchivesId(auto.getId() + "", "");
+				if (files != null && files.size() > 0){
+					files = files.stream().filter(file->file.getFileName().contains(vo.getQueryValue())).collect(Collectors.toList());
+				}
+				if (files != null && files.size() > 0){
+					return true;
+				}else {
+					return false;
+				}
+			}).collect(Collectors.toList());
+			if (list != null && list.size() > 0){
+				List<Long> ids = list.stream().map(l -> l.getId()).collect(Collectors.toList());
+				this.page(page,new LambdaQueryWrapper<ArchivesAuto>().in(ArchivesAuto::getId,ids));
+				return page;
+			}else {
+				return  null;
+			}
+
+		}
+
+	}
+
 	@Override
 	public IPage<ArchivesAutoVO> selectArchivesAutoFilePage(ArchivesAutoVO vo) {
 		Query query = new Query();

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

@@ -114,6 +114,72 @@ public class EVisaTaskCheckController {
         return R.data(300, false, "未选择审批人!!!");
     }
 
+    /**
+     * 资料查询批量上报,检查自定义流程,审批人权限
+     */
+    @PostMapping("/checkCustomFlowUserIsEVisaPermissions2")
+    @ApiOperation(value = "资料查询批量上报,检查自定义流程,审批人权限")
+    @ApiOperationSupport(order = 6)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "customFlowUserList", value = "所选的任务人集合,集合形式", required = true),
+            @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true),
+            @ApiImplicitParam(name = "privatePKeyId", value = "表单列表中的isTypePrivatePid字段,集合形式"),
+            @ApiImplicitParam(name = "theLogPrimaryKeyId", value = "日志左侧所选的填报类型ID"),
+            @ApiImplicitParam(name = "firstId", value = "首件记录ID,列表批量上报时传任意一个即可")
+    })
+    public R<Boolean> batchCheckCustomFlowUserIsEVisaPermissions2(@RequestBody JSONObject json) {
+        if (json.containsKey("customFlowUserList") && !json.getJSONArray("customFlowUserList").isEmpty()) {
+            //获取审批人
+            List<Long> customFlowUserList = json.getJSONArray("customFlowUserList").toJavaList(Long.class);
+            //获取这些审批人在当前合同段的权限
+            List<JSONObject> userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(customFlowUserList, json.getString("contractId"));
+            if (userRoleList == null || userRoleList.size() <= 0) {
+                return R.data(300, false, "所选审批人均未找到当前表格所需要的签字岗位,请联系服务人员处理");
+            }
+
+            //获取电签配置
+            List<String> list = json.getJSONArray("wbsIds").toJavaList(String.class);
+            Set<String> userNameFail = new HashSet<>();
+            for (String nodeId : list) {
+                WbsTreeContract contract = wbsTreeContractClient.getContractWbsTreeByPrimaryKeyId(Long.valueOf(nodeId));
+                List<WbsTreeContract> node = wbsTreeContractClient.queryChildByParentId(contract,"", "");
+                List<Long> ids = new ArrayList<>();
+                for (WbsTreeContract treeContract : node) {
+                    WbsTreePrivate wbsTreePrivate = wbsTreePrivateClient.queryPeersNodeByProjectIdAndId(treeContract.getProjectId(), treeContract.getId());
+                    ids.add(wbsTreePrivate.getPKeyId());
+                }
+                JSONObject object = new JSONObject();
+                object.put("privatePKeyId",ids);
+                List<JSONObject> jsonList = this.queryTableEVisaConfig(object);
+                if (jsonList == null || jsonList.size() <= 0) {
+                    return R.data(300, false, "未找到符合电签配置的相关流程,请联系服务人员处理");
+                }
+
+                //汇总电签配置的审批角色
+                List<String> eVisaRoleList = jsonList.stream().map(jsonObject -> jsonObject.getString("sigRoleId")).distinct().collect(Collectors.toList());
+
+                //检查
+                //循环审批人的角色集合,并判断电签配置中是否含有这个角色
+                for (JSONObject userRole : userRoleList) {
+                    if (!eVisaRoleList.contains(userRole.getString("roleId"))) {
+                        User user = this.userClient.userInfoById(userRole.getLong("userId")).getData();
+                        userNameFail.add(user.getRealName());
+                    }
+                }
+
+            }
+            //批量提示
+            if (userNameFail.size() > 0) {
+                return R.data(300, false, "所选中的用户【" + StringUtils.join(userNameFail, ",") + "】不具备当前表格所需要的签字岗位,请联系维护人员处理或更换审批人员");
+            }
+
+            //均满足
+            return R.data(true);
+        }
+
+        return R.data(300, false, "未选择审批人!!!");
+    }
+
     /**
      * 获取符合条件的预设流程(三大填报页、日志列表的批量上报、首件列表的批量上报)
      */
@@ -363,7 +429,6 @@ public class EVisaTaskCheckController {
         } else {
             //资料填报
             //jsonList = this.eVisaConfigClient.queryEVisaConfigAllByTableIds(json.getJSONArray("privatePKeyId").toJavaList(String.class));
-
             List<String> ids = json.getJSONArray("privatePKeyId").toJavaList(String.class);
             String sql = "select * from m_textdict_info where tab_id in(" + StringUtils.join(ids, ",") + ")";
             List<TextdictInfo> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TextdictInfo.class));

+ 489 - 103
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import io.github.classgraph.utils.LogNode;
 import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
@@ -71,6 +72,7 @@ import org.springblade.core.boot.ctrl.BladeController;
 
 import java.io.IOException;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
@@ -1339,104 +1341,486 @@ public class InformationWriteQueryController extends BladeController {
     @ApiOperationSupport(order = 15)
     @ApiOperation(value = "复制节点(新)")
     public R<Boolean> copyContractTreeNode(@RequestBody CopyContractTreeNodeVO vo) {
-        //首先查询需要复制的节点及其下级所有子节点的信息
-        WbsTreeContract needCopyNode = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(vo.getNeedCopyPrimaryKeyId());
-        // 获取当前节点的所有子节点
-        String vocational = SnowFlakeUtil.getId() + "";
-        //新增施工台账
-        List<WbsTreeContract> saveList = new ArrayList<>();
-        List<ConstructionLedger> saveLedger = new ArrayList<>();
-        // 获取附件
-        List<WbsTreeContract> nodeChildAll = informationQueryService.getNodeChildAllByNodeId(needCopyNode.getId() + "", needCopyNode.getContractId(), vo.getNeedCopyPrimaryKeyId());
-        // 获取实体表列对象
-        List<QueryProcessDataVO> nodeTabCols = informationQueryService.getNodeChildTabColsAllByNodeId(needCopyNode.getId() + "", needCopyNode.getContractId());
-        // 转化为map
-        Map<String, String> nodeTabColsMap = nodeTabCols.stream().collect(Collectors.toMap(QueryProcessDataVO::getQueryType, QueryProcessDataVO::getAncestors, (key1, key2) -> key2));
-        StringBuilder copeSql = new StringBuilder();
-
-        if (StringUtils.isNotEmpty(vo.getNeedCopyPrimaryKeyId())) {
-            WbsTreeContract parent = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(vo.getParentPrimaryKeyId());
-            //重塑关键信息
-            Map<Long, Long> oldToNewIdMap = new HashMap<>();
-            //节点信息
-            Map<String, WbsTreeContract> nodeMap = new HashMap<>();
-            nodeChildAll.forEach(node -> {
-                oldToNewIdMap.put(node.getId(), SnowFlakeUtil.getId());
-                nodeMap.put(node.getId().toString(), node);
-            });
+        //TODO 单份复制
+        if (("1").equals(vo.getCopyType())) {
+            //首先查询需要复制的节点及其下级所有子节点的信息
+            WbsTreeContract needCopyNode = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(vo.getNeedCopyPrimaryKeyId());
+            // 获取当前节点的所有子节点
+            String vocational = SnowFlakeUtil.getId() + "";
+            //新增施工台账
+            List<WbsTreeContract> saveList = new ArrayList<>();
+            List<ConstructionLedger> saveLedger = new ArrayList<>();
+            // 获取附件
+            List<WbsTreeContract> nodeChildAll = informationQueryService.getNodeChildAllByNodeId(needCopyNode.getId() + "", needCopyNode.getContractId(), vo.getNeedCopyPrimaryKeyId());
+            // 获取实体表列对象
+            List<QueryProcessDataVO> nodeTabCols = informationQueryService.getNodeChildTabColsAllByNodeId(needCopyNode.getId() + "", needCopyNode.getContractId());
+            // 转化为map
+            Map<String, String> nodeTabColsMap = nodeTabCols.stream().collect(Collectors.toMap(QueryProcessDataVO::getQueryType, QueryProcessDataVO::getAncestors, (key1, key2) -> key2));
+            StringBuilder copeSql = new StringBuilder();
 
-            //todo 单份复制
-            nodeChildAll.forEach(node -> {
-                WbsTreeContract newData = new WbsTreeContract();
-                BeanUtils.copyProperties(node, newData);
+            if (StringUtils.isNotEmpty(vo.getNeedCopyPrimaryKeyId())) {
+                WbsTreeContract parent = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(vo.getParentPrimaryKeyId());
                 //重塑关键信息
-                //重塑primaryKeyId
-                newData.setPKeyId(SnowFlakeUtil.getId());
-                //设置旧ID
-                if (StringUtils.isNotEmpty(node.getOldId())) {
-                    newData.setOldId(node.getOldId());
-                } else {
-                    newData.setOldId(node.getId().toString());
+                Map<Long, Long> oldToNewIdMap = new HashMap<>();
+                //节点信息
+                Map<String, WbsTreeContract> nodeMap = new HashMap<>();
+                nodeChildAll.forEach(node -> {
+                    oldToNewIdMap.put(node.getId(), SnowFlakeUtil.getId());
+                    nodeMap.put(node.getId().toString(), node);
+                });
+
+                nodeChildAll.forEach(node -> {
+                    WbsTreeContract newData = new WbsTreeContract();
+                    BeanUtils.copyProperties(node, newData);
+                    //重塑关键信息
+                    //重塑primaryKeyId
+                    newData.setPKeyId(SnowFlakeUtil.getId());
+                    //设置旧ID
+                    if (StringUtils.isNotEmpty(node.getOldId())) {
+                        newData.setOldId(node.getOldId());
+                    } else {
+                        newData.setOldId(node.getId().toString());
+                    }
+
+                    //设置新ID
+                    if (new Integer("1").equals(node.getType())) {
+                        //如果是节点类型才重塑ID
+                        newData.setId(oldToNewIdMap.containsKey(node.getId()) ? oldToNewIdMap.get(node.getId()) : SnowFlakeUtil.getId());
+                        //划分编号
+                        newData.setPartitionCode(StringUtils.isNotEmpty(vo.getPartitionCode()) ? vo.getPartitionCode() : null);
+                    }
+                    //设置父节点ID
+                    if (vo.getNeedCopyPrimaryKeyId().equals(node.getPKeyId().toString())) {
+                        //找到复制的节点,将parentId更改为 parent.getId()
+                        newData.setParentId(parent.getId());
+                        //设置新名称
+                        newData.setNodeName(vo.getNeedCopyNodeName());
+                        newData.setFullName(vo.getNeedCopyNodeName());
+                    } else {
+                        newData.setParentId(oldToNewIdMap.containsKey(node.getParentId()) ? oldToNewIdMap.get(node.getParentId()) : SnowFlakeUtil.getId());
+                    }
+                    newData.setCreateTime(new Date());
+                    newData.setUpdateTime(new Date());
+                    //初始化是否显示表格,默认显示
+                    newData.setIsBussShow(1);
+                    //初始化表格是否上传附件,默认未上传
+                    newData.setTabFileType(1);
+                    //初始化单表是否可以预览,默认不能
+                    newData.setIsTabPdf(1);
+                    //初始化PDF路径
+                    newData.setPdfUrl(null);
+                    newData.setCreateUser(AuthUtil.getUserId());
+                    //重塑父节点关联关系
+                    this.restoreParent(newData, oldToNewIdMap);
+                    //保存到集合中
+                    saveList.add(newData);
+                    if (new Integer("6").equals(node.getNodeType())) {
+                        //生成施工日志
+                        this.createLedger(newData, saveLedger, nodeMap, null);
+                    }
+
+                    // 组织复制值Sql
+                    if (nodeTabColsMap != null && node.getType() == 2) {
+                        String tableName = newData.getInitTableName();
+                        String col = nodeTabColsMap.get(tableName);
+                        String colVal = nodeTabColsMap.get(tableName);
+                        colVal = colVal.replaceAll("id,p_key_id,", "'" + SnowFlakeUtil.getId() + "' as id,'" + newData.getPKeyId() + "' as p_key_id,");
+                        copeSql.append("insert into " + tableName + "  (" + col + ") select " + colVal + " from " + tableName + " where p_key_id='" + node.getPKeyId() + "' ;");
+                    }
+                });
+            }
+            //保存节点信息
+            R<Boolean> booleanR = this.saveOrCopyNodeTree(saveList, saveLedger, 32, needCopyNode);
+
+            //复制数据逻辑
+            if (nodeTabColsMap != null && copeSql.length() >= 10) {
+                jdbcTemplate.execute(copeSql.toString());
+            }
+
+            //获取父节点信息
+            informationQueryService.AsyncWbsTree(needCopyNode.getParentId() + "", needCopyNode.getParentId() + "", needCopyNode.getContractId(), "", "1");
+            return booleanR;
+
+            /** TODO 多份复制
+             * @Author liuYC
+             * @Date 2023年4月10日18:06:53
+             * @Description
+             *  解析复制节点位置信息:
+             *  1:同节点复制(同一个父级下)
+             *      1.1 如果点击选择的是当前复制节点的父级,那么就新增一个当前需要复制的节点-新的子级-新的表-新的表数据(根据所属方查询对应数据)。
+             *      1.2 如果点击选择的是当前复制节点的同级节点(自己本身节点是无法点击进行复制的),那么复制对应表数据,如果没有对应表,那么跳过。
+             *  2:跨节点复制(不同父级下)
+             *      2.1 如果点击选择的是其他父级节点的父级,那么新增一个新的当前选择的复制的节点-新的表-新的表数据(根据所属方查询对应数据)。
+             *      2.2 如果点击选择的是当前复制节点本身的同等级节点,那么复制对应表数据,如果没有对应表,那么跳过。
+             */
+        } else if (("2").equals(vo.getCopyType())) {
+            //首先查询需要复制的节点的信息
+            WbsTreeContract needCopyNode = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(vo.getNeedCopyPrimaryKeyId());
+            //获取需要复制到的位置节点信息的集合
+            List<CopyContractTreeNodeVO.CopyBatch> copyBatches = vo.getCopyBatchToPaths();
+            if (needCopyNode != null && copyBatches.size() > 0) {
+                //获取当前需要复制到的位置节点信息,判断同节点复制或跨节点复制
+                List<Long> toCopyNodePKeyIds = copyBatches.stream().map(CopyContractTreeNodeVO.CopyBatch::getPrimaryKeyId).map(Long::valueOf).collect(Collectors.toList());
+                List<WbsTreeContract> toCopyNodes = wbsTreeContractClient.queryContractTreeNodeByPKIds(toCopyNodePKeyIds);
+                Map<String, CopyContractTreeNodeVO.CopyBatch> toCopyMaps = copyBatches.stream().collect(Collectors.toMap(CopyContractTreeNodeVO.CopyBatch::getPrimaryKeyId, Function.identity()));
+
+                //结果集
+                List<WbsTreeContract> addChildNodes = null;
+                List<WbsTreeContract> addChildNodesTables = null;
+                List<WbsTreeContract> addChildNodesTablesOld = null; //原始表单
+                List<String> resultTablesData = new ArrayList<>();
+
+                //表单所属方
+                String tabOwner = "";
+                if (("1,2").equals(vo.getClassifyType()) || ("2,1").equals(vo.getClassifyType())) {
+                    tabOwner = "1,2,3,4,5,6";
+                } else if (("1").equals(vo.getClassifyType())) {
+                    tabOwner = "1,2,3";
+                } else if (("2").equals(vo.getClassifyType())) {
+                    tabOwner = "4,5,6";
                 }
 
-                //设置新ID
-                if (new Integer("1").equals(node.getType())) {
-                    //如果是节点类型才重塑ID
-                    newData.setId(oldToNewIdMap.containsKey(node.getId()) ? oldToNewIdMap.get(node.getId()) : SnowFlakeUtil.getId());
-                    //划分编号
-                    newData.setPartitionCode(StringUtils.isNotEmpty(vo.getPartitionCode()) ? vo.getPartitionCode() : null);
+                //解析位置信息,进行复制数据构造
+                for (WbsTreeContract toCopyNode : toCopyNodes) {
+                    CopyContractTreeNodeVO.CopyBatch toCopyVO = toCopyMaps.get(toCopyNode.getPKeyId().toString());
+                    if (toCopyVO != null) {
+                        //TODO 同节点复制
+                        if (new Integer(1).equals(toCopyVO.getIsSameNode())) {
+                            //1.1 选择的同级的父级节点,新增
+                            if (needCopyNode.getParentId().equals(toCopyNode.getId())) {
+                                toCopyNode.setNodeName(toCopyVO.getNodeName());
+                                toCopyNode.setPartitionCode(toCopyVO.getPartitionCode());
+
+                                //获取需要复制的所有子节点节点
+                                addChildNodes = this.getChildNodes(needCopyNode);
+
+                                if (ObjectUtil.isEmpty(addChildNodes) || addChildNodes.size() == 0) {
+                                    //最下层级节点复制
+                                    addChildNodes = new ArrayList<>();
+                                    addChildNodes.add(needCopyNode);
+                                }
+
+                                //获取所有复制的表
+                                addChildNodesTables = this.getChildNodesTables(addChildNodes, toCopyNode.getContractId());
+                                addChildNodesTablesOld = addChildNodesTables;
+                                //构造新的节点、表、数据
+                                this.addCopyNodesAndTabsBuildData(addChildNodes, addChildNodesTables, needCopyNode, toCopyNode, resultTablesData, 1, tabOwner, vo.getIsCopyData());
+
+                                //1.2 选择的同级的同级节点,只复制数据
+                            } else if (needCopyNode.getParentId().equals(toCopyNode.getParentId())) {
+                                //构造数据
+                                this.addCopyTabData(needCopyNode, toCopyNode, tabOwner, resultTablesData, vo.getIsCopyData());
+                            }
+
+                            //TODO 跨节点复制
+                        } else if (new Integer(0).equals(toCopyVO.getIsSameNode())) {
+                            //获取需要复制节点的上级
+                            WbsTreeContract parentNodeNeed = wbsTreeContractClient.getContractWbsTreeByContractIdAndId(needCopyNode.getParentId(), Long.parseLong(needCopyNode.getContractId()));
+                            //2.1 选择的父级的同级的父级节点,新增(跨节点新增)
+                            //当复制节点父级与选择复制到的位置节点的父级id相同时,表示新增
+                            if (parentNodeNeed != null && parentNodeNeed.getParentId().equals(toCopyNode.getParentId())) {
+                                toCopyNode.setNodeName(toCopyVO.getNodeName());
+                                toCopyNode.setPartitionCode(toCopyVO.getPartitionCode());
+
+                                //获取需要复制的所有子节点节点
+                                addChildNodes = this.getChildNodes(needCopyNode);
+
+                                if (ObjectUtil.isEmpty(addChildNodes) || addChildNodes.size() == 0) {
+                                    //最下层级节点复制
+                                    addChildNodes = new ArrayList<>();
+                                    addChildNodes.add(needCopyNode);
+                                }
+
+                                //获取所有复制的表
+                                addChildNodesTables = this.getChildNodesTables(addChildNodes, toCopyNode.getContractId());
+                                addChildNodesTablesOld = addChildNodesTables;
+                                //构造新的节点、表、数据
+                                this.addCopyNodesAndTabsBuildData(addChildNodes, addChildNodesTables, needCopyNode, toCopyNode, resultTablesData, 0, tabOwner, vo.getIsCopyData());
+
+                                //2.2 如果点击选择的是当前复制节点本身的同等级节点,那么就只复制数据。(如果是跨节点,类型相同的情况下,只复制数据)
+                            } else if (needCopyNode.getNodeType().equals(toCopyNode.getNodeType()) && !needCopyNode.getParentId().equals(toCopyNode.getParentId())) {
+                                //构造数据
+                                this.addCopyTabData(needCopyNode, toCopyNode, tabOwner, resultTablesData, vo.getIsCopyData());
+                            }
+                        }
+                    }
                 }
-                //设置父节点ID
-                if (vo.getNeedCopyPrimaryKeyId().equals(node.getPKeyId().toString())) {
-                    //找到复制的节点,将parentId更改为 parent.getId()
-                    newData.setParentId(parent.getId());
-                    //设置新名称
-                    newData.setNodeName(vo.getNeedCopyNodeName());
-                    newData.setFullName(vo.getNeedCopyNodeName());
-                } else {
-                    newData.setParentId(oldToNewIdMap.containsKey(node.getParentId()) ? oldToNewIdMap.get(node.getParentId()) : SnowFlakeUtil.getId());
+
+                //节点
+                if (addChildNodes != null && addChildNodes.size() > 0) {
+                    wbsTreeContractClient.saveBatch(addChildNodes);
+                    //更新redis缓存
+                    Map<Long, List<WbsTreeContract>> collect = addChildNodes.stream().filter(f -> new Integer(1).equals(f.getType()) && ObjectUtil.isNotEmpty(f.getParentId())).collect(Collectors.groupingBy(WbsTreeContract::getParentId));
+                    for (Map.Entry<Long, List<WbsTreeContract>> longListEntry : collect.entrySet()) {
+                        informationQueryService.AsyncWbsTree("", longListEntry.getKey().toString(), needCopyNode.getContractId(), "", "1");
+                    }
                 }
-                newData.setCreateTime(new Date());
-                newData.setUpdateTime(new Date());
+                //元素表
+                if (addChildNodesTables != null && addChildNodesTables.size() > 0) {
+                    wbsTreeContractClient.saveBatch(addChildNodesTables);
+
+                    if (addChildNodesTablesOld.size() > 0) {
+                        //文件附件新增 TODO
+
+                    }
+                }
+                //实体表数据
+                if (resultTablesData.size() > 0) {
+                    jdbcTemplate.execute(StringUtils.join(resultTablesData, ""));
+                }
+                return R.success("操作成功");
+            }
+        }
+        return R.fail("操作失败");
+    }
+
+    /**
+     * 复制数据
+     */
+    private void addCopyTabData(WbsTreeContract needCopyNode, WbsTreeContract toCopyNode, String tabOwner, List<String> resultTablesData, Integer isCopyData) {
+        List<WbsTreeContract> wbsTreeContractsNeed = Collections.singletonList(needCopyNode);
+        List<WbsTreeContract> wbsTreeContractsTo = Collections.singletonList(toCopyNode);
+        List<WbsTreeContract> needCopyNodeTabs = getChildNodesTables(wbsTreeContractsNeed, needCopyNode.getContractId());
+        List<WbsTreeContract> toCopyNodeTabs = getChildNodesTables(wbsTreeContractsTo, needCopyNode.getContractId());
+        if (needCopyNodeTabs.size() > 0) {
+            for (WbsTreeContract needTab : needCopyNodeTabs) {
+                for (WbsTreeContract toCopyNodeTab : toCopyNodeTabs) {
+                    //获取相同表单 nodeName 、HtmlUrl相同
+                    if (needTab.getNodeName().equals(toCopyNodeTab.getNodeName()) && (ObjectUtil.isNotEmpty(needTab.getHtmlUrl()) && ObjectUtil.isNotEmpty(toCopyNodeTab.getHtmlUrl()) && needTab.getHtmlUrl().equals(toCopyNodeTab.getHtmlUrl()))) {
+                        if (StringUtils.isEmpty(needTab.getInitTableName())) {
+                            //没有对应实体表,跳过
+                            continue;
+                        }
+                        Long oldPKeyId = needTab.getPKeyId();
+
+                        //表单所属方,只有勾选了对应的所属方权限才复制数据;勾选了复制数据才能复制,否则只是创建节点、表
+                        if (tabOwner.contains(needTab.getTableOwner()) && isCopyData == 1) {
+                            //获取实体表列对象
+                            List<QueryProcessDataVO> nodeTabColOneTab = informationQueryService.getNodeChildTabColsAllByTabName(needTab.getInitTableName());
+                            //转化为map
+                            Map<String, String> nodeTabColsMap = nodeTabColOneTab.stream().collect(Collectors.toMap(QueryProcessDataVO::getQueryType, QueryProcessDataVO::getAncestors, (key1, key2) -> key2));
+                            //组织复制表的数据的sql
+                            if (nodeTabColsMap.size() > 0) {
+                                StringBuilder copyDataSql = new StringBuilder();
+                                String tableName = needTab.getInitTableName();
+                                String col = nodeTabColsMap.get(tableName);
+                                String colVal = nodeTabColsMap.get(tableName);
+                                colVal = colVal.replaceAll("id,p_key_id,", "'" + SnowFlakeUtil.getId() + "' as id,'" + toCopyNodeTab.getPKeyId() + "' as p_key_id,");
+                                //delete SQL (先删除旧数据,再新增)
+                                String delSql = "delete from " + tableName + " where p_key_id = " + toCopyNodeTab.getPKeyId() + " ; ";
+                                //insert into SQL
+                                copyDataSql.append(delSql).append("insert into ").append(tableName).append("  (").append(col).append(") select ").append(colVal).append(" from ").append(tableName).append(" where p_key_id='").append(oldPKeyId).append("' ;");
+                                resultTablesData.add(copyDataSql.toString());
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 新增复制节点、表的数据构造
+     */
+    private void addCopyNodesAndTabsBuildData(List<WbsTreeContract> needNodes, List<WbsTreeContract> needTabs, WbsTreeContract needCopyNode, WbsTreeContract toCopyNode, List<String> resultTablesData, Integer isSameNode, String tabOwner, Integer isCopyData) {
+        int var = 0;
+        if (needNodes.size() == 1) {
+            //判断是否为最下级节点
+            WbsTreeContract wbsTreeContract = needNodes.stream().filter(f -> f.getPKeyId().equals(needCopyNode.getPKeyId())).findAny().orElse(null);
+            if (wbsTreeContract != null) {
+                var = 1;
+            }
+        }
+
+        //最下层级节点复制
+        if (var == 1) {
+            //构造节点
+            Long id = SnowFlakeUtil.getId();
+            for (WbsTreeContract needNode : needNodes) {
+                if (isSameNode == 0) {
+                    //跨节点复制,更改父级id
+                    needNode.setParentId(toCopyNode.getId());
+                }
+                needNode.setOldId(needNode.getId() + "");
+                needNode.setPKeyId(SnowFlakeUtil.getId());
+                needNode.setId(id);
+                needNode.setNodeName(toCopyNode.getNodeName());
+                needNode.setFullName(toCopyNode.getNodeName());
+                needNode.setPartitionCode(toCopyNode.getPartitionCode());
+                break;
+            }
+            //构造当前节点下所有元素表
+            for (WbsTreeContract needTab : needTabs) {
+
+                if (StringUtils.isEmpty(needTab.getInitTableName())) {
+                    continue;
+                }
+                Long oldPKeyId = needTab.getPKeyId();
+
+                Long tabId = SnowFlakeUtil.getId();
+                needTab.setAncestors(needTab.getAncestors().replace(needTab.getParentId().toString(), id.toString()));
+                needTab.setId(tabId);
+                needTab.setParentId(id);
+                needTab.setPKeyId(SnowFlakeUtil.getId());
                 //初始化是否显示表格,默认显示
-                newData.setIsBussShow(1);
+                needTab.setIsBussShow(1);
                 //初始化表格是否上传附件,默认未上传
-                newData.setTabFileType(1);
+                needTab.setTabFileType(1);
                 //初始化单表是否可以预览,默认不能
-                newData.setIsTabPdf(1);
+                needTab.setIsTabPdf(1);
                 //初始化PDF路径
-                newData.setPdfUrl(null);
-                newData.setCreateUser(AuthUtil.getUserId());
-                //重塑父节点关联关系
-                this.restoreParent(newData, oldToNewIdMap);
-                //保存到集合中
-                saveList.add(newData);
-                if (new Integer("6").equals(node.getNodeType())) {
-                    //生成施工日志
-                    this.createLedger(newData, saveLedger, nodeMap, null);
+                needTab.setPdfUrl(null);
+
+                //表单所属方,只有勾选了对应的所属方权限才复制数据;勾选了复制数据才能复制,否则只是创建节点、表
+                if (tabOwner.contains(needTab.getTableOwner()) && isCopyData == 1) {
+                    //获取实体表列对象
+                    List<QueryProcessDataVO> nodeTabColOneTab = informationQueryService.getNodeChildTabColsAllByTabName(needTab.getInitTableName());
+                    //转化为map
+                    Map<String, String> nodeTabColsMap = nodeTabColOneTab.stream().collect(Collectors.toMap(QueryProcessDataVO::getQueryType, QueryProcessDataVO::getAncestors, (key1, key2) -> key2));
+                    //组织复制表的数据的sql
+                    if (nodeTabColsMap.size() > 0) {
+                        StringBuilder copyDataSql = new StringBuilder();
+                        String tableName = needTab.getInitTableName();
+                        String col = nodeTabColsMap.get(tableName);
+                        String colVal = nodeTabColsMap.get(tableName);
+                        colVal = colVal.replaceAll("id,p_key_id,", "'" + SnowFlakeUtil.getId() + "' as id,'" + needTab.getPKeyId() + "' as p_key_id,");
+                        copyDataSql.append("insert into ").append(tableName).append("  (").append(col).append(") select ").append(colVal).append(" from ").append(tableName).append(" where p_key_id='").append(oldPKeyId).append("' ;");
+                        resultTablesData.add(copyDataSql.toString());
+                    }
                 }
+            }
 
-                // 组织复制值Sql
-                if (nodeTabColsMap != null && node.getType() == 2) {
-                    String tableName = newData.getInitTableName();
-                    String col = nodeTabColsMap.get(tableName);
-                    String colVal = nodeTabColsMap.get(tableName);
-                    colVal = colVal.replaceAll("id,p_key_id,", "'" + SnowFlakeUtil.getId() + "' as id,'" + newData.getPKeyId() + "' as p_key_id,");
-                    copeSql.append("insert into " + tableName + "  (" + col + ") select " + colVal + " from " + tableName + " where p_key_id='" + node.getPKeyId() + "' ;");
+            //多层级节点复制
+        } else {
+            //根节点id
+            Long toCopyNodeOldId = toCopyNode.getId();
+            toCopyNode.setId(SnowFlakeUtil.getId());
+
+            Map<Long, Long> parentIdToId = new HashMap<>();
+            Map<Long, List<WbsTreeContract>> tabMap = needTabs.stream().collect(Collectors.groupingBy(WbsTreeContract::getParentId));
+
+            for (WbsTreeContract node : needNodes) {
+                Long oldId = node.getId();
+                //构造节点
+                Long newParentId;
+                if (parentIdToId.size() > 0) {
+                    //去数据源节点获取父级id对应的新id,设置成重设后的新的父级id
+                    newParentId = parentIdToId.get(node.getParentId());
+                } else {
+                    //根节点
+                    newParentId = toCopyNode.getId();
                 }
-            });
+                if (ObjectUtils.isEmpty(newParentId)) {
+                    newParentId = toCopyNode.getId();
+                }
+                node.setPKeyId(SnowFlakeUtil.getId());
+                node.setOldId(node.getId().toString());
+                Long id = SnowFlakeUtil.getId();
+                //数据源节点的老id与新的id的Map,作为下一级的节点的父级id的替换
+                parentIdToId.put(node.getId(), id);
+                //重设祖级id
+                node.setAncestors(node.getAncestors().replace(node.getParentId().toString(), id.toString()));
+                //重设Id
+                node.setId(id);
+                node.setParentId(newParentId);
+
+                //构造当前节点下所有元素表
+                List<WbsTreeContract> tabs = tabMap.get(oldId);
+                //构造节点下的表
+                if (tabs != null && tabs.size() > 0) {
+                    for (WbsTreeContract needTab : tabs) {
+                        if (StringUtils.isEmpty(needTab.getInitTableName())) {
+                            continue;
+                        }
+                        Long oldPKeyId = needTab.getPKeyId();
+
+                        Long tabId = SnowFlakeUtil.getId();
+                        needTab.setAncestors(needTab.getAncestors().replace(needTab.getParentId().toString(), id.toString()));
+                        needTab.setId(tabId);
+                        needTab.setParentId(id);
+                        needTab.setPKeyId(SnowFlakeUtil.getId());
+                        //初始化是否显示表格,默认显示
+                        needTab.setIsBussShow(1);
+                        //初始化表格是否上传附件,默认未上传
+                        needTab.setTabFileType(1);
+                        //初始化单表是否可以预览,默认不能
+                        needTab.setIsTabPdf(1);
+                        //初始化PDF路径
+                        needTab.setPdfUrl(null);
+
+                        //表单所属方,只有勾选了对应的所属方权限才复制数据;勾选了复制数据才能复制,否则只是创建节点、表
+                        if (tabOwner.contains(needTab.getTableOwner()) && isCopyData == 1) {
+                            //获取实体表列对象
+                            List<QueryProcessDataVO> nodeTabColOneTab = informationQueryService.getNodeChildTabColsAllByTabName(needTab.getInitTableName());
+                            //转化为map
+                            Map<String, String> nodeTabColsMap = nodeTabColOneTab.stream().collect(Collectors.toMap(QueryProcessDataVO::getQueryType, QueryProcessDataVO::getAncestors, (key1, key2) -> key2));
+                            //组织复制表的数据的sql
+                            if (nodeTabColsMap.size() > 0) {
+                                StringBuilder copyDataSql = new StringBuilder();
+                                String tableName = needTab.getInitTableName();
+                                String col = nodeTabColsMap.get(tableName);
+                                String colVal = nodeTabColsMap.get(tableName);
+                                colVal = colVal.replaceAll("id,p_key_id,", "'" + SnowFlakeUtil.getId() + "' as id,'" + needTab.getPKeyId() + "' as p_key_id,");
+                                copyDataSql.append("insert into ").append(tableName).append("  (").append(col).append(") select ").append(colVal).append(" from ").append(tableName).append(" where p_key_id='").append(oldPKeyId).append("' ;");
+                                resultTablesData.add(copyDataSql.toString());
+                            }
+                        }
+                    }
+                }
+            }
+
+            //添加根节点
+            toCopyNode.setOldId(needCopyNode.getId() + "");
+            if (isSameNode == 1) {
+                //同节点
+                toCopyNode.setParentId(needCopyNode.getParentId());
+            } else {
+                //跨节点
+                toCopyNode.setParentId(toCopyNodeOldId);
+            }
+            toCopyNode.setPKeyId(SnowFlakeUtil.getId());
+            toCopyNode.setNodeName(toCopyNode.getNodeName());
+            toCopyNode.setFullName(toCopyNode.getNodeName());
+            toCopyNode.setPartitionCode(toCopyNode.getPartitionCode());
+            needNodes.add(toCopyNode);
         }
-        //保存节点信息
-        R<Boolean> booleanR = this.saveOrCopyNodeTree(saveList, saveLedger, 32, needCopyNode);
+    }
 
-        //复制数据逻辑
-        if (nodeTabColsMap != null && copeSql.length() >= 10) {
-            jdbcTemplate.execute(copeSql.toString());
+    /**
+     * 获取所有子级节点
+     */
+    private List<WbsTreeContract> getChildNodes(WbsTreeContract obj) {
+        if (obj != null) {
+            List<WbsTreeContract> wbsTreeContracts = Collections.singletonList(obj);
+            List<WbsTreeContract> result = new ArrayList<>();
+            this.recursionGetChildNodes(wbsTreeContracts, result, obj.getContractId());
+            if (result.size() > 0) {
+                return result;
+            }
         }
+        return null;
+    }
 
-        //获取父节点信息
-        informationQueryService.AsyncWbsTree(needCopyNode.getParentId() + "", needCopyNode.getParentId() + "", needCopyNode.getContractId(), "", "1");
-        return booleanR;
+    private void recursionGetChildNodes(List<WbsTreeContract> list, List<WbsTreeContract> result, String contractId) {
+        List<Long> ids = list.stream().map(WbsTreeContract::getId).collect(Collectors.toList());
+        if (ids.size() > 0) {
+            List<WbsTreeContract> query = jdbcTemplate.query("select * from m_wbs_tree_contract where type = 1 and parent_id in(" + StringUtils.join(ids, ",") + ") and status = 1 and is_deleted = 0 and contract_id = " + contractId, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+            if (query.size() > 0) {
+                result.addAll(query);
+                recursionGetChildNodes(query, result, contractId);
+            }
+        }
+    }
+
+    /**
+     * 获取所有子级下的表
+     */
+    private List<WbsTreeContract> getChildNodesTables(List<WbsTreeContract> list, String contractId) {
+        if (list != null && list.size() > 0) {
+            List<Long> parentIds = list.stream().map(WbsTreeContract::getId).collect(Collectors.toList());
+            return jdbcTemplate.query("select * from m_wbs_tree_contract where type = 2 and is_deleted = 0 and status = 1 and parent_id in(" + StringUtils.join(parentIds, ",") + ") and contract_id = " + contractId, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+        }
+        return null;
     }
 
 
@@ -1619,17 +2003,6 @@ public class InformationWriteQueryController extends BladeController {
                         newData.setPdfUrl(null);
 
                         //获取当前所有复制的节点的最大sort
-                        /*String sql = "select sort from m_wbs_tree_contract where contract_id = '" + node.getContractId() + "' and (id = '" + node.getId() + "' or old_id = '" + node.getId() + "')";
-                        List<WbsTreeContract> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
-                        List<Integer> collect = query.stream().filter(f -> ObjectUtils.isNotEmpty(f.getSort())).collect(Collectors.toList()).stream().map(WbsTreeContract::getSort).collect(Collectors.toList());
-                        Integer max = 1;
-                        if (collect.size() > 0) {
-                            max = collect.stream().reduce(collect.get(0), Integer::max);
-                        } else {
-                            max = 1;
-                        }
-                        //设置sort
-                        newData.setSort(max);*/
                         newData.setSort(ObjectUtils.isNotEmpty(node.getSort()) ? node.getSort() : 0);
 
                         //重塑父节点关联关系
@@ -1676,7 +2049,8 @@ public class InformationWriteQueryController extends BladeController {
     /**
      * 生成施工日志记录
      */
-    private void createLedger(WbsTreeContract newData, List<ConstructionLedger> saveLedger, Map<String, WbsTreeContract> contractNodeMap, Map<String, WbsTreePrivate> projectNodeMap) {
+    private void createLedger(WbsTreeContract
+                                      newData, List<ConstructionLedger> saveLedger, Map<String, WbsTreeContract> contractNodeMap, Map<String, WbsTreePrivate> projectNodeMap) {
         //工序,需要新增施工台账
         ConstructionLedger ledger = new ConstructionLedger();
         //获取这个节点的原始信息
@@ -1730,7 +2104,8 @@ public class InformationWriteQueryController extends BladeController {
      * @param parentList 父节点集合
      * @param childList  保存集合
      */
-    private void foreachQueryChildContract(List<WbsTreeContract> parentList, List<WbsTreeContract> childList, Map<String, List<WbsTreeContract>> contractAllNodeMap) {
+    private void foreachQueryChildContract
+    (List<WbsTreeContract> parentList, List<WbsTreeContract> childList, Map<String, List<WbsTreeContract>> contractAllNodeMap) {
         parentList.forEach(parent -> {
             List<WbsTreeContract> childs;
             if (contractAllNodeMap.containsKey(parent.getId().toString())) {
@@ -1771,7 +2146,8 @@ public class InformationWriteQueryController extends BladeController {
             @ApiImplicitParam(name = "wbsType", value = "模板类型, 1质检,2试验", required = true),
             @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
     })
-    public R<List<WbsTreeContractTreeVOS>> queryMappingStructureTree(@RequestParam String parentId, @RequestParam String contractId, @RequestParam String contractIdRelation) {
+    public R<List<WbsTreeContractTreeVOS>> queryMappingStructureTree(@RequestParam String
+                                                                             parentId, @RequestParam String contractId, @RequestParam String contractIdRelation) {
         List<WbsTreeContractTreeVOS> result = this.informationQueryService.queryContractTree(parentId, contractId, contractIdRelation, null);
         if (result.size() == 1) {
             //只有一个子节点,继续向下
@@ -1823,7 +2199,8 @@ public class InformationWriteQueryController extends BladeController {
             @ApiImplicitParam(name = "nodeName", value = "节点的title", required = true),
             @ApiImplicitParam(name = "partitionCode", value = "划分编号")
     })
-    public R<Boolean> updateContractNodeParameter(@RequestParam Long pKeyId, @RequestParam String nodeName, @RequestParam String partitionCode) {
+    public R<Boolean> updateContractNodeParameter(@RequestParam Long pKeyId, @RequestParam String
+            nodeName, @RequestParam String partitionCode) {
         WbsTreeContract node = new WbsTreeContract();
         node.setPKeyId(pKeyId);
         node.setNodeName(nodeName);
@@ -2133,7 +2510,8 @@ public class InformationWriteQueryController extends BladeController {
         return booleanR;
     }
 
-    private List<WbsTreePrivate> unifiedCode(List<AddContractTreeNodeVO.Node> allSelectedNodeList, WbsTreeContract treeContract) {
+    private List<WbsTreePrivate> unifiedCode
+            (List<AddContractTreeNodeVO.Node> allSelectedNodeList, WbsTreeContract treeContract) {
         //获取主键
         List<String> halfSelectedList = allSelectedNodeList.stream().map(AddContractTreeNodeVO.Node::getPrimaryKeyId).distinct().collect(Collectors.toList());
         //查询数据
@@ -2145,7 +2523,9 @@ public class InformationWriteQueryController extends BladeController {
     }
 
     @NotNull
-    private R<Boolean> saveOrCopyNodeTree(List<WbsTreeContract> saveList, List<ConstructionLedger> saveLedger, Integer operationType, WbsTreeContract currentNode) {
+    private R<Boolean> saveOrCopyNodeTree
+            (List<WbsTreeContract> saveList, List<ConstructionLedger> saveLedger, Integer
+                    operationType, WbsTreeContract currentNode) {
 
         if (saveList.size() > 0) {
             StringBuilder str = new StringBuilder();
@@ -2199,7 +2579,8 @@ public class InformationWriteQueryController extends BladeController {
     /**
      * 处理半选集合
      */
-    private void disposeHalfSelectList(@RequestBody WbsTreeContract treeContract, List<AddContractTreeNodeVO.Node> allSelectedNodeList, List<WbsTreePrivate> selectedNodeList) {
+    private void disposeHalfSelectList(@RequestBody WbsTreeContract
+                                               treeContract, List<AddContractTreeNodeVO.Node> allSelectedNodeList, List<WbsTreePrivate> selectedNodeList) {
         if (allSelectedNodeList != null && allSelectedNodeList.size() > 0) {
             //获取主键
             List<String> allSelectedList = allSelectedNodeList.stream().map(AddContractTreeNodeVO.Node::getPrimaryKeyId).distinct().collect(Collectors.toList());
@@ -2245,7 +2626,8 @@ public class InformationWriteQueryController extends BladeController {
             @ApiImplicitParam(name = "projectId", value = "项目ID"),
             @ApiImplicitParam(name = "id", value = "点击节点ID")
     })
-    public R<List<WbsTreeContractTreeVOS>> queryWbsTreePrivateByProjectIdAndId(@RequestParam String projectId, @RequestParam String id) {
+    public R<List<WbsTreeContractTreeVOS>> queryWbsTreePrivateByProjectIdAndId(@RequestParam String
+                                                                                       projectId, @RequestParam String id) {
         List<WbsTreeContractTreeVOS> result = new ArrayList<>();
 
         if (StringUtils.isNotEmpty(id)) {
@@ -2419,7 +2801,9 @@ public class InformationWriteQueryController extends BladeController {
             @ApiImplicitParam(name = "parentId", value = "父节点,为空则查询第一级节点"),
             @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
     })
-    public R<List<WbsTreeContractTreeVOS>> queryStandingBookContractWbsTree(@RequestParam String primaryKeyId, @RequestParam String parentId, @RequestParam String contractId, @RequestParam String contractIdRelation) {
+    public R<List<WbsTreeContractTreeVOS>> queryStandingBookContractWbsTree(@RequestParam String
+                                                                                    primaryKeyId, @RequestParam String parentId, @RequestParam String contractId, @RequestParam String
+                                                                                    contractIdRelation) {
         if (StringUtils.isNotEmpty(primaryKeyId)) {
             parentId = primaryKeyId;
         }
@@ -2442,7 +2826,8 @@ public class InformationWriteQueryController extends BladeController {
             @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true),
             @ApiImplicitParam(name = "classifyType", value = "所属方,监理、总监办的资料查询使用,=1施工数据(默认),=2监理数据")
     })
-    public R<List<WbsTreeContractTreeVOS>> queryContractWbsTreeByContractIdAndType(@RequestParam String primaryKeyId,
+    public R<List<WbsTreeContractTreeVOS>> queryContractWbsTreeByContractIdAndType(@RequestParam String
+                                                                                           primaryKeyId,
                                                                                    @RequestParam String parentId,
                                                                                    @RequestParam String contractId,
                                                                                    @RequestParam String contractIdRelation,
@@ -2510,7 +2895,8 @@ public class InformationWriteQueryController extends BladeController {
             @ApiImplicitParam(name = "parentId", value = "父节点,为空则查询第一级节点"),
             @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
     })
-    public R<List<WbsTreeContractTreeVOS>> queryContractWbsTreeByFirstInfo(@RequestParam String parentId, @RequestParam String contractId, @RequestParam String contractIdRelation) {
+    public R<List<WbsTreeContractTreeVOS>> queryContractWbsTreeByFirstInfo(@RequestParam String
+                                                                                   parentId, @RequestParam String contractId, @RequestParam String contractIdRelation) {
         List<WbsTreeContractTreeVOS> rootTreeNode = informationQueryService.queryContractTree(parentId, contractId, contractIdRelation, null);
         //查询被标记为首件的数据
         rootTreeNode = rootTreeNode.stream().filter(WbsTreeContractTreeVOS::getIsFirst).collect(Collectors.toList());

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

@@ -313,7 +313,6 @@ public class TaskController extends BladeController {
                             String projectId = projectAndContractId.split(",")[0];
                             String contractId = projectAndContractId.split(",")[1];
                             Map<String, String> stringMap = iTaskService.getTaskCount(projectId, contractId, userId);
-
                             webSocket.sendMessageByUserId(AuthUtil.getUserId().toString(), JSON.toJSONString(stringMap));
                         }
                     }

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

@@ -111,4 +111,8 @@ public interface InformationQueryMapper extends BaseMapper<InformationQuery> {
 
 	// 获取当前节点下,所有表单的字段数据
 	List<QueryProcessDataVO> getNodeChildTabColsAllByNodeId(String nodeId, String contractId);
+
+	// 获取当前节点下,所有表单的字段数据,根据表名
+	List<QueryProcessDataVO> getNodeChildTabColsAllByTabName(String tabName);
+
 }

File diff suppressed because it is too large
+ 491 - 405
blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml


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

@@ -14,6 +14,7 @@
         <result column="is_deleted" property="isDeleted"/>
         <result column="task_parallel_id" property="taskParallelId"/>
         <result column="json_data" property="jsonData"/>
+        <result column="nick_name" property="nickName"/>
     </resultMap>
 
     <delete id="deletedById">

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

@@ -126,6 +126,9 @@ public interface IInformationQueryService extends BaseService<InformationQuery>
     // 获取当前节点所有的表的字段信息
     List<QueryProcessDataVO> getNodeChildTabColsAllByNodeId(String nodeId, String contractId);
 
+    // 获取当前节点下,所有表单的字段数据,根据表名
+    List<QueryProcessDataVO> getNodeChildTabColsAllByTabName(String tabName);
+
     // 测试节点信息
     List<WbsTreeContractTreeVOS> queryContractTree(String parentId, String contractId, String contractIdRelation, String classifyType);
 

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

@@ -19,6 +19,8 @@ package org.springblade.business.service;
 import org.springblade.business.entity.TaskBatch;
 import org.springblade.core.mp.base.BaseService;
 
+import java.util.List;
+
 /**
  *  服务类
  *

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

@@ -105,7 +105,7 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
             }
             if (tableList != null && tableList.size() > 0) {
                 //删除掉无法溯源的数据
-                tableList.removeIf(node -> node.getIsTypePrivatePid() == null || node.getIsTypePrivatePid() <= 0 || StringUtils.isEmpty(node.getIsTypePrivatePid().toString()));
+                tableList.removeIf(node -> node.getIsTypePrivatePid() == null || node.getIsTypePrivatePid() <= 0 || StringUtils.isEmpty(node.getIsTypePrivatePid().toString()) || node.getHtmlUrl()==null );
                 List<Long> privatePIdList = tableList.stream().map(WbsTreeContract::getIsTypePrivatePid).distinct().collect(Collectors.toList());
                 return JSONArray.parseArray(JSONObject.toJSONString(privatePIdList), String.class);
 
@@ -118,7 +118,6 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
                     return Func.toStrList(obj.getTableIds());
                 }
             }
-
         } else {
             //那么就可能是日志,检查是不是日志
             ContractLog log = this.contractLogService.getById(formDataId);
@@ -717,6 +716,10 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
         return baseMapper.getNodeChildTabColsAllByNodeId(nodeId, contractId);
     }
 
+    @Override
+    public List<QueryProcessDataVO> getNodeChildTabColsAllByTabName(String tabName) {
+        return baseMapper.getNodeChildTabColsAllByTabName(tabName);
+    }
 
     @Override
     public void AsyncWbsTree(String primaryKeyId, String parentId, String contractId, String contractIdRelation, String classifyType) {

+ 75 - 9
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java

@@ -1,5 +1,6 @@
 package org.springblade.business.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -38,10 +39,15 @@ import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.ProjectInfo;
 import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.feign.ProjectClient;
+import org.springblade.system.user.cache.UserCache;
+import org.springblade.system.user.entity.User;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -96,6 +102,9 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
 
     private final JdbcTemplate jdbcTemplate;
 
+    @Autowired
+    StringRedisTemplate RedisTemplate;
+
     private final ITrialSelfInspectionRecordService iTrialSelfInspectionRecordService;
 
     // 线程池
@@ -425,19 +434,71 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                     .in(TaskParallel::getParallelProcessInstanceId, taskIds));
             //保存批次
         TaskBatch taskBatch = new TaskBatch(null, JSONObject.toJSONString(taskApprovalVOS));
-            taskBatch.setCreateUser(AuthUtil.getUserId());
+            taskBatch.setCreateUser(userId);
+            taskBatch.setNickName(nickName);
             taskBatch.setCreateTime(new Date());
 
             this.taskBatchService.save(taskBatch);
             String taskBatchId = taskBatch.getId().toString();
+
+            // 电签
+            Boolean istrue = true;
+            for (TaskApprovalVO taskApprovalVO : taskApprovalVOS) {
+                Boolean aBoolean = RedisTemplate.hasKey("sign-" + taskApprovalVO.getFormDataId());
+                if(aBoolean){
+                    istrue =false;
+                    break;
+                }
+            }
+
             // 添加到 线程中
-            CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
-                try {
-                    this.checkIsExsitTaskBatch(taskApprovalVOS, taskBatchId,userId,nickName);
-                } catch (FileNotFoundException e) {
-                    e.printStackTrace();
+            if(istrue){
+                CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
+                    try {
+                        this.checkIsExsitTaskBatch(taskApprovalVOS, taskBatchId,userId,nickName);
+                    } catch (FileNotFoundException e) {
+                        e.printStackTrace();
+                    }
+                }, executor);  
+            }
+    }
+
+
+    @Scheduled(cron = "0 */3 * * * ?")
+    public  void  SignInfo() {
+        //执行代码
+        logger.debug("扫描开始");
+        List<TaskBatch> maps = taskBatchService.getBaseMapper().selectList(Wrappers.<TaskBatch>lambdaQuery().eq(TaskBatch::getIsDeleted, 0));
+        if(maps!=null && maps.size()>=1){
+            for (TaskBatch dataInfo:maps){
+                String jsonData = dataInfo.getJsonData();
+                List<TaskApprovalVO> list=JSONArray.parseArray(jsonData,TaskApprovalVO.class);
+                String taskBatchId = dataInfo.getId().toString();
+                Long userId = dataInfo.getCreateUser();
+                String nickName = dataInfo.getNickName();
+
+                Boolean istrue = true;
+                for (TaskApprovalVO taskApprovalVO : list) {
+                    Boolean aBoolean = RedisTemplate.hasKey("sign-" + taskApprovalVO.getFormDataId());
+                    if(aBoolean){
+                        istrue =false;
+                        break;
+                    }
+                }
+
+                // 添加到 线程中
+                if(istrue){
+                    CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
+                        try {
+                            this.checkIsExsitTaskBatch(list, taskBatchId,userId,nickName);
+                        } catch (FileNotFoundException e) {
+                            e.printStackTrace();
+                        }
+                    }, executor);
+                    runAsync.join();
                 }
-            }, executor);
+            }
+        }
     }
 
     private void checkIsExsitTaskBatch(List<TaskApprovalVO> taskApprovalVOS, String batchId,Long userId,String nickName) throws FileNotFoundException {
@@ -448,8 +509,9 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             for (TaskApprovalVO taskApprovalVO : taskApprovalVOS) {
                 taskApprovalVO.setUserId(userId);
                 taskApprovalVO.setNickName(nickName);
-                String pdfUrlEVisa = this.completeApprovalTask(taskApprovalVO);
+                RedisTemplate.opsForValue().set("sign-"+taskApprovalVO.getFormDataId(),"1",300, TimeUnit.SECONDS);
 
+                String pdfUrlEVisa = this.completeApprovalTask(taskApprovalVO);
                 //TODO ============== 电签成功,修改试验状态,关联工程部位信息pdf(只有电签成功,才修改) liuYc 2023-03-16 ==============
                 if ("OK".equals(taskApprovalVO.getFlag()) && StringUtils.isNotEmpty(pdfUrlEVisa)) {
                     //已审批
@@ -460,8 +522,12 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                     this.iTrialSelfInspectionRecordService.updateTrialSelfInspectionRecordStatusFC(taskApprovalVO);
                 }
             }
-            //删除掉对应批次
+
+            //executor删除掉对应批次
             this.taskBatchService.deletedById(batchId);
+            for (TaskApprovalVO taskApprovalVO : taskApprovalVOS) {
+                RedisTemplate.delete("sign-"+taskApprovalVO.getFormDataId());
+            }
             isContinue = false;
         }
     }

+ 12 - 12
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java

@@ -872,7 +872,7 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
         return dto.getId().toString();
     }
 
-    private void initBuildNumber(TrialSelfInspectionRecordDTO dto) {
+    public void initBuildNumber(TrialSelfInspectionRecordDTO dto) {
         if (ObjectUtil.isEmpty(dto.getId()) && StringUtils.isNotEmpty(dto.getTableType())) {
             //构建记录表编号、报告单编号
             this.buildNumber(dto);
@@ -880,7 +880,7 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
         }
     }
 
-    private void initTrialTabIds(TrialSelfInspectionRecordDTO dto) {
+    public void initTrialTabIds(TrialSelfInspectionRecordDTO dto) {
         JSONArray dataArray = dto.getDataInfo().getJSONArray("orderList");
         List<String> tableIds = new ArrayList<>();
         for (int i = 0; i < dataArray.size(); i++) {
@@ -892,11 +892,11 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
         dto.setTableIds(join);
     }
 
-    private void reBuildNumber(TrialSelfInspectionRecord obj, TrialSelfInspectionRecordDTO dto) {
-        if (StringUtils.isEmpty(obj.getRecordNo()) && dto.getTableType().contains("1")) {
+    public void reBuildNumber(TrialSelfInspectionRecord obj, TrialSelfInspectionRecordDTO dto) {
+        if (StringUtils.isEmpty(obj.getRecordNo()) && (dto.getTableType().contains("1") || dto.getTableType().contains("9"))) {
             this.buildNumber(dto);
             this.saveOrUpdate(dto);
-        } else if (StringUtils.isEmpty(obj.getReportNo()) && dto.getTableType().contains("2")) {
+        } else if (StringUtils.isEmpty(obj.getReportNo()) && (dto.getTableType().contains("2") || dto.getTableType().contains("10"))) {
             this.buildNumber(dto);
             this.saveOrUpdate(dto);
         }
@@ -1028,11 +1028,11 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
         List<TrialSelfInspectionRecord> trialSelfInspectionRecords = result.stream().filter(Objects::nonNull).collect(Collectors.toList());
 
         //两种类型同时生成
-        if (dto.getTableType().contains("1,2") || dto.getTableType().contains("2,1")) {
+        if (dto.getTableType().contains("1,2") || dto.getTableType().contains("2,1") || dto.getTableType().contains("9,10") || dto.getTableType().contains("10,9")) {
             String maxRecordNo = "";
             if (StringUtils.isEmpty(dto.getRecordNo())) {
                 //获取记录表最大编号
-                List<String> recordNos = trialSelfInspectionRecords.stream().filter(f -> ObjectUtils.isNotEmpty(f.getRecordNo())).map(TrialSelfInspectionRecord::getRecordNo).collect(Collectors.toList());
+                List<String> recordNos = trialSelfInspectionRecords.stream().map(TrialSelfInspectionRecord::getRecordNo).filter(ObjectUtils::isNotEmpty).collect(Collectors.toList());
                 if (recordNos.size() == 0 || ObjectUtil.isEmpty(recordNos)) {
                     maxRecordNo = "0001";
                 } else {
@@ -1053,7 +1053,7 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
             String maxReportNo = "";
             if (StringUtils.isEmpty(dto.getReportNo())) {
                 //获取报告单最大编号
-                List<String> reportNos = trialSelfInspectionRecords.stream().filter(f -> ObjectUtils.isNotEmpty(f.getReportNo())).map(TrialSelfInspectionRecord::getReportNo).collect(Collectors.toList());
+                List<String> reportNos = trialSelfInspectionRecords.stream().map(TrialSelfInspectionRecord::getReportNo).filter(ObjectUtils::isNotEmpty).collect(Collectors.toList());
                 if (reportNos.size() == 0 || ObjectUtil.isEmpty(reportNos)) {
                     maxReportNo = "0001";
                 } else {
@@ -1101,10 +1101,10 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
         }
 
         //记录表
-        if (("1").equals(dto.getTableType())) {
+        if (("1").equals(dto.getTableType()) || ("9").equals(dto.getTableType())) {
             if (StringUtils.isEmpty(dto.getRecordNo())) {
                 //获取记录表最大编号
-                List<String> recordNos = trialSelfInspectionRecords.stream().filter(f -> ObjectUtils.isNotEmpty(f.getRecordNo())).map(TrialSelfInspectionRecord::getRecordNo).collect(Collectors.toList());
+                List<String> recordNos = trialSelfInspectionRecords.stream().map(TrialSelfInspectionRecord::getRecordNo).filter(ObjectUtils::isNotEmpty).collect(Collectors.toList());
                 String maxRecordNo;
                 if (recordNos.size() == 0 || ObjectUtil.isEmpty(recordNos)) {
                     maxRecordNo = "0001";
@@ -1141,10 +1141,10 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
         }
 
         //报告单
-        if (("2").equals(dto.getTableType())) {
+        if (("2").equals(dto.getTableType()) || ("10").equals(dto.getTableType())) {
             if (StringUtils.isEmpty(dto.getReportNo())) {
                 //获取报告单最大编号
-                List<String> reportNos = trialSelfInspectionRecords.stream().filter(f -> ObjectUtils.isNotEmpty(f.getReportNo())).map(TrialSelfInspectionRecord::getReportNo).collect(Collectors.toList());
+                List<String> reportNos = trialSelfInspectionRecords.stream().map(TrialSelfInspectionRecord::getReportNo).filter(ObjectUtils::isNotEmpty).collect(Collectors.toList());
                 String maxReportNo;
                 if (reportNos.size() == 0 || ObjectUtil.isEmpty(reportNos)) {
                     maxReportNo = "0001";

+ 12 - 3
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java

@@ -51,6 +51,8 @@ import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.feign.SignPfxClient;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.cache.ParamCache;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
 import org.springframework.http.converter.HttpMessageConverter;
 import org.springframework.http.converter.StringHttpMessageConverter;
@@ -100,6 +102,9 @@ public class EVisaServiceImpl implements EVisaService {
 
     private final ContractClient contractClient;
 
+    @Autowired
+    StringRedisTemplate RedisTemplate;
+
     @Override
     public String certification(String pdfUrl, String fileName, String contractId) {
         try {
@@ -311,6 +316,7 @@ public class EVisaServiceImpl implements EVisaService {
         TaskApprovalVO taskFile = this.taskClient.queryBusinessDataTask(JSONObject.parseObject(JSONObject.toJSONString(task), TaskApprovalVO.class));
         if (taskFile == null || taskFile.getApprovalFileList().size() <= 0) {
             //没有找到业务文件,取消签章
+            RedisTemplate.delete("sign-"+task.getFormDataId());
             return NOT_PFX_OR_FILE;
         }
 
@@ -318,6 +324,7 @@ public class EVisaServiceImpl implements EVisaService {
         List<JSONObject> eVisaConfigList = this.taskClient.queryBusinessTableEVisaConfig(task.getParallelProcessInstanceId(),task.getUserId(), "false");
         if (eVisaConfigList == null || eVisaConfigList.size() == 0) {
             //没有电签配置,默认当前任务为不签字审批,返回成功
+            RedisTemplate.delete("sign-"+task.getFormDataId());
             return SUCCESS + "@@@@" + taskFile.getApprovalFileList().get(0).getFileUrl();
         }
 
@@ -325,11 +332,12 @@ public class EVisaServiceImpl implements EVisaService {
         List<SignPfxFile> userPfxList = this.signPfxClient.querySignPfxByUserIdOrContractId(task.getUserId().toString(), "");
         if (userPfxList == null || userPfxList.size() <= 0) {
             //没有签章,不执行电签
+            RedisTemplate.delete("sign-"+task.getFormDataId());
             return NOT_PFX_OR_FILE;
         }
 
         //上锁
-        if (DistributedRedisLock.acquire(task.getUserId().toString(), batch)) {
+        //if (DistributedRedisLock.acquire(task.getUserId().toString(), batch)) {
             try {
                 //获取需要签章的数据
                 List<TaskApprovalVO.ApprovalFile> files = taskFile.getApprovalFileList();
@@ -383,11 +391,12 @@ public class EVisaServiceImpl implements EVisaService {
                     }
                 }
             } catch (Exception e) {
+                RedisTemplate.delete("sign-"+task.getFormDataId());
                 e.printStackTrace();
             }
-        }
+       // }
         //释放锁
-        DistributedRedisLock.release(task.getUserId().toString());
+      //  DistributedRedisLock.release(task.getUserId().toString());
 
         return resultMessage;
     }

+ 11 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -282,8 +282,8 @@ public class ExcelTabController extends BladeController {
     })
     public R putFileAttach(@RequestParam("file") MultipartFile file, Long nodeId) {
 
-        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-        //String file_path = "/Users/hongchuangyanfa/Desktop/"; //ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        //String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        String file_path = "/Users/hongchuangyanfa/Desktop/"; //ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
 
         ExcelTab detail = excelTabService.getById(nodeId);
         // 上传excel文件
@@ -859,6 +859,9 @@ public class ExcelTabController extends BladeController {
 
             // 计算单元格坐标
             int x = 0;
+            if(i==9 || i==10){
+                System.out.println("1234");
+            }
             for (int j = 0; j < tds.size(); j++) {
                 {
                     Element data = tds.get(j);
@@ -971,7 +974,10 @@ public class ExcelTabController extends BladeController {
                                 int mx1 = Integer.parseInt(dataInfo3.split(":")[0]);
                                 int mx2 = Integer.parseInt(dataInfo3.split(":")[1]);
                                 if (mx2 + 1 == x1) {
-                                    dataInfo = StringUtils.join(ArrayUtils.remove(dataInfo2, dataInfo2.length - 1)); //removing element at index 2
+                                    String [] data3=new String[dataInfo2.length-1];
+                                    System.arraycopy(dataInfo2,0,data3,0,data3.length);
+                                    dataInfo = StringUtils.join(data3); //removing element at index 2
+
                                     if (dataInfo2.length == 1) {
                                         dataInfo = mx1 + ":" + x2;
                                     } else {
@@ -1679,9 +1685,9 @@ public class ExcelTabController extends BladeController {
         System.out.println("3=" + DateUtil.formatDateTime(DateUtil.now()));
         //单个 pdf加载
         for (TableInfo tableInfo : tableInfoList) {
-            if(!tableInfo.isToBeUpdated()){
+            //if(!tableInfo.isToBeUpdated()){
                 excelTabService.getBussPdfInfo(Long.parseLong(tableInfo.getPkeyId()));
-            }
+          //  }
 
         }
         System.out.println("4=" + DateUtil.formatDateTime(DateUtil.now()));

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

@@ -378,8 +378,24 @@ public class FirstController extends BladeController {
                 if (pdfUrls.size() > 0) {
                     try {
                         //关联的数据
-                        if (StringUtils.isNotEmpty(firstJson.getString("linkMergePdfUrl"))) {
-                            pdfUrls.add(firstJson.getString("linkMergePdfUrl"));
+//                        if (StringUtils.isNotEmpty(firstJson.getString("linkMergePdfUrl"))) {
+//                            pdfUrls.add(firstJson.getString("linkMergePdfUrl"));
+//                        }
+                        //获取所有工序节点的最新pdf
+                        String ids = firstJson.getString("sjRecordIds");
+                        if (StringUtils.isNotEmpty(ids)) {
+                            String[] strings = ids.split(",");
+                            for (String id : strings) {
+                                JSONObject info = informationQueryClient.queryFirstBusinessDataByFirstId(id);
+                                if (StringUtils.isNotEmpty(info.getString("eVisaPdfUrl"))){
+                                    pdfUrls.add(info.getString("eVisaPdfUrl"));
+                                }else if (StringUtils.isNotEmpty(info.getString("pdfUrl"))){
+                                    pdfUrls.add(info.getString("pdfUrl"));
+                                }
+                                if (StringUtils.isNotEmpty(info.getString("uploadFile"))) {
+                                    pdfUrls.add(info.getString("uploadFile"));
+                                }
+                            }
                         }
                         //总结报告
                         if (StringUtils.isNotEmpty(firstJson.getString("uploadFile"))) {

+ 28 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ProjectInfoController.java

@@ -1,6 +1,8 @@
 package org.springblade.manager.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
@@ -10,9 +12,12 @@ import javax.validation.Valid;
 import org.springblade.core.mp.support.Condition;
 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.dto.WbsTreeContractDTO;
 import org.springblade.manager.dto.ProjectInfoDTO;
 import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.entity.WbsInfo;
+import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.service.*;
 import org.springblade.manager.vo.*;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
@@ -23,8 +28,11 @@ import org.springblade.manager.entity.ProjectInfo;
 import org.springblade.manager.wrapper.ProjectInfoWrapper;
 import org.springblade.core.boot.ctrl.BladeController;
 
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 @RestController
 @AllArgsConstructor
@@ -198,7 +206,7 @@ public class ProjectInfoController extends BladeController {
      */
     @GetMapping("/tree")
     @ApiOperationSupport(order = 11)
-    @ApiOperation(value = "查询项目私有wbs节点树形结构(多个接口复用)", notes = "wbsId、项目id")
+    @ApiOperation(value = "查询项目私有wbs节点树形结构", notes = "wbsId、项目id")
     @ApiImplicitParams(value = {
             @ApiImplicitParam(name = "projectId", value = "项目id", required = true),
             @ApiImplicitParam(name = "wbsId", value = "wbsId", required = true)
@@ -211,6 +219,25 @@ public class ProjectInfoController extends BladeController {
         return R.fail(200, "未查询到信息");
     }
 
+    /**
+     * 后管-试验-新增or编辑勾选相关联试验-获取试验配合比树
+     */
+    @GetMapping("/tree-record-trial")
+    @ApiOperationSupport(order = 11)
+    @ApiOperation(value = "后管-试验-新增or编辑勾选相关联试验-获取试验配合比树", notes = "wbsId、项目id、节点pKeyId")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "projectId", value = "项目id", required = true),
+            @ApiImplicitParam(name = "wbsId", value = "wbsId", required = true),
+            @ApiImplicitParam(name = "pKeyId", value = "节点pKeyId", required = true)
+    })
+    public R<Map<String, List<Object>>> treeRecordTrial(String wbsId, String projectId, String pKeyId) {
+        Map<String, List<Object>> map = wbsTreePrivateService.treeRecordTrial(wbsId, projectId, pKeyId);
+        if (map != null && map.size() > 0) {
+            return R.data(map);
+        }
+        return R.fail(200, "未查询到信息");
+    }
+
     /**
      * 保存或修改分配项目级wbs树
      */

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

@@ -130,7 +130,7 @@ public class TableFileController extends BladeController {
 
         Long pkeyId = Long.parseLong(tableFile.getTabId() + "");
         //单pdf
-        excelTabService.getBussPDFTrial(pkeyId, contractId, id, 0, 0);
+        excelTabService.getBussPDFTrial(pkeyId, contractId, id, 0, 0, null);
 
         WbsTreePrivate wbsTreePrivate = wbsTreePrivateService.getBaseMapper().selectOne(Wrappers.<WbsTreePrivate>query().lambda()
                 .eq(WbsTreePrivate::getPKeyId, pkeyId));
@@ -154,7 +154,7 @@ public class TableFileController extends BladeController {
         List<String> collect = query.stream().map(TrialSelfInspectionRecord::getTableIds).collect(Collectors.toList());
 
         //合并pdf
-        String bussPDFSTrial = excelTabService.getBussPDFSTrial(wbsTreePrivate1.getPKeyId() + "", tableType, classify, contractId, wbsTreePrivate.getProjectId(), id, org.apache.commons.lang.StringUtils.join(collect, ","));
+        String bussPDFSTrial = excelTabService.getBussPDFSTrial(wbsTreePrivate1.getPKeyId() + "", tableType, classify, contractId, wbsTreePrivate.getProjectId(), id, org.apache.commons.lang.StringUtils.join(collect, ","), null);
 
         if (StringUtils.isNotEmpty(bussPDFSTrial)) {
             //修改合并pdf

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

@@ -38,33 +38,33 @@ public class WbsTreeContractController extends BladeController {
     @ApiOperation(value = "查询当前节点下所有元素表信息", notes = "传入节点primaryKeyId、type、合同段id、项目id")
     public R searchNodeAllTable(String primaryKeyId, String type, String contractId, String projectId) {
         List<AppWbsTreeContractVO> list = iWbsTreeContractService.searchNodeAllTable(primaryKeyId, type, contractId, projectId);
-        boolean flag = false;
-        Set<Long> l1 = new HashSet<>();
-        for (AppWbsTreeContractVO vo : list) {
-            if (vo.getNodeName().contains("_PL_")){
-                l1.add(vo.getId());
-                flag = true;
-            }
-        }
-        if (flag){
-            for (Long aLong : l1) {
-                List<AppWbsTreeContractVO> vos = new ArrayList<>();
-                for (AppWbsTreeContractVO vo : list) {
-                    if (aLong.equals(vo.getId())){
-                        vos.add(vo);
-                    }
-                }
-                list = list.stream().filter(l -> {
-                    if (l.getId().equals(aLong)){
-                        return false;
-                    }else {
-                        return true;
-                    }
-                }).collect(Collectors.toList());
-                vos = vos.stream().sorted(Comparator.comparing(AppWbsTreeContractVO::getPKeyId)).collect(Collectors.toList());
-                list.addAll(vos);
-            }
-        }
+//        boolean flag = false;
+//        Set<Long> l1 = new HashSet<>();
+//        for (AppWbsTreeContractVO vo : list) {
+//            if (vo.getNodeName().contains("_PL_")){
+//                l1.add(vo.getId());
+//                flag = true;
+//            }
+//        }
+//        if (flag){
+//            for (Long aLong : l1) {
+//                List<AppWbsTreeContractVO> vos = new ArrayList<>();
+//                for (AppWbsTreeContractVO vo : list) {
+//                    if (aLong.equals(vo.getId())){
+//                        vos.add(vo);
+//                    }
+//                }
+//                list = list.stream().filter(l -> {
+//                    if (l.getId().equals(aLong)){
+//                        return false;
+//                    }else {
+//                        return true;
+//                    }
+//                }).collect(Collectors.toList());
+//                vos = vos.stream().sorted(Comparator.comparing(AppWbsTreeContractVO::getPKeyId)).collect(Collectors.toList());
+//                list.addAll(vos);
+//            }
+//        }
         if (list.size() > 0) {
             list.stream().forEach(l->{
                 if (StringUtils.isNotBlank(l.getHtmlUrl())){

+ 14 - 19
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java

@@ -76,14 +76,12 @@ public class ExcelTabClientImpl implements ExcelTabClient {
         if (isBatchSave == 0) {
             //------单表PDF保存------
             TableInfo tableInfo = tableInfoList.stream().findAny().orElse(null);
-            assert tableInfo != null;
-            if (tabIds.contains(tableInfo.getPkeyId())) {
+            if (tableInfo != null && tabIds.contains(tableInfo.getPkeyId())) {
                 //构造pdf
-                excelTabService.getBussPDFTrial(Long.valueOf(tableInfo.getPkeyId()), contractId, id, 0, 0);
+                excelTabService.getBussPDFTrial(Long.valueOf(tableInfo.getPkeyId()), contractId, id, 0, 0, dto);
 
                 //重新合并pdf
-                String sql = "select pdf_url from u_trial_self_data_record where record_id = " + id;
-                List<TrialSelfDataRecord> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TrialSelfDataRecord.class));
+                List<TrialSelfDataRecord> query = jdbcTemplate.query("select pdf_url from u_trial_self_data_record where record_id = " + id, new BeanPropertyRowMapper<>(TrialSelfDataRecord.class));
                 List<String> pdfList = query.stream().map(TrialSelfDataRecord::getPdfUrl).collect(Collectors.toList());
 
                 String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
@@ -95,20 +93,17 @@ public class ExcelTabClientImpl implements ExcelTabClient {
                 FileUtils.mergePdfPublicMethods(pdfList, pdfPath);
                 BladeFile bladeFile = newIOSSClient.uploadFile(id + "2.pdf", pdfPath);
 
-                String sqlUpdate = "update u_trial_self_inspection_record set pdf_url = '" + bladeFile.getLink() + "' where id = " + id;
-                jdbcTemplate.execute(sqlUpdate);
+                jdbcTemplate.execute("update u_trial_self_inspection_record set pdf_url = '" + bladeFile.getLink() + "' where id = " + id);
 
                 //获取试验记录id的试验项目名称,重新合并pdf集合(解决单表保存后上报找不到题名问题)
-                String sql2 = "select trial_project_name from u_trial_self_inspection_record where id = " + id;
-                TrialSelfInspectionRecord obj = jdbcTemplate.query(sql2, new BeanPropertyRowMapper<>(TrialSelfInspectionRecord.class)).stream().findAny().orElse(null);
-                assert obj != null;
-                String querySql = "select id from u_information_query where classify ='" + type + "' and wbs_id ='" + id + "' and contract_id ='" + contractId + "'";
-                List<InformationQuery> query2 = jdbcTemplate.query(querySql, new BeanPropertyRowMapper<>(InformationQuery.class));
-                if (query2.size() > 0) {
-                    String updateSql = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "', name ='" + obj.getTrialProjectName() + "'  where classify='" + type + "' and  wbs_id='" + id + "' and contract_id ='" + contractId + "'";
-                    jdbcTemplate.execute(updateSql);
+                TrialSelfInspectionRecord obj = jdbcTemplate.query("select trial_project_name from u_trial_self_inspection_record where id = " + id, new BeanPropertyRowMapper<>(TrialSelfInspectionRecord.class)).stream().findAny().orElse(null);
+                List<InformationQuery> query2 = jdbcTemplate.query("select id from u_information_query where classify ='" + type + "' and wbs_id ='" + id + "' and contract_id ='" + contractId + "'", new BeanPropertyRowMapper<>(InformationQuery.class));
+                if (obj != null && query2.size() > 0) {
+                    jdbcTemplate.execute("update u_information_query set pdf_url ='" + bladeFile.getLink() + "', name ='" + obj.getTrialProjectName() + "'  where classify='" + type + "' and  wbs_id='" + id + "' and contract_id ='" + contractId + "'");
                 } else {
-                    informationQueryClient.saveData(id.toString(), projectId, contractId, type.toString(), bladeFile.getLink(), obj.getTrialProjectName());
+                    if (obj != null) {
+                        informationQueryClient.saveData(id.toString(), projectId, contractId, type.toString(), bladeFile.getLink(), obj.getTrialProjectName());
+                    }
                 }
             }
 
@@ -122,7 +117,7 @@ public class ExcelTabClientImpl implements ExcelTabClient {
              * id=记录id
              * tabIds=表的pKeyIds
              */
-            pdfUrl = excelTabService.getBussPDFSTrial(nodeId, tableType, String.valueOf(type), contractId, projectId, id, tabIds);
+            pdfUrl = excelTabService.getBussPDFSTrial(nodeId, tableType, String.valueOf(type), contractId, projectId, id, tabIds,dto);
 
         }
         return pdfUrl;
@@ -130,12 +125,12 @@ public class ExcelTabClientImpl implements ExcelTabClient {
 
     @Override
     public void getBussPDFTrial(Long pkeyId, String contractId, String id) throws Exception {
-        excelTabService.getBussPDFTrial(pkeyId, contractId, Long.parseLong(id), 0, 0);
+        excelTabService.getBussPDFTrial(pkeyId, contractId, Long.parseLong(id), 0, 0, null);
     }
 
     @Override
     public String getBussPDFSTrial(String nodeId, String tableType, String classify, String contractId, String projectId, String id, String tabIds) throws Exception {
-        return excelTabService.getBussPDFSTrial(nodeId, tableType, classify, contractId, projectId, Long.parseLong(id), tabIds);
+        return excelTabService.getBussPDFSTrial(nodeId, tableType, classify, contractId, projectId, Long.parseLong(id), tabIds,null);
     }
 
 

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

@@ -156,7 +156,7 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
 
     @Override
     public WbsTreeContract getContractWbsTreeByContractIdAndId(Long id, Long contractId) {
-        return this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getId, id.toString()).eq(WbsTreeContract::getContractId, contractId.toString()));
+        return this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getId, id).eq(WbsTreeContract::getContractId, contractId.toString()));
     }
 
     @Override

+ 13 - 11
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/TableElementConverter.java

@@ -123,19 +123,19 @@ public class TableElementConverter implements ITableElementConverter {
                 String[] codeAndId = e.split(StringPool.AT);
                 KeyMapper one = kms.get(0);
                 Formula formula =formulaMap.get(one.getFormulaId());
-                FormData fd=new FormData(codeAndId[0],new ArrayList<>(),formula,this.coordinateMap.get(one.getTableName()).get(one.getField()));
+                FormData fd=new FormData(codeAndId[0],new ArrayList<>(),formula,this.coordinateMap.getOrDefault(one.getTableName(),new HashMap<>()).get(one.getField()));
                 fd.setIsCurrentNodeElement(Boolean.TRUE);
                 fd.setEName(one.getEName());
                 /*初始化元素数据集*/
                 List<ElementData> eds =fd.getValues();
-                String coords = this.coordinateMap.get(fd.getTableName()).get(fd.getKey());
-                if(Func.isNotBlank(coords)) {
-                    List<Coords> coordsList = Stream.of(coords).flatMap(s -> Arrays.stream(s.split(";"))).map(s -> {
-                        String[] xy = s.split("_");
-                        return new Coords(xy[1], xy[0]);
-                    }).collect(Collectors.toList());
-                    fd.setCoordsList(coordsList);
-                }
+//                String coords = this.coordinateMap.getOrDefault(fd.getTableName(),new HashMap<>()).get(fd.getKey());
+//                if(Func.isNotBlank(coords)) {
+//                    List<Coords> coordsList = Stream.of(coords).flatMap(s -> Arrays.stream(s.split(";"))).map(s -> {
+//                        String[] xy = s.split("_");
+//                        return new Coords(xy[1], xy[0]);
+//                    }).collect(Collectors.toList());
+//                    fd.setCoordsList(coordsList);
+//                }
                 for(int i=0;i<kms.size();i++){
                     /*每一页都有自己对立的Id*/
                     KeyMapper km=kms.get(i);
@@ -153,7 +153,7 @@ public class TableElementConverter implements ITableElementConverter {
                                 tmpMap.put(StringUtils.join(fd.getCode(),groupId,i,Func.toInt(c[1]),Func.toInt(c[0]),StringPool.AT),t[0]);
                             }
                         }
-                        if(Func.isNotBlank(coords)){
+                        if(Func.isNotEmpty(fd.getCoordsList())){
                             for(Coords c:fd.getCoordsList()){
                                 Object val = null;
                                 String key =StringUtils.join(fd.getCode(),groupId,i,c.getX(),c.getY(),StringPool.AT);
@@ -167,10 +167,12 @@ public class TableElementConverter implements ITableElementConverter {
                                  String[] sa=k.split(StringPool.AT);
                                  eds.add(new ElementData(Func.toInt(sa[2]),Func.toInt(sa[1]),val,Func.toInt(sa[3]),Func.toInt(sa[4])));
                             });
-                            log.append(fd.getEName()).append(fd.getCode()).append("定位信息不存在;");
                         }
                     }
                 }
+                if(Func.isEmpty(fd.getCoordsList())){
+                    log.append(fd.getEName()).append(fd.getCode()).append("定位信息不存在;");
+                }
                 this.formDataMap.put(fd.getCode(),fd);
                 if(fd.getFormula()!=null){
                     /*只有需要执行公式的才放这里*/

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

@@ -426,7 +426,7 @@
                 #{tableOwnerList}
             </foreach>
         </if>
-        ORDER BY sort,node_name,create_time
+        ORDER BY sort,full_name,p_key_id,update_time
     </select>
 
     <select id="selectRoleInfo" resultType="org.springblade.manager.entity.SaveUserInfoByProject">

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

@@ -347,7 +347,9 @@
             wt.id AS id,
             wt.node_name AS tableName,
             wt.sort AS sort,
-            wt.table_type AS tableType,
+            case when wt.table_type in(1,9) then 1
+                 when wt.table_type in(2,10) then 2
+                    end as tableType,
             wt.`status` AS isCreateTable ,
             wt.table_owner as tableOwner,
             wt.is_link_table,
@@ -356,7 +358,7 @@
             wt.wbs_id AS "wbsId",
             wt.fill_rate AS "fillRate",
             wt.init_table_id AS initTableId,
-            (SELECT count(*) FROM m_wbs_form_element WHERE f_id = wt.init_table_id and is_deleted = 0 and status = 1) AS "elementTotal"
+            (SELECT count(1) FROM m_wbs_form_element WHERE f_id = wt.init_table_id and is_deleted = 0 and status = 1) AS "elementTotal"
         FROM
             m_wbs_tree AS wt
         WHERE

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

@@ -83,7 +83,7 @@ public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
 
     void delTabProjectById(String pKeyId, String projectId);
 
-    List<WbsTreePrivateVO4> selectWbsTreeTrialTabList(List<String> roleAndTabOwners, String tableType, String projectId, String wbsId, Long parentId, List<String> tableOwnerList, String contractId);
+    List<WbsTreePrivateVO4> selectWbsTreeTrialTabList(String tableType, String projectId, String wbsId, Long parentId, String contractId);
 
     //删除表单信息
     void delTableById(String pKeyId);
@@ -91,4 +91,7 @@ public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
     List<TableInfo> selectTabInfoAll();
 
     void updateBatchByPKeyId(@Param("list") List<WbsTreePrivate> wbsTreePrivateList);
+
+    List<WbsTreePrivateVO5> treeRecordTrial(String wbsId, String projectId, Integer wbsType);
+
 }

+ 26 - 12
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml

@@ -452,7 +452,9 @@
         SELECT wt.p_key_id AS "pKeyId",
                wt.id AS id,
                wt.node_name AS tableName,
-               wt.table_type AS tableType,
+               case when wt.table_type in(1,9) then 1
+                    when wt.table_type in(2,10) then 2
+                    end as tableType,
                wt.`status` AS isCreateTable,
                wt.table_owner AS tableOwner,
                wt.is_link_table,
@@ -701,7 +703,9 @@
             excel_id,
             project_id,
             type,
-            table_type,
+            case when table_type = 9 then 1
+                 when table_type = 10 then 2
+                 end as tableType,
             table_owner,
             init_table_name,
             init_table_id,
@@ -716,19 +720,11 @@
             AND wbs_id = #{wbsId}
             AND parent_id = #{parentId}
             AND table_type = #{tableType}
-            AND table_owner in
-        <foreach item="roleAndTabOwners" collection="roleAndTabOwners" open="(" close=")" separator=",">
-            #{roleAndTabOwners}
-        </foreach>
             AND type = 2
             AND status = 1
             AND is_deleted = 0
-        <if test="tableOwnerList != null and tableOwnerList!= ''">
-            AND table_owner in
-            <foreach item="tableOwnerList" collection="tableOwnerList" open="(" close=")" separator=",">
-                #{tableOwnerList}
-            </foreach>
-        </if>
+            /*试验所属方=7*/
+            AND table_owner = 7
         /*解决不同合同段中复制表问题*/
         <if test="contractId == null">
             -- 后管加载原始表
@@ -745,6 +741,24 @@
         select * from m_table_info
     </select>
 
+    <select id="treeRecordTrial" resultType="org.springblade.manager.vo.WbsTreePrivateVO5">
+        select  id, parent_id,
+                node_name as title,
+                node_type AS "nodeType",
+                wbs_type as "wbsType"
+        from m_wbs_tree_private
+        where
+        is_deleted = 0
+        and status = 1
+        and `type` = 1
+        and project_id = #{projectId}
+        and wbs_id = #{wbsId}
+        <if test="wbsType != null and wbsType != ''">
+            and wbs_type = #{wbsType}
+        </if>
+        ORDER BY sort
+    </select>
+
     <delete id="delTabProjectById">
         delete from m_wbs_tree_private WHERE p_key_id = #{pKeyId} and project_id=#{projectId}AND type = 10
     </delete>

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

@@ -139,12 +139,12 @@ public interface IExcelTabService extends BaseService<ExcelTab> {
     /**
      * 单PDF 生成 - 试验
      */
-    String getBussPDFTrial(Long pKeyId, String contractId, Long id, int pageNumber, int pageNumberCount) throws Exception;
+    String getBussPDFTrial(Long pKeyId, String contractId, Long id, int pageNumber, int pageNumberCount, TrialSelfInspectionRecordDTO dto) throws Exception;
 
     /**
      * 多PDF 合并 - 试验
      */
-    String getBussPDFSTrial(String nodeId, String tableType, String classify, String contractId, String projectId, Long id, String tabIds) throws Exception;
+    String getBussPDFSTrial(String nodeId, String tableType, String classify, String contractId, String projectId, Long id, String tabIds, TrialSelfInspectionRecordDTO dto) throws Exception;
 
     /**
      * 保存 首件数据

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

@@ -12,10 +12,12 @@ import org.springblade.manager.vo.*;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.List;
+import java.util.Map;
 
 public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
 
     List<WbsTreePrivateVO> tree(String wbsId, String projectId);
+
     List<WbsTreeVO2> tree2(String wbsId, String projectId);
 
     boolean submit(WbsTreePrivate wbsTreePrivate);
@@ -84,4 +86,6 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
 
     List<WbsTreePrivateVO> getMixRatioTestTree(String pKeyId);
 
+    Map<String, List<Object>> treeRecordTrial(String wbsId, String projectId, String pKeyId);
+
 }

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

@@ -233,7 +233,7 @@ public class ArTreeContractInitServiceImpl {
      *
      * @param archiveTreeContracts
      */
-    public void InitTreeSort(List<ArchiveTreeContract> archiveTreeContracts) {
+    public void InitTreeSort(List<ArchiveTreeContract> archiveTreeContracts,List<ArchiveTreeVO2> proVo2Trees) {
         List<ArchiveTreeContractVO2> archiveTreeContractVO2List = new ArrayList<>();
 
         Map<Long,ArchiveTreeContractVO2> vo2Map = new LinkedHashMap<>();
@@ -245,7 +245,7 @@ public class ArTreeContractInitServiceImpl {
 
         InitTreeSort(trees.get(0), "");
 
-        archiveAutoRuleSync.syncArchiveTreeContractList(vo2Map);
+        archiveAutoRuleSync.syncArchiveTreeContractList(vo2Map,proVo2Trees);
 
         List<ArchiveTreeContract> upList = new ArrayList<>();
 

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

@@ -22,7 +22,7 @@ public class ArchiveAutoRuleSyncImpl {
 
     }
 
-    public void syncArchiveTreeList(Map<Long,ArchiveTreeVO2> vo2Map){
+    public void syncArchiveTreeList(Map<Long,ArchiveTreeVO2> vo2Map,List<ArchiveTreeVO2> sysVo2Trees){
 
         List<ArchiveTreeVO2> normalList = new ArrayList<>();
         List<ArchiveTreeVO2> wbsList = new ArrayList<>();
@@ -32,19 +32,19 @@ public class ArchiveAutoRuleSyncImpl {
         }
 
 
-        ForestNodeMergerEx.setPropertyfromId(normalList,syncPropertyMap);
-
-
+        /*ForestNodeMergerEx.setPropertyfromId(normalList,syncPropertyMap);
         for (ArchiveTreeVO2 archiveTreeVO2 : vo2Map.values()) {
             if (archiveTreeVO2.getArchiveAutoNodeId() != null) {
                 archiveTreeVO2.setFlag(1);
             }
-        }
-        //todo group type
+        }*/
+
+        //组卷规则同步
+        //syncRuleSysToProject(vo2Map,sysVo2Trees);
 
     }
 
-    public void syncArchiveTreeContractList(Map<Long,ArchiveTreeContractVO2> vo2Map){
+    public void syncArchiveTreeContractList(Map<Long,ArchiveTreeContractVO2> vo2Map,List<ArchiveTreeVO2> proVo2Trees){
 
         List<ArchiveTreeContractVO2> normalList = new ArrayList<>();
         List<ArchiveTreeContractVO2> wbsList = new ArrayList<>();
@@ -60,7 +60,7 @@ public class ArchiveAutoRuleSyncImpl {
         }
 
         //根据formId
-        ForestNodeMergerEx.setPropertyfromId(normalList,syncPropertyMap);
+        //ForestNodeMergerEx.setPropertyfromId(normalList,syncPropertyMap);
 
         //todo,这里补充上获取对应的wbsid
         List<Long> wbsIds = new ArrayList<>();
@@ -95,12 +95,256 @@ public class ArchiveAutoRuleSyncImpl {
         }
 
         //设置修改标识
-        for (ArchiveTreeContractVO2 archiveTreeContractVO2 : vo2Map.values()) {
+       /* for (ArchiveTreeContractVO2 archiveTreeContractVO2 : vo2Map.values()) {
             if (archiveTreeContractVO2.getArchiveAutoNodeId() != null) {
                 archiveTreeContractVO2.setFlag(1);
             }
+        }*/
+        //组卷规则同步
+        //syncRuleProToContract(vo2Map,proVo2Trees);
+    }
+
+    /**
+     *
+     * @param vo2Map 项目级节点集合
+     * @param sysVo2Trees  系统级节点集合
+     */
+    private void syncRuleSysToProject(Map<Long,ArchiveTreeVO2> vo2Map,List<ArchiveTreeVO2> sysVo2Trees){
+        //同步规则
+        // archiveAutoType  与系统级一致  不用处理
+        // archiveAutoNodeId   需替换成对应项目级节点id
+        // archiveAutoGroupId     与系统级一致 不用处理
+        // archiveAutoGroupSelect  与系统级一致 不用处理
+        //系统初始化项目 vo2Map.values()里的规则字段值都是系统级的值
+        //初始化后项目级再次同步  vo2Map.values()里的规则字段值新加的是系统级的值,原来的是项目级的值
+
+        //准备系统级节点map
+        Map<Long,ArchiveTreeVO2> sysMap = new HashMap<>();
+        for(ArchiveTreeVO2 sysVo2:sysVo2Trees){
+            sysMap.put(sysVo2.getId(),sysVo2);
         }
-        //todo group type
+        //准备在页面勾选设置的系统级节点ID_项目级节点Map   用于映射archiveAutoNodeId同步
+        Map<Long,List<ArchiveTreeVO2>> sysIdToPro_Map = new HashMap<>();
+        for(ArchiveTreeVO2 proVO2 : vo2Map.values()){
+            //只提取设置的节点,也就是select=1的节点
+            if(proVO2.getArchiveAutoGroupSelect()==1){
+                Long fromId = proVO2.getFromId();
+                if(sysIdToPro_Map.containsKey(fromId)){
+                    List<ArchiveTreeVO2> archiveTreeVO2s = sysIdToPro_Map.get(fromId);
+                    archiveTreeVO2s.add(proVO2);
+                    sysIdToPro_Map.put(fromId,archiveTreeVO2s);
+                }else{
+                    List<ArchiveTreeVO2> archiveTreeVO2s = new ArrayList<>();
+                    archiveTreeVO2s.add(proVO2);
+                    sysIdToPro_Map.put(fromId,archiveTreeVO2s);
+                }
+            }
+        }
+        //同步规则设置
+        for (ArchiveTreeVO2 archiveTreeVO2: vo2Map.values()) {
+            Integer archiveAutoType = archiveTreeVO2.getArchiveAutoType();
+            //过滤没有任何规则的节点
+            if(archiveAutoType!=null){
+                //步骤一:处理archiveAutoNodeId同步
+                Long archiveAutoNodeId = archiveTreeVO2.getArchiveAutoNodeId();
+                if(archiveAutoNodeId!=null){
+                    //判断规则值是系统级的还是项目级的
+                    if(sysMap.containsKey(archiveAutoNodeId)){
+                        //这个节点是刚从系统级同步过来,规则值还是系统级的。而这个archiveAutoNodeId是系统级设置的最高并卷节点的ID
+                        //用archiveAutoNodeId通过sysIdToPro_Map找出对应的项目级节点
+                        List<ArchiveTreeVO2> pro_select_vo2s = sysIdToPro_Map.get(archiveAutoNodeId);
+                        if(pro_select_vo2s.size()==1){
+                            //一个系统级节点对应了一个项目级节点
+                            Long pro_archiveAutoNodeId = pro_select_vo2s.get(0).getId();
+                            archiveTreeVO2.setArchiveAutoNodeId(pro_archiveAutoNodeId);//设置项目级的archiveAutoNodeId
+                            archiveTreeVO2.setFlag(1);
+                        }else{
+                            //一个系统级节点对应了多个项目级节点(项目级添加加节点的情况)
+                            for(ArchiveTreeVO2 pro_select_vo2:pro_select_vo2s){
+                                //系统级对应多个节点时,用当前节点的ancestors去对比pro_select_vo2中的id,当前节点的ancestors必有上级节点的id。或当前节点id=pro_select_vo2中的id
+                                String ancestorsPid = pro_select_vo2.getId().toString();
+                                String ancestors = archiveTreeVO2.getAncestors();
+                                Long pro_id = archiveTreeVO2.getId();
 
+                                if(ancestors.contains(ancestorsPid) ||  pro_id.equals(ancestorsPid)){
+                                    archiveTreeVO2.setArchiveAutoNodeId(pro_select_vo2.getId());//设置项目级的archiveAutoNodeId
+                                    archiveTreeVO2.setFlag(1);
+                                    break;
+                                }
+                            }
+                        }
+                    }else{
+                        //TODO 这个节点是已经初始化出来的节点,规则值是项目级的   已经是项目级好像不用处理了
+                        //Long fromId = archiveTreeVO2.getFromId();
+                        //ArchiveTreeVO2 sys_vo2 = sysMap.get(fromId);
+                        //ArchiveTreeVO2 sys_select_vo2 = sysMap.get(sys_vo2.getArchiveAutoNodeId());
+                    }
+                }
+            }
+
+
+            //archiveAutoType  与系统级一致  不用处理
+            //archiveAutoGroupSelect  与系统级一致 不用处理
+            //archiveAutoGroupId 与系统级一致 不用处理
+        }
     }
+
+
+    /**
+     * 项目级同步客户级 组卷规则处理
+     * @param vo2Map  客户级节点集合
+     * @param proVo2Trees  项目级节点集合
+     */
+    private void syncRuleProToContract(Map<Long,ArchiveTreeContractVO2> vo2Map,List<ArchiveTreeVO2> proVo2Trees){
+        //同步规则
+        // archiveAutoType  与系统级一致  不用处理
+        // archiveAutoNodeId   需替换成对应项目级节点id
+        // archiveAutoGroupId     项目级同组的在 客户级有合同段的要按合同段分开
+        // archiveAutoGroupSelect  与系统级一致 不用处理
+        //系统初始化客户级 vo2Map.values()里的规则字段值都是项目级的值
+        //初始化后客户级再次同步  vo2Map.values()里的规则字段值新加的是项目的值,原来的是客户级的值
+
+
+        //准备项目级节点map
+        Map<Long,ArchiveTreeVO2> proMap = new HashMap<>();
+        for(ArchiveTreeVO2 proVo2:proVo2Trees){
+            proMap.put(proVo2.getId(),proVo2);
+        }
+        //准备在页面勾选设置的项目级节点ID_客户级节点Map   用于映射archiveAutoNodeId同步
+        Map<Long,List<ArchiveTreeContractVO2>> proIdToContact_Map = new HashMap<>();
+        for(ArchiveTreeContractVO2 contractVO2 : vo2Map.values()){
+            //只提取设置的节点,也就是select=1的节点
+            if(contractVO2.getArchiveAutoGroupSelect()==1){
+                Long fromId = contractVO2.getFromId();
+                if(proIdToContact_Map.containsKey(fromId)){
+                    List<ArchiveTreeContractVO2> contractTreeVO2s = proIdToContact_Map.get(fromId);
+                    contractTreeVO2s.add(contractVO2);
+                    proIdToContact_Map.put(fromId,contractTreeVO2s);
+                }else{
+                    List<ArchiveTreeContractVO2> archiveTreeVO2s = new ArrayList<>();
+                    archiveTreeVO2s.add(contractVO2);
+                    proIdToContact_Map.put(fromId,archiveTreeVO2s);
+                }
+            }
+        }
+
+        //构建 合同段ID_项目级groupID,客户级groupID> 集合   用于映射archiveAutoGroupId同步
+        Map<String,Long> groupMap = new HashMap<>();
+        for(ArchiveTreeContractVO2 contractVO2 : vo2Map.values()){
+            Integer archiveAutoType = contractVO2.getArchiveAutoType();
+            Long fromId = contractVO2.getFromId();
+            //只处理普通节点,规则时分类并卷类型的
+            if (contractVO2.getExtType()== null && fromId!=null && archiveAutoType==2){
+                Long contract_groupId = contractVO2.getArchiveAutoGroupId();
+                //如果当前contractVO2的groupID是客户级(19位数),需要先保存关联集合
+                if(contract_groupId.toString().length()==19){
+                    //1.通过fromid找出项目级
+                    ArchiveTreeVO2 proTreeVO2 = proMap.get(fromId);
+                    //2.获取项目级groupID
+                    Long pro_groupId = proTreeVO2.getArchiveAutoGroupId();
+                    //3.,那么保存到集合  合同段ID_项目级groupID,客户级groupID
+                    Long contractId = contractVO2.getContractId();
+                    if(contractId!=null){
+                        String key =contractId+"_"+pro_groupId;
+                        if(!groupMap.containsKey(key)){
+                            groupMap.put(key,contract_groupId);
+                        }
+                    }else{
+                        String key = pro_groupId.toString();
+                        if(!groupMap.containsKey(key)){
+                            groupMap.put(key,contract_groupId);
+                        }
+                    }
+                }
+            }
+        }
+
+        //同步规则设置
+        for (ArchiveTreeContractVO2 contractVO2: vo2Map.values()) {
+
+            //只处理普通节点,wbs节点待客户级同步入库后,再根据项目级保存规则来设置
+            if (contractVO2.getExtType()== null){
+                Integer archiveAutoType = contractVO2.getArchiveAutoType();
+                //过滤没有任何规则的节点
+                //步骤一:处理archiveAutoNodeId同步
+                if(archiveAutoType!=null){
+
+                    Long archiveAutoNodeId = contractVO2.getArchiveAutoNodeId();
+                    if(archiveAutoNodeId!=null){
+                        //判断规则值是项目级的还是客户级的
+                        if(proMap.containsKey(archiveAutoNodeId)){
+                            //这个节点是刚从项目级同步过来,规则值还是项目级的。而这个archiveAutoNodeId是项目级设置的最高并卷节点的ID
+                            //用archiveAutoNodeId通过proIdToContact_Map找出对应的客户级节点
+                            List<ArchiveTreeContractVO2> pro_select_vo2s = proIdToContact_Map.get(archiveAutoNodeId);
+                            if(pro_select_vo2s.size()==1){
+                                //一个系统级节点对应了一个项目级节点
+                                Long pro_archiveAutoNodeId = pro_select_vo2s.get(0).getId();
+                                contractVO2.setArchiveAutoNodeId(pro_archiveAutoNodeId);//设置项目级的archiveAutoNodeId
+                                contractVO2.setFlag(1);
+                            }else{
+                                //一个系统级节点对应了多个项目级节点(项目级添加加节点的情况)
+                                for(ArchiveTreeContractVO2 contract_select_vo2:pro_select_vo2s){
+                                    //系统级对应多个节点时,用当前节点的ancestors去对比pro_select_vo2中的id,当前节点的ancestors必有上级节点的id。或当前节点id=pro_select_vo2中的id
+                                    String ancestorsPid = contract_select_vo2.getId().toString();
+                                    String ancestors = contractVO2.getAncestors();
+                                    Long contract_id = contractVO2.getId();
+
+                                    if(ancestors.contains(ancestorsPid) ||  contract_id.equals(ancestorsPid)){
+                                        contractVO2.setArchiveAutoNodeId(contract_select_vo2.getId());//设置客户级的archiveAutoNodeId
+                                        contractVO2.setFlag(1);
+                                        break;
+                                    }
+                                }
+                            }
+                        }else{
+                            //TODO 这个节点是已经初始化出来的节点,规则值是项目级的   已经是项目级好像不用处理了
+                            //Long fromId = archiveTreeVO2.getFromId();
+                            //ArchiveTreeVO2 sys_vo2 = sysMap.get(fromId);
+                            //ArchiveTreeVO2 sys_select_vo2 = sysMap.get(sys_vo2.getArchiveAutoNodeId());
+                        }
+                    }
+                }
+
+                //步骤二:处理archiveAutoGroupId同步
+                if(archiveAutoType==2){
+                    Long contractId = contractVO2.getContractId();
+                    //分合同段的 给archiveAutoGroupId
+                    Long groupId = contractVO2.getArchiveAutoGroupId();
+                    //客户级的groupID用19位数字  系统级和项目级用16位数字
+                    if(groupId.toString().length()==16){
+                        String key ="";
+                        if(contractId==null) {
+                            key =groupId+"";
+                        }else {
+                            key =contractId+"_"+groupId;
+                        }
+
+                        if(groupMap.containsKey(key)){
+                            Long contractGroupId = groupMap.get(key);
+                            contractVO2.setArchiveAutoGroupId(contractGroupId);
+                            contractVO2.setFlag(1);
+                        }else{
+                            //客户级的group用19位,在同步的时候方便判断是值是客户级还是项目级
+                            double v = Math.random();
+                            if(v<0.1){
+                                v=v+0.1;
+                            }
+                            v=v*1000000;
+                            long ran = (long)v;
+                            Long contractGroupId=Long.parseLong(System.currentTimeMillis()+""+ran);
+                            groupMap.put(key,contractGroupId);
+                            contractVO2.setArchiveAutoGroupId(contractGroupId);
+                            contractVO2.setFlag(1);
+                        }
+                    }else {
+                        //已经是客户级了不用理
+                    }
+                }
+            }
+            //archiveAutoType  与项目级一致  不用处理
+            //archiveAutoGroupSelect  与项目级一致 不用处理
+        }
+    }
+
+
 }

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

@@ -147,7 +147,7 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		archiveTreeContracts.addAll(addNodes);
 
 		//初始化祖先节点和排序
-		arTreeContractInitService.InitTreeSort(archiveTreeContracts);
+		arTreeContractInitService.InitTreeSort(archiveTreeContracts,tree);
 		//todo 同步质检资料动态节点,处理文件提名
 
 		//todo 同步立卷规则
@@ -450,7 +450,7 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		}
 
 		//更新排序,把排序,自动组卷这种变化,刷新到新增节点和修改节点上
-		archiveTreeContractSync.InitTreeSort(dstTree,saveContractList,upList);
+		archiveTreeContractSync.InitTreeSort(dstTree,saveContractList,upList,srcTrees);
 
 		saveList.addAll(saveContractList);
 		//同步生成案卷

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

@@ -102,7 +102,7 @@ public class ArchiveTreeContractSyncImpl {
      * @param dstTree
      * @param addList
      */
-    public void InitTreeSort(ArchiveTreeContractVO2  dstTree,List<ArchiveTreeContract> addList,List<ArchiveTreeContract> upList)
+    public void InitTreeSort(ArchiveTreeContractVO2  dstTree,List<ArchiveTreeContract> addList,List<ArchiveTreeContract> upList,List<ArchiveTreeVO2> proVo2Trees)
     {
         Map<Long,ArchiveTreeContractVO2> vo2Map = new LinkedHashMap<>();
 
@@ -115,7 +115,7 @@ public class ArchiveTreeContractSyncImpl {
         ForestNodeMergerEx.InitTreeSort(tree, "");
 
         //更新自动组卷节点
-        archiveAutoRuleSync.syncArchiveTreeContractList(vo2Map);
+        archiveAutoRuleSync.syncArchiveTreeContractList(vo2Map,proVo2Trees);
 
         //根据vo的排序和自动组卷信息,刷新新增节点,根据修改标识生成更新节点
         arTreeContractInitService.handleAddAndUpList(vo2Map,addList,upList);

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

@@ -98,9 +98,20 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
 
         Map<Long,ArchiveTree> archiveMap = new LinkedHashMap<>();
 
+        List<ArchiveTreeVO2> sysVo2Trees = new ArrayList<>();//用于规则同步
+
         for (ArchiveTree archiveTree :sysTrees) {
             oldNewMap.put(archiveTree.getId(), SnowFlakeUtil.getId());
             archiveMap.put(archiveTree.getId(), archiveTree);
+
+            //用于规则同步 ArchiveTree转换成ArchiveTreeVO2
+            ArchiveTreeVO2  vo2 = new ArchiveTreeVO2();
+            vo2.setId(archiveTree.getId());
+            vo2.setArchiveAutoType(archiveTree.getArchiveAutoType());
+            vo2.setArchiveAutoNodeId(archiveTree.getArchiveAutoNodeId());
+            vo2.setArchiveAutoGroupId(archiveTree.getArchiveAutoGroupId());
+            vo2.setArchiveAutoGroupSelect(archiveTree.getArchiveAutoGroupSelect());
+            sysVo2Trees.add(vo2);
         }
         oldNewMap.put(0L,0L);
 
@@ -138,7 +149,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
         }
 
         //todo 同步立卷规则
-        InitAncestors(archiveTrees);
+        InitAncestors(archiveTrees,sysVo2Trees);
 
         this.saveBatch(archiveTrees);
 
@@ -444,7 +455,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
             Long archiveAutoGroupId=null;
             //分类并卷规则的需要生成个随机数,作为同一个分类赋值archiveAutoNodeId
             if(archiveAutoType==2){
-                double v = Math.random() * 10000;
+                double v = Math.random() * 1000;
                 long ran = (long)v;
                 archiveAutoGroupId=Long.parseLong(System.currentTimeMillis()+""+ran);
             }
@@ -454,6 +465,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
                 long nodeIdLong = Long.parseLong(nodeId);
                 ArchiveTree archiveTree = baseMapper.selectById(nodeIdLong);
                 archiveTree.setArchiveAutoType(archiveAutoType);
+                archiveTree.setArchiveAutoGroupSelect(1);
                 if(archiveAutoType==1){
                     //最高并卷规则 选择节点的ID
                     archiveTree.setArchiveAutoNodeId(nodeIdLong);
@@ -461,7 +473,6 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
                 if(archiveAutoType==2){
                     //分类并卷规则 提交都是一个分类类型
                     archiveTree.setArchiveAutoGroupId(archiveAutoGroupId);
-                    archiveTree.setArchiveAutoGroupSelect(1);
                 }
                 baseMapper.updateById(archiveTree);
 
@@ -493,7 +504,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
             Long archiveAutoGroupId=null;
             //分类并卷规则的需要生成个随机数,作为同一个分类赋值archiveAutoNodeId
             if(archiveAutoType==2){
-                double v = Math.random() * 10000;
+                double v = Math.random() * 1000;
                 long ran = (long)v;
                 archiveAutoGroupId=Long.parseLong(System.currentTimeMillis()+""+ran);
             }
@@ -544,7 +555,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
                     Long groupId = dto.getArchiveAutoGroupId();
                     String selectNodeIds = dto.getSelectNodeIds();
                     List<String> selectNodeIdlist = Arrays.asList(selectNodeIds.split(","));
-                    //先将同一分组的节点删除配置,。
+                    //先将同一分组的节点删除配置
                     baseMapper.removeNodeForArchiveAutoRule_Group(groupId);
                     //然后再按照选择节点保存新的设置
                     for(String nodeId:selectNodeIdlist){
@@ -962,7 +973,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
         modifyBySrcTree(srcTree,dstTree);
 
         //刷新treeCode
-        InitAncestors(dstTree,saveList,upList);
+        InitAncestors(dstTree,saveList,upList,srcTrees);
 
         //相同的属性刷新?
         //updateDstArchiveTrees(srcTree,dstTree);
@@ -973,7 +984,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
     }
 
 
-    public void InitAncestors(ArchiveTreeVO2  dstTree,List<ArchiveTree> addList,List<ArchiveTree> upList)
+    public void InitAncestors(ArchiveTreeVO2  dstTree,List<ArchiveTree> addList,List<ArchiveTree> upList,List<ArchiveTreeVO2> sysTrees)
     {
         Map<Long,ArchiveTreeVO2> vo2Map = new LinkedHashMap<>();
 
@@ -984,13 +995,13 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
         ForestNodeMergerEx.InitAncestors(tree,"0");
 
         //更新自动组卷节点
-        archiveAutoRuleSync.syncArchiveTreeList(vo2Map);
+        archiveAutoRuleSync.syncArchiveTreeList(vo2Map,sysTrees);
 
         //根据vo的排序和自动组卷信息,刷新新增节点,根据修改标识生成更新节点
         this.handleAddAndUpList(vo2Map,addList,upList);
     }
 
-    public void InitAncestors(List<ArchiveTree> archiveTrees) {
+    public void InitAncestors(List<ArchiveTree> archiveTrees,List<ArchiveTreeVO2> sysVo2Trees) {
         List<ArchiveTreeVO2> archiveTreeVO2List = new ArrayList<>();
 
         Map<Long,ArchiveTreeVO2> vo2Map = new LinkedHashMap<>();
@@ -1001,7 +1012,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
         //重复
         //ForestNodeMergerEx.InitAncestors(trees.get(0),"0");
 
-        archiveAutoRuleSync.syncArchiveTreeList(vo2Map);
+        archiveAutoRuleSync.syncArchiveTreeList(vo2Map,sysVo2Trees);
 
         List<ArchiveTree> upList = new ArrayList<>();
 
@@ -1130,6 +1141,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
             treeContractVO2.setArchiveAutoType(archiveTree.getArchiveAutoType());
             treeContractVO2.setArchiveAutoGroupId(archiveTree.getArchiveAutoGroupId());
             treeContractVO2.setArchiveAutoGroupSelect(archiveTree.getArchiveAutoGroupSelect());
+            treeContractVO2.setAncestors(archiveTree.getAncestors());
             vos.add(treeContractVO2);
             vo2Map.put(treeContractVO2.getId(),treeContractVO2);
         }

+ 72 - 44
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -1,24 +1,7 @@
-/*
- *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
- *
- *  Redistribution and use in source and binary forms, with or without
- *  modification, are permitted provided that the following conditions are met:
- *
- *  Redistributions of source code must retain the above copyright notice,
- *  this list of conditions and the following disclaimer.
- *  Redistributions in binary form must reproduce the above copyright
- *  notice, this list of conditions and the following disclaimer in the
- *  documentation and/or other materials provided with the distribution.
- *  Neither the name of the dreamlu.net developer nor the names of its
- *  contributors may be used to endorse or promote products derived from
- *  this software without specific prior written permission.
- *  Author: Chill 庄骞 (smallchill@163.com)
- */
 package org.springblade.manager.service.impl;
 
 import cn.hutool.core.date.StopWatch;
 import cn.hutool.log.StaticLog;
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -43,6 +26,7 @@ import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
+import org.springblade.business.dto.TrialSelfInspectionRecordDTO;
 import org.springblade.business.entity.InformationQuery;
 import org.springblade.business.entity.TrialSelfInspectionRecord;
 import org.springblade.business.feign.ContractLogClient;
@@ -320,7 +304,9 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                         dataMap2.put(k, lastStr);
                     } else {
                         String dataVal = dataInfo2.getString(dataMap.get(k).get(0));
-                        dataMap2.put(k, dataVal + "_^_" + dataMap.get(k).get(0).split("__")[1]);
+                        if (StringUtils.isNotEmpty(dataVal)) {
+                            dataMap2.put(k, dataVal + "_^_" + dataMap.get(k).get(0).split("__")[1]);
+                        }
                     }
                 }
                 dataMap2.put("p_key_id", tableInfo.getPkeyId());
@@ -363,18 +349,22 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     tec.before();
                     this.formulaService.execute(tec);
                     tec.after();
-                }else{
+                } else {
                     tec.getLog().append("【").append("没有执行任何公式").append("】");
                 }
                 stopWatch.stop();
                 Long totalTime = stopWatch.getTotalTimeMillis();
                 log.append("公式执行消耗时间:").append(totalTime);
                 StaticLog.info("公式执行用时:{}", totalTime);
-                String[] sql = new String[]{
-                        "delete from m_formula_log where id =" + wtc.getPKeyId(),
-                        "INSERT INTO m_formula_log (id,content) VALUES (" + wtc.getPKeyId() + ", '" + log + "')"
-                };
-                this.jdbcTemplate.batchUpdate(sql);
+                try {
+                    String[] sql = new String[]{
+                            "delete from m_formula_log where id =" + wtc.getPKeyId(),
+                            "INSERT INTO m_formula_log (id,content) VALUES (" + wtc.getPKeyId() + ", '" + log + "')"
+                    };
+                    this.jdbcTemplate.batchUpdate(sql);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
             }
         }
     }
@@ -1122,7 +1112,12 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     } else if (tabVal.indexOf("_^_") >= 0) {
                         String[] tabData = tabVal.split("_\\^_");
                         if (StringUtils.isNotEmpty(tabData[0])) {
-                            reData.put(key + "__" + tabData[1], tabData[0]);
+                            if (tabVal.contains("[") && tabVal.contains("年")) {
+                                String[] strings = StringUtils.strip(tabData[0], "[]").split(",");
+                                reData.put(key + "__" + tabData[1], strings);
+                            }else {
+                                reData.put(key + "__" + tabData[1], tabData[0]);
+                            }
                         }
                     } else {
                         reData.put(key, tabVal);
@@ -1164,8 +1159,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
     @Override
     public R getBussPdfInfo(Long pkeyId) throws Exception {
-       // String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-        String file_path = "/www/wwwroot/Users/hongchuangyanfa/Desktop/";
+        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        //String file_path = "/Users/hongchuangyanfa/Desktop/";
         WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
                 .eq(WbsTreeContract::getPKeyId, pkeyId));
 
@@ -1282,7 +1277,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                                     x1 = 1;
                                                 }
                                                 String myData = DataInfo.get(val) + "";
-                                                if (myData.indexOf("T") >= 0 && myData.indexOf("-") >= 0) {
+                                                if ((myData.indexOf("T") >= 0 && myData.indexOf("-") >= 0) || (myData.indexOf(",") >= 0 && myData.indexOf("]") >= 0)){
                                                     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
                                                     sdf.setTimeZone(TimeZone.getTimeZone("GTM+8"));
                                                     SimpleDateFormat formatStr = new SimpleDateFormat("yyyy年MM月dd日");
@@ -1410,8 +1405,6 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 }
             }
         }
-
-        //wb.saveToFile(excelPath, ExcelVersion.Version2010);
         //输出流
         FileOutputStream outputStream = new FileOutputStream(excelPath);
         workbook.write(outputStream);
@@ -1469,8 +1462,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
     @Override
     public void getBussPdfs(String nodeId, String classify, String contractId, String projectId) throws Exception {
-        //String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-        String file_path = "/Users/hongchuangyanfa/Desktop/";
+        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        //String file_path = "/Users/hongchuangyanfa/Desktop/";
         // 获取有权限的节点信息
         List<AppWbsTreeContractVO> wbsTreeContractList = wbsTreeContractService.searchNodeAllTable(nodeId, classify, contractId, projectId);
         List<String> data = new ArrayList<>();
@@ -1946,8 +1939,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
      * 试验 单pdf
      */
     @Override
-    public String getBussPDFTrial(Long pkeyId, String contractId, Long id, int pageNumber, int pageNumberCount) throws
-            Exception {
+    public String getBussPDFTrial(Long pkeyId, String contractId, Long id, int pageNumber, int pageNumberCount, TrialSelfInspectionRecordDTO dto) throws Exception {
         String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
         WbsTreePrivate wbsTreePrivate = wbsTreePrivateService.getBaseMapper().selectOne(Wrappers.<WbsTreePrivate>query().lambda()
                 .eq(WbsTreePrivate::getPKeyId, pkeyId));
@@ -1974,7 +1966,10 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
         //获取数据信息info
         List<Map<String, Object>> bussDataInfoTrial = this.getBussDataInfoTrial(id, pkeyId, Long.parseLong(contractId));
-        Map<String, Object> DataInfo = bussDataInfoTrial.stream().findAny().orElse(null);
+        Map<String, Object> DataInfo = new HashMap<>();
+        if (bussDataInfoTrial.size() > 0) {
+            DataInfo.putAll(bussDataInfoTrial.stream().findAny().orElse(null));
+        }
 
         org.apache.poi.ss.usermodel.Workbook workbook = WorkbookFactory.create(CommonUtil.getOSSInputStream(excelTab.getFileUrl()));
         Sheet sheet = workbook.getSheetAt(0);
@@ -2027,6 +2022,26 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 Document doc = Jsoup.parse(htmlString);
                 Element table = doc.select("table").first();
                 Elements trs = table.select("tr");
+
+                Elements bgHB = doc.select("el-input[placeholder~=报告编号.*]");
+                Elements jlBH = doc.select("el-input[placeholder~=记录编号.*]");
+                if (dto != null) {
+                    //报告编号
+                    if (bgHB.size() >= 1 && StringUtils.isNotEmpty(dto.getReportNo())) {
+                        for (Element element : bgHB) {
+                            DataInfo.put(element.attr("keyname"), "NUMBER-" + dto.getReportNo());
+                            break;
+                        }
+                    }
+                    //记录编号
+                    if (jlBH.size() >= 1 && StringUtils.isNotEmpty(dto.getRecordNo())) {
+                        for (Element element : jlBH) {
+                            DataInfo.put(element.attr("keyname"), "NUMBER-" + dto.getRecordNo());
+                            break;
+                        }
+                    }
+                }
+
                 if (ObjectUtil.isNotEmpty(DataInfo)) {
                     for (String val : Objects.requireNonNull(DataInfo).keySet()) {
                         if (val.contains("__")) {
@@ -2114,6 +2129,18 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                                             ObjectUtils.isNotEmpty(cell);
                                                         }
                                                     }
+                                                } else if (myData.contains("NUMBER-JL-") || myData.contains("NUMBER-BG-")) {
+                                                    //记录表号、报告单号
+                                                    Row row = sheet.getRow(y1 - 1);
+                                                    if (row != null) {
+                                                        Cell cell = row.getCell(x1 - 1);
+                                                        if (cell != null) {
+                                                            String replace = myData.replace("NUMBER-", "");
+                                                            cell.setCellValue(replace);
+                                                        } else {
+                                                            ObjectUtils.isNotEmpty(cell);
+                                                        }
+                                                    }
                                                 } else {
                                                     Row row = sheet.getRow(y1 - 1);
                                                     if (row != null) {
@@ -2152,7 +2179,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                 Elements tdsx = ytzData.select("td");
                                 if (Integer.parseInt(trtd[1]) < tdsx.size()) {
                                     Element data = ytzData.select("td").get(Integer.parseInt(trtd[1]));
-                                    if (data.html().indexOf("el-tooltip") >= 0) {
+                                    if (data.html().contains("el-tooltip")) {
                                         data = data.children().get(0);
                                     }
 
@@ -2165,7 +2192,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                     Row row = sheet.getRow(y1 - 1);
                                     if (row != null) {
                                         Cell cell = sheet.getRow(y1 - 1).getCell(x1 - 1);
-                                        if (cell != null || ObjectUtils.isNotEmpty(cell)) {
+                                        if (cell != null) {
                                             short fontIndex = cell.getCellStyle().getFontIndex();
                                             Font oldfontAt = workbook.getFontAt(fontIndex);
 
@@ -2179,6 +2206,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                             newStyle.setFont(redFont);
                                             cell.setCellStyle(newStyle);
                                             cell.setCellValue(e.getId() + "");
+                                        } else {
+                                            ObjectUtils.isNotEmpty(cell);
                                         }
                                     }
                                 }
@@ -2258,17 +2287,16 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
      */
     @Override
     public String getBussPDFSTrial(String nodeId, String tableType, String classify, String contractId, String
-            projectId, Long id, String tabIds) throws Exception {
+            projectId, Long id, String tabIds, TrialSelfInspectionRecordDTO dto) throws Exception {
         String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
         //获取有权限的表的信息
-        String sql = "select p_key_id,html_url,table_type,sort,node_name,create_time from m_wbs_tree_private where is_deleted = 0 and p_key_id in (" + tabIds + ") order by sort,node_name,create_time";
-        List<WbsTreePrivate> queryList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreePrivate.class));
+        List<WbsTreePrivate> queryList = jdbcTemplate.query("select p_key_id,html_url,table_type,sort,node_name,create_time from m_wbs_tree_private where is_deleted = 0 and p_key_id in (" + tabIds + ") order by sort,node_name,create_time", new BeanPropertyRowMapper<>(WbsTreePrivate.class));
         List<String> dataPdfUrls = new ArrayList<>();
 
         //报告单
-        List<WbsTreePrivate> reportTable = queryList.stream().filter(f -> f.getTableType() == 2).collect(Collectors.toList());
+        List<WbsTreePrivate> reportTable = queryList.stream().filter(f -> f.getTableType() == 10 || f.getTableType() == 2).collect(Collectors.toList());
         //记录表
-        List<WbsTreePrivate> recordTable = queryList.stream().filter(f -> f.getTableType() == 1).collect(Collectors.toList());
+        List<WbsTreePrivate> recordTable = queryList.stream().filter(f -> f.getTableType() == 9 || f.getTableType() == 1).collect(Collectors.toList());
 
         if (queryList.size() > 0) {
             int reportPageNumber = 1;
@@ -2278,7 +2306,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     //没有excel表单的不生成pdf
                     if (StringUtils.isNotEmpty(report.getHtmlUrl())) {
                         //生成报告单pdf
-                        String bussPdfInfo = this.getBussPDFTrial(report.getPKeyId(), contractId, id, reportPageNumber++, reportPageNumberCount);
+                        String bussPdfInfo = this.getBussPDFTrial(report.getPKeyId(), contractId, id, reportPageNumber++, reportPageNumberCount, dto);
                         if (StringUtils.isNotEmpty(bussPdfInfo)) {
                             dataPdfUrls.add(bussPdfInfo);
                         }
@@ -2293,7 +2321,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     //没有excel表单的不生成pdf
                     if (StringUtils.isNotEmpty(record.getHtmlUrl())) {
                         //生成记录表pdf
-                        String bussPdfInfo = this.getBussPDFTrial(record.getPKeyId(), contractId, id, recordPageNumber++, recordPageNumberCount);
+                        String bussPdfInfo = this.getBussPDFTrial(record.getPKeyId(), contractId, id, recordPageNumber++, recordPageNumberCount,null);
                         if (StringUtils.isNotEmpty(bussPdfInfo)) {
                             dataPdfUrls.add(bussPdfInfo);
                         }

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

@@ -117,9 +117,9 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     @Override
     public IFormulaService init() {
-         this.checkItems= new ArrayList<>();
-         this.checkDate= new ArrayList<>();
-         this.summary = new ArrayList<>();
+        this.checkItems= new ArrayList<>();
+        this.checkDate= new ArrayList<>();
+        this.summary = new ArrayList<>();
         this.tableDataMaps=this.tec.getTableDataMaps();
         this.formDataMap=this.tec.getFormDataMap();
         List<FormData> list =this.tec.getFds();
@@ -707,7 +707,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         if(this.summary.size()>0){
             /**/
             this.constantMap.put(CHECK_ITEMS,this.checkItems.stream().filter(fdTmp->fdTmp.getValues().stream().map(ElementData::getValue).anyMatch(e->StringUtils.isNotEmpty(e)&&StringUtils.isNotEquals("/",e))).map(FormData::getEName).map(FormulaUtils::parseItemName).distinct().collect(Collectors.joining(",")));
-            this.constantMap.put("CKD",this.checkDate.stream().flatMap(k->k.getValues().stream()).map(ElementData::stringValue).reduce((a, b) -> Comparator.<DateTime>reverseOrder().compare(new DateTime(a), new DateTime(b)) <= 0 ? a : b).orElse(null));
+            this.constantMap.put("CKD",this.checkDate.stream().flatMap(k->k.getValues().stream()).map(ElementData::stringValue).filter(StringUtils::isNotEmpty).reduce((a, b) -> Comparator.<DateTime>reverseOrder().compare(new DateTime(a), new DateTime(b)) <= 0 ? a : b).orElse(null));
             this.summary.forEach(e->{
                 /*处理脚本*/
                 e.getFormula().setFormula(e.getFormula().getNumber());

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

@@ -413,7 +413,7 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean submitExcelRelationWbsTreeAndElement(FormElementDTO2 formElementDTO) {
-        //新增元素表、实体表 2表示 创建 并关联 wbs 树节点信息   3 表示只创建
+        //1新增元素表、实体表 2表示 创建 并关联 wbs 树节点信息   3 表示只创建
         if (formElementDTO.getSubmitStatus() == 2 || formElementDTO.getSubmitStatus() == 3) {//
             this.saveFormElement(formElementDTO);
         } else if (formElementDTO.getSubmitStatus() == 1) { // 修改实体信息

+ 72 - 56
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -12,6 +12,7 @@ import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.springblade.business.entity.ConstructionLedger;
 import org.springblade.business.feign.ConstructionLedgerFeignClient;
+import org.springblade.business.feign.InformationQueryClient;
 import org.springblade.common.utils.FileUtils;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
@@ -51,6 +52,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
     private final WbsTreePrivateMapper wbsTreePrivateMapper;
     private final ContractInfoMapper contractInfoMapper;
     private final JdbcTemplate jdbcTemplate;
+    private final InformationQueryClient informationQueryClient;
 
     @Override
     public List<WbsTreeContract> selectQueryCurrentNodeByAncestors(List<String> ids, String contractId) {
@@ -86,7 +88,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
 
         //获取当前合同段所有节点、表单(不包括客户端新增或者复制节点)
         List<WbsTreeContract> list = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
-                .select(WbsTreeContract::getId, WbsTreeContract::getType)
+                .select(WbsTreeContract::getId, WbsTreeContract::getType, WbsTreeContract::getParentId)
                 .eq(WbsTreeContract::getContractId, pawDTO.getContractId())
                 .eq(WbsTreeContract::getWbsId, pawDTO.getWbsId())
                 .eq(WbsTreeContract::getStatus, 1)
@@ -179,6 +181,14 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                     throw new ServiceException(StringUtil.format("节点下的 {} 中存在填报数据,删除失败!", names));
                 }
                 baseMapper.deleteBatch(ids1, pawDTO.getWbsId(), pawDTO.getProjectId(), pawDTO.getContractId());
+
+                //更新redis缓存
+                List<WbsTreeContract> delObjList = list.stream().filter(f -> ids1.contains(f.getId())).collect(Collectors.toList());
+                Map<Long, List<WbsTreeContract>> collect = delObjList.stream().filter(f -> ObjectUtil.isNotEmpty(f.getParentId())).collect(Collectors.groupingBy(WbsTreeContract::getParentId));
+                for (Map.Entry<Long, List<WbsTreeContract>> longListEntry : collect.entrySet()) {
+                    informationQueryClient.AsyncWbsTree(longListEntry.getKey().toString() + "", longListEntry.getKey() + "", pawDTO.getContractId(), "", "1");
+                }
+
             }
 
             //TODO ---------新增---------
@@ -233,6 +243,12 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
 
                 this.insertBatch(wbsTreeContractList, 1000);
                 constructionLedgerFeign.initConstructionLedger(constructionLedgerList);
+
+                //更新redis缓存
+                Map<Long, List<WbsTreeContract>> collect = wbsTreeContractList.stream().filter(f -> new Integer(1).equals(f.getType()) && ObjectUtil.isNotEmpty(f.getParentId())).collect(Collectors.groupingBy(WbsTreeContract::getParentId));
+                for (Map.Entry<Long, List<WbsTreeContract>> longListEntry : collect.entrySet()) {
+                    informationQueryClient.AsyncWbsTree("", longListEntry.getKey().toString(), pawDTO.getContractId(), "", "1");
+                }
             }
         }
         return true;
@@ -359,7 +375,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
 
     // 频率添加表单
     @Override
-    public boolean addTabInfoByRan(RangeInfo info,List<Object> moreData,String[] excLenght){
+    public boolean addTabInfoByRan(RangeInfo info, List<Object> moreData, String[] excLenght) {
         WbsTreeContract wbsInfo = this.baseMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda()
                 .eq(WbsTreeContract::getPKeyId, info.getPkId()));
 
@@ -369,7 +385,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 .eq(WbsTreeContract::getId, wbsInfo.getId())
                 .eq(WbsTreeContract::getContractId, wbsInfo.getContractId())
                 .eq(WbsTreeContract::getParentId, wbsInfo.getParentId()));
-        List<WbsTreeContract> wbsTreeContractList2 = wbsTreeContractList.stream().filter(wbsTreeContract -> wbsTreeContract.getIsCopeTab() ==null || wbsTreeContract.getIsCopeTab()==3).sorted(Comparator.comparing(WbsTreeContract::getCreateTime)).collect(Collectors.toList());
+        List<WbsTreeContract> wbsTreeContractList2 = wbsTreeContractList.stream().filter(wbsTreeContract -> wbsTreeContract.getIsCopeTab() == null || wbsTreeContract.getIsCopeTab() == 3).sorted(Comparator.comparing(WbsTreeContract::getCreateTime)).collect(Collectors.toList());
 
         int indexId = wbsTreeContractList2.indexOf(wbsInfo);
 
@@ -378,73 +394,73 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         List<WbsTreeContract> addList = new ArrayList<>();
         StringBuilder addSql = new StringBuilder();
         //修改或新增数据
-        for(int i=indexId+1 ; i<wbsTreeContractList2.size();i++){
-             WbsTreeContract wbsTreeContract = wbsTreeContractList2.get(i);
-             List<Map<String, Object>> DataMap = jdbcTemplate.queryForList("select  * from " + wbsInfo.getInitTableName() + " where p_key_id=" + wbsTreeContract.getPKeyId());
-
-             int dataSize = 0;
-             if(moreData.size()>= excLenght.length){
-                 dataSize =excLenght.length;
-             }else{
-                 dataSize =moreData.size();
-                 if(dataSize<=0){
-                     break;
-                 }
-             }
-
-            if(DataMap!=null && DataMap.size()>=1){
+        for (int i = indexId + 1; i < wbsTreeContractList2.size(); i++) {
+            WbsTreeContract wbsTreeContract = wbsTreeContractList2.get(i);
+            List<Map<String, Object>> DataMap = jdbcTemplate.queryForList("select  * from " + wbsInfo.getInitTableName() + " where p_key_id=" + wbsTreeContract.getPKeyId());
+
+            int dataSize = 0;
+            if (moreData.size() >= excLenght.length) {
+                dataSize = excLenght.length;
+            } else {
+                dataSize = moreData.size();
+                if (dataSize <= 0) {
+                    break;
+                }
+            }
+
+            if (DataMap != null && DataMap.size() >= 1) {
                 String dataCol = "";
-                String updateSql = "update "+wbsInfo.getInitTableName()+" set "+info.getKey() +"=";
-                for(int j=0; j<dataSize;j++){
-                    if(j==dataSize-1){
-                        dataCol = dataCol + moreData.get(j) +"_^_"+excLenght[j];
-                    }else{
-                        dataCol = dataCol + moreData.get(j) +"_^_"+excLenght[j]+"☆";
+                String updateSql = "update " + wbsInfo.getInitTableName() + " set " + info.getKey() + "=";
+                for (int j = 0; j < dataSize; j++) {
+                    if (j == dataSize - 1) {
+                        dataCol = dataCol + moreData.get(j) + "_^_" + excLenght[j];
+                    } else {
+                        dataCol = dataCol + moreData.get(j) + "_^_" + excLenght[j] + "☆";
                     }
                 }
-                updateSql = updateSql + "'"+dataCol +"' where p_key_id=" + wbsTreeContract.getPKeyId() +" ;";
+                updateSql = updateSql + "'" + dataCol + "' where p_key_id=" + wbsTreeContract.getPKeyId() + " ;";
                 moreData = moreData.stream().skip(excLenght.length).map(com.mixsmart.utils.StringUtils::handleNull).collect(Collectors.toList());
                 addSql.append(updateSql);
-            }else{
+            } else {
                 long dataId = SnowFlakeUtil.getId();
-                String insertSql = "insert into "+wbsInfo.getInitTableName() +"(id,p_key_id,"+info.getKey()+") VALUES ("+dataId+","+ wbsTreeContract.getPKeyId()+",'";
+                String insertSql = "insert into " + wbsInfo.getInitTableName() + "(id,p_key_id," + info.getKey() + ") VALUES (" + dataId + "," + wbsTreeContract.getPKeyId() + ",'";
                 String dataCol = "";
-                for(int j=0; j<dataSize;j++){
-                    if(j==dataSize-1){
-                        dataCol = dataCol + moreData.get(j) +"_^_"+excLenght[j];
-                    }else{
-                        dataCol = dataCol + moreData.get(j) +"_^_"+excLenght[j]+"☆";
+                for (int j = 0; j < dataSize; j++) {
+                    if (j == dataSize - 1) {
+                        dataCol = dataCol + moreData.get(j) + "_^_" + excLenght[j];
+                    } else {
+                        dataCol = dataCol + moreData.get(j) + "_^_" + excLenght[j] + "☆";
                     }
                 }
-                insertSql =insertSql+dataCol+"');";
+                insertSql = insertSql + dataCol + "');";
                 moreData = moreData.stream().skip(excLenght.length).map(com.mixsmart.utils.StringUtils::handleNull).collect(Collectors.toList());
                 addSql.append(insertSql);
             }
         }
 
         //计算张数
-        double tabCount = moreData.size() / Double.parseDouble(excLenght.length+"") ;
-        double tabsCount  = Math.ceil(tabCount);//- wbsTreeContractList2.size()+indexId+1;
-        int maxIndex=0;
-        if(tabsCount>=1){
-            for(int i =0 ;i<tabsCount;i++){
+        double tabCount = moreData.size() / Double.parseDouble(excLenght.length + "");
+        double tabsCount = Math.ceil(tabCount);//- wbsTreeContractList2.size()+indexId+1;
+        int maxIndex = 0;
+        if (tabsCount >= 1) {
+            for (int i = 0; i < tabsCount; i++) {
                 long newPkId = SnowFlakeUtil.getId();
                 WbsTreeContract wbsTreeContract = new WbsTreeContract();
-                BeanUtil.copy(wbsInfo,wbsTreeContract);
+                BeanUtil.copy(wbsInfo, wbsTreeContract);
                 wbsTreeContract.setPKeyId(newPkId);
                 wbsTreeContract.setCreateTime(new Date());
                 wbsTreeContract.setTabGroupId(tabGroupId);
-                String nodeName = wbsTreeContractList2.get(wbsTreeContractList2.size()-1).getNodeName();
+                String nodeName = wbsTreeContractList2.get(wbsTreeContractList2.size() - 1).getNodeName();
 
                 if (nodeName.indexOf("_PL_") >= 0) {
                     String[] oldName = nodeName.split("_PL_");
-                    if(i==0){
+                    if (i == 0) {
                         maxIndex = Integer.parseInt(oldName[1]);
                     }
-                    maxIndex =maxIndex+1 ;
+                    maxIndex = maxIndex + 1;
                     nodeName = oldName[0] + "_PL_" + maxIndex;
                 } else {
-                    maxIndex =maxIndex+1 ;
+                    maxIndex = maxIndex + 1;
                     nodeName = nodeName + "_PL_" + maxIndex;
                 }
 
@@ -458,22 +474,22 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 addList.add(wbsTreeContract);
 
                 int dataSize = 0;
-                if(moreData.size()>= excLenght.length){
-                    dataSize =excLenght.length;
-                }else{
-                    dataSize =moreData.size();
+                if (moreData.size() >= excLenght.length) {
+                    dataSize = excLenght.length;
+                } else {
+                    dataSize = moreData.size();
                 }
                 long dataId = SnowFlakeUtil.getId();
-                String insertSql = "insert into "+wbsInfo.getInitTableName() +"(id,p_key_id,"+info.getKey()+") VALUES ("+dataId+","+ wbsTreeContract.getPKeyId()+",'";
+                String insertSql = "insert into " + wbsInfo.getInitTableName() + "(id,p_key_id," + info.getKey() + ") VALUES (" + dataId + "," + wbsTreeContract.getPKeyId() + ",'";
                 String dataCol = "";
-                for(int j=0; j<dataSize;j++){
-                    if(j==dataSize-1){
-                        dataCol = dataCol + moreData.get(j) +"_^_"+excLenght[j];
-                    }else{
-                        dataCol = dataCol + moreData.get(j) +"_^_"+excLenght[j]+"☆";
+                for (int j = 0; j < dataSize; j++) {
+                    if (j == dataSize - 1) {
+                        dataCol = dataCol + moreData.get(j) + "_^_" + excLenght[j];
+                    } else {
+                        dataCol = dataCol + moreData.get(j) + "_^_" + excLenght[j] + "☆";
                     }
                 }
-                insertSql =insertSql+dataCol+"');";
+                insertSql = insertSql + dataCol + "');";
                 moreData = moreData.stream().skip(excLenght.length).map(com.mixsmart.utils.StringUtils::handleNull).collect(Collectors.toList());
                 addSql.append(insertSql);
             }
@@ -482,12 +498,12 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         }
 
         this.jdbcTemplate.execute(addSql.toString());
-        for(WbsTreeContract wbsTreeCont:wbsTreeContractList2){
+        for (WbsTreeContract wbsTreeCont : wbsTreeContractList2) {
             UpdateWrapper<WbsTreeContract> updateWrapper = new UpdateWrapper<>();
             updateWrapper.in("p_key_id", wbsTreeCont.getPKeyId() + "");
             updateWrapper.set("tab_group_id", tabGroupId);
             wbsTreeCont.setTabGroupId(tabGroupId);
-            this.getBaseMapper().update(wbsTreeCont,updateWrapper);
+            this.getBaseMapper().update(wbsTreeCont, updateWrapper);
         }
         return false;
     }

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

@@ -17,7 +17,6 @@ import org.springblade.business.feign.InformationQueryClient;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
-import org.springblade.common.utils.ThreadPoolMonitor;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Condition;
@@ -1560,6 +1559,91 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         }
     }
 
+    @Override
+    public Map<String, List<Object>> treeRecordTrial(String wbsId, String projectId, String pKeyId) {
+        WbsInfo wbsInfo = wbsInfoMapper.selectOne(Wrappers.<WbsInfo>query().lambda().select(WbsInfo::getWbsType).eq(WbsInfo::getId, wbsId));
+        if (wbsInfo != null) {
+            WbsTreePrivate wbsTreePrivate = this.getBaseMapper().selectOne(Wrappers.<WbsTreePrivate>lambdaQuery()
+                    .select(WbsTreePrivate::getMixRatioTestIds)
+                    .eq(WbsTreePrivate::getPKeyId, pKeyId));
+            if (wbsTreePrivate != null && StringUtils.isNotEmpty(wbsTreePrivate.getMixRatioTestIds())) {
+                //公有引用
+                List<WbsTreePrivateVO5> wbsTreePrivateVO5s = baseMapper.treeRecordTrial(wbsId, projectId, wbsInfo.getWbsType());
+                List<String> strings = Func.toStrList(wbsTreePrivate.getMixRatioTestIds());
+                for (WbsTreePrivateVO5 wbsTreePrivateVO5 : wbsTreePrivateVO5s) {
+                    for (String id : strings) {
+                        if (id.equals(wbsTreePrivateVO5.getId().toString())) {
+                            wbsTreePrivateVO5.setCheckStatus(1);
+                            break;
+                        }
+                    }
+                }
+
+                List<Long> allStatusIds = wbsTreePrivateVO5s.stream().filter(f -> new Integer(1).equals(f.getCheckStatus())).map(WbsTreePrivateVO5::getId).collect(Collectors.toList());
+                List<Long> halfStatusIds = wbsTreePrivateVO5s.stream().filter(f -> !new Integer(1).equals(f.getCheckStatus())).map(WbsTreePrivateVO5::getId).collect(Collectors.toList());
+
+                Map<String, List<Object>> map = new HashMap<>();
+                map.put("allTree", Collections.singletonList(this.buildWbsTreeByStreamTrial(wbsTreePrivateVO5s)));
+                map.put("allStatusIds", Collections.singletonList(allStatusIds));
+                map.put("halfStatusIds", Collections.singletonList(halfStatusIds));
+                return map;
+            }
+
+        } else {
+            //私有引用
+            WbsTreePrivate nodeRoot = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery()
+                    .select(WbsTreePrivate::getWbsType)
+                    .eq(WbsTreePrivate::getWbsId, wbsId)
+                    .eq(WbsTreePrivate::getProjectId, projectId)
+                    .eq(WbsTreePrivate::getParentId, 0L));
+            if (nodeRoot != null) {
+                WbsTreePrivate wbsTreePrivate = this.getBaseMapper().selectOne(Wrappers.<WbsTreePrivate>lambdaQuery()
+                        .select(WbsTreePrivate::getMixRatioTestIds)
+                        .eq(WbsTreePrivate::getPKeyId, pKeyId));
+                if (wbsTreePrivate != null && StringUtils.isNotEmpty(wbsTreePrivate.getMixRatioTestIds())) {
+                    List<WbsTreePrivateVO5> wbsTreePrivateVO5s = baseMapper.treeRecordTrial(wbsId, projectId, Integer.valueOf(nodeRoot.getWbsType()));
+                    List<String> strings = Func.toStrList(wbsTreePrivate.getMixRatioTestIds());
+                    for (WbsTreePrivateVO5 wbsTreePrivateVO5 : wbsTreePrivateVO5s) {
+                        for (String id : strings) {
+                            if (id.equals(wbsTreePrivateVO5.getId().toString())) {
+                                wbsTreePrivateVO5.setCheckStatus(1);
+                                break;
+                            }
+                        }
+                    }
+
+                    List<Long> allStatusIds = wbsTreePrivateVO5s.stream().filter(f -> new Integer(1).equals(f.getCheckStatus())).map(WbsTreePrivateVO5::getId).collect(Collectors.toList());
+                    List<Long> halfStatusIds = wbsTreePrivateVO5s.stream().filter(f -> !new Integer(1).equals(f.getCheckStatus())).map(WbsTreePrivateVO5::getId).collect(Collectors.toList());
+
+                    Map<String, List<Object>> map = new HashMap<>();
+                    map.put("allTree", Collections.singletonList(this.buildWbsTreeByStreamTrial(wbsTreePrivateVO5s)));
+                    map.put("allStatusIds", Collections.singletonList(allStatusIds));
+                    map.put("halfStatusIds", Collections.singletonList(halfStatusIds));
+                    return map;
+                }
+            }
+        }
+        return null;
+    }
+
+    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));
+        this.recursionFnTreeTrial(list, map);
+        return list;
+    }
+
+    private void recursionFnTreeTrial(List<WbsTreePrivateVO5> list, Map<Long, List<WbsTreePrivateVO5>> map) {
+        for (WbsTreePrivateVO5 wbsTreeVO2 : list) {
+            List<WbsTreePrivateVO5> childrenList = map.get(wbsTreeVO2.getId());
+            wbsTreeVO2.setChildren(childrenList);
+            if (childrenList != null && childrenList.size() > 0) {
+                wbsTreeVO2.setHasChildren(true);
+                recursionFnTreeTrial(childrenList, map);
+            }
+        }
+    }
+
     private List<WbsTreePrivateVO> buildWbsTreeByStream(List<WbsTreePrivateVO> wbsTreePrivateVOS) {
         List<WbsTreePrivateVO> list = wbsTreePrivateVOS.stream().filter(f -> f.getParentId() == 0L).collect(Collectors.toList());
         Map<Long, List<WbsTreePrivateVO>> map = wbsTreePrivateVOS.stream().collect(Collectors.groupingBy(WbsTreePrivateVO::getParentId));
@@ -1823,20 +1907,18 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         }
         //角色权限
         List<String> roleAndTabOwners = wbsTableOwnerRoleList.stream().map(WbsTableOwnerRole::getTableOwnerNumber).collect(Collectors.toList());
-
-        //表单权限
-        List<String> tableOwnerList = null;
-        if (org.apache.commons.lang.StringUtils.isNotEmpty(tableOwner)) {
-            String tableOwners = "";
-            if (tableOwner.equals("1")) {
-                tableOwners = "1,2,3";
-            } else if (tableOwner.equals("2")) {
-                tableOwners = "4,5,6";
+        String roleAndTabOwner = roleAndTabOwners.stream().filter(("7")::equals).findAny().orElse(null);
+        if (StringUtils.isNotEmpty(roleAndTabOwner)) {
+            //试验tabOwner=7,默认加载全部tabOwner=7的表
+            if ("1".equals(tableType)) {
+                tableType = "9"; //记录表
+            } else if ("2".equals(tableType)) {
+                tableType = "10";  //报告单
             }
-            tableOwnerList = Func.toStrList(tableOwners);
+            return baseMapper.selectWbsTreeTrialTabList(tableType, wbsTreePrivate.getProjectId(), wbsTreePrivate.getWbsId(), wbsTreePrivate.getId(), contractId);
+        } else {
+            throw new ServiceException("当前用户角色未授权,请先分配角色查看元素表相对应的权限");
         }
-
-        return baseMapper.selectWbsTreeTrialTabList(roleAndTabOwners, tableType, wbsTreePrivate.getProjectId(), wbsTreePrivate.getWbsId(), wbsTreePrivate.getId(), tableOwnerList, contractId);
     }
 
     @Override

+ 0 - 46
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/AsyncConfigurer.java

@@ -1,46 +0,0 @@
-package org.springblade.manager.utils;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.scheduling.annotation.EnableAsync;
-
-import java.util.concurrent.*;
-
-@Slf4j
-@Configuration
-@EnableAsync
-public class AsyncConfigurer {
-
-    /**
-     * cpu 核心数量
-     */
-    public static final int cpuNum = Runtime.getRuntime().availableProcessors();
-
-    /**
-     * 线程池配置
-     *
-     * @return
-     */
-    @Bean("taskExecutor1")
-    public ThreadPoolExecutor getAsyncExecutor() {
-        return new ThreadPoolMonitor(cpuNum
-                , cpuNum * 2
-                , 60
-                , TimeUnit.SECONDS
-                , new LinkedBlockingQueue<>(2000)
-                , new ThreadPoolExecutor.DiscardOldestPolicy(), "manager-thread-pool");
-    }
-
-    /**
-     * 线程池配置
-     *
-     * @return
-     */
-    @Bean("singleExecutor")
-    public ExecutorService getSingleExecutor() {
-        log.info("线程池初始化......");
-        return Executors.newSingleThreadExecutor();
-    }
-
-}

+ 3 - 34
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/test.java

@@ -5,15 +5,11 @@ import cn.hutool.extra.pinyin.PinyinUtil;
 import cn.hutool.extra.pinyin.engine.pinyin4j.Pinyin4jEngine;
 import com.alibaba.druid.sql.repository.SchemaObjectType;
 import com.alibaba.excel.util.DateUtils;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.jfireel.expression.Expression;
-import org.checkerframework.checker.units.qual.A;
 import org.jsoup.Connection;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
-import org.springblade.manager.entity.ArchiveTree;
 
 import java.io.IOException;
 import java.time.LocalDateTime;
@@ -23,21 +19,11 @@ import java.util.Map;
 
 public class test {
 
-    public static void main(String[] args) {
-        ArchiveTree archiveTree = new ArchiveTree();
-        archiveTree.setNodeName("hahaha");
-        archiveTree.setId(996L);
-
-        Map<String, Object> archivesAutoMap = new ObjectMapper().convertValue(archiveTree, Map.class);
-        Map<String,Object> variables = new HashMap<>();
-
-        variables.put("ArchiveTree",archivesAutoMap);
-        String formula = "ArchiveTree['nodeName']";
-        Object data = Expression.parse(formula).calculate(variables);
-        System.out.println();
+    /*public static void main(String[] args) {
+        Map<String, Map<String, String>> map = getWeather("chongqing", "202304");
 //        String str = LocalDateTime.now().minusDays(1L).format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"));
 //        System.out.println(map.get(str));
-    }
+    }*/
     public static  Map<String,Map<String,String>> getWeather(String city,String month){
         String html = "http://www.tianqihoubao.com/lishi/"+city+"/month/"+month+".html";
         System.out.println(html);
@@ -70,21 +56,4 @@ public class test {
         return map;
     }
 
-
-    public static int convertCellReferenceToIndex(String cellRef) {
-        int idx = 0;
-        for (int i = 0; i < cellRef.length(); i++) {
-            char ch = Character.toUpperCase(cellRef.charAt(i));
-            if (Character.isLetter(ch)) {
-                // 计算字母对应的数字
-                idx = idx * 26 + (ch - 'A');
-            } else {
-                // 计算数字对应的行数
-                idx = Integer.parseInt(cellRef.substring(i)) - 1;
-                break;
-            }
-        }
-        return idx;
-    }
-
 }

Some files were not shown because too many files changed in this diff