buhuazhen
8 天以前 90faa5303c948210cc12795cdb68f3a16ebd17a3
feat(plan): 新增项目管理计划模块基础功能

- 添加项目管理计划实体Plan及数据库映射配置
- 创建PlanMapper接口及对应的MyBatis XML映射文件,实现分页查询
- 实现PlanService接口及其实现类PlanServiceImpl,支持计划的保存、删除和查询
- 定义PlanVo、SavePlanVo和SearchPlanVo数据传输对象,支持请求和响应的数据结构
- 集成附件字段处理,支持附件ID列表转换及附件列表回填
- 添加基本的逻辑删除功能,删除时标记isDelete字段
- 添加基本的事务管理和代码结构优化
- 实现分页查询功能并转换为PlanVo返回用户
已添加8个文件
342 ■■■■■ 文件已修改
src/main/java/com/ruoyi/projectManagement/mapper/PlanMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/pojo/Plan.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/service/PlanService.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/service/impl/PlanServiceImpl.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/vo/PlanVo.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/vo/SavePlanVo.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/vo/SearchPlanVo.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/projectManagement/PlanMapper.xml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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 é’ˆå¯¹è¡¨ã€project_management_plan(项目管理计划表(项目管理类型))】的数据库操作Mapper
* @createDate 2026-03-06 15:29:26
* @Entity generator.domain.ProjectManagementPlan
*/
public interface PlanMapper extends BaseMapper<Plan> {
    IPage<Plan> selectPlanPage(SearchPlanVo searchPlanVo);
}
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;
}
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 é’ˆå¯¹è¡¨ã€project_management_plan(项目管理计划表(项目管理类型))】的数据库操作Service
* @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);
}
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;
    }
}
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;
}
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;
}
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 {
}
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>