feat:树形数据

This commit is contained in:
2026-01-20 16:16:55 +08:00
parent bbb42cd1e6
commit 53a3b96fd3
11 changed files with 581 additions and 27 deletions

View File

@@ -161,7 +161,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
ProjectRequestVo.RequestDescription req = new ProjectRequestVo.RequestDescription();
BeanUtil.copyProperties(detail, req);
req.setDays(CommonTimeFormatUtil.calculateDaysBetween(req.getStartTime(), req.getEndTime()));
if (ObjectUtil.isEmpty(req.getParentDetailId())) {
if ("0".equals(req.getParentDetailId())) {
requestDescriptions.add(req);
}
for (StageDetail stageDetail : details) {

View File

@@ -16,24 +16,22 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import org.nl.pmm.modular.stagedetail.entity.vo.TreeStageDetailVo;
import org.nl.pmm.modular.stagedetail.param.*;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import org.nl.common.annotation.CommonLog;
import org.nl.common.pojo.CommonResult;
import org.nl.pmm.modular.stagedetail.entity.StageDetail;
import org.nl.pmm.modular.stagedetail.param.StageDetailAddParam;
import org.nl.pmm.modular.stagedetail.param.StageDetailEditParam;
import org.nl.pmm.modular.stagedetail.param.StageDetailIdParam;
import org.nl.pmm.modular.stagedetail.param.StageDetailPageParam;
import org.nl.pmm.modular.stagedetail.service.StageDetailService;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import java.util.List;
import java.util.Map;
/**
* 项目阶段明细控制器
@@ -120,4 +118,24 @@ public class StageDetailController {
public CommonResult<StageDetail> detail(@Valid StageDetailIdParam stageDetailIdParam) {
return CommonResult.data(stageDetailService.detail(stageDetailIdParam));
}
/**
* 查询基础类型
* @param detailTreeParam
* @return
*/
@GetMapping("/pmm/stagedetail/loadClass")
public CommonResult<List<TreeStageDetailVo>> loadClass(StageDetailTreeParam detailTreeParam) {
return CommonResult.data(stageDetailService.loadClass(detailTreeParam));
}
/**
* 获取当前层级以及所有父类层级
* @param detailTreeParam
* @return
*/
@GetMapping("/pmm/stagedetail/superior")
public CommonResult<List<TreeStageDetailVo>> superior(StageDetailTreeParam detailTreeParam) {
return CommonResult.data(stageDetailService.getSuperior(detailTreeParam));
}
}

View File

@@ -0,0 +1,43 @@
package org.nl.pmm.modular.stagedetail.entity.vo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
*
* @author: lyd
* @date: 2026/1/20
*/
@Data
public class TreeStageDetailVo {
/** 明细id */
private String detailId;
/** 阶段id */
private String stageId;
/** 父明细id */
private String parentDetailId;
/** 序号 */
private String seq;
/** 功能模块 */
private String modelName;
/** 功能明细 */
private String modelDetail;
/** 是否为叶子节点 */
private Boolean isLeaf;
/** 子节点 */
private List<TreeStageDetailVo> children;
}

View File

@@ -14,6 +14,10 @@ package org.nl.pmm.modular.stagedetail.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.nl.pmm.modular.stagedetail.entity.StageDetail;
import org.nl.pmm.modular.stagedetail.entity.vo.TreeStageDetailVo;
import org.nl.pmm.modular.stagedetail.param.StageDetailTreeParam;
import java.util.List;
/**
* 项目阶段明细Mapper接口
@@ -22,4 +26,8 @@ import org.nl.pmm.modular.stagedetail.entity.StageDetail;
* @date 2025/11/17 20:34
**/
public interface StageDetailMapper extends BaseMapper<StageDetail> {
/**
* 树形加载
*/
List<TreeStageDetailVo> loadClass(StageDetailTreeParam detailTreeParam);
}

View File

@@ -2,4 +2,27 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.nl.pmm.modular.stagedetail.mapper.StageDetailMapper">
<select id="loadClass" parameterType="org.nl.pmm.modular.stagedetail.param.StageDetailTreeParam"
resultType="org.nl.pmm.modular.stagedetail.entity.vo.TreeStageDetailVo">
select
detail_id as detailId,
stage_id as stageId,
parent_detail_id as parentDetailId,
seq,
model_name as modelName,
model_detail as modelDetail,
case
when exists(select 1 from pmm_stage_detail psd where psd.parent_detail_id = pmm_stage_detail.detail_id)
then false else true end as isLeaf
from pmm_stage_detail
where stage_id = #{stageId}
<if test="parentDetailId == null or parentDetailId == ''">
and parent_detail_id is null
</if>
<if test="parentDetailId != null and parentDetailId != ''">
and parent_detail_id = #{parentDetailId}
</if>
order by seq, detail_id
</select>
</mapper>

View File

@@ -12,13 +12,14 @@
*/
package org.nl.pmm.modular.stagedetail.param;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fhs.core.trans.anno.Trans;
import com.fhs.core.trans.constant.TransType;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Date;
/**
@@ -71,4 +72,36 @@ public class StageDetailAddParam {
@Schema(description = "结束时间")
private Date endTime;
/** 创建时间 */
@Schema(description = "创建时间")
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/** 创建人 */
@Schema(description = "创建人")
@TableField(fill = FieldFill.INSERT)
@Trans(type = TransType.RPC, targetClassName = "org.nl.sys.modular.user.entity.SysUser", fields = "name", alias = "createUser", ref = "createUserName")
private String createUser;
/** 创建人名称 */
@Schema(description = "创建人名称")
@TableField(exist = false)
private String createUserName;
/** 更新时间 */
@Schema(description = "更新时间")
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
/** 更新人 */
@Schema(description = "更新人")
@TableField(fill = FieldFill.UPDATE)
@Trans(type = TransType.RPC, targetClassName = "org.nl.sys.modular.user.entity.SysUser", fields = "name", alias = "updateUser", ref = "updateUserName")
private String updateUser;
/** 更新人名称 */
@Schema(description = "更新人名称")
@TableField(exist = false)
private String updateUserName;
}

View File

@@ -0,0 +1,21 @@
package org.nl.pmm.modular.stagedetail.param;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
*
* @author: lyd
* @date: 2026/1/20
*/
@Data
public class StageDetailTreeParam {
/** 阶段id */
@Schema(description = "阶段id")
private String stageId;
/** 父明细id */
@Schema(description = "父明细id")
private String parentDetailId;
}

View File

@@ -15,10 +15,8 @@ package org.nl.pmm.modular.stagedetail.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.pmm.modular.stagedetail.entity.StageDetail;
import org.nl.pmm.modular.stagedetail.param.StageDetailAddParam;
import org.nl.pmm.modular.stagedetail.param.StageDetailEditParam;
import org.nl.pmm.modular.stagedetail.param.StageDetailIdParam;
import org.nl.pmm.modular.stagedetail.param.StageDetailPageParam;
import org.nl.pmm.modular.stagedetail.entity.vo.TreeStageDetailVo;
import org.nl.pmm.modular.stagedetail.param.*;
import java.util.List;
@@ -79,4 +77,13 @@ public interface StageDetailService extends IService<StageDetail> {
StageDetail queryEntity(String id);
List<StageDetail> getByStageId(String stageId);
/**
* 获取当前父类的所有下一子集数据
* @param detailTreeParam
* @return
*/
List<TreeStageDetailVo> loadClass(StageDetailTreeParam detailTreeParam);
List<TreeStageDetailVo> getSuperior(StageDetailTreeParam detailTreeParam);
}

View File

@@ -20,6 +20,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.nl.pmm.modular.stagedetail.entity.vo.TreeStageDetailVo;
import org.nl.pmm.modular.stagedetail.param.*;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.nl.common.enums.CommonSortOrderEnum;
@@ -27,10 +29,6 @@ import org.nl.common.exception.CommonException;
import org.nl.common.page.CommonPageRequest;
import org.nl.pmm.modular.stagedetail.entity.StageDetail;
import org.nl.pmm.modular.stagedetail.mapper.StageDetailMapper;
import org.nl.pmm.modular.stagedetail.param.StageDetailAddParam;
import org.nl.pmm.modular.stagedetail.param.StageDetailEditParam;
import org.nl.pmm.modular.stagedetail.param.StageDetailIdParam;
import org.nl.pmm.modular.stagedetail.param.StageDetailPageParam;
import org.nl.pmm.modular.stagedetail.service.StageDetailService;
import java.util.List;
@@ -100,4 +98,21 @@ public class StageDetailServiceImpl extends ServiceImpl<StageDetailMapper, Stage
.orderByAsc(StageDetail::getSeq);
return list(lam);
}
@Override
public List<TreeStageDetailVo> loadClass(StageDetailTreeParam detailTreeParam) {
return this.baseMapper.loadClass(detailTreeParam);
}
/**
* 获取当前对应父节点的所有子节点,以及所有的父节点数据
* <p>例当前是顶层则返回所有当前stageId的顶层parentDetailId
* 如果当前是第三层则获取当前节点的所有同父节点的数据以及所有第二层和所有第一层并且保持上下级关系子节点放到children字段中。
* @param detailTreeParam
* @return
*/
@Override
public List<TreeStageDetailVo> getSuperior(StageDetailTreeParam detailTreeParam) {
return List.of();
}
}