Explorar o código

Merge remote-tracking branch 'origin/master'

“zhifk” %!s(int64=2) %!d(string=hai) anos
pai
achega
eadd2eb8bc

+ 59 - 34
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java

@@ -53,8 +53,10 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
             queryWrapper.lambda().like(TaskProcessInfo::getAuditUserIds, SecureUtil.getUserId());
             queryWrapper.lambda().eq(TaskProcessInfo::getStatus, 1);
         } else if (dto.getSelectType().equals("2")) { //已审核、已驳回为已办任务
-            queryWrapper.lambda().like(TaskProcessInfo::getAuditUserIds, SecureUtil.getUserId());
-            queryWrapper.lambda().in(TaskProcessInfo::getStatus, 2, 3);
+            queryWrapper.lambda().like(TaskProcessInfo::getAuditUserIds, SecureUtil.getUserId())
+                    .or()
+                    .like(TaskProcessInfo::getAuditUserIdsComplete, SecureUtil.getUserId())
+                    .and(wrapper -> wrapper.in(TaskProcessInfo::getStatus, 2, 3));
         } else if (dto.getSelectType().equals("3")) { //我发起的任务
             if (ObjectUtil.isNotEmpty(dto.getSelectStatus()) && !dto.getSelectStatus().equals("1")) {
                 queryWrapper.lambda().eq(TaskProcessInfo::getStatus, dto.getSelectStatus());
@@ -83,15 +85,19 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
 
             vo.setReportUserName(userMap.get(vo.getReportUserId()));
 
-            List<String> auditUserNames = Arrays.stream(vo.getAuditUserIds().split(","))
-                    .map(Long::parseLong).map(userMap::get)
-                    .collect(Collectors.toList());
-            vo.setAuditUserNames(StringUtils.join(auditUserNames, "、"));
+            if (StringUtils.isNotEmpty(vo.getAuditUserIds())) {
+                List<String> auditUserNames = Arrays.stream(vo.getAuditUserIds().split(","))
+                        .map(Long::parseLong).map(userMap::get)
+                        .collect(Collectors.toList());
+                vo.setAuditUserNames(StringUtils.join(auditUserNames, "、"));
+            }
 
-            List<String> auditUserCompleteNames = Arrays.stream(vo.getAuditUserIdsComplete().split(","))
-                    .map(Long::parseLong).map(userMap::get)
-                    .collect(Collectors.toList());
-            vo.setAuditUserCompleteNames(StringUtils.join(auditUserCompleteNames, "、"));
+            if (StringUtils.isNotEmpty(vo.getAuditUserIdsComplete())) {
+                List<String> auditUserCompleteNames = Arrays.stream(vo.getAuditUserIdsComplete().split(","))
+                        .map(Long::parseLong).map(userMap::get)
+                        .collect(Collectors.toList());
+                vo.setAuditUserCompleteNames(StringUtils.join(auditUserCompleteNames, "、"));
+            }
 
             vo.setStatusName(vo.getStatus().equals(1) ? "待审批" : (vo.getStatus().equals(2) ? "已审批" : "已驳回"));
 
@@ -207,31 +213,42 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
 
     @Override
     public boolean taskReject(TaskProcessInfoDTO dto) {
-        if (ObjectUtil.isEmpty(dto.getId())) {
-            throw new ServiceException("未获取到当前任务信息,请联系管理员");
-        }
-        List<ExpenseTaskRecord> records = jdbcTemplate.query("select * from c_expense_task_record where task_id = " + dto.getId(), new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
-        if (records.size() == 0) {
-            throw new ServiceException("未获取当前任务的关联业务信息,请联系管理员");
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+            throw new ServiceException("未获取到当前用户信息,请联系管理员");
         }
-        //修改审批任务状态 =3 已驳回
-        if (this.update(Wrappers.<TaskProcessInfo>lambdaUpdate()
-                .set(TaskProcessInfo::getStatus, 3)
-                .set(TaskProcessInfo::getRejectDesc, StringUtils.isNotEmpty(dto.getRejectDesc()) ? dto.getRejectDesc() : null)
-                .eq(TaskProcessInfo::getId, dto.getId()))) {
-            //修改业务数据状态 =3 已驳回
-            for (ExpenseTaskRecord record : records) {
-                if (ObjectUtil.isNotEmpty(record.getExpenseInfoType())) {
-                    Integer businessDataType = record.getExpenseInfoType();
-                    if (businessDataType.equals(dto.getTaskType())) {
-                        this.updateTaskStatus(businessDataType, 3, record.getExpenseInfoId());
+        TaskProcessInfo taskProcessInfo = baseMapper.selectById(dto.getId());
+        if (taskProcessInfo != null) {
+            List<ExpenseTaskRecord> records = jdbcTemplate.query("select * from c_expense_task_record where task_id = " + taskProcessInfo.getId(), new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
+            if (records.size() == 0) {
+                throw new ServiceException("未获取当前任务的关联业务信息,请联系管理员");
+            }
+            if (StringUtils.isNotEmpty(taskProcessInfo.getAuditUserIds())) {
+                if (!taskProcessInfo.getAuditUserIds().contains(SecureUtil.getUserId() + "")) {
+                    throw new ServiceException("当前用户不属于当前审批任务的审批人员,操作失败");
+                }
+                //修改审批任务状态 =3 已驳回
+                if (this.update(Wrappers.<TaskProcessInfo>lambdaUpdate()
+                        .set(TaskProcessInfo::getStatus, 3)
+                        .set(TaskProcessInfo::getRejectDesc, StringUtils.isNotEmpty(dto.getRejectDesc()) ? dto.getRejectDesc() : null)
+                        .eq(TaskProcessInfo::getId, dto.getId()))) {
+                    //修改业务数据状态 =3 已驳回
+                    for (ExpenseTaskRecord record : records) {
+                        if (ObjectUtil.isNotEmpty(record.getExpenseInfoType())) {
+                            Integer businessDataType = record.getExpenseInfoType();
+                            if (businessDataType.equals(dto.getTaskType())) {
+                                this.updateTaskStatus(businessDataType, 3, record.getExpenseInfoId());
+                            }
+                        }
                     }
+                    return true;
                 }
+            } else {
+                throw new ServiceException("未获取到当前任务的审批人员信息,请联系管理员");
             }
-            return true;
         } else {
-            throw new ServiceException("当前任务审批失败,请联系管理员");
+            throw new ServiceException("未获取到当前任务信息,请联系管理员");
         }
+        return false;
     }
 
     @Override
@@ -242,23 +259,31 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
         }
         TaskProcessInfo taskProcessInfo = baseMapper.selectById(id);
         if (ObjectUtil.isEmpty(taskProcessInfo)) {
-            throw new ServiceException("未获取当前任务信息,请联系管理员");
+            throw new ServiceException("未获取当前任务信息,请联系管理员");
         }
 
         List<ExpenseTaskRecord> records = jdbcTemplate.query("select * from c_expense_task_record where task_id = " + id, new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
         if (records.size() == 0) {
             throw new ServiceException("未获取当前任务的关联业务信息,请联系管理员");
         }
-        if (StringUtils.isNotEmpty(taskProcessInfo.getAuditUserIds()) && taskProcessInfo.getAuditUserIds().contains(SecureUtil.getUserId() + "")) {
+        if (StringUtils.isNotEmpty(taskProcessInfo.getAuditUserIds())) {
+            if (ObjectUtil.isNotEmpty(taskProcessInfo.getAuditUserIdsComplete()) && taskProcessInfo.getAuditUserIdsComplete().contains(SecureUtil.getUserId() + "")) {
+                throw new ServiceException("当前用户已完成此任务的审批操作,请勿重复提交");
+            }
+            if (!taskProcessInfo.getAuditUserIds().contains(SecureUtil.getUserId() + "")) {
+                throw new ServiceException("当前用户不属于当前审批任务的审批人员,操作失败");
+            }
             //加锁
             String redisLock = bladeRedis.get("user:id=" + SecureUtil.getUserId());
             if (StringUtils.isNotEmpty(redisLock) && redisLock.equals("task:id=" + id)) {
-                throw new ServiceException("当前用户已提交该任务的审批,请勿重复操作!");
+                throw new ServiceException("当前用户已完成此任务的审批操作,请勿重复提交");
             } else {
-                bladeRedis.setEx("user:id=" + SecureUtil.getUserId(), "task:id=" + id, Duration.ofMinutes(10));//10分钟过期
+                bladeRedis.setEx("user:id=" + SecureUtil.getUserId(), "task:id=" + id, Duration.ofMinutes(1));
             }
 
-            List<String> auditUserIdList = Func.toStrList(taskProcessInfo.getAuditUserIds());
+            //待审批人员List
+            List<String> auditUserIdList = new ArrayList<>(Func.toStrList(taskProcessInfo.getAuditUserIds()));
+            //已审批人员List
             Set<String> auditUserIdCompleteList = new HashSet<>(Func.toStrList(taskProcessInfo.getAuditUserIdsComplete()));
 
             //剔除待审批中当前用户信息

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

@@ -582,7 +582,7 @@ public class ContractInfoController extends BladeController {
     /**
      * 查询合同段树-全加载-监理合同段
      */
-    @GetMapping("/tree-all-jl")
+    /*@GetMapping("/tree-all-jl")
     @ApiOperationSupport(order = 19)
     @ApiOperation(value = "查询合同段私有Wbs节点树形结构-监理合同段", notes = "合同段id,type=1")
     @ApiImplicitParams(value = {
@@ -604,7 +604,7 @@ public class ContractInfoController extends BladeController {
             return R.data(treeAllJL);
         }
         return R.fail(200, "未查询到信息");
-    }
+    }*/
 
     /**
      * 查询合同段私有Wbs节点树形结构 --- 试验关联工程节点树 懒加载
@@ -713,4 +713,51 @@ public class ContractInfoController extends BladeController {
     }
 
 
+    /**
+     * 资料填报(资料查询)节点搜索输入框查询接口
+     *
+     * @author liuyc
+     * @since 2023年6月15日11:44:36
+     */
+    @GetMapping("/getTreeNodeByQueryValueAndContractId")
+    @ApiOperationSupport(order = 23)
+    @ApiOperation(value = "资料填报(资料查询)节点搜索输入框查询接口", notes = "传入合同段id、输入框搜索的queryValue")
+    public R getTreeNodeByValueAndContractId(@RequestParam String queryValue, @RequestParam String contractId) {
+        R list = contractInfoService.getTreeNodeByValueAndContractId(queryValue, contractId);
+        Object data = list.getData();
+        if (data != null) {
+            ContractInfo contractInfo = contractInfoService.getBaseMapper().selectById(contractId);
+            if (data instanceof List) {
+                if (contractInfo.getContractType().equals(1)) {
+                    List<WbsTreeContractTreeAllVO> dataList = (List<WbsTreeContractTreeAllVO>) data;
+                    for (WbsTreeContractTreeAllVO wbsTreeContractVO : dataList) {
+                        if (ObjectUtil.isNotEmpty(wbsTreeContractVO.getParentId()) && 0L == wbsTreeContractVO.getParentId()) {
+                            wbsTreeContractVO.setTitle(contractInfo.getContractName());
+                            break;
+                        }
+                    }
+                    return R.data(data);
+                }
+            } else if (data instanceof Map) {
+                if (contractInfo.getContractType().equals(2) || contractInfo.getContractType().equals(3)) {
+                    List<WbsTreeContractTreeAllVO> jlYzList = new LinkedList<>();
+                    Map<Long, List<WbsTreeContractTreeAllVO>> dataMap = (Map<Long, List<WbsTreeContractTreeAllVO>>) data;
+                    for (Map.Entry<Long, List<WbsTreeContractTreeAllVO>> map : dataMap.entrySet()) {
+                        ContractInfo contractInfoJlYz = contractInfoService.getBaseMapper().selectById(map.getKey());
+                        for (WbsTreeContractTreeAllVO wbsTreeContractVO : map.getValue()) {
+                            if (ObjectUtil.isNotEmpty(wbsTreeContractVO.getParentId()) && 0L == wbsTreeContractVO.getParentId()) {
+                                wbsTreeContractVO.setTitle(contractInfoJlYz.getContractName());
+                                break;
+                            }
+                        }
+                        jlYzList.addAll(map.getValue());
+                    }
+                    return R.data(jlYzList);
+                }
+            }
+        }
+        return R.fail(200, "未查询到信息");
+    }
+
+
 }

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

@@ -1,6 +1,7 @@
 package org.springblade.manager.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.core.tool.api.R;
 import org.springblade.manager.dto.FindAllUserByConditionDTO;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.ContractRelationJlyz;
@@ -78,4 +79,7 @@ public interface IContractInfoService extends BaseService<ContractInfo> {
 
 
     List<ContractInfo> getContractListByProjectId(Long projectId);
+
+    R getTreeNodeByValueAndContractId(String queryValue, String contractId);
+
 }

+ 250 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java

@@ -2,27 +2,32 @@ package org.springblade.manager.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.google.common.collect.Lists;
 import lombok.AllArgsConstructor;
+import org.springblade.business.entity.InformationQuery;
 import org.springblade.business.feign.InformationQueryClient;
 import org.springblade.common.utils.BaiduApiUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.manager.dto.FindAllUserByConditionDTO;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.manager.entity.*;
+import org.springblade.manager.mapper.ContractInfoMapper;
 import org.springblade.manager.mapper.ProjectContractAreaMapper;
 import org.springblade.manager.mapper.SaveUserInfoByProjectMapper;
 import org.springblade.manager.mapper.WbsTreeContractMapper;
-import org.springblade.manager.vo.*;
-import org.springblade.manager.mapper.ContractInfoMapper;
 import org.springblade.manager.service.IContractInfoService;
-import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.manager.vo.*;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springblade.system.user.vo.UserContractInfoVO;
@@ -31,7 +36,6 @@ import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 
 import java.io.IOException;
 import java.util.*;
@@ -206,10 +210,250 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
 
     @Override
     public List<ContractInfo> getContractListByProjectId(Long projectId) {
-        List<ContractInfo> list=contractInfoMapper.getContractListByProjectId(projectId);
-        return list;
+        return contractInfoMapper.getContractListByProjectId(projectId);
+    }
+
+    @Override
+    public R getTreeNodeByValueAndContractId(String queryValue, String contractId) {
+        List<WbsTreeContractTreeAllVO> resultList = new ArrayList<>();
+        Map<Long, List<WbsTreeContractTreeAllVO>> resultMaps = new LinkedHashMap<>();
+        if (StringUtils.isNotEmpty(queryValue) && StringUtils.isNotEmpty(contractId)) {
+            ContractInfo contractInfo = contractInfoMapper.selectById(contractId);
+            if (contractInfo != null) {
+                //质检
+                if (contractInfo.getContractType().equals(1)) {
+                    //获取查询的有效节点信息,以及所有上级父级节点
+                    LambdaQueryWrapper<WbsTreeContract> queryWrapper = new LambdaQueryWrapper<>();
+                    queryWrapper.like(WbsTreeContract::getFullName, queryValue);
+                    queryWrapper.eq(WbsTreeContract::getContractId, contractId);
+                    queryWrapper.eq(WbsTreeContract::getType, 1);
+                    List<WbsTreeContract> nodes = wbsTreeContractMapper.selectList(queryWrapper);
+                    Set<WbsTreeContract> resultNodes = new LinkedHashSet<>();
+                    this.recursiveGetParentNodes(resultNodes, nodes, contractId);
+                    resultNodes.addAll(nodes);
+                    List<String> nodePkeyIds = resultNodes.stream().map(WbsTreeContract::getPKeyId).map(String::valueOf).collect(Collectors.toList());
+
+                    //获取填报过的资料信息Map
+                    Set<InformationQuery> informationQuerySet = new HashSet<>();
+                    List<List<String>> partition = Lists.partition(nodePkeyIds, 500);
+                    for (List<String> wbsIds : partition) {
+                        List<InformationQuery> informationQueryList = jdbcTemplate.query("select wbs_id,status from u_information_query where wbs_id in(" + org.apache.commons.lang.StringUtils.join(wbsIds, ",") + ")", new BeanPropertyRowMapper<>(InformationQuery.class));
+                        informationQuerySet.addAll(informationQueryList);
+                    }
+                    Map<Long, Integer> informationQueryMaps = informationQuerySet.stream().collect(Collectors.toMap(InformationQuery::getWbsId, InformationQuery::getStatus, (v1, v2) -> v1));
+
+                    //构造vo
+                    List<WbsTreeContractTreeAllVO> wbsTreeContractTreeAllVOS = resultNodes.stream().map(node -> {
+                        WbsTreeContractTreeAllVO vo = BeanUtil.copyProperties(node, WbsTreeContractTreeAllVO.class);
+                        if (vo != null) {
+                            vo.setType(ObjectUtils.isNotEmpty(node.getNodeType()) ? node.getNodeType() : 0);
+                            vo.setTitle(node.getFullName());
+                            vo.setPrimaryKeyId(node.getPKeyId());
+                            if (ObjectUtils.isNotEmpty(informationQueryMaps.get(vo.getPrimaryKeyId()))) {
+                                vo.setSubmitCounts(1L); //如果存在资料填报信息,那么计数
+                                vo.setColorStatus(informationQueryMaps.get(vo.getPrimaryKeyId())); //颜色
+                            } else {
+                                vo.setSubmitCounts(0L);
+                                vo.setColorStatus(null); //没填报就是null
+                            }
+                        }
+                        return vo;
+                    }).collect(Collectors.toList());
+
+                    //构造树形结构
+                    List<WbsTreeContractTreeAllVO> reNodes = this.buildWbsTreeByStreamByTreeAll(wbsTreeContractTreeAllVOS);
+
+                    //获取构造完的List集合
+                    LinkedList<WbsTreeContractTreeAllVO> resultNodesAll = new LinkedList<>();
+                    this.getNodesAll(reNodes, resultNodesAll);
+                    resultNodesAll.addAll(0, reNodes);
+
+                    //处理父级节点计数、颜色问题
+                    this.reSetSubmitCountsAndColorStatus(resultNodesAll);
+
+                    //返回结果集
+                    resultList.addAll(reNodes);
+                    return R.data(resultList);
+
+                } else if (contractInfo.getContractType().equals(2) || contractInfo.getContractType().equals(3)) {
+                    //监理、指挥部
+                    List<ContractRelationJlyz> relationJLYZList = jdbcTemplate.query("select * from m_contract_relation_jlyz where contract_id_jlyz = " + contractId, new BeanPropertyRowMapper<>(ContractRelationJlyz.class));
+
+                    for (ContractRelationJlyz contractRelationJlyz : relationJLYZList) {
+                        //获取查询的有效节点信息,以及所有上级父级节点
+                        LambdaQueryWrapper<WbsTreeContract> queryWrapper = new LambdaQueryWrapper<>();
+                        queryWrapper.like(WbsTreeContract::getFullName, queryValue);
+                        queryWrapper.eq(WbsTreeContract::getContractId, contractRelationJlyz.getContractIdSg());
+                        queryWrapper.eq(WbsTreeContract::getType, 1);
+                        List<WbsTreeContract> nodes = wbsTreeContractMapper.selectList(queryWrapper);
+                        Set<WbsTreeContract> resultNodes = new LinkedHashSet<>();
+                        this.recursiveGetParentNodes(resultNodes, nodes, contractRelationJlyz.getContractIdSg() + "");
+                        resultNodes.addAll(nodes);
+                        List<String> nodePkeyIds = resultNodes.stream().map(WbsTreeContract::getPKeyId).map(String::valueOf).collect(Collectors.toList());
+
+                        //获取填报过的资料信息Map
+                        Set<InformationQuery> informationQuerySet = new HashSet<>();
+                        List<List<String>> partition = Lists.partition(nodePkeyIds, 500);
+                        for (List<String> wbsIds : partition) {
+                            List<InformationQuery> informationQueryList = jdbcTemplate.query("select wbs_id,status from u_information_query where wbs_id in(" + org.apache.commons.lang.StringUtils.join(wbsIds, ",") + ")", new BeanPropertyRowMapper<>(InformationQuery.class));
+                            informationQuerySet.addAll(informationQueryList);
+                        }
+                        Map<Long, Integer> informationQueryMaps = informationQuerySet.stream().collect(Collectors.toMap(InformationQuery::getWbsId, InformationQuery::getStatus, (v1, v2) -> v1));
+
+                        //构造vo
+                        List<WbsTreeContractTreeAllVO> wbsTreeContractTreeAllVOS = resultNodes.stream().map(node -> {
+                            WbsTreeContractTreeAllVO vo = BeanUtil.copyProperties(node, WbsTreeContractTreeAllVO.class);
+                            if (vo != null) {
+                                vo.setType(ObjectUtils.isNotEmpty(node.getNodeType()) ? node.getNodeType() : 0);
+                                vo.setTitle(node.getFullName());
+                                vo.setPrimaryKeyId(node.getPKeyId());
+                                if (ObjectUtils.isNotEmpty(informationQueryMaps.get(vo.getPrimaryKeyId()))) {
+                                    vo.setSubmitCounts(1L); //如果存在资料填报信息,那么计数
+                                    vo.setColorStatus(informationQueryMaps.get(vo.getPrimaryKeyId())); //颜色
+                                } else {
+                                    vo.setSubmitCounts(0L);
+                                    vo.setColorStatus(null); //没填报就是null
+                                }
+                            }
+                            return vo;
+                        }).collect(Collectors.toList());
+
+                        //构造树形结构
+                        List<WbsTreeContractTreeAllVO> reNodes = this.buildWbsTreeByStreamByTreeAll(wbsTreeContractTreeAllVOS);
+
+                        //获取构造完的List集合
+                        LinkedList<WbsTreeContractTreeAllVO> resultNodesAll = new LinkedList<>();
+                        this.getNodesAll(reNodes, resultNodesAll);
+                        resultNodesAll.addAll(0, reNodes);
+
+                        //处理父级节点计数、颜色问题
+                        this.reSetSubmitCountsAndColorStatus(resultNodesAll);
+                        //返回结果集
+                        resultMaps.put(contractRelationJlyz.getContractIdSg(), reNodes);
+                    }
+                    return R.data(resultMaps);
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 处理submitCounts计数、colorStatus颜色问题
+     *
+     * @param reNodes 数据源
+     */
+    private void reSetSubmitCountsAndColorStatus(List<WbsTreeContractTreeAllVO> reNodes) {
+        //反向for循环解决顺序问题,最底层节点才是数据源
+        for (int i = reNodes.size() - 1; i >= 0; i--) {
+            WbsTreeContractTreeAllVO node = reNodes.get(i);
+            if (node.getChildren() != null && !node.getChildren().isEmpty()) {
+                long childSubmitCounts = 0L;
+                int colorStatus = 1;
+
+                boolean allChildStatusEquals3 = true;
+                boolean allChildStatusEquals4 = true;
+
+                //计数
+                for (WbsTreeContractTreeAllVO child : node.getChildren()) {
+                    if (child.getSubmitCounts() == 1L) {
+                        childSubmitCounts++;
+                    } else if (child.getSubmitCounts() > 1L) {
+                        childSubmitCounts = child.getSubmitCounts();
+                    }
+                }
+
+                //颜色
+                for (WbsTreeContractTreeAllVO child : node.getChildren()) {
+                    if (ObjectUtils.isNotEmpty(child.getColorStatus())) {
+                        //只要有一个子级是已填报-未上报,那么上级默认已填报-未上报(蓝色)
+                        if (child.getColorStatus().equals(2)) {
+                            colorStatus = 2;
+                            break;
+                        }
+
+                        if (child.getColorStatus().equals(3)) {
+                            allChildStatusEquals4 = false;
+                            colorStatus = 4;
+
+                        } else if (child.getColorStatus().equals(4)) {
+                            allChildStatusEquals3 = false;
+                            colorStatus = 3;
+
+                        } else {
+                            allChildStatusEquals3 = false;
+                            allChildStatusEquals4 = false;
+                            colorStatus = 1;
+                            break;
+                        }
+                    }
+                }
+
+                //父节点计数
+                node.setSubmitCounts(childSubmitCounts);
+
+                //父节点颜色
+                if (allChildStatusEquals3) {
+                    node.setColorStatus(3);
+                    continue;
+                }
+                if (allChildStatusEquals4) {
+                    node.setColorStatus(4);
+                    continue;
+                }
+                node.setColorStatus(colorStatus);
+
+            } else if (node.getSubmitCounts() == 1L) {
+                node.setSubmitCounts(1L);
+                //最底层颜色
+                if (ObjectUtils.isNotEmpty(node.getColorStatus())) {
+                    if (node.getColorStatus().equals(0)) { //任务状态=0,未上报
+                        node.setColorStatus(2); //蓝色
+                    } else if (node.getColorStatus().equals(1)) { //任务状态=1,待审批
+                        node.setColorStatus(3); //橙色
+                    } else if (node.getColorStatus().equals(2)) { //任务状态=2,已审批
+                        node.setColorStatus(4); //绿色
+                    }
+                }
+            } else if (node.getSubmitCounts() == 0L && ObjectUtils.isEmpty(node.getColorStatus())) {
+                node.setColorStatus(1); //黑色 //任务状态=null,未填报
+            }
+        }
     }
 
+
+    /**
+     * 获取构造完的List集合
+     *
+     * @param reNodes 数据源
+     * @param result  结果集
+     */
+    private void getNodesAll(List<WbsTreeContractTreeAllVO> reNodes, LinkedList<WbsTreeContractTreeAllVO> result) {
+        for (WbsTreeContractTreeAllVO node : reNodes) {
+            if (node.getChildren() != null && !node.getChildren().isEmpty()) {
+                result.addAll(node.getChildren());
+                getNodesAll(node.getChildren(), result);
+            }
+        }
+    }
+
+    /**
+     * 反向递归获取父级
+     *
+     * @param resultNodes
+     * @param nodes
+     * @param contractId
+     */
+    private void recursiveGetParentNodes(Set<WbsTreeContract> resultNodes, List<WbsTreeContract> nodes, String contractId) {
+        Set<String> parentIds = nodes.stream().map(WbsTreeContract::getParentId).map(String::valueOf).filter(ObjectUtils::isNotEmpty).collect(Collectors.toSet());
+        List<WbsTreeContract> parentNodes = jdbcTemplate.query("select * from m_wbs_tree_contract where is_deleted = 0 and status = 1 and type = 1 and id in(" + org.apache.commons.lang.StringUtils.join(parentIds, ",") + ") and contract_id = " + contractId, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+        if (parentNodes.size() > 0) {
+            resultNodes.addAll(parentNodes);
+            this.recursiveGetParentNodes(resultNodes, parentNodes, contractId);
+        }
+    }
+
+
     public List<WbsTreeContractVO> buildWbsTreeByStreamChildNodeTree(List<WbsTreeContractVO> nodes, WbsTreeContract parentNodeRoot) {
         List<WbsTreeContractVO> list = nodes.stream().filter(f -> f.getId().equals(parentNodeRoot.getId())).collect(Collectors.toList());
         Map<Long, List<WbsTreeContractVO>> map = nodes.stream().collect(Collectors.groupingBy(WbsTreeContractVO::getParentId));