huangjn 3 سال پیش
والد
کامیت
379c115c85
15فایلهای تغییر یافته به همراه283 افزوده شده و 50 حذف شده
  1. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/BusinessUserOpinionVO.java
  2. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreeContractClient.java
  3. 6 3
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ManagerHomePageVO.java
  4. 31 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ConstructionLedgerController.java
  5. 132 19
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  6. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ContractLogWbsMapper.java
  7. 19 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ContractLogWbsMapper.xml
  8. 3 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/IContractLogWbsService.java
  9. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ContractLogWbsServiceImpl.java
  10. 7 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/UserOpinionServiceImpl.java
  11. 17 7
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ManagerHomePageController.java
  12. 8 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  13. 11 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java
  14. 31 16
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreePrivateClientImpl.java
  15. 2 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml

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

@@ -114,6 +114,9 @@ public class BusinessUserOpinionVO {
     @ApiModelProperty(value = "提交用户")
     private String submitUserName;
 
+    @ApiModelProperty(value = "提交人岗位")
+    private String submitUserRole;
+
     @ApiModelProperty(value = "提交用户联系方式")
     private String submitPhone;
 

+ 6 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreeContractClient.java

@@ -21,6 +21,12 @@ public interface WbsTreeContractClient {
      */
     String API_PREFIX = "/api/manager/WbsTreeContract";
 
+    @GetMapping(API_PREFIX + "/countChildByPrimaryKeyId")
+    Long countChildByPrimaryKeyId(@RequestParam String primaryKeyId);
+
+    @GetMapping(API_PREFIX + "/searchContractTree")
+    List<WbsTreeContract> searchContractTree(@RequestParam String contractId);
+
     @PostMapping(API_PREFIX + "/regainRemoveTreeByPrimaryKeyIds")
     Boolean regainRemoveTreeByPrimaryKeyIds(@RequestBody List<String> primaryKeyIds);
 

+ 6 - 3
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ManagerHomePageVO.java

@@ -38,8 +38,8 @@ public class ManagerHomePageVO {
         this.userOpinionFlowList.add(new UserOpinionFlow(userOpinionId, title, currentLink, newNumber, currentLinkId, operation));
     }
 
-    public OpinionDetails getOpinionDetails(String projectName, String contractName, String opinionContent, String submitUserName, String submitUser, String submitPhone, String manageTime, List<String> fileUrl){
-        return new OpinionDetails(projectName, contractName, opinionContent, submitUserName, submitUser, submitPhone, manageTime, fileUrl);
+    public OpinionDetails getOpinionDetails(String projectName, String contractName, String opinionContent, String submitUserName, String submitUser, String submitUserRole, String submitPhone, String manageTime, List<String> fileUrl){
+        return new OpinionDetails(projectName, contractName, opinionContent, submitUserName, submitUser, submitUserRole, submitPhone, manageTime, fileUrl);
     }
 
     public void setUserOpinionList(String projectId, String projectName, String problemType, String problemTypeAmount){
@@ -105,13 +105,16 @@ public class ManagerHomePageVO {
         private String manageTime;
         @ApiModelProperty("文件路径")
         private List<String> fileUrl;
+        @ApiModelProperty("反馈人岗位")
+        private String submitUserRole;
 
-        public OpinionDetails(String projectName, String contractName, String opinionContent, String submitUserName, String submitUser, String submitPhone, String manageTime, List<String> fileUrl){
+        public OpinionDetails(String projectName, String contractName, String opinionContent, String submitUserName, String submitUser, String submitUserRole, String submitPhone, String manageTime, List<String> fileUrl){
             this.projectName = projectName;
             this.contractName = contractName;
             this.opinionContent = opinionContent;
             this.submitUserName = submitUserName;
             this.submitUser = submitUser;
+            this.submitUserRole = submitUserRole;
             this.submitPhone = submitPhone;
             this.manageTime = manageTime;
             this.fileUrl = fileUrl;

+ 31 - 1
blade-service/blade-business/src/main/java/org/springblade/business/controller/ConstructionLedgerController.java

@@ -8,6 +8,8 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 import javax.validation.Valid;
 import org.apache.commons.lang.StringUtils;
+import org.springblade.business.entity.ContractLog;
+import org.springblade.business.service.IContractLogWbsService;
 import org.springblade.business.service.IInformationQueryService;
 import org.springblade.business.vo.QueryProcessDataVO;
 import org.springblade.core.mp.support.Condition;
@@ -30,6 +32,7 @@ import org.springblade.business.wrapper.ConstructionLedgerWrapper;
 import org.springblade.business.service.IConstructionLedgerService;
 import org.springblade.core.boot.ctrl.BladeController;
 
+import java.time.Duration;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
@@ -55,6 +58,8 @@ public class ConstructionLedgerController extends BladeController {
 
 	private final IInformationQueryService informationQueryService;
 
+	private final IContractLogWbsService contractLogWbsService;
+
 	/**
 	 * 获取当前合同段的划分树
 	 * @param wbsType 查询类型,1为质检类型划分
@@ -129,8 +134,33 @@ public class ConstructionLedgerController extends BladeController {
 		}
 
 		IPage<ConstructionLedgerVO> voiPage = ConstructionLedgerWrapper.build().pageVO(pages);
+
 		voiPage.getRecords().forEach(vos -> {
-			vos.setSiteTimeStr(DateUtil.format(vos.getSiteStartTime(), "yyyy-MM-dd"));
+			//找到最开始的施工日志,如果存在数据则使用最开始的时间,如果没有再使用自定义编辑的时间
+			ContractLog contractLog = this.contractLogWbsService.queryContractLogNewOrOldDataBySelectPrimaryKeyIdAndClassify(vos.getWbsId().toString(), 7, "OLD");
+			if(contractLog != null){
+				//获取最开始的填报时间
+				String recordTime = contractLog.getRecordTime();
+				if(vos.getSiteStartTime() == null){
+					vos.setSiteTimeStr(recordTime);
+				} else {
+					//校验两个时间,看看哪个时间更早
+					Duration duration = org.springblade.core.tool.utils.DateUtil.between(
+							org.springblade.core.tool.utils.DateUtil.parse(recordTime, "yyyy-MM-dd HH:mm:ss"),
+							org.springblade.core.tool.utils.DateUtil.toDate(vos.getSiteStartTime())
+					);
+					if(duration.getSeconds() > 0){
+						//说明施工日志最早的填报时间比自定义填写的时间要晚,取客户填写的时间
+						vos.setSiteTimeStr(DateUtil.format(vos.getSiteStartTime(), "yyyy-MM-dd"));
+					} else {
+						vos.setSiteTimeStr(recordTime);
+					}
+				}
+			} else {
+				vos.setSiteTimeStr(DateUtil.format(vos.getSiteStartTime(), "yyyy-MM-dd"));
+			}
+
+
 			vos.setDetectionTimeStr(DateUtil.format(vos.getSiteEndTime(), "yyyy-MM-dd"));
 			vos.setDetectionStartTimeValue(DateUtil.format(vos.getDetectionStartTime(), "yyyy-MM-dd"));
 			vos.setDetectionEndTimeValue(DateUtil.format(vos.getDetectionEndTime(), "yyyy-MM-dd"));

+ 132 - 19
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -66,6 +66,7 @@ import org.springblade.business.service.IInformationQueryService;
 import org.springblade.core.boot.ctrl.BladeController;
 
 import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
 /**
@@ -108,6 +109,99 @@ public class InformationWriteQueryController extends BladeController {
 
 	private final RecycleBinClient recycleBinClient;
 
+	/**
+	 * 输入框查询合同段树
+	 */
+	@GetMapping("/searchContractTree")
+	@ApiOperationSupport(order = 26)
+	@ApiOperation(value = "输入框查询合同段树")
+	public R<List<WbsTreeContractTreeVOS>> searchContractTree(@RequestParam String queryValue, @RequestParam String contractId){
+		//获取合同段信息
+		ContractInfo contract = this.contractClient.getContractById(Long.parseLong(contractId));
+		if(new Integer("2").equals(contract.getContractType())){
+			//监理,需要获取监理合同段关联的施工方合同段ID
+		} else {
+			//施工,直接查询
+			//获取当前合同段下所有的数据
+			List<WbsTreeContract> contractTreeList = this.wbsTreeContractClient.searchContractTree(contractId);
+			Map<String, WbsTreeContractTreeVOS> nodeMap = new HashMap<>();
+			Map<String, String> titleToIdMap = new HashMap<>();
+			//根节点
+			AtomicReference<WbsTreeContract> rootNode = new AtomicReference<>();
+
+			contractTreeList.forEach(tree -> {
+				if(Long.valueOf("0").equals(tree.getParentId())){
+					//顺便找到根节点
+					rootNode.set(tree);
+				}
+				//转换类型
+				WbsTreeContractTreeVOS vos = new WbsTreeContractTreeVOS();
+				//设置参数
+				vos.setId(tree.getId().toString());
+				vos.setKey(tree.getId().toString());
+				vos.setPrimaryKeyId(tree.getPKeyId().toString());
+				vos.setParentId(tree.getParentId().toString());
+				vos.setTitle(StringUtils.isNotEmpty(tree.getFullName()) ? tree.getFullName() : tree.getDeptName());
+				vos.setType(tree.getType());
+				vos.setWbsType(tree.getWbsType());
+
+				nodeMap.put(tree.getId().toString(), vos);
+				titleToIdMap.put(tree.getId().toString(), StringUtils.isNotEmpty(tree.getFullName()) ? tree.getFullName() : tree.getDeptName());
+			});
+			if(rootNode.get() == null){
+				return R.data(300, null, "未找到相关数据");
+			}
+			//获得根节点
+			WbsTreeContract rootTree = rootNode.get();
+
+			//查询名称
+			titleToIdMap.entrySet().removeIf(map -> !map.getValue().contains(queryValue));
+
+			//处理后的titleToIdMap就是匹配的结果,向上获取父节点,向下获取所有子节点
+			if(titleToIdMap.size() > 0){
+				//循环剩下的数据,找到对应的节点
+				Set<String> idMap = titleToIdMap.keySet();
+				//记录哪些节点已经被获取了
+				List<String> recordGetIds = new ArrayList<>();
+				for(String nodeId : idMap){
+					if(!recordGetIds.contains(nodeId)){
+						//获取节点
+						WbsTreeContractTreeVOS node = nodeMap.get(nodeId);
+						//优先向下获取子节点
+						this.foreachQueryChild(node, nodeMap, recordGetIds);
+						//其次向上获取父节点
+
+						int i = 0;
+					}
+				}
+			}
+		}
+
+		return R.data(300, null, "未找到相关数据");
+	}
+
+	private void foreachQueryChild(WbsTreeContractTreeVOS parentNode, Map<String, WbsTreeContractTreeVOS> nodeMap, List<String> recordGetIds){
+		//校验当前节点是否还有子节点
+		Long count = this.wbsTreeContractClient.countChildByPrimaryKeyId(parentNode.getPrimaryKeyId());
+		if(count > 0){
+			//说明还有子节点
+			Set<String> keySet = nodeMap.keySet();
+			for(String key : keySet){
+				if(!recordGetIds.contains(key)){
+					WbsTreeContractTreeVOS child = nodeMap.get(key);
+					if(child.getParentId().equals(parentNode.getId())){
+						//继续向下获取子节点
+						this.foreachQueryChild(child, nodeMap, recordGetIds);
+						//添加记录
+						recordGetIds.add(key);
+						//设置进子节点集合中
+						parentNode.getChildren().add(child);
+					}
+				}
+			}
+		}
+	}
+
 	/**
 	 * 复制节点填报数据
 	 */
@@ -851,6 +945,23 @@ public class InformationWriteQueryController extends BladeController {
 		//拼接
 		ids = ids + "," + String.join(",", JSONArray.parseArray(JSONObject.toJSONString(removeList), String.class));
 
+		//获取当前节点下所有填报节点
+		List<QueryProcessDataVO> queryProcess = this.informationQueryService.queryProcessDataByParentIdAndContractId(removeNode.getId().toString(), 1, removeNode.getContractId());
+		if(queryProcess == null || queryProcess.size() == 0){
+			//填报节点
+			queryProcess = this.informationQueryService.queryProcessDataByPrimaryKeyIdAndClassify(removeNode.getPKeyId().toString(), 1);
+		}
+
+		if(queryProcess != null && queryProcess.size() > 0){
+			//检查这些填报节点是否存在已经审批或已经上报的节点,如果存在则不允许删除
+			List<QueryProcessDataVO> approvalList = queryProcess.stream().filter(vo -> new Integer("2").equals(vo.getStatus())).collect(Collectors.toList());
+			List<QueryProcessDataVO> runTaskList = queryProcess.stream().filter(vo -> new Integer("1").equals(vo.getStatus())).collect(Collectors.toList());
+			if(approvalList.size() > 0 || runTaskList.size() > 0){
+				//说明存在已经审批或已经上报的节点,不允许删除
+				return R.data(300, false, "存在已经上报或审批的节点,不允许删除");
+			}
+		}
+
 		//保存操作记录
 		this.operationLogClient.saveUserOperationLog(4, "资料管理", "工序资料", ids);
 		//保存进回收站
@@ -1079,24 +1190,26 @@ public class InformationWriteQueryController extends BladeController {
 			@ApiImplicitParam(name = "id", value = "点击节点ID")
 	})
 	public R<List<WbsTreeContractTreeVOS>> queryWbsTreePrivateByProjectIdAndId(@RequestParam String projectId, @RequestParam String id){
-//		List<WbsTreeContractTreeVOS> result = new ArrayList<>();
-//
-//		WbsTreeContractTreeVOS vos = new WbsTreeContractTreeVOS();
-//		WbsTreePrivate wbsTreePrivate = this.wbsTreePrivateClient.queryPeersNodeByProjectIdAndId(projectId, Long.parseLong(id));
-//		//设置参数
-//		vos.setId(wbsTreePrivate.getId().toString());
-//		vos.setKey(wbsTreePrivate.getId().toString());
-//		vos.setPrimaryKeyId(wbsTreePrivate.getPKeyId().toString());
-//		vos.setParentId(wbsTreePrivate.getParentId().toString());
-//		vos.setTitle(wbsTreePrivate.getDeptName());
-//		vos.setType(wbsTreePrivate.getType());
-//		vos.setWbsType(Integer.parseInt(wbsTreePrivate.getWbsType()));
-//		//设置子级
-//		vos.setChildren();
-//		//添加进结果集合中
-//		result.add(vos);
-
-		return R.data(this.wbsTreePrivateClient.queryWbsTreePrivateByProjectIdAndId(projectId, Long.parseLong(id)));
+		List<WbsTreeContractTreeVOS> result = new ArrayList<>();
+
+		if(StringUtils.isNotEmpty(id)){
+			WbsTreeContractTreeVOS vos = new WbsTreeContractTreeVOS();
+			WbsTreePrivate wbsTreePrivate = this.wbsTreePrivateClient.queryPeersNodeByProjectIdAndId(projectId, Long.parseLong(id));
+			//设置参数
+			vos.setId(wbsTreePrivate.getId().toString());
+			vos.setKey(wbsTreePrivate.getId().toString());
+			vos.setPrimaryKeyId(wbsTreePrivate.getPKeyId().toString());
+			vos.setParentId(wbsTreePrivate.getParentId().toString());
+			vos.setTitle(wbsTreePrivate.getDeptName());
+			vos.setType(wbsTreePrivate.getType());
+			vos.setWbsType(Integer.parseInt(wbsTreePrivate.getWbsType()));
+			//设置子级
+			vos.setChildren(this.wbsTreePrivateClient.queryWbsTreePrivateByProjectIdAndId(projectId, Long.parseLong(id)));
+			//添加进结果集合中
+			result.add(vos);
+		}
+
+		return R.data(result);
 	}
 
 	/**
@@ -1197,7 +1310,7 @@ public class InformationWriteQueryController extends BladeController {
 		WbsTreeContract node = this.wbsTreeContractClient.getContractWbsTreeByPrimaryKeyId(vo.getWbsId());
 		if(!new Integer("6").equals(node.getDeptCategory()) && !Arrays.asList("1,2,3,4".split(",")).contains(node.getMajorDataType().toString())){
 			//不是工序,则查询当前节点下的所有填报节点
-			List<QueryProcessDataVO> queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractId(node.getId().toString(), 1, vo.getContractId().toString());
+			List<QueryProcessDataVO> queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractId(node.getId().toString(), vo.getClassify(), vo.getContractId().toString());
 			if(StringUtils.isNotEmpty(vo.getIsFirst())){
 				//如果是首件列表请求,则删掉没有标记为首件的数据
 				queryDataResult.removeIf(data -> StringUtils.isEmpty(data.getFirstId()));

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

@@ -32,6 +32,8 @@ import java.util.List;
  */
 public interface ContractLogWbsMapper extends BaseMapper<ContractLogWbs> {
 
+	ContractLog queryContractLogNewOrOldDataBySelectPrimaryKeyIdAndClassify(@Param("selectPrimaryKeyId") String selectPrimaryKeyId, @Param("classify") Integer classify, @Param("newOrOld") String newOrOld);
+
 	Integer countContractLogBySelectPrimaryKeyIdsAndClassify(@Param("primaryKeyIds") List<String> primaryKeyIds, @Param("classify") Integer classify);
 
 	List<ContractLog> queryContractLogBySelectPrimaryKeyIdsAndClassify(@Param("primaryKeyIds") List<String> primaryKeyIds, @Param("classify") Integer classify);

+ 19 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ContractLogWbsMapper.xml

@@ -39,6 +39,25 @@
         <result column="file_name" property="fileName"/>
     </resultMap>
 
+    <select id="queryContractLogNewOrOldDataBySelectPrimaryKeyIdAndClassify" resultMap="contractLogResultMap">
+        select
+            *
+        from
+            u_contract_log
+        where
+        id in(
+            select contract_log_id from u_contract_log_wbs where is_deleted = 0 and tree_primary_key_id = #{selectPrimaryKeyId}
+        )
+        and wbs_node_type = #{classify} and is_deleted = 0
+        <choose>
+            <when test="newOrOld == 'old' || newOrOld == 'OLD'">
+                order by record_time DESC
+            </when>
+            <otherwise>order by record_time ASC</otherwise>
+        </choose>
+        limit 1
+    </select>
+
     <select id="countContractLogBySelectPrimaryKeyIdsAndClassify" resultType="java.lang.Integer">
         select
             count(id)

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

@@ -16,6 +16,7 @@
  */
 package org.springblade.business.service;
 
+import org.springblade.business.entity.ContractLog;
 import org.springblade.business.entity.ContractLogWbs;
 import org.springblade.business.vo.ContractLogVO;
 import org.springblade.core.mp.base.BaseService;
@@ -30,6 +31,8 @@ import java.util.List;
  */
 public interface IContractLogWbsService extends BaseService<ContractLogWbs> {
 
+	ContractLog queryContractLogNewOrOldDataBySelectPrimaryKeyIdAndClassify(String selectPrimaryKeyId, Integer classify, String newOrOld);
+
 	Integer countContractLogBySelectPrimaryKeyIdsAndClassify(List<String> selectPrimaryKeyIds, Integer classify);
 
 	/**

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

@@ -40,6 +40,11 @@ import java.util.stream.Collectors;
 @Service
 public class ContractLogWbsServiceImpl extends BaseServiceImpl<ContractLogWbsMapper, ContractLogWbs> implements IContractLogWbsService {
 
+	@Override
+	public ContractLog queryContractLogNewOrOldDataBySelectPrimaryKeyIdAndClassify(String selectPrimaryKeyId, Integer classify, String newOrOld) {
+		return this.baseMapper.queryContractLogNewOrOldDataBySelectPrimaryKeyIdAndClassify(selectPrimaryKeyId, classify, newOrOld);
+	}
+
 	@Override
 	public Integer countContractLogBySelectPrimaryKeyIdsAndClassify(List<String> selectPrimaryKeyIds, Integer classify) {
 		return this.baseMapper.countContractLogBySelectPrimaryKeyIdsAndClassify(selectPrimaryKeyIds, classify);

+ 7 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/UserOpinionServiceImpl.java

@@ -21,6 +21,7 @@ import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.system.feign.ISysClient;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springframework.stereotype.Service;
@@ -49,6 +50,8 @@ public class UserOpinionServiceImpl extends BaseServiceImpl<UserOpinionMapper, U
 
 	private final IUserOpinionGoodService userOpinionGoodService;
 
+	private final ISysClient sysClient;
+
 	@Override
 	public List<UserOpinion> queryOpinionTypeAmount() {
 		return this.baseMapper.queryOpinionTypeAmount();
@@ -150,6 +153,10 @@ public class UserOpinionServiceImpl extends BaseServiceImpl<UserOpinionMapper, U
 					User user = this.userClient.userInfoById(opinion.getCreateUser()).getData();
 					if(user != null){
 						vo.setSubmitPhone(user.getPhone());
+						if(StringUtils.isNotEmpty(user.getRoleId())){
+							List<String> roleNames = this.sysClient.getRoleNames(user.getRoleId()).getData();
+							vo.setSubmitUserRole(String.join(",", roleNames));
+						}
 					}
 				}
 			});

+ 17 - 7
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ManagerHomePageController.java

@@ -23,6 +23,7 @@ import org.springblade.manager.vo.ProjectUserAmountVO;
 import org.springblade.manager.vo.SingPfxManagementVO;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.feign.IDictBizClient;
+import org.springblade.system.feign.ISysClient;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -53,6 +54,8 @@ public class ManagerHomePageController extends BladeController {
 
     private final ISignPfxFileService signPfxFileService;
 
+    private final ISysClient sysClient;
+
     /**
      * 证书统计
      */
@@ -220,9 +223,16 @@ public class ManagerHomePageController extends BladeController {
         ContractInfo contractInfo = this.contractInfoService.getById(vo.getContractName());
         //查询用户信息
         User user = this.userClient.userInfoById(Long.parseLong(vo.getSubmitPhone())).getData();
+        String roleName = "";
+        if(StringUtils.isNotEmpty(user.getRoleId())){
+            List<String> roleNames = this.sysClient.getRoleNames(user.getRoleId()).getData();
+            if(roleNames != null && roleNames.size() > 0){
+                roleName = String.join(",", roleNames);
+            }
+        }
 
         ManagerHomePageVO reVO = new ManagerHomePageVO();
-        return R.data(reVO.getOpinionDetails(projectInfo.getProjectName(), contractInfo.getContractName(), vo.getOpinionContent(), vo.getSubmitUserName(), user.getId().toString(), user.getPhone(), DateUtil.format(vo.getCreateTime(), "yyyy-MM-dd HH:mm:ss"), vo.getImageUrl()));
+        return R.data(reVO.getOpinionDetails(projectInfo.getProjectName(), contractInfo.getContractName(), vo.getOpinionContent(), vo.getSubmitUserName(), user.getId().toString(), roleName, user.getPhone(), DateUtil.format(vo.getCreateTime(), "yyyy-MM-dd HH:mm:ss"), vo.getImageUrl()));
     }
 
     /**
@@ -244,8 +254,8 @@ public class ManagerHomePageController extends BladeController {
             //拼接数据
             result.forEach(vo -> {
                 if(!new Integer("1").equals(vo.getIsIgnore())){
-                    String title = "待办工单任务:" + vo.getManageTime() + "来自" + "【" + vo.getProjectName() + "-" + vo.getContractName() + "】" +
-                            "的【" + "资料员" + vo.getSubmitUserName() + "】" + "向您反馈" + "\"" + vo.getProblemType() + "\"";
+                    String title = "待办工单任务:" + DateUtil.format(vo.getCreateTime(), "yyyy-MM-dd HH:mm:ss") + "来自" + "【" + vo.getProjectName() + "-" + vo.getContractName() + "】" +
+                            "的【" + vo.getSubmitUserRole() + vo.getSubmitUserName() + "】" + "向您反馈" + "\"" + vo.getProblemType() + "\"";
 
                     resultVO.setUserOpinionFlowList(vo.getUserOpinionId().toString(), title, vo.getCurrentLink(), vo.getNewNumber(), vo.getCurrentLinkId().toString(), vo.getOperation());
                 }
@@ -279,13 +289,13 @@ public class ManagerHomePageController extends BladeController {
                 if(vo.getOperation()){
                     //有操作权限且没有被忽略的
                     if(!new Integer("1").equals(vo.getIsIgnore())){
-                        title = "待办工单任务:" + vo.getManageTime() + "来自" + "【" + vo.getProjectName() + "-" + vo.getContractName() + "】" +
-                                "的【" + "资料员" + vo.getSubmitUserName() + "】" + "向您反馈" + "\"" + vo.getProblemType() + "\"";
+                        title = "待办工单任务:" + DateUtil.format(vo.getCreateTime(), "yyyy-MM-dd HH:mm:ss") + "来自" + "【" + vo.getProjectName() + "-" + vo.getContractName() + "】" +
+                                "的【" + vo.getSubmitUserRole() + vo.getSubmitUserName() + "】" + "向您反馈" + "\"" + vo.getProblemType() + "\"";
                         resultVO.setUserOpinionFlowList(vo.getUserOpinionId().toString(), title, vo.getCurrentLink(), vo.getNewNumber(), vo.getCurrentLinkId().toString(), vo.getOperation());
                     }
                 } else {
-                    title = "待办工单任务:" + vo.getManageTime() + "来自" + "【" + vo.getProjectName() + "-" + vo.getContractName() + "】" +
-                            "的【" + "资料员" + vo.getSubmitUserName() + "】" + "向【" + vo.getManagerUserName() + "】反馈" + "\"" + vo.getProblemType() + "\"";
+                    title = "待办工单任务:" + DateUtil.format(vo.getCreateTime(), "yyyy-MM-dd HH:mm:ss") + "来自" + "【" + vo.getProjectName() + "-" + vo.getContractName() + "】" +
+                            "的【" + vo.getSubmitUserRole() + vo.getSubmitUserName() + "】" + "向【" + vo.getManagerUserName() + "】反馈" + "\"" + vo.getProblemType() + "\"";
                     resultVO.setUserOpinionFlowList(vo.getUserOpinionId().toString(), title, vo.getCurrentLink(), vo.getNewNumber(), vo.getCurrentLinkId().toString(), vo.getOperation());
                 }
             });

+ 8 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java

@@ -93,8 +93,13 @@ 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();
@@ -112,11 +117,11 @@ public class WbsTreePrivateController extends BladeController {
                     return R.data(this.wbsTreePrivateService.saveBatch(saveTreePrivateList));
                 }
             } else {
-                return R.data(200, true, "不需要新增节点");
+                return R.data(200, true, "未找到需要新增的节点");
             }
 
         }
-        return R.data(300, false, "保存失败");
+        return R.data(300, true, "保存失败,未选择任何数据");
     }
 
     /**

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

@@ -32,6 +32,17 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
 
     private final IDictBizClient dictBizClient;
 
+    @Override
+    public Long countChildByPrimaryKeyId(String primaryKeyId) {
+        WbsTreeContract contractTree = this.getContractNodeByPrimaryKeyId(primaryKeyId);
+        return this.wbsTreeContractService.count(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getParentId, contractTree.getId()).eq(WbsTreeContract::getContractId, contractTree.getContractId()).eq(WbsTreeContract::getType, 1));
+    }
+
+    @Override
+    public List<WbsTreeContract> searchContractTree(String contractId) {
+        return this.wbsTreeContractService.list(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getType, "1").eq(WbsTreeContract::getContractId, contractId));
+    }
+
     @Override
     public Boolean regainRemoveTreeByPrimaryKeyIds(List<String> primaryKeyIds) {
         return this.wbsTreeContractService.regainRemoveTreeByPrimaryKeyIds(primaryKeyIds);

+ 31 - 16
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreePrivateClientImpl.java

@@ -1,10 +1,14 @@
 package org.springblade.manager.feign;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
+import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.service.IWbsTreePrivateService;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
+import org.springblade.manager.vo.WbsTreePrivateVO;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.ArrayList;
@@ -33,28 +37,39 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
 
     @Override
     public List<WbsTreeContractTreeVOS> queryWbsTreePrivateByProjectIdAndId(String projectId, Long id) {
-        List<WbsTreePrivate> result =  this.wbsTreePrivateService.list(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getProjectId, projectId).eq(WbsTreePrivate::getType, 1).eq(WbsTreePrivate::getParentId, id).eq(WbsTreePrivate::getIsDeleted, 0));
-        if(result != null && result.size() != 0){
+        List<WbsTreePrivate> result = this.wbsTreePrivateService.list(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getProjectId, projectId).eq(WbsTreePrivate::getType, 1).like(WbsTreePrivate::getAncestors, id).eq(WbsTreePrivate::getIsDeleted, 0));
+        if(result != null && result.size() > 0){
+            //转换实体
+            List<WbsTreePrivateVO> voList = ForestNodeMerger.merge(JSONArray.parseArray(JSONObject.toJSONString(result), WbsTreePrivateVO.class));
             List<WbsTreeContractTreeVOS> vosResult = new ArrayList<>();
-            result.forEach(wbsTreePrivate -> {
-                WbsTreeContractTreeVOS vos = new WbsTreeContractTreeVOS();
-                vos.setId(wbsTreePrivate.getId().toString());
-                vos.setKey(wbsTreePrivate.getId().toString());
-                vos.setPrimaryKeyId(wbsTreePrivate.getPKeyId().toString());
-                vos.setParentId(wbsTreePrivate.getParentId().toString());
-                vos.setTitle(wbsTreePrivate.getDeptName());
-                vos.setType(wbsTreePrivate.getType());
-                vos.setWbsType(Integer.parseInt(wbsTreePrivate.getWbsType()));
-                long count = this.wbsTreePrivateService.count(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getProjectId, projectId).eq(WbsTreePrivate::getParentId, wbsTreePrivate.getId()).eq(WbsTreePrivate::getType, "1"));
-                vos.setNotExsitChild(count == 0);
-
-                vosResult.add(vos);
-            });
+            this.foreachSetChildList(vosResult, voList);
             return vosResult;
         }
         return null;
     }
 
+    private void foreachSetChildList(List<WbsTreeContractTreeVOS> vosResult, List<WbsTreePrivateVO> voList){
+        voList.forEach(wbsTreePrivateVO -> {
+            WbsTreeContractTreeVOS vos = new WbsTreeContractTreeVOS();
+            vos.setId(wbsTreePrivateVO.getId().toString());
+            vos.setKey(wbsTreePrivateVO.getId().toString());
+            vos.setPrimaryKeyId(wbsTreePrivateVO.getPKeyId().toString());
+            vos.setParentId(wbsTreePrivateVO.getParentId().toString());
+            vos.setTitle(wbsTreePrivateVO.getDeptName());
+            vos.setType(wbsTreePrivateVO.getType());
+            vos.setWbsType(Integer.parseInt(wbsTreePrivateVO.getWbsType()));
+            vos.setNotExsitChild(vos.getChildren().size() == 0);
+
+            if(wbsTreePrivateVO.getChildren().size() > 0){
+                List<WbsTreeContractTreeVOS> child = new ArrayList<>();
+                this.foreachSetChildList(child, wbsTreePrivateVO.getChildren());
+                vos.setChildren(child);
+            }
+
+            vosResult.add(vos);
+        });
+    }
+
     @Override
     public WbsTreePrivate queryPeersNodeByProjectIdAndId(String projectId, Long id) {
         return this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getProjectId, projectId).eq(WbsTreePrivate::getId, id).eq(WbsTreePrivate::getIsDeleted, 0));

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

@@ -385,7 +385,8 @@
                wt.init_table_name,
                wt.excel_id    as excelId,
                wt.sort,
-               wt.status
+               wt.status,
+               (SELECT count(1) FROM m_wbs_form_element WHERE f_id = wt.id) AS "elementTotal"
         FROM m_wbs_tree_private AS wt
         WHERE wt.type = 2
           AND wt.is_deleted = 0