From 101f7a8f8c6ab2c830ca28992f2e14bb4f29bb17 Mon Sep 17 00:00:00 2001
From: buhuazhen <hua100783@gmail.com>
Date: 星期六, 07 三月 2026 11:22:33 +0800
Subject: [PATCH] feat(projectManagement): 优化项目管理计划及节点功能

---
 src/main/java/com/ruoyi/projectManagement/service/impl/PlanServiceImpl.java |   92 +++++++++++++++++++++++++++++++++++++++------
 1 files changed, 79 insertions(+), 13 deletions(-)

diff --git a/src/main/java/com/ruoyi/projectManagement/service/impl/PlanServiceImpl.java b/src/main/java/com/ruoyi/projectManagement/service/impl/PlanServiceImpl.java
index 4262f89..6856bb6 100644
--- a/src/main/java/com/ruoyi/projectManagement/service/impl/PlanServiceImpl.java
+++ b/src/main/java/com/ruoyi/projectManagement/service/impl/PlanServiceImpl.java
@@ -1,21 +1,32 @@
 package com.ruoyi.projectManagement.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ruoyi.basic.service.CustomerFollowUpFileService;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.projectManagement.mapper.PlanMapper;
+import com.ruoyi.projectManagement.mapper.PlanNodeMapper;
 import com.ruoyi.projectManagement.pojo.Plan;
+import com.ruoyi.projectManagement.pojo.PlanNode;
 import com.ruoyi.projectManagement.service.PlanService;
-import com.ruoyi.projectManagement.vo.PlanVo;
-import com.ruoyi.projectManagement.vo.SavePlanVo;
-import com.ruoyi.projectManagement.vo.SearchPlanVo;
+import com.ruoyi.projectManagement.vo.*;
 import lombok.RequiredArgsConstructor;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.Collections;
+import java.util.List;
+import java.util.Map;
 import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 /**
  * @author buhuazhen
@@ -31,6 +42,12 @@
 
     private final CustomerFollowUpFileService customerFollowUpFileService;
 
+    private final PlanNodeMapper planNodeMapper;
+
+    @Lazy
+    @Autowired
+    private PlanService planService;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void savePlan(SavePlanVo savePlanVo) {
@@ -38,18 +55,55 @@
         // 闄勪欢澶勭悊 , 鎷兼帴
         String attachments = String.join(",", Optional.ofNullable(savePlanVo.getAttachmentIds()).orElse(Collections.emptyList()));
         plan.setAttachment(attachments);
-
-
         if (savePlanVo.getId() == null) {
             planMapper.insert(plan);
         } else {
             planMapper.updateById(plan);
         }
-
-        // todo@ 鑺傜偣淇濆瓨
-
-
+        planService.savePlanNode(plan.getId(), savePlanVo.getSavePlanNodeList());
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void savePlanNode(Long planId, @Nullable List<SavePlanNodeVo> savePlanNodeVos) {
+        Assert.notNull(planId, () -> new ServiceException("璁″垝ID涓嶈兘涓虹┖"));
+        if (CollUtil.isEmpty(savePlanNodeVos)) {
+            return;
+        }
+
+        // 鍒犻櫎澶氫綑鑺傜偣
+        List<PlanNode> needDeleteNode = planNodeMapper.selectList(new LambdaQueryWrapper<PlanNode>()
+                .select(PlanNode::getId)
+                .eq(PlanNode::getProjectManagementPlanId, planId)
+                .ne(PlanNode::getId, savePlanNodeVos.get(0).getId())
+                .notIn(PlanNode::getId, savePlanNodeVos.stream().map(SavePlanNodeVo::getId).collect(Collectors.toList())));
+        deletePlanNode(needDeleteNode.stream().map(PlanNode::getId).collect(Collectors.toList()));
+
+        List<PlanNode> planNodes = BeanUtil.copyToList(savePlanNodeVos, PlanNode.class);
+        // 璁剧疆鎺掑簭绱㈠紩
+        IntStream.range(0, savePlanNodeVos.size()).forEach(i -> {
+            planNodes.get(i).setSort(i);
+            planNodes.get(i).setProjectManagementPlanId(planId);
+            if (planNodes.get(i).getId() == null) {
+                planNodeMapper.insert(planNodes.get(i));
+            } else {
+                planNodeMapper.updateById(planNodes.get(i));
+            }
+        });
+    }
+
+    private List<PlanNode> getPlanNodeByPlanId(Long planId) {
+        return planNodeMapper.selectList(new LambdaQueryWrapper<PlanNode>()
+                .eq(PlanNode::getIsDelete, 0)
+                .eq(PlanNode::getProjectManagementPlanId, planId));
+    }
+
+    private List<PlanNode> getPlanNodeByPlanIds(List<Long> planIds) {
+        return planNodeMapper.selectList(new LambdaQueryWrapper<PlanNode>()
+                .eq(PlanNode::getIsDelete, 0)
+                .in(PlanNode::getProjectManagementPlanId, planIds));
+    }
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -58,9 +112,18 @@
                 new LambdaUpdateWrapper<Plan>()
                         .eq(Plan::getId, id)
                         .set(Plan::getIsDelete, 1));
-        // todo@ 瀵瑰簲鑺傜偣鍏ㄩ儴鍒犻櫎
+        planService.deletePlanNode(getPlanNodeByPlanId(id).stream().map(PlanNode::getId).collect(Collectors.toList()));
+    }
 
-
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deletePlanNode(List<Long> ids) {
+        if (CollUtil.isNotEmpty(ids)) {
+            planNodeMapper.update(null,
+                    new LambdaUpdateWrapper<PlanNode>()
+                            .in(PlanNode::getId, ids)
+                            .set(PlanNode::getIsDelete, 1));
+        }
     }
 
     @Override
@@ -69,8 +132,11 @@
         IPage<PlanVo> resultPage = planIPage.convert(plan -> BeanUtil.copyProperties(plan, PlanVo.class));
         // 鏂囦欢鑾峰彇
         customerFollowUpFileService.fillAttachment(resultPage.getRecords(), PlanVo::getAttachment, PlanVo::setAttachmentList);
-        // todo@ node 鑺傜偣鑾峰彇
-
+        Map<Long, List<PlanNodeVo>> collect = getPlanNodeByPlanIds(resultPage.getRecords().stream().map(PlanVo::getId).collect(Collectors.toList()))
+                .stream()
+                .map(it -> BeanUtil.copyProperties(it, PlanNodeVo.class))
+                .collect(Collectors.groupingBy(PlanNodeVo::getProjectManagementPlanId, Collectors.toList()));
+        resultPage.getRecords().forEach(planVo -> planVo.setPlanNodeList(collect.getOrDefault(planVo.getId(), Collections.emptyList())));
         return resultPage;
     }
 

--
Gitblit v1.9.3