From 90faa5303c948210cc12795cdb68f3a16ebd17a3 Mon Sep 17 00:00:00 2001
From: buhuazhen <hua100783@gmail.com>
Date: 星期五, 06 三月 2026 16:34:00 +0800
Subject: [PATCH] feat(plan): 新增项目管理计划模块基础功能

---
 src/main/resources/mapper/projectManagement/PlanMapper.xml                  |   30 +++++
 src/main/java/com/ruoyi/projectManagement/vo/PlanVo.java                    |   40 ++++++
 src/main/java/com/ruoyi/projectManagement/pojo/Plan.java                    |   84 ++++++++++++++
 src/main/java/com/ruoyi/projectManagement/vo/SearchPlanVo.java              |   21 +++
 src/main/java/com/ruoyi/projectManagement/service/PlanService.java          |   34 +++++
 src/main/java/com/ruoyi/projectManagement/mapper/PlanMapper.java            |   21 +++
 src/main/java/com/ruoyi/projectManagement/service/impl/PlanServiceImpl.java |   81 +++++++++++++
 src/main/java/com/ruoyi/projectManagement/vo/SavePlanVo.java                |   31 +++++
 8 files changed, 342 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/ruoyi/projectManagement/mapper/PlanMapper.java b/src/main/java/com/ruoyi/projectManagement/mapper/PlanMapper.java
new file mode 100644
index 0000000..3c5d707
--- /dev/null
+++ b/src/main/java/com/ruoyi/projectManagement/mapper/PlanMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.projectManagement.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ruoyi.projectManagement.pojo.Plan;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.projectManagement.vo.SearchPlanVo;
+
+/**
+* @author buhuazhen
+* @description 閽堝琛ㄣ�恜roject_management_plan(椤圭洰绠$悊璁″垝琛�(椤圭洰绠$悊绫诲瀷))銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2026-03-06 15:29:26
+* @Entity generator.domain.ProjectManagementPlan
+*/
+public interface PlanMapper extends BaseMapper<Plan> {
+
+    IPage<Plan> selectPlanPage(SearchPlanVo searchPlanVo);
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/projectManagement/pojo/Plan.java b/src/main/java/com/ruoyi/projectManagement/pojo/Plan.java
new file mode 100644
index 0000000..3fa3a98
--- /dev/null
+++ b/src/main/java/com/ruoyi/projectManagement/pojo/Plan.java
@@ -0,0 +1,84 @@
+package com.ruoyi.projectManagement.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.time.LocalDateTime;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 椤圭洰绠$悊璁″垝琛�(椤圭洰绠$悊绫诲瀷)
+ * @TableName project_management_plan
+ */
+@TableName(value ="project_management_plan")
+@Data
+@ApiModel(description="椤圭洰绠$悊璁″垝琛�(椤圭洰绠$悊绫诲瀷)")
+public class Plan {
+    /**
+     * 
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @ApiModelProperty(value="涓婚敭ID")
+    private Long id;
+
+    /**
+     * 璁″垝鍚嶇О
+     */
+    @TableField(value = "name")
+    @ApiModelProperty(value="璁″垝鍚嶇О")
+    private String name;
+
+    /**
+     * 璁″垝鎻忚堪
+     */
+    @TableField(value = "describe")
+    @ApiModelProperty(value="璁″垝鎻忚堪")
+    private String describe;
+
+    /**
+     * 闄勪欢 ,杩涜鍒嗗壊
+     */
+    @TableField(value = "attachment")
+    @ApiModelProperty(value="闄勪欢")
+    private String attachment;
+
+    /**
+     * 
+     */
+    @TableField(value = "is_delete")
+    @ApiModelProperty(value="鏄惁鍒犻櫎")
+    private Integer isDelete;
+
+    /**
+     * 
+     */
+    @TableField(value = "create_time",fill = FieldFill.INSERT)
+    @ApiModelProperty(value="鍒涘缓鏃堕棿")
+    private LocalDateTime createTime;
+
+    /**
+     * 
+     */
+    @TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value="鏇存柊鏃堕棿")
+    private LocalDateTime updateTime;
+
+    /**
+     * 
+     */
+    @TableField(value = "create_user",fill = FieldFill.INSERT)
+    @ApiModelProperty(value="鍒涘缓浜�")
+    private String createUser;
+
+    /**
+     * 
+     */
+    @TableField(value = "update_user",fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value="鏇存柊浜�")
+    private String updateUser;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/projectManagement/service/PlanService.java b/src/main/java/com/ruoyi/projectManagement/service/PlanService.java
new file mode 100644
index 0000000..7eab7d8
--- /dev/null
+++ b/src/main/java/com/ruoyi/projectManagement/service/PlanService.java
@@ -0,0 +1,34 @@
+package com.ruoyi.projectManagement.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ruoyi.projectManagement.pojo.Plan;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.projectManagement.vo.PlanVo;
+import com.ruoyi.projectManagement.vo.SavePlanVo;
+import com.ruoyi.projectManagement.vo.SearchPlanVo;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+* @author buhuazhen
+* @description 閽堝琛ㄣ�恜roject_management_plan(椤圭洰绠$悊璁″垝琛�(椤圭洰绠$悊绫诲瀷))銆戠殑鏁版嵁搴撴搷浣淪ervice
+* @createDate 2026-03-06 15:29:26
+*/
+public interface PlanService{
+
+    /**
+     * 淇濆瓨椤圭洰绠$悊璁″垝
+     * @param savePlanVo
+     */
+    void savePlan(@NotNull SavePlanVo savePlanVo);
+
+    /**
+     * 鍒犻櫎椤圭洰绠$悊璁″垝
+     * @param id
+     */
+    void deletePlan(@NotNull Long id);
+
+
+    IPage<PlanVo> searchPlan(@NotNull SearchPlanVo searchPlanVo);
+}
diff --git a/src/main/java/com/ruoyi/projectManagement/service/impl/PlanServiceImpl.java b/src/main/java/com/ruoyi/projectManagement/service/impl/PlanServiceImpl.java
new file mode 100644
index 0000000..4262f89
--- /dev/null
+++ b/src/main/java/com/ruoyi/projectManagement/service/impl/PlanServiceImpl.java
@@ -0,0 +1,81 @@
+package com.ruoyi.projectManagement.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ruoyi.basic.service.CustomerFollowUpFileService;
+import com.ruoyi.projectManagement.mapper.PlanMapper;
+import com.ruoyi.projectManagement.pojo.Plan;
+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 lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Collections;
+import java.util.Optional;
+
+/**
+ * @author buhuazhen
+ * @description 椤圭洰绠$悊璁″垝鐨勫疄鐜�
+ * @createDate 2026-03-06 15:29:26
+ */
+@Service
+@RequiredArgsConstructor
+@Transactional(readOnly = true)
+public class PlanServiceImpl implements PlanService {
+
+    private final PlanMapper planMapper;
+
+    private final CustomerFollowUpFileService customerFollowUpFileService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void savePlan(SavePlanVo savePlanVo) {
+        Plan plan = BeanUtil.copyProperties(savePlanVo, Plan.class);
+        // 闄勪欢澶勭悊 , 鎷兼帴
+        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@ 鑺傜偣淇濆瓨
+
+
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deletePlan(Long id) {
+        planMapper.update(null,
+                new LambdaUpdateWrapper<Plan>()
+                        .eq(Plan::getId, id)
+                        .set(Plan::getIsDelete, 1));
+        // todo@ 瀵瑰簲鑺傜偣鍏ㄩ儴鍒犻櫎
+
+
+    }
+
+    @Override
+    public IPage<PlanVo> searchPlan(SearchPlanVo searchPlanVo) {
+        IPage<Plan> planIPage = planMapper.selectPlanPage(searchPlanVo);
+        IPage<PlanVo> resultPage = planIPage.convert(plan -> BeanUtil.copyProperties(plan, PlanVo.class));
+        // 鏂囦欢鑾峰彇
+        customerFollowUpFileService.fillAttachment(resultPage.getRecords(), PlanVo::getAttachment, PlanVo::setAttachmentList);
+        // todo@ node 鑺傜偣鑾峰彇
+
+        return resultPage;
+    }
+
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/projectManagement/vo/PlanVo.java b/src/main/java/com/ruoyi/projectManagement/vo/PlanVo.java
new file mode 100644
index 0000000..9ee78e9
--- /dev/null
+++ b/src/main/java/com/ruoyi/projectManagement/vo/PlanVo.java
@@ -0,0 +1,40 @@
+package com.ruoyi.projectManagement.vo;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.ruoyi.common.vo.SimpleFileVo;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 璁″垝VO
+ * @author buhuazhen
+ * @date 2026/3/6
+ * @email 3038525872@qq.com
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PlanVo implements Serializable {
+
+    private Long id;
+
+    private String name;
+
+    private String describe;
+
+    // 闄勪欢
+    private List<SimpleFileVo> attachmentList;
+
+    @JsonIgnore
+    private String attachment;
+
+    private LocalDateTime createTime;
+
+    private LocalDateTime updateTime;
+
+}
diff --git a/src/main/java/com/ruoyi/projectManagement/vo/SavePlanVo.java b/src/main/java/com/ruoyi/projectManagement/vo/SavePlanVo.java
new file mode 100644
index 0000000..5c79940
--- /dev/null
+++ b/src/main/java/com/ruoyi/projectManagement/vo/SavePlanVo.java
@@ -0,0 +1,31 @@
+package com.ruoyi.projectManagement.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author buhuazhen
+ * @date 2026/3/6
+ * @email 3038525872@qq.com
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class SavePlanVo implements Serializable {
+
+    private Long id;
+    @NotBlank
+    private String name;
+    @NotBlank
+    private String describe;
+
+    private List<String> attachmentIds;
+
+
+
+}
diff --git a/src/main/java/com/ruoyi/projectManagement/vo/SearchPlanVo.java b/src/main/java/com/ruoyi/projectManagement/vo/SearchPlanVo.java
new file mode 100644
index 0000000..d4d4ad0
--- /dev/null
+++ b/src/main/java/com/ruoyi/projectManagement/vo/SearchPlanVo.java
@@ -0,0 +1,21 @@
+package com.ruoyi.projectManagement.vo;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @author buhuazhen
+ * @date 2026/3/6
+ * @email 3038525872@qq.com
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class SearchPlanVo extends Page implements Serializable {
+
+
+}
diff --git a/src/main/resources/mapper/projectManagement/PlanMapper.xml b/src/main/resources/mapper/projectManagement/PlanMapper.xml
new file mode 100644
index 0000000..3578358
--- /dev/null
+++ b/src/main/resources/mapper/projectManagement/PlanMapper.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.projectManagement.mapper.PlanMapper">
+
+    <resultMap id="BaseResultMap" type="com.ruoyi.projectManagement.pojo.Plan">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="name" column="name" jdbcType="VARCHAR"/>
+            <result property="describe" column="describe" jdbcType="VARCHAR"/>
+            <result property="attachment" column="attachment" jdbcType="VARCHAR"/>
+            <result property="is_delete" column="is_delete" jdbcType="INTEGER"/>
+            <result property="create_time" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="update_time" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="create_user" column="create_user" jdbcType="VARCHAR"/>
+            <result property="update_user" column="update_user" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,name,describe,
+        attachment,is_delete,create_time,
+        update_time,create_user,update_user
+    </sql>
+
+    <select id="selectPlanPage" resultMap="BaseResultMap">
+        select t1.*
+        from project_management_plan as t1
+        order by t1.create_time desc
+    </select>
+</mapper>

--
Gitblit v1.9.3