diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/ProgressBigScreenController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/ProgressBigScreenController.java new file mode 100644 index 00000000..caf962be --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/ProgressBigScreenController.java @@ -0,0 +1,77 @@ +package org.dromara.bigscreen.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import jakarta.annotation.Resource; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.bigscreen.domain.dto.ProjectImageProgressDetailReq; +import org.dromara.bigscreen.domain.progress.DesignProgressVo; +import org.dromara.bigscreen.domain.progress.MilestoneProgressVo; +import org.dromara.bigscreen.domain.progress.ProjectTotalProgressVo; +import org.dromara.bigscreen.domain.vo.ProjectImageProgressDetailVo; +import org.dromara.bigscreen.service.ProgressBigScreenService; +import org.dromara.bigscreen.service.ProjectBigScreenService; +import org.dromara.common.core.domain.R; +import org.dromara.common.web.core.BaseController; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 进度管理大屏接口 + * + * @author lilemy + * @date 2025-12-15 11:35 + */ +@SaIgnore +@Validated +@RestController +@RequiredArgsConstructor +@RequestMapping("/progress/big/screen") +public class ProgressBigScreenController extends BaseController { + + @Resource + private ProgressBigScreenService progressBigScreenService; + + @Resource + private ProjectBigScreenService projectBigScreenService; + + /** + * 获取项目总进度 + */ + @GetMapping("/projectTotalProgress/{projectId}") + public R getProjectTotalProgress(@NotNull(message = "项目主键不能为空") + @PathVariable Long projectId) { + return R.ok(progressBigScreenService.getProjectTotalProgress(projectId)); + } + + /** + * 获取里程碑进度 + */ + @GetMapping("/milestoneProgress/{projectId}") + public R> getMilestoneProgress(@NotNull(message = "项目主键不能为空") + @PathVariable Long projectId) { + return R.ok(progressBigScreenService.getMilestoneProgress(projectId)); + } + + /** + * 获取设计进度 + */ + @GetMapping("/designProgress/{projectId}") + public R getDesignProgress(@NotNull(message = "项目主键不能为空") + @PathVariable Long projectId) { + return R.ok(progressBigScreenService.getDesignProgress(projectId)); + } + + /** + * 获取施工进度详情 + */ + @GetMapping("/constructionProgress/detail") + public R> getProjectImageProgressDetail(@Validated ProjectImageProgressDetailReq req) { + return R.ok(projectBigScreenService.getProjectImageProgressDetail(req)); + } +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/progress/DesignProgressMajorVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/progress/DesignProgressMajorVo.java new file mode 100644 index 00000000..829b35aa --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/progress/DesignProgressMajorVo.java @@ -0,0 +1,27 @@ +package org.dromara.bigscreen.domain.progress; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * @author lilemy + * @date 2025-12-15 17:30 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DesignProgressMajorVo { + + /** + * 专业名称 + */ + private String majorName; + + /** + * 完成率 + */ + private BigDecimal completionRate; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/progress/DesignProgressVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/progress/DesignProgressVo.java new file mode 100644 index 00000000..55b717d4 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/progress/DesignProgressVo.java @@ -0,0 +1,94 @@ +package org.dromara.bigscreen.domain.progress; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * @author lilemy + * @date 2025-12-15 17:07 + */ +@Data +public class DesignProgressVo implements Serializable { + + @Serial + private static final long serialVersionUID = 379443600182489913L; + + /** + * 总设计任务进度 + */ + private Long totalDesignProgress; + + /** + * 当前设计任务进度 + */ + private Long currentDesignProgress; + + /** + * 设计任务进度趋势 + */ + private Boolean designProgressTrend; + + /** + * 设计任务进度环比 + */ + private BigDecimal designProgressRate; + + /** + * 总设计 + */ + private Long totalDesign; + + /** + * 已审核设计 + */ + private Long reviewedDesign; + + /** + * 已审核设计进度趋势 + */ + private Boolean reviewedDesignTrend; + + /** + * 已审核设计进度环比 + */ + private BigDecimal reviewedDesignRate; + + /** + * 待审核设计 + */ + private Long pendingDesignReview; + + /** + * 待审核设计进度趋势 + */ + private Boolean pendingDesignReviewTrend; + + /** + * 待审核设计进度环比 + */ + private BigDecimal pendingDesignReviewRate; + + /** + * 已逾期设计 + */ + private Long delayedDesign; + + /** + * 已逾期设计进度趋势 + */ + private Boolean delayedDesignTrend; + + /** + * 已逾期设计进度环比 + */ + private BigDecimal delayedDesignRate; + + /** + * 设计专业详情 + */ + List majorList; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/progress/MilestoneProgressVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/progress/MilestoneProgressVo.java new file mode 100644 index 00000000..0465b6f9 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/progress/MilestoneProgressVo.java @@ -0,0 +1,64 @@ +package org.dromara.bigscreen.domain.progress; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDate; + +/** + * @author lilemy + * @date 2025-12-15 16:15 + */ +@Data +public class MilestoneProgressVo implements Serializable { + + @Serial + private static final long serialVersionUID = 5731146976460407811L; + + /** + * 主键 ID + */ + private Long id; + + /** + * 节点名称 + */ + private String nodeName; + + /** + * 对应项目结构 + */ + private Long projectStructure; + + /** + * 对应项目结构名称 + */ + private String projectStructureName; + + /** + * 预计开始时间 + */ + private LocalDate planStartDate; + + /** + * 预计结束时间 + */ + private LocalDate planEndDate; + + /** + * 实际开始时间 + */ + private LocalDate practicalStartDate; + + /** + * 实际结束时间 + */ + private LocalDate practicalEndDate; + + /** + * 当前进度 + */ + private BigDecimal currentProgress; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/progress/ProjectTotalProgressDetailVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/progress/ProjectTotalProgressDetailVo.java new file mode 100644 index 00000000..50ff1f1b --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/progress/ProjectTotalProgressDetailVo.java @@ -0,0 +1,37 @@ +package org.dromara.bigscreen.domain.progress; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * @author lilemy + * @date 2025-12-15 14:40 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ProjectTotalProgressDetailVo { + + /** + * 名称 + */ + private String name; + + /** + * 实际进度 + */ + private BigDecimal actualProgress; + + /** + * 计划进度 + */ + private BigDecimal planProgress; + + /** + * 完成率 + */ + private BigDecimal completionRate; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/progress/ProjectTotalProgressVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/progress/ProjectTotalProgressVo.java new file mode 100644 index 00000000..82fad871 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/progress/ProjectTotalProgressVo.java @@ -0,0 +1,49 @@ +package org.dromara.bigscreen.domain.progress; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * @author lilemy + * @date 2025-12-15 14:23 + */ +@Data +public class ProjectTotalProgressVo implements Serializable { + + @Serial + private static final long serialVersionUID = -5706098940478706815L; + + /** + * 总进度 + */ + private BigDecimal totalProgress; + + /** + * 总计划工期(天) + */ + private Long totalPlannedDuration; + + /** + * 当前计划工期(天) + */ + private Long currentPlannedDuration; + + /** + * 总完成情况(万元) + */ + private BigDecimal totalCompletionAmount; + + /** + * 当前完成情况(万元) + */ + private BigDecimal currentCompletionAmount; + + /** + * 详情 + */ + private List detailList; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/ProgressBigScreenService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/ProgressBigScreenService.java new file mode 100644 index 00000000..e2f749f9 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/ProgressBigScreenService.java @@ -0,0 +1,38 @@ +package org.dromara.bigscreen.service; + +import org.dromara.bigscreen.domain.progress.DesignProgressVo; +import org.dromara.bigscreen.domain.progress.MilestoneProgressVo; +import org.dromara.bigscreen.domain.progress.ProjectTotalProgressVo; + +import java.util.List; + +/** + * @author lilemy + * @date 2025-12-15 14:18 + */ +public interface ProgressBigScreenService { + + /** + * 获取项目总进度 + * + * @param projectId 项目 id + * @return 项目总进度 + */ + ProjectTotalProgressVo getProjectTotalProgress(Long projectId); + + /** + * 获取里程碑进度 + * + * @param projectId 项目 id + * @return 里程碑进度 + */ + List getMilestoneProgress(Long projectId); + + /** + * 获取设计进度 + * + * @param projectId 项目 id + * @return 设计进度 + */ + DesignProgressVo getDesignProgress(Long projectId); +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/ProgressBigScreenServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/ProgressBigScreenServiceImpl.java new file mode 100644 index 00000000..f453d5b9 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/ProgressBigScreenServiceImpl.java @@ -0,0 +1,295 @@ +package org.dromara.bigscreen.service.impl; + +import cn.hutool.core.collection.CollUtil; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.dromara.bigscreen.domain.progress.*; +import org.dromara.bigscreen.service.ProgressBigScreenService; +import org.dromara.common.core.enums.BusinessStatusEnum; +import org.dromara.common.utils.BigDecimalUtil; +import org.dromara.design.domain.DesVolumeCatalog; +import org.dromara.design.domain.DesVolumeFile; +import org.dromara.design.service.IDesVolumeCatalogService; +import org.dromara.design.service.IDesVolumeFileService; +import org.dromara.progress.constant.PgsProgressCategoryConstant; +import org.dromara.progress.domain.PgsConstructionSchedulePlan; +import org.dromara.progress.domain.PgsProgressCategory; +import org.dromara.progress.domain.dto.progressplan.PgsProgressPlanQueryReq; +import org.dromara.progress.domain.vo.progresscategory.PgsProgressCategoryValueTotalVo; +import org.dromara.progress.domain.vo.progressplan.PgsProgressPlanDateVo; +import org.dromara.progress.service.IPgsConstructionSchedulePlanService; +import org.dromara.progress.service.IPgsProgressCategoryService; +import org.dromara.progress.service.IPgsProgressPlanService; +import org.dromara.project.domain.BusProject; +import org.dromara.project.service.IBusProjectService; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.service.ISysDictDataService; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author lilemy + * @date 2025-12-15 14:18 + */ +@Slf4j +@Service +public class ProgressBigScreenServiceImpl implements ProgressBigScreenService { + + @Resource + private IBusProjectService projectService; + + @Resource + private IPgsProgressCategoryService progressCategoryService; + + @Resource + private IPgsProgressPlanService progressPlanService; + + @Resource + private IPgsConstructionSchedulePlanService constructionSchedulePlanService; + + @Resource + private IDesVolumeCatalogService volumeCatalogService; + + @Resource + private IDesVolumeFileService volumeFileService; + + @Resource + private ISysDictDataService dictDataService; + + /** + * 获取项目总进度 + * + * @param projectId 项目 id + * @return 项目总进度 + */ + @Override + public ProjectTotalProgressVo getProjectTotalProgress(Long projectId) { + ProjectTotalProgressVo vo = new ProjectTotalProgressVo(); + // 获取项目和项目子项 + BusProject project = projectService.getById(projectId); + if (project == null) { + return vo; + } + List projects = projectService.lambdaQuery() + .eq(BusProject::getPId, projectId) + .list(); + projects.add(project); + List projectIds = projects.stream().map(BusProject::getId).toList(); + // 获取当前项目所有父级类别 + List topList = progressCategoryService.lambdaQuery() + .in(PgsProgressCategory::getProjectId, projectIds) + .eq(PgsProgressCategory::getParentId, PgsProgressCategoryConstant.TOP_PARENT_ID) + .list(); + if (CollUtil.isEmpty(topList)) { + return vo; + } + List topIds = topList.stream().map(PgsProgressCategory::getId).toList(); + List children = progressCategoryService.getLeafNodesByTopIds(topIds); + BigDecimal completedPercentage = progressCategoryService.getCompletedPercentage(children); + vo.setTotalProgress(completedPercentage); + // 获取总计划工期 + PgsProgressPlanQueryReq queryDate = new PgsProgressPlanQueryReq(); + queryDate.setProjectId(projectId); + PgsProgressPlanDateVo dateVo = progressPlanService.queryDate(queryDate); + if (dateVo != null && dateVo.getStartDate() != null && dateVo.getEndDate() != null) { + LocalDate startDate = dateVo.getStartDate(); + LocalDate endDate = dateVo.getEndDate(); + LocalDate now = LocalDate.now(); + long totalDays = ChronoUnit.DAYS.between(startDate, endDate); + vo.setTotalPlannedDuration(totalDays); + if (now.isAfter(endDate)) { + vo.setCurrentPlannedDuration(totalDays); + } else if (now.isBefore(startDate)) { + vo.setCurrentPlannedDuration(0L); + } else { + vo.setCurrentPlannedDuration(ChronoUnit.DAYS.between(startDate, now) + 1); + } + } + // 获取整体完成情况 + PgsProgressCategoryValueTotalVo valueTotal = progressCategoryService.getValueTotal(children, true); + vo.setTotalCompletionAmount(valueTotal.getTotalValue()); + vo.setCurrentCompletionAmount(valueTotal.getCurrentValue()); + // 获取详情 + Map> nameMap = topList.stream() + .collect(Collectors.groupingBy(PgsProgressCategory::getName)); + List detailList = new ArrayList<>(); + for (Map.Entry> entry : nameMap.entrySet()) { + ProjectTotalProgressDetailVo detailVo = new ProjectTotalProgressDetailVo(); + String name = entry.getKey(); + detailVo.setName(name); + List value = entry.getValue(); + List top = value.stream().map(PgsProgressCategory::getId).toList(); + List nameChildren = progressCategoryService.getLeafNodesByTopIds(top, children); + BigDecimal completedTotal = nameChildren.stream().map(PgsProgressCategory::getCompleted) + .reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal planTotal = nameChildren.stream().map(PgsProgressCategory::getPlanTotal) + .reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal total = nameChildren.stream().map(PgsProgressCategory::getTotal) + .reduce(BigDecimal.ZERO, BigDecimal::add); + detailVo.setActualProgress(completedTotal); + detailVo.setPlanProgress(planTotal); + detailVo.setCompletionRate(BigDecimalUtil.toPercentage(completedTotal, total)); + detailList.add(detailVo); + } + vo.setDetailList(detailList); + return vo; + } + + /** + * 获取里程碑进度 + * + * @param projectId 项目 id + * @return 里程碑进度 + */ + @Override + public List getMilestoneProgress(Long projectId) { + List voList = new ArrayList<>(); + List planList = constructionSchedulePlanService.lambdaQuery() + .eq(PgsConstructionSchedulePlan::getProjectId, projectId) + .list(); + if (CollUtil.isEmpty(planList)) { + return voList; + } + List topList = planList.stream().filter(plan -> plan.getParentId().equals(0L)).toList(); + return topList.stream().map(plan -> { + MilestoneProgressVo vo = new MilestoneProgressVo(); + BeanUtils.copyProperties(plan, vo); + // 获取子节点 + List allChildren = constructionSchedulePlanService.getAllChildren(plan.getId(), planList); + long count = allChildren.stream().filter(child -> child.getStatus().equals("4")).count(); + BigDecimal percentage = BigDecimalUtil.toPercentage(new BigDecimal(count), new BigDecimal(allChildren.size())); + vo.setCurrentProgress(percentage); + return vo; + }).toList(); + } + + /** + * 获取设计进度 + * + * @param projectId 项目 id + * @return 设计进度 + */ + @Override + public DesignProgressVo getDesignProgress(Long projectId) { + DesignProgressVo vo = new DesignProgressVo(); + List catalogList = volumeCatalogService.lambdaQuery() + .eq(DesVolumeCatalog::getProjectId, projectId).list(); + if (CollUtil.isEmpty(catalogList)) { + return vo; + } + LocalDate nowDate = LocalDate.now(); + long currentDesignProgress = 0L; + BigDecimal designProgressThisM = BigDecimal.ZERO; + BigDecimal designProgressLastM = BigDecimal.ZERO; + long currentDelay = 0L; + BigDecimal delayThisD = BigDecimal.ZERO; + BigDecimal delayLastD = BigDecimal.ZERO; + // 总数量 + vo.setTotalDesignProgress((long) catalogList.size()); + LocalDateTime firstDayOfMonth = LocalDateTime.now().withDayOfMonth(1).with(LocalTime.MIN); + LocalDateTime lastMonthFirstDay = LocalDateTime.now().minusMonths(1).withDayOfMonth(1).with(LocalTime.MIN); + for (DesVolumeCatalog catalog : catalogList) { + // 已出图状态 + if (catalog.getDesignState().equals("1")) { + currentDesignProgress++; + // 获取当月和上月的完成数量 + LocalDateTime finishTime = catalog.getFinishTime(); + if (finishTime != null) { + if (finishTime.isAfter(firstDayOfMonth)) { + designProgressThisM = designProgressThisM.add(BigDecimal.ONE); + } else if (finishTime.isBefore(lastMonthFirstDay)) { + designProgressLastM = designProgressLastM.add(BigDecimal.ONE); + } + } + } else if (!catalog.getPlannedCompletion().isAfter(nowDate) && catalog.getDesignState().equals("2")) { + currentDelay++; + if (catalog.getPlannedCompletion().isEqual(nowDate)) { + delayThisD = delayThisD.add(BigDecimal.ONE); + } else if (catalog.getPlannedCompletion().isEqual(nowDate.minusDays(1))) { + delayLastD = delayLastD.add(BigDecimal.ONE); + } + } + } + // 计算完成情况 + vo.setCurrentDesignProgress(currentDesignProgress); + vo.setDesignProgressTrend(designProgressThisM.compareTo(designProgressLastM) >= 0); + vo.setDesignProgressRate(BigDecimalUtil.toLoopPercentage(designProgressThisM, designProgressLastM)); + // 总逾期数量 + vo.setDelayedDesign(currentDelay); + vo.setDelayedDesignTrend(delayThisD.compareTo(delayLastD) >= 0); + vo.setDelayedDesignRate(BigDecimalUtil.toLoopPercentage(delayThisD, delayLastD)); + // 获取各专业完成情况 + List majorList = new ArrayList<>(); + Map> specialtyMap = catalogList.stream() + .collect(Collectors.groupingBy(DesVolumeCatalog::getSpecialty)); + List desUserMajor = dictDataService.selectByDictType("des_user_major"); + if (CollUtil.isEmpty(desUserMajor)) { + log.error("专业字典 des_user_major 数据不存在"); + } else { + Map dictMap = desUserMajor.stream() + .collect(Collectors.toMap(SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel)); + specialtyMap.forEach((specialty, list) -> { + DesignProgressMajorVo majorVo = new DesignProgressMajorVo(); + majorVo.setMajorName(dictMap.getOrDefault(specialty, specialty)); + BigDecimal total = new BigDecimal(list.size()); + long count = list.stream().filter(catalog -> catalog.getDesignState().equals("1")).count(); + majorVo.setCompletionRate(BigDecimalUtil.toPercentage(new BigDecimal(count), total)); + majorList.add(majorVo); + }); + } + vo.setMajorList(majorList); + // 审核信息 + Set ids = catalogList.stream().map(DesVolumeCatalog::getDesign).collect(Collectors.toSet()); + List fileList = volumeFileService.lambdaQuery() + .in(DesVolumeFile::getVolumeCatalogId, ids) + .list(); + long reviewedDesign = 0L; + BigDecimal reviewedDesignThisM = BigDecimal.ZERO; + BigDecimal reviewedDesignLastM = BigDecimal.ZERO; + long pendingReviewDesign = 0L; + BigDecimal pendingReviewDesignThisD = BigDecimal.ZERO; + BigDecimal pendingReviewDesignLastD = BigDecimal.ZERO; + for (DesVolumeFile file : fileList) { + String status = file.getStatus(); + if (BusinessStatusEnum.FINISH.getStatus().equals(status)) { + reviewedDesign++; + // 获取当月和上月的完成数量 + LocalDateTime finishTime = file.getFinishTime(); + if (finishTime != null) { + if (finishTime.isAfter(firstDayOfMonth)) { + reviewedDesignThisM = reviewedDesignThisM.add(BigDecimal.ONE); + } else if (finishTime.isBefore(lastMonthFirstDay)) { + reviewedDesignLastM = reviewedDesignLastM.add(BigDecimal.ONE); + } + } + } else if (BusinessStatusEnum.WAITING.getStatus().equals(status)) { + pendingReviewDesign++; + Date createTime = file.getCreateTime(); + LocalDate createDate = createTime.toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDate(); + if (createDate.isEqual(nowDate)) { + pendingReviewDesignThisD = pendingReviewDesignThisD.add(BigDecimal.ONE); + } else if (createDate.isEqual(nowDate.minusDays(1))) { + pendingReviewDesignLastD = pendingReviewDesignLastD.add(BigDecimal.ONE); + } + } + } + vo.setReviewedDesign(reviewedDesign); + vo.setReviewedDesignTrend(reviewedDesignThisM.compareTo(reviewedDesignLastM) >= 0); + vo.setReviewedDesignRate(BigDecimalUtil.toLoopPercentage(reviewedDesignThisM, reviewedDesignLastM)); + vo.setPendingDesignReview(pendingReviewDesign); + vo.setPendingDesignReviewTrend(pendingReviewDesignThisD.compareTo(pendingReviewDesignLastD) >= 0); + vo.setPendingDesignReviewRate(BigDecimalUtil.toLoopPercentage(pendingReviewDesignThisD, pendingReviewDesignLastD)); + return vo; + } +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/ProjectBigScreenServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/ProjectBigScreenServiceImpl.java index 95c9e4ab..6896bb4e 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/ProjectBigScreenServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/ProjectBigScreenServiceImpl.java @@ -370,7 +370,7 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService { // 如果有叶子节点,统计进度和状态;否则初始化为未完成 if (CollUtil.isNotEmpty(leafNodesByTopIds)) { topVo.setProgressTotal(progressCategoryService.getCompletedPercentage(leafNodesByTopIds)); - topVo.setValueTotal(progressCategoryService.getValueTotal(leafNodesByTopIds, true)); + topVo.setValueTotal(progressCategoryService.getValueTotal(leafNodesByTopIds, true).getCurrentValue()); } else { topVo.setProgressTotal(BigDecimal.ZERO); topVo.setValueTotal(BigDecimal.ZERO); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/common/utils/BigDecimalUtil.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/common/utils/BigDecimalUtil.java index 53307861..228d03c3 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/common/utils/BigDecimalUtil.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/common/utils/BigDecimalUtil.java @@ -25,4 +25,24 @@ public class BigDecimalUtil { .divide(divisor, 2, RoundingMode.HALF_UP); } + /** + * 计算环比 = (本次 - 上次) / 上次 × 100% 的绝对值 + * + * @param thisNum 本次数量 + * @param lastNum 上次数量 + * @return 环比 = (本次 - 上次) / 上次 × 100% 的绝对值 + */ + public static BigDecimal toLoopPercentage(BigDecimal thisNum, BigDecimal lastNum) { + if (thisNum == null || lastNum == null) { + return BigDecimal.valueOf(0.00); + } + if (lastNum.compareTo(BigDecimal.ZERO) == 0) { + return BigDecimal.valueOf(100.00); + } + return thisNum.subtract(lastNum) + .multiply(new BigDecimal("100")) + .divide(lastNum, 2, RoundingMode.HALF_UP) + .abs(); + } + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/DesVolumeCatalog.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/DesVolumeCatalog.java index 5cbd5ac0..8251d609 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/DesVolumeCatalog.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/DesVolumeCatalog.java @@ -8,6 +8,7 @@ import org.dromara.common.mybatis.core.domain.BaseEntity; import java.io.Serial; import java.time.LocalDate; +import java.time.LocalDateTime; /** * 卷册目录对象 des_volume_catalog @@ -74,6 +75,11 @@ public class DesVolumeCatalog extends BaseEntity { */ private LocalDate plannedCompletion; + /** + * 实际完成时间 + */ + private LocalDateTime finishTime; + /** * 状态(字典) */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/DesVolumeFile.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/DesVolumeFile.java index fe3c3b03..3bb5ee4a 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/DesVolumeFile.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/DesVolumeFile.java @@ -1,11 +1,13 @@ package org.dromara.design.domain; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; import java.io.Serial; +import java.time.LocalDateTime; /** * 卷册文件对象 des_volume_file @@ -28,7 +30,6 @@ public class DesVolumeFile extends BaseEntity { public static final String WASTE = "4"; - /** * 主键ID */ @@ -80,4 +81,9 @@ public class DesVolumeFile extends BaseEntity { */ private String auditStatus; + /** + * 实际完成时间 + */ + private LocalDateTime finishTime; + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/vo/volumecatalog/DesVolumeCatalogVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/vo/volumecatalog/DesVolumeCatalogVo.java index 1ddda84e..e61959cc 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/vo/volumecatalog/DesVolumeCatalogVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/vo/volumecatalog/DesVolumeCatalogVo.java @@ -89,6 +89,11 @@ public class DesVolumeCatalogVo implements Serializable { */ private LocalDate plannedCompletion; + /** + * 实际完成时间 + */ + private LocalDateTime finishTime; + /** * 状态(字典) */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/vo/volumefile/DesVolumeFileVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/vo/volumefile/DesVolumeFileVo.java index a9e911e5..a8ae1021 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/vo/volumefile/DesVolumeFileVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/vo/volumefile/DesVolumeFileVo.java @@ -6,6 +6,7 @@ import org.dromara.design.domain.DesVolumeFile; import java.io.Serial; import java.io.Serializable; +import java.time.LocalDateTime; /** @@ -76,6 +77,11 @@ public class DesVolumeFileVo implements Serializable { */ private String auditStatus; + /** + * 实际完成时间 + */ + private LocalDateTime finishTime; + /** * 是否弹窗 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/service/impl/DesVolumeFileServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/service/impl/DesVolumeFileServiceImpl.java index 9550739a..f665bd02 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/service/impl/DesVolumeFileServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/service/impl/DesVolumeFileServiceImpl.java @@ -12,7 +12,6 @@ import io.micrometer.common.util.StringUtils; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.HttpStatus; -import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.event.ProcessDeleteEvent; import org.dromara.common.core.domain.event.ProcessEvent; import org.dromara.common.core.domain.event.ProcessTaskEvent; @@ -48,8 +47,8 @@ import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.*; -import java.util.stream.Collectors; /** * 卷册文件Service业务层处理 @@ -602,9 +601,12 @@ public class DesVolumeFileServiceImpl extends ServiceImpllambdaUpdate() .set(DesVolumeCatalog::getDesignState, "1") + .set(DesVolumeCatalog::getFinishTime, LocalDateTime.now()) .eq(DesVolumeCatalog::getDesign, desVolumeFile.getVolumeCatalogId()) ); //异步处理二维码 diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/ys7/IncSyncYs7DeviceData.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/ys7/IncSyncYs7DeviceData.java index baaf60d1..db3339fb 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/ys7/IncSyncYs7DeviceData.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/ys7/IncSyncYs7DeviceData.java @@ -43,18 +43,17 @@ public class IncSyncYs7DeviceData { } } - //同步摄像头全天录像开关状态 - // 每 1 分钟执行一次 + //同步摄像头全天录像开关状态 每 1 天执行一次 @Scheduled(cron = "1 0 0 * * ?") // @Scheduled(cron = "0 */10 * * * ?") public void getEnable() { - log.info("定时同步摄像头设备数据"); + log.info("定时同步摄像头全天录像开关状态"); List ys7DeviceList = ys7DeviceService.getBaseMapper().selectList(new LambdaQueryWrapper().orderByDesc(OthYs7Device::getCreateTime)); Boolean result = ys7DeviceService.saveOrUpdateEnableByDeviceList(ys7DeviceList); if (result) { - log.info("定时同步摄像头设备数据成功"); + log.info("定时同步摄像头全天录像开关状态成功"); } else { - log.info("没有需要定时同步的设备"); + log.info("没有需要定时同步的摄像头全天录像开关状态"); } } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/other/domain/OthYs7Device.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/other/domain/OthYs7Device.java index 22a3b643..e50131b2 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/other/domain/OthYs7Device.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/other/domain/OthYs7Device.java @@ -111,6 +111,11 @@ public class OthYs7Device implements Serializable { */ private String detail; + /** + * 排序 + */ + private Integer sortData; + /** * 备注 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/other/domain/dto/ys7device/OthYs7DeviceUpdateReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/other/domain/dto/ys7device/OthYs7DeviceUpdateReq.java index b30d84b4..eb559663 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/other/domain/dto/ys7device/OthYs7DeviceUpdateReq.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/other/domain/dto/ys7device/OthYs7DeviceUpdateReq.java @@ -40,6 +40,11 @@ public class OthYs7DeviceUpdateReq implements Serializable { */ private String detail; + /** + * 排序 + */ + private Integer sortData; + /** * 备注 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/other/domain/vo/ys7device/OthYs7DeviceVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/other/domain/vo/ys7device/OthYs7DeviceVo.java index 84a57db3..bdaf0758 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/other/domain/vo/ys7device/OthYs7DeviceVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/other/domain/vo/ys7device/OthYs7DeviceVo.java @@ -97,6 +97,11 @@ public class OthYs7DeviceVo implements Serializable { */ private String detail; + /** + * 排序 + */ + private Integer sortData; + /** * 备注 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/other/service/impl/OthYs7DeviceServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/other/service/impl/OthYs7DeviceServiceImpl.java index 5e16777e..fd478665 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/other/service/impl/OthYs7DeviceServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/other/service/impl/OthYs7DeviceServiceImpl.java @@ -290,6 +290,7 @@ public class OthYs7DeviceServiceImpl extends ServiceImpl 1) { String first = dateList.getFirst(); - req.setStartTime(first+" 00:00:00"); - req.setEndTime(first+" 23:59:59"); + req.setStartTime(first + " 00:00:00"); + req.setEndTime(first + " 23:59:59"); } List deviceLocalVideo = getDeviceLocalVideo(req); vo.setDeviceList(deviceLocalVideo); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progresscategory/PgsProgressCategoryValueTotalVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progresscategory/PgsProgressCategoryValueTotalVo.java new file mode 100644 index 00000000..0b83c29b --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progresscategory/PgsProgressCategoryValueTotalVo.java @@ -0,0 +1,28 @@ +package org.dromara.progress.domain.vo.progresscategory; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author lilemy + * @date 2025-12-15 15:28 + */ +@Data +public class PgsProgressCategoryValueTotalVo implements Serializable { + + @Serial + private static final long serialVersionUID = 3568038376181464491L; + + /** + * 总产值 + */ + private BigDecimal totalValue; + + /** + * 当前产值 + */ + private BigDecimal currentValue; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplan/PgsProgressPlanDateVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplan/PgsProgressPlanDateVo.java new file mode 100644 index 00000000..f9aaaf93 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplan/PgsProgressPlanDateVo.java @@ -0,0 +1,28 @@ +package org.dromara.progress.domain.vo.progressplan; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; + +/** + * @author lilemy + * @date 2025-12-15 15:01 + */ +@Data +public class PgsProgressPlanDateVo implements Serializable { + + @Serial + private static final long serialVersionUID = -2179633422685929795L; + + /** + * 计划开始时间 + */ + private LocalDate startDate; + + /** + * 计划结束时间 + */ + private LocalDate endDate; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsConstructionSchedulePlanService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsConstructionSchedulePlanService.java index 385e2f7e..57cb1c68 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsConstructionSchedulePlanService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsConstructionSchedulePlanService.java @@ -91,6 +91,15 @@ public interface IPgsConstructionSchedulePlanService extends IService getVoList(List constructionSchedulePlanList); + /** + * 获取所有子节点 + * + * @param parentId 父节点 ID + * @param allList 所有节点列表 + * @return 所有子节点列表 + */ + List getAllChildren(Long parentId, List allList); + /** * 导出Excel * diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressCategoryService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressCategoryService.java index 827b7190..a58ee870 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressCategoryService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressCategoryService.java @@ -220,7 +220,7 @@ public interface IPgsProgressCategoryService extends IService categoryList, Boolean selectValue); + PgsProgressCategoryValueTotalVo getValueTotal(List categoryList, Boolean selectValue); /** * 获取项目进度类别未完成数量 diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressPlanService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressPlanService.java index 6259bfd4..845d10f7 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressPlanService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressPlanService.java @@ -9,6 +9,7 @@ import org.dromara.progress.domain.PgsProgressCategory; import org.dromara.progress.domain.PgsProgressPlan; import org.dromara.progress.domain.dto.progressplan.PgsProgressPlanCreateReq; import org.dromara.progress.domain.dto.progressplan.PgsProgressPlanQueryReq; +import org.dromara.progress.domain.vo.progressplan.PgsProgressPlanDateVo; import org.dromara.progress.domain.vo.progressplan.PgsProgressPlanVo; import java.math.BigDecimal; @@ -47,6 +48,14 @@ public interface IPgsProgressPlanService extends IService { */ List queryList(PgsProgressPlanQueryReq req); + /** + * 查询进度计划日期(最早的开始时间和最晚的结束时间) + * + * @param req 查询条件 + * @return 进度计划日期(最早的开始时间和最晚的结束时间) + */ + PgsProgressPlanDateVo queryDate(PgsProgressPlanQueryReq req); + /** * 新增进度计划 * diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsConstructionSchedulePlanServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsConstructionSchedulePlanServiceImpl.java index e6bfbc70..e98abb14 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsConstructionSchedulePlanServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsConstructionSchedulePlanServiceImpl.java @@ -199,6 +199,26 @@ public class PgsConstructionSchedulePlanServiceImpl extends ServiceImpl getAllChildren(Long parentId, List allList) { + List result = new ArrayList<>(); + for (PgsConstructionSchedulePlan node : allList) { + if (Objects.equals(node.getParentId(), parentId)) { + result.add(node); + // 递归找子节点 + result.addAll(getAllChildren(node.getId(), allList)); + } + } + return result; + } + // region 导出 excel /** diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressCategoryServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressCategoryServiceImpl.java index 86c3cfb9..360ae0c3 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressCategoryServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressCategoryServiceImpl.java @@ -1547,10 +1547,14 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl categoryList, Boolean selectValue) { + public PgsProgressCategoryValueTotalVo getValueTotal(List categoryList, Boolean selectValue) { + PgsProgressCategoryValueTotalVo vo = new PgsProgressCategoryValueTotalVo(); + vo.setCurrentValue(BigDecimal.ZERO); + vo.setTotalValue(BigDecimal.ZERO); // 如果没有数据,则返回0 if (CollUtil.isEmpty(categoryList)) { - return BigDecimal.ZERO; + return vo; } + BigDecimal currentValue = BigDecimal.ZERO; BigDecimal totalValue = BigDecimal.ZERO; - // 遍历所有项目进度,计算总完成数和总数 for (PgsProgressCategory category : categoryList) { BigDecimal completed = category.getCompleted(); @@ -1662,9 +1669,12 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl planList = this.list(this.buildQueryWrapper(req)); + PgsProgressPlanDateVo dateVo = new PgsProgressPlanDateVo(); + if (CollUtil.isEmpty(planList)) { + return dateVo; + } + dateVo.setStartDate(planList.stream().map(PgsProgressPlan::getStartDate).min(LocalDate::compareTo).orElse(null)); + dateVo.setEndDate(planList.stream().map(PgsProgressPlan::getEndDate).max(LocalDate::compareTo).orElse(null)); + return dateVo; + } + /** * 新增进度计划 *