Parcourir la source

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

yangyj il y a 2 ans
Parent
commit
6f1646f9c1
32 fichiers modifiés avec 502 ajouts et 346 suppressions
  1. 0 2
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TaskBatch.java
  2. 1 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/InformationQueryClient.java
  3. 7 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/TaskClient.java
  4. 38 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ImportWbsNodeVO.java
  5. 6 0
      blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/RoleMenu.java
  6. 2 2
      blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/GrantVO.java
  7. 27 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ArchiveFileController.java
  8. 38 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ContractLogController.java
  9. 2 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/EVisaTaskCheckController.java
  10. 51 4
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  11. 5 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  12. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ContractLogClientImpl.java
  13. 15 1
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/InformationQueryClientImpl.java
  14. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/TaskClientImpl.java
  15. 6 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  16. 8 202
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  17. 5 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FirstController.java
  18. 0 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/SignPfxFileController.java
  19. 73 39
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  20. 89 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/excel/WbsExcelUtil.java
  21. 7 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java
  22. 0 9
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java
  23. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  24. 74 41
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  25. 2 0
      blade-service/blade-system/src/main/java/org/springblade/system/mapper/RoleMapper.java
  26. 1 0
      blade-service/blade-system/src/main/java/org/springblade/system/mapper/RoleMapper.xml
  27. 1 0
      blade-service/blade-system/src/main/java/org/springblade/system/mapper/RoleMenuMapper.xml
  28. 1 1
      blade-service/blade-system/src/main/java/org/springblade/system/service/IRoleService.java
  29. 1 1
      blade-service/blade-system/src/main/java/org/springblade/system/service/ITopMenuService.java
  30. 1 1
      blade-service/blade-system/src/main/java/org/springblade/system/service/impl/MenuServiceImpl.java
  31. 16 6
      blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleServiceImpl.java
  32. 18 18
      blade-service/blade-system/src/main/java/org/springblade/system/service/impl/TopMenuServiceImpl.java

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

@@ -51,8 +51,6 @@ public class TaskBatch extends BaseEntity {
         this.setId(SnowFlakeUtil.getId());
         this.taskParallelId = taskParallelId;
         this.jsonData = jsonData;
-        this.setCreateUser(AuthUtil.getUserId());
-        this.setCreateTime(new Date());
     }
 
     public TaskBatch(){}

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

@@ -21,7 +21,7 @@ public interface InformationQueryClient {
     String API_PREFIX = "/api/business/informationQuery";
 
     /**
-     * 获取记录
+     * 获取首件记录
      */
     @PostMapping(API_PREFIX + "/queryFirstBusinessDataByFirstId")
     JSONObject queryFirstBusinessDataByFirstId(@RequestParam String firstId);

+ 7 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/TaskClient.java

@@ -27,6 +27,7 @@ public interface TaskClient {
     String QUERY_FORM_DATA_ID = API_PREFIX + "/query-form-data-id";
     String QUERY_BUSINESS_DATA_TASK = API_PREFIX + "/query-business-data-task";
     String QUERY_APPROVAL_USER = API_PREFIX + "/query-approval-user";
+    String QUERY_APPROVAL_USER_TASK_ID = API_PREFIX + "/query-approval-user-by-task-id";
     String QUERY_BUSINESS_TABLE_E_VISA_CONFIG = API_PREFIX + "/query-business-table-e-visa-config";
     String QUERY_TASK_CONTRACT_ID = API_PREFIX + "/query-task-contract-id";
 
@@ -48,6 +49,12 @@ public interface TaskClient {
     @GetMapping(QUERY_APPROVAL_USER)
     List<TaskParallel> queryApprovalUser(@RequestParam String formDataIds);
 
+    /**
+     * 获取填报人列表
+     */
+    @GetMapping(QUERY_APPROVAL_USER_TASK_ID)
+    List<TaskParallel> queryApprovalUserByTaskId(@RequestParam String taskId);
+
     /**
      * 获取业务数据
      */

+ 38 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ImportWbsNodeVO.java

@@ -0,0 +1,38 @@
+package org.springblade.manager.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ImportWbsNodeVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    //主键id
+    private Long id;
+
+    //父级id
+    private Long parentId;
+
+    //祖级信息
+    private String ancestors;
+
+    //节点类型
+    private String nodeType;
+
+    //节点名
+    private String nodeName;
+
+    //唯一code
+    private String code;
+
+    //上级code
+    private String parentCode;
+
+    //行
+    private Integer row;
+
+    //子级对象VO
+    private ImportWbsNodeVO childEntity;
+
+}

+ 6 - 0
blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/RoleMenu.java

@@ -61,5 +61,11 @@ public class RoleMenu implements Serializable {
 	@ApiModelProperty(value = "角色id")
 	private Long roleId;
 
+	/**
+	 * 勾选状态
+	 */
+	@JsonSerialize(using = ToStringSerializer.class)
+	@ApiModelProperty(value = "勾选状态")
+	private String status;
 
 }

+ 2 - 2
blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/GrantVO.java

@@ -19,10 +19,10 @@ public class GrantVO implements Serializable {
     private List<Long> roleIds;
 
     @ApiModelProperty(value = "menuIds集合")
-    private List<Long> menuIds;
+    private List<String> menuIds;
 
     @ApiModelProperty(value = "menuClientIds集合")
-    private List<Long> menuClientIds;
+    private List<String> menuClientIds;
 
     @ApiModelProperty(value = "topMenuIds集合")
     private List<Long> topMenuIds;

+ 27 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/ArchiveFileController.java

@@ -13,6 +13,7 @@ import lombok.AllArgsConstructor;
 
 import org.apache.commons.lang.StringUtils;
 import org.springblade.business.entity.Task;
+import org.springblade.business.entity.TaskParallel;
 import org.springblade.business.feign.MessageWarningClient;
 import org.springblade.business.feign.OperationLogClient;
 import org.springblade.business.feign.RecycleBinClient;
@@ -166,6 +167,10 @@ public class ArchiveFileController extends BladeController {
 					this.archiveFileService.update(Wrappers.<ArchiveFile>lambdaUpdate().set(ArchiveFile::getEVisaFile, null).set(ArchiveFile::getStatus, 0).in(ArchiveFile::getId, Arrays.asList(task.getFormDataId().split(","))));
 				}
 				List<ArchiveFile> archiveFiles = this.archiveFileService.getBaseMapper().selectBatchIds(Arrays.asList(task.getFormDataId().split(",")));
+
+				//获取当前任务的环节审批人
+				List<TaskParallel> linkList = this.taskClient.queryApprovalUserByTaskId(task.getProcessInstanceId());
+
 				for(ArchiveFile archiveFile : archiveFiles){
 					try{
 						ProjectInfo projectInfo = this.projectClient.queryProjectList(Func.toStrList(archiveFile.getProjectId())).get(0);
@@ -191,6 +196,28 @@ public class ArchiveFileController extends BladeController {
 						json.put("operationObjName", archiveFile.getFileName());
 						this.operationLogClient.saveUserOperationLog(26, "其它文件", "工程文件", json);
 
+						if(linkList != null && linkList.size() > 0){
+
+							List<MessageWarningVO> messageList = new ArrayList<>();
+							for(TaskParallel taskParallel : linkList){
+								messageList.add(new MessageWarningVO(
+										Long.parseLong(task.getProjectId()),
+										Long.parseLong(task.getContractId()),
+										//废除通知
+										3,
+										//内容
+										(StringUtils.isNotEmpty(projectInfo.getProjectAlias()) ? projectInfo.getProjectAlias() : projectInfo.getProjectName()) + contractInfo.getContractName() + "的用户" + AuthUtil.getNickName() + "废除了【" + archiveFile.getFileName() + "】流程,请及时查看",
+										//推送的目标人
+										Long.parseLong(taskParallel.getTaskUser()),
+										//默认未读
+										0
+								));
+							}
+							if(messageList.size() > 0){
+								this.messageWarningClient.savePushUserMessageWarning(messageList);
+							}
+						}
+
 					}catch (Exception e){
 						e.printStackTrace();
 					}

+ 38 - 2
blade-service/blade-business/src/main/java/org/springblade/business/controller/ContractLogController.java

@@ -84,7 +84,7 @@ public class ContractLogController extends BladeController {
 	@ApiImplicitParams({
 			@ApiImplicitParam(name = "contractId", value = "合同段ID"),
 			@ApiImplicitParam(name = "nodePrimaryKeyId", value = "左侧填报日志节点primaryKeyId"),
-			@ApiImplicitParam(name = "time", value = "所选的时间,格式为yyyy-MM-dd")
+			@ApiImplicitParam(name = "time", value = "所选的时间,格式为yyyy-MM-dd、yyyy-MM、yyyy")
 	})
 	public R<List<ContractLog>> queryLogByContractIdAndNodePrimaryKeyId(@RequestParam String contractId, @RequestParam String nodePrimaryKeyId, @RequestParam String time){
 		return R.data(this.contractLogService.list(Wrappers.<ContractLog>lambdaQuery().eq(ContractLog::getContractId, contractId).eq(ContractLog::getWbsNodeId, nodePrimaryKeyId).like(ContractLog::getRecordTime, time)));
@@ -336,8 +336,13 @@ public class ContractLogController extends BladeController {
 				}
 
 				List<ContractLog> contractLogs = this.contractLogService.getBaseMapper().selectBatchIds(Arrays.asList(task.getFormDataId().split(",")));
+				List<String> fileNameList = new ArrayList<>();
 				for(ContractLog contractLog : contractLogs){
 
+					if(!fileNameList.contains(contractLog.getFileName())){
+						fileNameList.add(contractLog.getFileName());
+					}
+
 					ProjectInfo projectInfo = this.projectClient.queryProjectList(Func.toStrList(contractLog.getProjectId().toString())).get(0);
 					ContractInfo contractInfo = this.contractClient.getContractById(contractLog.getContractId());
 
@@ -354,7 +359,6 @@ public class ContractLogController extends BladeController {
 								contractLog.getCreateUser(),
 								//默认未读
 								0
-
 						));
 
 						//保存操作记录
@@ -364,11 +368,43 @@ public class ContractLogController extends BladeController {
 
 						this.operationLogClient.saveUserOperationLog(9, "台账日志", "日志填报", json);
 
+
 					}catch (Exception e){
 						e.printStackTrace();
 					}
 
 				}
+				try{
+					//获取当前任务的环节审批人
+					List<TaskParallel> linkList = this.taskClient.queryApprovalUserByTaskId(task.getProcessInstanceId());
+					if(linkList != null && linkList.size() > 0){
+						ProjectInfo projectInfo = this.projectClient.queryProjectList(Func.toStrList(task.getProjectId())).get(0);
+						ContractInfo contractInfo = this.contractClient.getContractById(Long.parseLong(task.getContractId()));
+
+						List<MessageWarningVO> messageList = new ArrayList<>();
+						for(String fileName : fileNameList){
+							for(TaskParallel taskParallel : linkList){
+								messageList.add(new MessageWarningVO(
+										Long.parseLong(task.getProjectId()),
+										Long.parseLong(task.getContractId()),
+										//废除通知
+										3,
+										//内容
+										(StringUtils.isNotEmpty(projectInfo.getProjectAlias()) ? projectInfo.getProjectAlias() : projectInfo.getProjectName()) + contractInfo.getContractName() + "的用户" + AuthUtil.getNickName() + "废除了【" + fileName + "】流程,请及时查看",
+										//推送的目标人
+										Long.parseLong(taskParallel.getTaskUser()),
+										//默认未读
+										0
+								));
+							}
+						}
+						if(messageList.size() > 0){
+							this.messageWarningClient.savePushUserMessageWarning(messageList);
+						}
+					}
+				}catch (Exception e){
+					e.printStackTrace();
+				}
 			}
 		}
 		return R.data(true);

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

@@ -368,7 +368,8 @@ public class EVisaTaskCheckController {
             List<Long> pKeyList = privateTreeList.stream().map(WbsTreePrivate::getPKeyId).distinct().collect(Collectors.toList());
             jsonList = this.eVisaConfigClient.queryEVisaConfigAllByTableIds(JSONArray.parseArray(JSONObject.toJSONString(pKeyList), String.class));
         } else {
-            jsonList = null;
+            //也许当前参数就是表格,直查
+            jsonList = this.eVisaConfigClient.queryEVisaConfigAllByTableIds(primaryKeyIds);
         }
 
         return jsonList;

+ 51 - 4
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -602,6 +602,9 @@ public class InformationWriteQueryController extends BladeController {
 						projects.forEach(project -> projectMap.put(project.getId().toString(), project));
 						contracts.forEach(contract -> contractMap.put(contract.getId().toString(), contract));
 
+						//获取当前任务的环节审批人
+						List<TaskParallel> linkList = this.taskClient.queryApprovalUserByTaskId(task.getProcessInstanceId());
+
 						for(InformationQuery query : queries){
 							if(StringUtils.isNotEmpty(query.getFileUserIdAndName())){
 								String[] userArray = query.getFileUserIdAndName().split(",");
@@ -638,8 +641,34 @@ public class InformationWriteQueryController extends BladeController {
 									}
 								}
 							}
+
+							if(linkList != null && linkList.size() > 0){
+								ProjectInfo projectInfo = this.projectClient.queryProjectList(Func.toStrList(task.getProjectId())).get(0);
+								ContractInfo contractInfo = this.contractClient.getContractById(Long.parseLong(task.getContractId()));
+
+								List<MessageWarningVO> messageList = new ArrayList<>();
+								for(TaskParallel taskParallel : linkList){
+									messageList.add(new MessageWarningVO(
+											Long.parseLong(task.getProjectId()),
+											Long.parseLong(task.getContractId()),
+											//废除通知
+											3,
+											//内容
+											(StringUtils.isNotEmpty(projectInfo.getProjectAlias()) ? projectInfo.getProjectAlias() : projectInfo.getProjectName()) + contractInfo.getContractName() + "的用户" + AuthUtil.getNickName() + "废除了【" + query.getName() + "】流程,请及时查看",
+											//推送的目标人
+											Long.parseLong(taskParallel.getTaskUser()),
+											//默认未读
+											0
+									));
+								}
+								if(messageList.size() > 0){
+									this.messageWarningClient.savePushUserMessageWarning(messageList);
+								}
+							}
+
 						}
 					}
+
 					try{
 						JSONObject json = new JSONObject();
 						json.put("operationObjIds", Func.toStrList(task.getFormDataId()));
@@ -938,7 +967,7 @@ public class InformationWriteQueryController extends BladeController {
 				});
 			}
 		}
-		return this.saveOrCopyNodeTree(saveList, saveLedger, 32);
+		return this.saveOrCopyNodeTree(saveList, saveLedger, 32, needCopyNode);
 	}
 
 	/**
@@ -1395,7 +1424,7 @@ public class InformationWriteQueryController extends BladeController {
 			});
 		}
 
-		return this.saveOrCopyNodeTree(saveList, saveLedger, 2);
+		return this.saveOrCopyNodeTree(saveList, saveLedger, 2, treeContract);
 	}
 
 	private List<WbsTreePrivate> unifiedCode(List<AddContractTreeNodeVO.Node> allSelectedNodeList, WbsTreeContract treeContract){
@@ -1410,7 +1439,7 @@ public class InformationWriteQueryController extends BladeController {
 	}
 
 	@NotNull
-	private R<Boolean> saveOrCopyNodeTree(List<WbsTreeContract> saveList, List<ConstructionLedger> saveLedger, Integer operationType) {
+	private R<Boolean> saveOrCopyNodeTree(List<WbsTreeContract> saveList, List<ConstructionLedger> saveLedger, Integer operationType, WbsTreeContract currentNode) {
 		if(saveList.size() > 0){
 			//保存施工日志
 			if(saveLedger.size() > 0){
@@ -1418,9 +1447,19 @@ public class InformationWriteQueryController extends BladeController {
 			}
 
 			try{
+				//获取当前节点的所有父节点
+				List<WbsTreeContract> result = new ArrayList<>();
+				result.add(currentNode);
+				this.queryParentNode(currentNode, result);
+				StringBuilder pathName = new StringBuilder();
+				for(int i = 1, l = result.size(); i <= l; i ++){
+					WbsTreeContract node = result.get(result.size() - i);
+					pathName.append("-").append(StringUtils.isNotEmpty(node.getFullName()) ? node.getFullName() : node.getNodeName());
+				}
+
 				JSONObject json = new JSONObject();
 				json.put("operationObjIds", JSONArray.parseArray(JSONObject.toJSONString(saveList.stream().map(WbsTreeContract::getPKeyId).distinct().collect(Collectors.toList())), String.class));
-				json.put("operationObjName", saveList.stream().map(wbs -> StringUtils.isNotEmpty(wbs.getFullName()) ? wbs.getFullName() : wbs.getNodeName()).collect(Collectors.joining()));
+				json.put("operationObjName", pathName.substring(1));
 				//保存操作记录
 				this.operationLogClient.saveUserOperationLog(operationType, "资料管理", "工序资料", json);
 
@@ -1434,6 +1473,14 @@ public class InformationWriteQueryController extends BladeController {
 		return R.data(false);
 	}
 
+	private void queryParentNode(WbsTreeContract currentNode, List<WbsTreeContract> result){
+		WbsTreeContract parentNode = this.wbsTreeContractClient.getContractWbsTreeByContractIdAndId(currentNode.getParentId(), Long.parseLong(currentNode.getContractId()));
+		if(parentNode != null){
+			result.add(parentNode);
+			this.queryParentNode(parentNode, result);
+		}
+	}
+
 	/**
 	 * 处理半选集合
 	 */

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

@@ -2,7 +2,6 @@ package org.springblade.business.controller;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -33,6 +32,7 @@ import org.springblade.core.tool.jackson.JsonUtil;
 import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.flow.core.entity.BladeFlow;
 import org.springblade.flow.core.feign.NewFlowClient;
+import org.springblade.manager.feign.ContractClient;
 import org.springblade.resource.feign.NewISmsClient;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.feign.IDictBizClient;
@@ -506,7 +506,10 @@ public class TaskController extends BladeController {
 			taskApprovalVOS.add(taskApprovalVO);
 
 			//存在批次,当前审批的追加进队列
-			this.taskBatchService.save(new TaskBatch(taskApprovalVO.getParallelProcessInstanceId(), JSONObject.toJSONString(taskApprovalVOS)));
+			TaskBatch taskBatch = new TaskBatch(taskApprovalVO.getParallelProcessInstanceId(), JSONObject.toJSONString(taskApprovalVOS));
+			taskBatch.setCreateUser(AuthUtil.getUserId());
+			taskBatch.setCreateTime(new Date());
+			this.taskBatchService.save(taskBatch);
 
 			return R.data(true, "当前等待电签的批次较多,请等待几分钟后刷新页面查看........");
 		} else {

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

@@ -141,7 +141,7 @@ public class ContractLogClientImpl implements ContractLogClient {
             contractLog.setCreateUser(AuthUtil.getUserId());
             contractLog.setCreateUserName(AuthUtil.getNickName());
             contractLog.setStatus(0);
-            contractLog.setFileName(saveContractLogVO.getRecordTime() + " " + node.getNodeName());
+            contractLog.setFileName(saveContractLogVO.getRecordTime() + " " + node.getNodeName() + " " + AuthUtil.getNickName());
 
             if(saveContractLogVO.getCorrelationIds() != null && saveContractLogVO.getCorrelationIds().size() > 0){
                 List<JSONObject> list = saveContractLogVO.getCorrelationIds();

+ 15 - 1
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/InformationQueryClientImpl.java

@@ -1,9 +1,12 @@
 package org.springblade.business.feignClient;
 
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import org.springblade.business.entity.InformationQuery;
+import org.springblade.business.entity.InformationQueryFile;
 import org.springblade.business.feign.InformationQueryClient;
+import org.springblade.business.service.IInformationQueryFileService;
 import org.springblade.business.service.IInformationQueryService;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -15,10 +18,21 @@ public class InformationQueryClientImpl implements InformationQueryClient {
 
     private final IInformationQueryService iInformationQueryService;
 
+    private final IInformationQueryFileService informationQueryFileService;
+
     @Override
     public JSONObject queryFirstBusinessDataByFirstId(String firstId) {
         InformationQuery query = this.iInformationQueryService.getById(firstId);
-        return query != null ? JSONObject.parseObject(JSONObject.toJSONString(query), JSONObject.class) : null;
+        if(query != null){
+            JSONObject json = JSONObject.parseObject(JSONObject.toJSONString(query), JSONObject.class);
+            InformationQueryFile queryFile = this.informationQueryFileService.getOne(Wrappers.<InformationQueryFile>lambdaQuery().eq(InformationQueryFile::getQueryId, query.getId()));
+            if(queryFile != null){
+                json.put("uploadFile", queryFile.getPdfUrl());
+            }
+            return json;
+        }
+
+        return null;
     }
 
     @Override

+ 5 - 0
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/TaskClientImpl.java

@@ -83,6 +83,11 @@ public class TaskClientImpl implements TaskClient {
         return this.taskService.queryApprovalUser(formDataIds);
     }
 
+    @Override
+    public List<TaskParallel> queryApprovalUserByTaskId(String taskId) {
+        return this.taskParallelService.list(Wrappers.<TaskParallel>lambdaQuery().eq(TaskParallel::getProcessInstanceId, taskId));
+    }
+
     @Override
     public TaskApprovalVO queryBusinessDataTask(TaskApprovalVO taskApprovalVO) {
         return this.taskService.queryBusinessDataTask(taskApprovalVO);

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

@@ -295,7 +295,10 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                     .set(TaskParallel::getEVisaContent, "当前等待电签的批次较多,请等待几分钟后刷新页面查看........")
                     .in(TaskParallel::getParallelProcessInstanceId, taskIds));
             //保存批次
-            this.taskBatchService.save(new TaskBatch(null, JSONObject.toJSONString(taskApprovalVOS)));
+            TaskBatch taskBatch = new TaskBatch(null, JSONObject.toJSONString(taskApprovalVOS));
+            taskBatch.setCreateUser(AuthUtil.getUserId());
+            taskBatch.setCreateTime(new Date());
+            this.taskBatchService.save(taskBatch);
         } else {
             //修改电签状态
             this.taskParallelService.update(Wrappers.<TaskParallel>lambdaUpdate()
@@ -304,6 +307,8 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
 
             //保存批次
             TaskBatch taskBatch = new TaskBatch(null, JSONObject.toJSONString(taskApprovalVOS));
+            taskBatch.setCreateUser(AuthUtil.getUserId());
+            taskBatch.setCreateTime(new Date());
             this.taskBatchService.save(taskBatch);
 
             //执行电签,结束后检查在执行是否有新的等待批次

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

@@ -1435,9 +1435,15 @@ public class ExcelTabController extends BladeController {
             @ApiImplicitParam(name = "contractId", value = "合同段Id", required = true)
     })
     public R getpdfs(String nodeId, String classify, String contractId, String projectId) {
-        String sql = "select  pdf_url from u_information_query  where classify='" + classify + "' and  wbs_id='" + nodeId + "' and contract_id ='" + contractId + "' ";
+        String sql = "select pdf_url, e_visa_pdf_url from u_information_query  where classify='" + classify + "' and  wbs_id='" + nodeId + "' and contract_id ='" + contractId + "' ";
         Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(sql);
-        return R.data(stringObjectMap.get("pdf_url"));
+        Object pdfUrl = stringObjectMap.get("pdf_url");
+        if(stringObjectMap.get("e_visa_pdf_url") != null){
+            //优先使用电签的PDF
+            pdfUrl = stringObjectMap.get("e_visa_pdf_url");
+        }
+
+        return R.data(pdfUrl);
     }
 
     /**
@@ -2048,206 +2054,6 @@ public class ExcelTabController extends BladeController {
         return R.data(300, null, "未找到对应的业务数据");
     }
 
-    /**
-     * 预览首件PDF
-     */
-    @GetMapping("/get-first-pdf-info")
-    @ApiOperationSupport(order = 28)
-    @ApiOperation(value = "获取首件填报记录")
-    @ApiImplicitParam(name = "firstId", value = "首件列表ID")
-    public R<String> getFirstPdfInfo(String firstId) {
-        if (StringUtils.isNotEmpty(firstId)) {
-            //PDF路径集合
-            List<String> pdfUrls = new ArrayList<>();
-
-            //获取配置的路径
-            String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-            //获取数据
-            JSONObject firstJson = this.informationQueryClient.queryFirstBusinessDataByFirstId(firstId);
-            if (firstJson != null) {
-                if (StringUtils.isNotEmpty(firstJson.getString("eVisaPdfUrl")) || StringUtils.isNotEmpty(firstJson.getString("pdfUrl"))) {
-                    pdfUrls.add(StringUtils.isNotEmpty(firstJson.getString("eVisaPdfUrl")) ? firstJson.getString("eVisaPdfUrl") : firstJson.getString("pdfUrl"));
-                } else {
-                    //没有生成拼接的记录,生成
-                    //获取html
-                    WbsTreeContract tableNode = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, firstJson.getString("tableId")));
-
-                    if (tableNode == null) {
-                        return R.fail("该数据下无此节点!");
-                    }
-
-                    if (StringUtils.isEmpty(tableNode.getHtmlUrl())) {
-                        return R.fail("请关联清表!");
-                    }
-
-                    // 获取清表信息
-                    ExcelTab excelTab = excelTabService.getById(tableNode.getExcelId());
-                    if (excelTab == null) {
-                        return R.fail("失败");
-                    }
-
-                    List<Map<String, Object>> businessDataMapList = this.getFirstBusinessData(firstId).getData();
-
-                    try {
-                        //处理数据
-                        for (Map<String, Object> dataMap : businessDataMapList) {
-                            // 获取excel流 和 html流
-                            Workbook wb = new Workbook();
-                            wb.loadFromMHtml(CommonUtil.getOSSInputStream(excelTab.getFileUrl()));
-                            //获取工作表
-                            Worksheet sheet = wb.getWorksheets().get(0);
-
-                            // 数据不为空 &&
-                            if (StringUtils.isNotEmpty(tableNode.getHtmlUrl())) {
-                                File htmlFile = ResourceUtil.getFile(tableNode.getHtmlUrl());
-                                if (htmlFile.exists()) {
-                                    String htmlString = IoUtil.readToString(new FileInputStream(htmlFile));
-                                    Document doc = Jsoup.parse(htmlString);
-                                    Element table = doc.select("table").first();
-                                    Elements trs = table.select("tr");
-
-                                    if (ObjectUtil.isNotEmpty(dataMap)) {
-                                        for (String val : dataMap.keySet()) {
-                                            if (val.indexOf("__") >= 0) {
-                                                String DataVal[] = val.split("__");
-                                                String[] xy = DataVal[1].split("_");
-                                                Element data = trs.get(Integer.parseInt(xy[0])).select("td").get(Integer.parseInt(xy[1]));
-
-                                                if (data.html().indexOf("x1") >= 0 && data.html().indexOf("y1") >= 0) {
-                                                    int x1, y1;
-
-                                                    if (data.html().indexOf("el-tooltip") >= 0) {
-                                                        x1 = Integer.parseInt(data.children().get(0).children().get(0).attr("x1"));
-                                                        y1 = Integer.parseInt(data.children().get(0).children().get(0).attr("y1"));
-                                                    } else {
-                                                        x1 = Integer.parseInt(data.children().get(0).attr("x1"));
-                                                        y1 = Integer.parseInt(data.children().get(0).attr("y1"));
-                                                    }
-                                                    if (x1 == 0) {
-                                                        x1 = 1;
-                                                    }
-                                                    String myData = dataMap.get(val) + "";
-                                                    if (myData.indexOf("T") >= 0 && myData.indexOf("-") >= 0) {
-                                                        if (myData.indexOf(",") >= 0 && myData.indexOf("]") >= 0) {
-                                                            myData = myData.replace("[", "").replace("]", "");
-                                                            String[] dataVal = myData.split(",");
-                                                            String Start_dataStr[] = dataVal[0].split("T")[0].split("-");
-                                                            String StartDate = StringUtil.format("{}年{}月{}日", new Object[]{Start_dataStr[0], Start_dataStr[1], Integer.parseInt(Start_dataStr[2]) + 1});
-
-                                                            String end_dataStr[] = dataVal[1].split("T")[0].split("-");
-                                                            String endDate = StringUtil.format("{}年{}月{}日", new Object[]{end_dataStr[0], end_dataStr[1], Integer.parseInt(end_dataStr[2]) + 1});
-
-                                                            if (StartDate.equals(endDate)) {
-                                                                myData = StartDate;
-                                                            } else {
-                                                                myData = StartDate + "-" + endDate;
-                                                            }
-                                                        } else {
-                                                            String dataStr[] = myData.split("T")[0].split("-");
-                                                            myData = StringUtil.format("{}年{}月{}日", new Object[]{dataStr[0], dataStr[1], Integer.parseInt(dataStr[2]) + 1});
-                                                        }
-                                                    }
-
-                                                    if (myData.indexOf("https") >= 0 && myData.indexOf("aliyuncs") >= 0) {
-                                                        Element element = trs.get(y1).select("td").get(x1);
-                                                        String styles[] = element.attr("style").split(";");
-                                                        int Height = 0;
-                                                        for (String sty : styles) {
-                                                            if (sty.indexOf("height:") >= 0) {
-                                                                Height = Integer.parseInt(sty.replace("height:", "").replace("px", ""));
-                                                            }
-                                                        }
-
-                                                        BufferedImage image = ImageIO.read(CommonUtil.getOSSInputStream(myData));
-                                                        ExcelPicture pic = sheet.getPictures().add(y1, x1, image);
-                                                        pic.setHeight(Height);
-                                                        sheet.getCellRange(y1, x1).getStyle().setShrinkToFit(true);
-
-                                                    } else {
-                                                        final CellRange cellRange = sheet.getCellRange(y1, x1);
-                                                        cellRange.setText(myData);
-                                                    }
-                                                }
-                                            }
-                                        }
-                                    }
-
-                                    // 组装电签设置
-                                    QueryWrapper<TextdictInfo> queryWrapper = new QueryWrapper<>();
-                                    queryWrapper.eq("type", 2);
-                                    queryWrapper.eq("tab_id", tableNode.getPKeyId());
-
-                                    final List<TextdictInfo> textdictInfos = textdictInfoService.getBaseMapper().selectList(queryWrapper);
-                                    if (textdictInfos != null && !textdictInfos.isEmpty()) {
-                                        textdictInfos.forEach(e -> {
-                                            String key = e.getColKey();
-                                            String keys[] = key.split("__");
-                                            String[] trtd = keys[1].split("_");
-                                            Element data = trs.get(Integer.parseInt(trtd[0])).select("td").get(Integer.parseInt(trtd[1]));
-                                            int x1 = Integer.parseInt(data.children().get(0).attr("x1"));
-                                            if (x1 == 0) {
-                                                x1 = 1;
-                                            }
-                                            int y1 = Integer.parseInt(data.children().get(0).attr("y1"));
-
-                                            final CellRange cellRange = sheet.getCellRange(y1, x1);
-
-                                            cellRange.setText(e.getId() + "");
-                                            cellRange.getCellStyle().getFont().setColor(Color.white);
-
-                                        });
-                                    }
-                                }
-                            }
-
-                            Long fileName = SnowFlakeUtil.getId();
-                            String onePdfPath = file_path + "/pdf//" + fileName + ".pdf";
-
-                            sheet.saveToPdf(onePdfPath);
-
-                            BladeFile bladeFile = this.newIOSSClient.uploadFile(fileName + ".pdf", onePdfPath);
-
-                            pdfUrls.add(bladeFile.getLink());
-
-                            wb.dispose();
-                        }
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
-                }
-
-                if (pdfUrls.size() > 0) {
-                    try {
-                        //关联的数据
-                        if (StringUtils.isNotEmpty(firstJson.getString("linkMergePdfUrl"))) {
-                            pdfUrls.add(firstJson.getString("linkMergePdfUrl"));
-                        }
-                        //总结报告,暂时无
-
-                        //上传
-                        String mergePdfPath = file_path + "/pdf//" + firstId + ".pdf";
-                        File oldMergePdf = ResourceUtil.getFile(mergePdfPath);
-                        if (oldMergePdf.exists()) {
-                            oldMergePdf.delete();
-                        }
-                        //合并
-                        FileUtils.mergePdfPublicMethods(pdfUrls, mergePdfPath);
-                        //上传
-                        BladeFile mergeFile = this.newIOSSClient.uploadFile(firstId + '-' + new Date().getTime() + ".pdf", mergePdfPath);
-
-                        //返回
-                        return R.data(mergeFile.getLink());
-
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
-                }
-            }
-        }
-
-        return R.data(300, null, "未找到数据");
-    }
-
     @PostMapping("/save_log_first_buss_data")
     @ApiOperationSupport(order = 29)
     @ApiOperation(value = "填报页面数据保存", notes = "填报页面数据保存")

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

@@ -290,7 +290,7 @@ public class FirstController extends BladeController {
                                     // 组装电签设置
                                     QueryWrapper<TextdictInfo> queryWrapper = new QueryWrapper<>();
                                     queryWrapper.eq("type", 2);
-                                    queryWrapper.eq("tab_id", tableNode.getPKeyId());
+                                    queryWrapper.eq("tab_id", StringUtils.isNotEmpty(tableNode.getIsTypePrivatePid().toString()) ? tableNode.getIsTypePrivatePid() : tableNode.getPKeyId());
 
                                     final List<TextdictInfo> textdictInfos = this.textdictInfoService.getBaseMapper().selectList(queryWrapper);
                                     if (textdictInfos != null && !textdictInfos.isEmpty()) {
@@ -341,7 +341,10 @@ public class FirstController extends BladeController {
                         if(StringUtils.isNotEmpty(firstJson.getString("linkMergePdfUrl"))){
                             pdfUrls.add(firstJson.getString("linkMergePdfUrl"));
                         }
-                        //总结报告,暂时无
+                        //总结报告
+                        if(StringUtils.isNotEmpty(firstJson.getString("uploadFile"))){
+                            pdfUrls.add(firstJson.getString("uploadFile"));
+                        }
 
                         //上传
                         String mergePdfPath = file_path + "/pdf//" + firstId + ".pdf";

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

@@ -20,7 +20,6 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.mixsmart.utils.StringUtils;
-import feign.Contract;
 import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;

+ 73 - 39
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java

@@ -36,6 +36,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.validation.Valid;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
 
@@ -67,26 +68,62 @@ public class WbsTreePrivateController extends BladeController {
             //需要保存的集合
             List<WbsTreePrivate> saveTreePrivateList = new ArrayList<>();
 
+            //记录需要修改的对象
+            List<WbsTreePrivate> updateList = new ArrayList<>();
+
             //模板节点
             List<String> wbsTreeIds = new ArrayList<>(Arrays.asList(vo.getWbsTreeIds().split(",")));
 
-            if (oldDataList != null && oldDataList.size() > 0) {
-                //只新增节点
-                //检查哪些节点是重复的,删除
-                Iterator<String> iterator = wbsTreeIds.iterator();
-                while (iterator.hasNext()) {
-                    String id = iterator.next();
-                    for (WbsTreePrivate oldPrivate : oldDataList) {
-                        if (oldPrivate.getId().toString().equals(id)) {
-                            iterator.remove();
-                            break;
+            if (wbsTreeIds.size() > 0) {
+                //获取模板节点
+                List<WbsTree> wbsTreeList = this.wbsTreeService.list(Wrappers.<WbsTree>lambdaQuery().in(WbsTree::getId, wbsTreeIds));
+                //获取这些模板下的表格元素
+                List<WbsTree> wbsTreeTableList = this.wbsTreeService.list(Wrappers.<WbsTree>lambdaQuery().in(WbsTree::getParentId, wbsTreeIds).eq(WbsTree::getType, 2));
+                if (wbsTreeTableList != null && wbsTreeTableList.size() > 0) {
+                    wbsTreeList.addAll(wbsTreeTableList);
+                }
+
+                if (oldDataList != null && oldDataList.size() > 0) {
+                    //检查哪些节点是重复的或修改的,删除
+                    Iterator<WbsTree> iterator = wbsTreeList.iterator();
+                    while (iterator.hasNext()) {
+                        WbsTree next = iterator.next();
+                        for (WbsTreePrivate oldPrivate : oldDataList) {
+                            if (oldPrivate.getId().equals(next.getId())) {
+                                if (
+                                        (StringUtils.isNotEmpty(next.getFullName(), oldPrivate.getFullName()) && !next.getFullName().equals(oldPrivate.getFullName()))
+                                                || (StringUtils.isNotEmpty(next.getNodeName(), oldPrivate.getNodeName()) && !next.getNodeName().equals(oldPrivate.getNodeName()))
+                                                || (StringUtils.isNotEmpty(next.getMajorDataType(), oldPrivate.getMajorDataType()) && !next.getMajorDataType().equals(oldPrivate.getMajorDataType()))
+                                                || (StringUtils.isNotEmpty(next.getNodeType(), oldPrivate.getNodeType()) && !next.getNodeType().equals(oldPrivate.getNodeType()))
+                                ) {
+                                    //需要修改
+                                    oldPrivate.setFullName(next.getFullName());
+                                    oldPrivate.setNodeName(next.getNodeName());
+                                    oldPrivate.setNodeType(next.getNodeType());
+                                    oldPrivate.setMajorDataType(next.getMajorDataType());
+
+                                    updateList.add(oldPrivate);
+                                }
+                                iterator.remove();
+                                break;
+                            }
+
                         }
                     }
                 }
-            }
 
-            //记录需要修改的对象(只改名称)
-            List<WbsTreePrivate> updateList = new ArrayList<>();
+                //复制数据
+                for (WbsTree tree : wbsTreeList) {
+                    WbsTreePrivate treePrivate = new WbsTreePrivate();
+                    BeanUtils.copyProperties(tree, treePrivate);
+                    treePrivate.setWbsType("4");
+                    treePrivate.setProjectId(vo.getProjectId());
+                    treePrivate.setPKeyId(SnowFlakeUtil.getId());
+                    treePrivate.setCreateTime(now);
+
+                    saveTreePrivateList.add(treePrivate);
+                }
+            }
 
             //检查一下原本节点的表是否有新增的(只处理新增)
             if (oldDataList != null && oldDataList.size() > 0) {
@@ -109,12 +146,12 @@ public class WbsTreePrivateController extends BladeController {
                                     if (privateNode.getId().equals(tree.getId())) {
                                         if (
                                                 (StringUtils.isNotEmpty(privateNode.getFullName(), tree.getFullName()) && !privateNode.getFullName().equals(tree.getFullName()))
-                                                        ||
-                                                        (StringUtils.isNotEmpty(privateNode.getNodeName(), tree.getNodeName()) && !privateNode.getNodeName().equals(tree.getNodeName()))
+                                                || (StringUtils.isNotEmpty(privateNode.getNodeName(), tree.getNodeName()) && !privateNode.getNodeName().equals(tree.getNodeName()))
                                         ) {
                                             //名字不同,需要修改
                                             privateNode.setFullName(tree.getFullName());
                                             privateNode.setNodeName(tree.getNodeName());
+
                                             updateList.add(privateNode);
                                         }
 
@@ -142,28 +179,6 @@ public class WbsTreePrivateController extends BladeController {
                 }
             }
 
-            if (wbsTreeIds.size() > 0) {
-                //获取模板节点
-                List<WbsTree> wbsTreeList = this.wbsTreeService.list(Wrappers.<WbsTree>lambdaQuery().in(WbsTree::getId, wbsTreeIds));
-                //获取这些模板下的表格元素
-                List<WbsTree> wbsTreeTableList = this.wbsTreeService.list(Wrappers.<WbsTree>lambdaQuery().in(WbsTree::getParentId, wbsTreeIds).eq(WbsTree::getType, 2));
-                if (wbsTreeTableList != null && wbsTreeTableList.size() > 0) {
-                    wbsTreeList.addAll(wbsTreeTableList);
-                }
-
-                //复制数据
-                for (WbsTree tree : wbsTreeList) {
-                    WbsTreePrivate treePrivate = new WbsTreePrivate();
-                    BeanUtils.copyProperties(tree, treePrivate);
-                    treePrivate.setWbsType("4");
-                    treePrivate.setProjectId(vo.getProjectId());
-                    treePrivate.setPKeyId(SnowFlakeUtil.getId());
-                    treePrivate.setCreateTime(now);
-
-                    saveTreePrivateList.add(treePrivate);
-                }
-            }
-
             if (saveTreePrivateList.size() > 0) {
                 //修改项目引用
                 this.projectInfoService.update(Wrappers.<ProjectInfo>lambdaUpdate().set(ProjectInfo::getReferenceLogWbsTemplateId, vo.getWbsId()).eq(ProjectInfo::getId, vo.getProjectId()));
@@ -173,13 +188,32 @@ public class WbsTreePrivateController extends BladeController {
             }
             if (updateList.size() > 0) {
                 for (WbsTreePrivate treePrivate : updateList) {
-                    this.wbsTreePrivateService.update(Wrappers.<WbsTreePrivate>lambdaUpdate().set(WbsTreePrivate::getNodeName, treePrivate.getNodeName()).set(WbsTreePrivate::getFullName, treePrivate.getFullName()).eq(WbsTreePrivate::getPKeyId, treePrivate.getPKeyId()));
+                    this.wbsTreePrivateService.update(Wrappers.<WbsTreePrivate>lambdaUpdate()
+                            .set(WbsTreePrivate::getNodeName, treePrivate.getNodeName())
+                            .set(WbsTreePrivate::getFullName, treePrivate.getFullName())
+                            .set(WbsTreePrivate::getNodeType, treePrivate.getNodeType())
+                            .set(WbsTreePrivate::getMajorDataType, treePrivate.getMajorDataType())
+                            .eq(WbsTreePrivate::getPKeyId, treePrivate.getPKeyId()));
                 }
             }
 
             return R.data(200, true, "保存成功");
+        } else {
+            //没有数据,直接清空
+            //获取当前项目已经划分的日志树
+            List<WbsTreePrivate> oldDataList = this.wbsTreePrivateService.list(Wrappers.<WbsTreePrivate>lambdaQuery()
+                    .eq(WbsTreePrivate::getProjectId, vo.getProjectId())
+                    .eq(WbsTreePrivate::getWbsType, "4")
+                    .eq(WbsTreePrivate::getWbsId, vo.getWbsId()));
+
+            if(oldDataList != null && oldDataList.size() > 0){
+                //旧数据唯一键
+                List<Long> primaryKeyIds = oldDataList.stream().map(WbsTreePrivate::getPKeyId).distinct().collect(Collectors.toList());
+                //删除记录
+                this.wbsTreePrivateService.update(Wrappers.<WbsTreePrivate>lambdaUpdate().set(WbsTreePrivate::getIsDeleted, "1").in(WbsTreePrivate::getPKeyId, primaryKeyIds));
+            }
         }
-        return R.data(300, true, "保存失败,未选择任何数据");
+        return R.data(200, true, "未选择任何数据,默认执行清空操作");
     }
 
     /**

+ 89 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/excel/WbsExcelUtil.java

@@ -7,17 +7,103 @@ import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import org.springblade.core.tool.utils.StringUtil;
-import org.springblade.manager.utils.DiffListUtil;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.SecureUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.vo.ImportWbsNodeVO;
+import org.springblade.manager.vo.WbsTreeContractVO;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.*;
-import java.lang.reflect.Array;
 import java.util.*;
 import java.util.stream.Collectors;
 
+
 public class WbsExcelUtil {
 
+    /*public static void main(String[] args) throws IOException, ClassNotFoundException {
+        WbsExcelUtil excelUtil = new WbsExcelUtil();
+        //读取excel数据
+        ArrayList<Map<String, String>> result = excelUtil.readExcelToObj("C:\\Users\\泓创开发\\Desktop\\excel节点模板\\隧道工程.xls");
+        //result.forEach(System.out::println);
+
+        //构造
+        List<ImportWbsNodeVO> list = new ArrayList<>();
+        int rowNumber = 1;
+        for (Map<String, String> row : result) { //行
+
+            List<String> parentCode = new ArrayList<>();
+            Map<String, ImportWbsNodeVO> mapCol = new HashMap<>();
+
+            for (Map.Entry<String, String> col : row.entrySet()) { //列
+                ImportWbsNodeVO wbsNodeVO = new ImportWbsNodeVO();
+                if (col.getValue().equals("")) {
+                    continue;
+                }
+
+                if (mapCol.size() > 0) {
+                    wbsNodeVO.setRow(rowNumber);
+                    wbsNodeVO.setId(SnowFlakeUtil.getId());
+                    wbsNodeVO.setNodeName(col.getValue());
+                    wbsNodeVO.setNodeType(col.getKey());
+                    wbsNodeVO.setAncestors(null);
+                    wbsNodeVO.setCode(rowNumber + "-" + col.getKey());
+
+                    parentCode.add(wbsNodeVO.getCode());
+                    Iterator<String> iterator = parentCode.iterator();
+                    while (iterator.hasNext()) {
+                        String next = iterator.next();
+                        if (!next.equals(wbsNodeVO.getCode())) {
+                            wbsNodeVO.setParentCode(next);
+                            if (wbsNodeVO.getParentCode() != null) {
+                                iterator.remove();
+                            }
+                        }
+                    }
+
+                    //获取上级obj
+                    Iterator<Map.Entry<String, ImportWbsNodeVO>> iteratorMap = mapCol.entrySet().iterator();
+                    while (iteratorMap.hasNext()) {
+                        Map.Entry<String, ImportWbsNodeVO> importWbsNodeVOEntry = iteratorMap.next();
+                        if (wbsNodeVO.getParentCode().equals(importWbsNodeVOEntry.getValue().getCode())) {
+                            wbsNodeVO.setParentId(importWbsNodeVOEntry.getValue().getId());
+                        }
+                    }
+
+                    mapCol.put(wbsNodeVO.getNodeType(), wbsNodeVO);
+
+                } else {
+                    wbsNodeVO.setRow(rowNumber);
+                    wbsNodeVO.setId(SnowFlakeUtil.getId());
+                    wbsNodeVO.setNodeName(col.getValue());
+                    wbsNodeVO.setNodeType(col.getKey());
+                    wbsNodeVO.setParentId(0L);
+                    wbsNodeVO.setAncestors(null);
+                    wbsNodeVO.setCode(rowNumber + "-" + col.getKey());
+
+                    parentCode.add(wbsNodeVO.getCode());
+                    Iterator<String> iterator = parentCode.iterator();
+                    while (iterator.hasNext()) {
+                        String next = iterator.next();
+                        if (!next.equals(wbsNodeVO.getCode())) {
+                            wbsNodeVO.setParentCode(next);
+                            if (wbsNodeVO.getParentCode() != null) {
+                                iterator.remove();
+                            }
+                        }
+                    }
+                    mapCol.put(wbsNodeVO.getNodeType(), wbsNodeVO);
+                }
+                list.add(wbsNodeVO);
+            }
+            rowNumber++;
+        }
+
+        list.forEach(System.out::println);
+
+    }*/
+
     /**
      * 读取excel数据
      *

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

@@ -3,14 +3,12 @@ package org.springblade.manager.feign;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.mixsmart.utils.StringUtils;
 import lombok.AllArgsConstructor;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
-import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.ContractRelationJlyz;
 import org.springblade.manager.entity.WbsTreeContract;
@@ -22,6 +20,7 @@ import org.springblade.manager.vo.WbsTreeContractTreeVOS;
 import org.springblade.system.cache.ParamCache;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.feign.IDictBizClient;
+import org.springblade.system.feign.ISysClient;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.*;
@@ -36,6 +35,8 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
 
     private final IDictBizClient dictBizClient;
 
+    private final ISysClient sysClient;
+
     @Override
     public List<WbsTreeContract> queryContractTreeNodeByPKIds(List<Long> PKIds) {
         return this.wbsTreeContractService.list(Wrappers.<WbsTreeContract>lambdaQuery().in(WbsTreeContract::getPKeyId, PKIds));
@@ -197,9 +198,11 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
             List<WbsTreeContractTreeVOS> vosResult = new ArrayList<>();
 
             //获取施工配置,如果未找到配置则使用默认判断
-            String sgTheLog = StringUtils.isNotEmpty(ParamCache.getValue(CommonConstant.SG_THE_LOG)) ? ParamCache.getValue(CommonConstant.SG_THE_LOG) : "7,9,13";
+            String sgLogConfig = this.sysClient.getParamValue(CommonConstant.SG_THE_LOG).getData();
+            String sgTheLog = StringUtils.isNotEmpty(sgLogConfig) ? sgLogConfig : "7,9,13";
             //获取监理配置,如果未找到配置则使用默认判断
-            String jlTheLOg = StringUtils.isNotEmpty(ParamCache.getValue(CommonConstant.JL_THE_LOG)) ? ParamCache.getValue(CommonConstant.JL_THE_LOG) : "8,10,11,12";
+            String jlLogConfig = this.sysClient.getParamValue(CommonConstant.JL_THE_LOG).getData();
+            String jlTheLOg = StringUtils.isNotEmpty(jlLogConfig) ? jlLogConfig : "8,10,11,12";
 
             result.forEach(node -> {
                if(new Integer("2").equals(contract.getContractType()) && Arrays.asList(jlTheLOg.split(",")).contains(node.getNodeType().toString())){

+ 0 - 9
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java

@@ -123,19 +123,12 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
 
     @Override
     public List<WbsTreeContractVO> tree(String wbsId, String projectId, String contractId) {
-
-        //方式1:数据量过大时格式异常
-        //return ForestNodeMerger.merge(baseMapper.tree(wbsId, projectId, contractId, null, null));
-
-        //方式2
         List<WbsTreeContractVO> wbsTreeContractVOS = baseMapper.tree2(wbsId, projectId, contractId, null, null);
         return buildWbsTreeByStream(wbsTreeContractVOS);
     }
 
     public List<WbsTreeContractVO> buildWbsTreeByStream(List<WbsTreeContractVO> wbsTreeVO2s) {
-        //根节点
         List<WbsTreeContractVO> list = wbsTreeVO2s.stream().filter(f -> f.getParentId() == 0L).collect(Collectors.toList());
-        //子节点分组
         Map<Long, List<WbsTreeContractVO>> map = wbsTreeVO2s.stream().collect(Collectors.groupingBy(WbsTreeContractVO::getParentId));
         this.recursionFnTree(list, map);
         return list;
@@ -146,9 +139,7 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
             List<WbsTreeContractVO> childrenList = map.get(wbsTreeContractVO.getId());
             wbsTreeContractVO.setChildren(childrenList);
             if (childrenList != null && childrenList.size() > 0) {
-                //存在子级
                 wbsTreeContractVO.setHasChildren(true);
-                //递归查询
                 recursionFnTree(childrenList, map);
             }
         }

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

@@ -439,7 +439,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 WbsExcelUtil excelUtil = new WbsExcelUtil();
                 ArrayList<Map<String, String>> result = excelUtil.readExcelToObjContract(canonicalPath);
                 //匹配对应工程类别修改对应合同段节点名称
-                return this.importSubmitWbsContractNodes(result, primaryKeyId, 1); //TODO 1=默认拼接
+                return this.importSubmitWbsContractNodes(result, primaryKeyId, isSplicingNumber);
             }
         } catch (Exception e) {
             e.printStackTrace();

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

@@ -2,6 +2,7 @@ package org.springblade.manager.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
@@ -12,7 +13,6 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.StringPool;
-import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.manager.dto.WbsTreePrivateDTO2;
 import org.springblade.manager.dto.WbsTreePrivateDTO3;
 import org.springblade.manager.entity.*;
@@ -22,6 +22,7 @@ import org.springblade.manager.service.IWbsTreePrivateService;
 import org.springblade.manager.vo.WbsNodeTabAndParamVO;
 import org.springblade.manager.vo.WbsNodeTableVO;
 import org.springblade.manager.vo.WbsTreePrivateVO;
+import org.springframework.context.annotation.Bean;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -149,7 +150,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     }
 
     @Override
-    public List<WbsTreePrivateVO> tabTypeLazyTree( Long parentId, String projectId) {
+    public List<WbsTreePrivateVO> tabTypeLazyTree(Long parentId, String projectId) {
         return ForestNodeMerger.merge(baseMapper.tabTypeLazyTree(parentId, projectId));
     }
 
@@ -473,42 +474,49 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                 break;
             }
             if (StringUtils.isNotEmpty(wbsId)) {
+                //获取当前参数表的所有业务数据
+                List<WbsParam> wbsParamListAll = wbsParamMapper.selectList(Wrappers.<WbsParam>query().lambda().eq(WbsParam::getType, 1));
 
                 List<WbsParam> paramListData = new ArrayList<>();
-
                 //获取公有树
                 List<WbsTree> treePublicNodeAll = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
                         .eq(WbsTree::getWbsId, wbsId)
                         .eq(WbsTree::getStatus, 1)
                         .eq(WbsTree::getType, 1)
                 );
+
                 if (treePublicNodeAll.size() > 0) {
                     //公有引用
                     for (WbsTreePrivate wbsTreePrivate : wbsTreePrivateAllNow) {
                         for (WbsTree wbsTree : treePublicNodeAll) {
                             if (wbsTree.getId().equals(wbsTreePrivate.getId())) {
                                 //获取公有节点参数
-                                List<WbsParam> paramList = wbsParamServiceImpl.findByNodeId(wbsTree.getId());
-                                for (WbsParam wbsParam : paramList) {
-                                    wbsParam.setWbsId(wbsTreePrivate.getPKeyId());
-                                    wbsParam.setId(SnowFlakeUtil.getId());
-                                    paramListData.add(wbsParam);
+                                List<WbsParam> wbsParamList = wbsParamListAll.stream().filter(f -> f.getWbsId().equals(wbsTree.getId())).collect(Collectors.toList());
+                                if (wbsParamList.size() > 0) {
+                                    for (WbsParam wbsParam : wbsParamList) {
+                                        WbsParam param = BeanUtil.copyProperties(wbsParam, WbsParam.class);
+                                        if (param != null) {
+                                            param.setWbsId(wbsTreePrivate.getPKeyId());
+                                            param.setId(SnowFlakeUtil.getId());
+                                            paramListData.add(param);
+                                        }
+                                    }
                                 }
                             }
                         }
                     }
 
                 } else {
-                    //私有引用 - 获取私有树
+                    //私有引用 - 获取原始引用私有树
                     WbsTreePrivate treePrivateRootNode = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda()
                             .eq(WbsTreePrivate::getPKeyId, wbsId)
                             .eq(WbsTreePrivate::getParentId, 0L)
                             .eq(WbsTreePrivate::getStatus, 1)
                             .eq(WbsTreePrivate::getType, 1)
                     );
-
                     List<WbsTreePrivate> treePrivateNodeAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
                             .eq(WbsTreePrivate::getWbsId, treePrivateRootNode.getWbsId())
+                            .eq(WbsTreePrivate::getProjectId, treePrivateRootNode.getProjectId())
                             .eq(WbsTreePrivate::getStatus, 1)
                             .eq(WbsTreePrivate::getType, 1)
                     );
@@ -517,11 +525,16 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                         for (WbsTreePrivate wbsTreePrivateYS : treePrivateNodeAll) {
                             if (wbsTreePrivateYS.getId().equals(wbsTreePrivate.getId())) {
                                 //获取公有节点参数
-                                List<WbsParam> paramList = wbsParamServiceImpl.findByNodeId(wbsTreePrivateYS.getPKeyId());
-                                for (WbsParam wbsParam : paramList) {
-                                    wbsParam.setWbsId(wbsTreePrivate.getPKeyId());
-                                    wbsParam.setId(SnowFlakeUtil.getId());
-                                    paramListData.add(wbsParam);
+                                List<WbsParam> wbsParamList = wbsParamListAll.stream().filter(f -> f.getWbsId().equals(wbsTreePrivateYS.getPKeyId())).collect(Collectors.toList());
+                                if (wbsParamList.size() > 0) {
+                                    for (WbsParam wbsParam : wbsParamList) {
+                                        WbsParam param = BeanUtil.copyProperties(wbsParam, WbsParam.class);
+                                        if (param != null) {
+                                            param.setWbsId(wbsTreePrivate.getPKeyId());
+                                            param.setId(SnowFlakeUtil.getId());
+                                            paramListData.add(param);
+                                        }
+                                    }
                                 }
                             }
                         }
@@ -532,16 +545,17 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                 Iterator<WbsParam> iterator = paramListData.iterator();
                 while (iterator.hasNext()) {
                     WbsParam next = iterator.next();
-                    WbsParam wbsParam = wbsParamMapper.selectOne(Wrappers.<WbsParam>query().lambda()
-                            .eq(WbsParam::getK, next.getK())
-                            .eq(WbsParam::getV, next.getV())
-                            .eq(WbsParam::getName, next.getName())
-                            .eq(WbsParam::getWbsId, next.getWbsId())
-                    );
-                    if (wbsParam != null) {
+                    List<WbsParam> collect = wbsParamListAll.stream().filter(f ->
+                            (StringUtils.isNotEmpty(f.getK()) && f.getK().equals(next.getK()))
+                                    && (StringUtils.isNotEmpty(f.getV()) && f.getV().equals(next.getV()))
+                                    && (StringUtils.isNotEmpty(f.getName()) && f.getName().equals(next.getName()))
+                                    && (ObjectUtils.isNotEmpty(f.getWbsId()) && f.getWbsId().equals(next.getWbsId())))
+                            .collect(Collectors.toList());
+                    if (collect.size() > 0) {
                         iterator.remove();
                     }
                 }
+
                 wbsParamServiceImpl.saveBatch(paramListData, 1000);
                 return true;
             }
@@ -567,29 +581,38 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                 WbsTree wbsTree = wbsTreeMapper.selectOne(Wrappers.<WbsTree>query().lambda()
                         .eq(WbsTree::getId, wbsTreePrivate.getId())
                 );
-                List<WbsTree> wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
-                        .eq(WbsTree::getWbsId, wbsTree.getWbsId())
-                        .eq(WbsTree::getType, 2)
-                        .eq(WbsTree::getStatus, 1)
-                        .like(WbsTree::getAncestors, wbsTree.getId())
-                );
+                List<WbsTree> wbsTreesPublicTables;
+                if (wbsTree.getAncestors().equals("0")) {
+                    //根节点
+                    wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
+                            .eq(WbsTree::getWbsId, wbsTree.getWbsId())
+                            .eq(WbsTree::getType, 2)
+                            .eq(WbsTree::getStatus, 1)
+                    );
+                } else {
+                    wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
+                            .eq(WbsTree::getWbsId, wbsTree.getWbsId())
+                            .eq(WbsTree::getType, 2)
+                            .eq(WbsTree::getStatus, 1)
+                            .like(WbsTree::getAncestors, wbsTree.getId())
+                    );
+                }
 
                 //获取当前项目树下的元素表 节点
                 List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
                         .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
                         .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
                         .eq(WbsTreePrivate::getStatus, 1)
-                        .like(WbsTreePrivate::getAncestors, wbsTreePrivate.getId())
                 );
                 List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
-                List<WbsTreePrivate> wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
+                List<WbsTreePrivate> wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2) && f.getAncestors().contains(String.valueOf(wbsTreePrivate.getId()))).collect(Collectors.toList());
 
                 //获取新增的公有元素表addPublicTable
                 List<WbsTree> addPublicTable = wbsTreesPublicTables.stream().filter(f ->
                         !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId()))
                         .collect(Collectors.toList());
 
-                //判断当前新增的表在项目的wbs树是否存在上级节点,存在表示可以新增,不存在表示不新增
+                //判断当前新增的表在项目的wbs树是否存在上级节点,存在表示可以新增,不存在表示不新增
                 List<WbsTree> addPublicTables = addPublicTable.stream().filter(node ->
                         wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())
                 ).collect(Collectors.toList());
@@ -670,24 +693,34 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                 //根据wbsTreePrivate的wbsId=私有引用的pKeyId来获取引用树根节点
                 WbsTreePrivate wbsTreePrivateRoot = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, wbsTreePrivate.getWbsId()));
                 //获取当前私有引用树的元素表信息
-                List<WbsTreePrivate> wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId())
-                        .eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId())
-                        .eq(WbsTreePrivate::getType, 2)
-                        .eq(WbsTreePrivate::getStatus, 1)
-                        .like(WbsTreePrivate::getAncestors, wbsTreePrivateRoot.getId())
-                );
+                List<WbsTreePrivate> wbsTreePrivateRootTables;
+                if (wbsTreePrivate.getAncestors().equals("0")) {
+                    //根节点
+                    wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                            .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId())
+                            .eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId())
+                            .eq(WbsTreePrivate::getType, 2)
+                            .eq(WbsTreePrivate::getStatus, 1)
+                    );
+                } else {
+                    wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                            .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId())
+                            .eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId())
+                            .eq(WbsTreePrivate::getType, 2)
+                            .eq(WbsTreePrivate::getStatus, 1)
+                            .like(WbsTreePrivate::getAncestors, wbsTreePrivate.getId())
+                    );
+                }
 
                 //获取当前项目选择的节点下的所有元素表 节点
                 List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
                         .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
                         .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
                         .eq(WbsTreePrivate::getStatus, 1)
-                        .like(WbsTreePrivate::getAncestors, wbsTreePrivate.getId())
                 );
 
                 List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
-                List<WbsTreePrivate> wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
+                List<WbsTreePrivate> wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2) && f.getAncestors().contains(String.valueOf(wbsTreePrivate.getId()))).collect(Collectors.toList());
 
                 //获取新增的私有元素表addPrivateTable
                 List<WbsTreePrivate> addPrivateTable = wbsTreePrivateRootTables.stream().filter(f ->
@@ -749,7 +782,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                                         //将表单同步到复制或新增的节点下
                                         for (WbsTreeContract treeContract : wbsTreeContracts2) {
                                             WbsTreeContract wbsTreeContract2 = BeanUtil.copyProperties(wbsTreeContract, WbsTreeContract.class);
-                                            if (wbsTreeContract2 != null){
+                                            if (wbsTreeContract2 != null) {
                                                 wbsTreeContract2.setPKeyId(SnowFlakeUtil.getId());
                                                 wbsTreeContract2.setParentId(treeContract.getId());
 

+ 2 - 0
blade-service/blade-system/src/main/java/org/springblade/system/mapper/RoleMapper.java

@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.manager.entity.WbsTableOwnerRole;
 import org.springblade.manager.vo.WbsTableOwnerRoleVO;
+import org.springblade.system.entity.Menu;
 import org.springblade.system.entity.Role;
 import org.springblade.system.vo.RoleTypeVO;
 import org.springblade.system.vo.RoleVO;
@@ -81,4 +82,5 @@ public interface RoleMapper extends BaseMapper<Role> {
     List<RoleTypeVO> getRoleTypeInfo();
 
     List<RoleTypeVO> getRoleInfoByParentId(String ParentId);
+
 }

+ 1 - 0
blade-service/blade-system/src/main/java/org/springblade/system/mapper/RoleMapper.xml

@@ -98,4 +98,5 @@
     <select id="getRoleInfoByParentId" resultMap="RoleTypeVOMap">
         select id,id as `value`,role_name as label from blade_role where is_deleted = 0 and parent_id=#{ParentId}
     </select>
+
 </mapper>

+ 1 - 0
blade-service/blade-system/src/main/java/org/springblade/system/mapper/RoleMenuMapper.xml

@@ -7,6 +7,7 @@
         <id column="id" property="id"/>
         <result column="menu_id" property="menuId"/>
         <result column="role_id" property="roleId"/>
+        <result column="status" property="status"/>
     </resultMap>
 
     <select id="selectRoleMenuPage" resultMap="roleMenuResultMap">

+ 1 - 1
blade-service/blade-system/src/main/java/org/springblade/system/service/IRoleService.java

@@ -64,7 +64,7 @@ public interface IRoleService extends IService<Role> {
      * @param apiScopeIds  接口权限id集合
      * @return 是否成功
      */
-    boolean grant(@NotEmpty List<Long> roleIds, List<Long> menuIds, List<Long> menuClientIds, List<Long> dataScopeIds, List<Long> apiScopeIds, List<Long> tableOwners);
+    boolean grant(@NotEmpty List<Long> roleIds, List<String> menuIds, List<String> menuClientIds, List<Long> dataScopeIds, List<Long> apiScopeIds, List<Long> tableOwners);
 
     /**
      * 获取角色ID

+ 1 - 1
blade-service/blade-system/src/main/java/org/springblade/system/service/ITopMenuService.java

@@ -36,6 +36,6 @@ public interface ITopMenuService extends BaseService<TopMenu> {
 	 * @param menuIds    菜单id集合
 	 * @return 是否成功
 	 */
-	boolean grant(@NotEmpty List<Long> topMenuIds, @NotEmpty List<Long> menuIds);
+	boolean grant(@NotEmpty List<Long> topMenuIds, @NotEmpty List<String> menuIds);
 
 }

+ 1 - 1
blade-service/blade-system/src/main/java/org/springblade/system/service/impl/MenuServiceImpl.java

@@ -214,7 +214,7 @@ public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IM
     @Override
     public List<String> roleTreeKeys(String roleIds) {
         List<RoleMenu> roleMenus = roleMenuService.list(Wrappers.<RoleMenu>query().lambda().in(RoleMenu::getRoleId, Func.toLongList(roleIds)));
-        return roleMenus.stream().map(roleMenu -> Func.toStr(roleMenu.getMenuId())).collect(Collectors.toList());
+        return roleMenus.stream().map(roleMenu -> Func.toStr(roleMenu.getMenuId() + "---" + roleMenu.getStatus())).collect(Collectors.toList());
     }
 
     @Override

+ 16 - 6
blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleServiceImpl.java

@@ -34,6 +34,7 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.entity.WbsTableOwnerRole;
 import org.springblade.manager.vo.WbsTableOwnerRoleVO;
 import org.springblade.system.dto.RoleDTO;
+import org.springblade.system.entity.Menu;
 import org.springblade.system.entity.Role;
 import org.springblade.system.entity.RoleMenu;
 import org.springblade.system.entity.RoleScope;
@@ -86,11 +87,11 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IR
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean grant(@NotEmpty List<Long> roleIds, List<Long> menuIds, List<Long> menuClientIds, List<Long> dataScopeIds, List<Long> apiScopeIds, List<Long> tableOwners) {
+    public boolean grant(@NotEmpty List<Long> roleIds, List<String> menuIds, List<String> menuClientIds, List<Long> dataScopeIds, List<Long> apiScopeIds, List<Long> tableOwners) {
         return grantRoleMenu(roleIds, menuIds, menuClientIds) && grantDataScope(roleIds, dataScopeIds) && grantApiScope(roleIds, apiScopeIds) && submitRoleAndTableOwner(roleIds, tableOwners);
     }
 
-    private boolean grantRoleMenu(List<Long> roleIds, List<Long> menuIds, List<Long> menuClientIds) {
+    private boolean grantRoleMenu(List<Long> roleIds, List<String> menuIds, List<String> menuClientIds) {
         // 防止越权配置超管角色
         Long administratorCount = baseMapper.selectCount(Wrappers.<Role>query().lambda().eq(Role::getRoleAlias, RoleConstant.ADMINISTRATOR).in(Role::getId, roleIds));
         if (!AuthUtil.isAdministrator() && administratorCount > 0L) {
@@ -109,7 +110,8 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IR
         roleIds.forEach(roleId -> menuIds.forEach(menuId -> {
             RoleMenu roleMenu = new RoleMenu();
             roleMenu.setRoleId(roleId);
-            roleMenu.setMenuId(menuId);
+            roleMenu.setMenuId(Long.valueOf(menuId.split("---")[0]));
+            roleMenu.setStatus(menuId.split("---")[1]);
             roleMenus.add(roleMenu);
         }));
 
@@ -117,7 +119,8 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IR
         roleIds.forEach(roleId -> menuClientIds.forEach(menuIdC -> {
             RoleMenu roleMenu = new RoleMenu();
             roleMenu.setRoleId(roleId);
-            roleMenu.setMenuId(menuIdC);
+            roleMenu.setMenuId(Long.valueOf(menuIdC.split("---")[0]));
+            roleMenu.setStatus(menuIdC.split("---")[1]);
             roleMenus.add(roleMenu);
         }));
 
@@ -131,7 +134,14 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IR
         return true;
     }
 
-    private void recursionRoleMenu(List<Long> roleIds, List<Long> menuIds) {
+    private void recursionRoleMenu(List<Long> roleIds, List<String> menuIdsAll) {
+        //解析menuIds
+        List<Long> menuIds = new ArrayList<>();
+        for (String menuId : menuIdsAll) {
+            String[] split = menuId.split("---");
+            String id = split[0]; //id
+            menuIds.add(Long.valueOf(id));
+        }
         roleIds.forEach(roleId -> baseMapper.selectList(Wrappers.<Role>query().lambda().eq(Role::getParentId, roleId)).forEach(role -> {
             List<RoleMenu> roleMenuList = roleMenuService.list(Wrappers.<RoleMenu>query().lambda().eq(RoleMenu::getRoleId, role.getId()));
             // 子节点过滤出父节点删除的菜单集合
@@ -140,7 +150,7 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IR
                 // 删除子节点权限外的菜单集合
                 roleMenuService.remove(Wrappers.<RoleMenu>update().lambda().eq(RoleMenu::getRoleId, role.getId()).in(RoleMenu::getMenuId, collectRoleMenuIds));
                 // 递归设置下属角色菜单集合
-                recursionRoleMenu(Collections.singletonList(role.getId()), menuIds);
+                recursionRoleMenu(Collections.singletonList(role.getId()), menuIdsAll);
             }
         }));
     }

+ 18 - 18
blade-service/blade-system/src/main/java/org/springblade/system/service/impl/TopMenuServiceImpl.java

@@ -40,24 +40,24 @@ import java.util.List;
 @AllArgsConstructor
 public class TopMenuServiceImpl extends BaseServiceImpl<TopMenuMapper, TopMenu> implements ITopMenuService {
 
-	private final ITopMenuSettingService topMenuSettingService;
+    private final ITopMenuSettingService topMenuSettingService;
 
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public boolean grant(@NotEmpty List<Long> topMenuIds, @NotEmpty List<Long> menuIds) {
-		// 删除顶部菜单配置的菜单集合
-		topMenuSettingService.remove(Wrappers.<TopMenuSetting>update().lambda().in(TopMenuSetting::getTopMenuId, topMenuIds));
-		// 组装配置
-		List<TopMenuSetting> menuSettings = new ArrayList<>();
-		topMenuIds.forEach(topMenuId -> menuIds.forEach(menuId -> {
-			TopMenuSetting menuSetting = new TopMenuSetting();
-			menuSetting.setTopMenuId(topMenuId);
-			menuSetting.setMenuId(menuId);
-			menuSettings.add(menuSetting);
-		}));
-		// 新增配置
-		topMenuSettingService.saveBatch(menuSettings);
-		return true;
-	}
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean grant(@NotEmpty List<Long> topMenuIds, @NotEmpty List<String> menuIds) {
+        // 删除顶部菜单配置的菜单集合
+        topMenuSettingService.remove(Wrappers.<TopMenuSetting>update().lambda().in(TopMenuSetting::getTopMenuId, topMenuIds));
+        // 组装配置
+        List<TopMenuSetting> menuSettings = new ArrayList<>();
+        topMenuIds.forEach(topMenuId -> menuIds.forEach(menuId -> {
+            TopMenuSetting menuSetting = new TopMenuSetting();
+            menuSetting.setTopMenuId(topMenuId);
+            menuSetting.setMenuId(Long.valueOf(menuId));
+            menuSettings.add(menuSetting);
+        }));
+        // 新增配置
+        topMenuSettingService.saveBatch(menuSettings);
+        return true;
+    }
 
 }