From 659146a2cfc5a85dc970f344f5958fb77213abbb Mon Sep 17 00:00:00 2001 From: lcj <2331845269@qq.com> Date: Mon, 3 Nov 2025 19:25:48 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=9B=E5=BA=A6=E8=AE=A1=E5=88=92=E5=A4=A7?= =?UTF-8?q?=E5=B1=8F=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectBigScreenController.java | 13 ++- .../dto/ProjectImageProgressDetailReq.java | 30 ++++++ .../vo/ProjectImageProgressDetailVo.java | 39 ++++++++ .../domain/vo/ProjectImageProgressVo.java | 10 ++ .../service/ProjectBigScreenService.java | 10 ++ .../impl/ProjectBigScreenServiceImpl.java | 91 +++++++++++++++++-- .../out/domain/vo/OutConstructionValueVo.java | 10 ++ .../impl/OutConstructionValueServiceImpl.java | 2 + .../service/IPgsProgressCategoryService.java | 9 ++ .../impl/PgsProgressCategoryServiceImpl.java | 35 ++++++- 10 files changed, 238 insertions(+), 11 deletions(-) create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/dto/ProjectImageProgressDetailReq.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectImageProgressDetailVo.java diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/ProjectBigScreenController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/ProjectBigScreenController.java index c36d42d6..59a95dbd 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/ProjectBigScreenController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/ProjectBigScreenController.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import jakarta.annotation.Resource; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; +import org.dromara.bigscreen.domain.dto.ProjectImageProgressDetailReq; import org.dromara.bigscreen.domain.dto.ProjectUpdateDto; import org.dromara.bigscreen.domain.dto.TanchuangInfoReq; import org.dromara.bigscreen.domain.dto.Ys7DeviceUpdateReq; @@ -37,7 +38,6 @@ import org.dromara.other.service.IOthYs7DeviceService; import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo; import org.dromara.project.domain.vo.project.BusProjectVo; import org.dromara.project.domain.vo.projectnews.BusProjectNewsVo; -import org.dromara.project.service.IBusProjectNewsService; import org.dromara.project.service.IBusProjectService; import org.dromara.quality.domain.dto.qualityinspection.QltQualityInspectionGisReq; import org.dromara.quality.domain.vo.qualityinspection.QltQualityInspectionListGisVo; @@ -79,8 +79,6 @@ public class ProjectBigScreenController extends BaseController { private final IBusProjectService projectService; - private final IBusProjectNewsService projectNewsService; - private final IQltQualityInspectionService qualityInspectionService; private final IHseSafetyInspectionService safetyInspectionService; @@ -223,6 +221,15 @@ public class ProjectBigScreenController extends BaseController { return R.ok(projectBigScreenService.getProjectImageProgress(projectId)); } + /** + * 获取项目形象进度详情 + */ + @GetMapping("/imageProgress/detail") + public R> getProjectImageProgressDetail(@Validated ProjectImageProgressDetailReq req) { + List list = projectBigScreenService.getProjectImageProgressDetail(req); + return R.ok(list); + } + /** * 查询项目概括 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/dto/ProjectImageProgressDetailReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/dto/ProjectImageProgressDetailReq.java new file mode 100644 index 00000000..0aafb0a5 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/dto/ProjectImageProgressDetailReq.java @@ -0,0 +1,30 @@ +package org.dromara.bigscreen.domain.dto; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025-11-03 18:53 + */ +@Data +public class ProjectImageProgressDetailReq implements Serializable { + + @Serial + private static final long serialVersionUID = -2943732963243838829L; + + /** + * 项目id + */ + @NotNull(message = "项目主键不能为空") + private Long projectId; + + /** + * 进度名称 + */ + @NotNull(message = "进度名称不能为空") + private String progressName; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectImageProgressDetailVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectImageProgressDetailVo.java new file mode 100644 index 00000000..55ffad16 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectImageProgressDetailVo.java @@ -0,0 +1,39 @@ +package org.dromara.bigscreen.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author lilemy + * @date 2025-11-03 16:34 + */ +@Data +public class ProjectImageProgressDetailVo implements Serializable { + + @Serial + private static final long serialVersionUID = -8317739851423164942L; + + /** + * 进度名称 + */ + private String progressName; + + /** + * 计划进度 + */ + private BigDecimal planProgress; + + /** + * 实际进度 + */ + private BigDecimal actualProgress; + + /** + * 总进度 + */ + private BigDecimal totalProgress; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectImageProgressVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectImageProgressVo.java index 63dafd57..4df7dbe1 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectImageProgressVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectImageProgressVo.java @@ -26,6 +26,16 @@ public class ProjectImageProgressVo implements Serializable { */ private BigDecimal progressTotal; + /** + * 产值 + */ + private BigDecimal valueTotal; + + /** + * 产值百分比 + */ + private BigDecimal valuePercentage; + /** * 场区百分比 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/ProjectBigScreenService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/ProjectBigScreenService.java index a8b4e9f9..5e84081c 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/ProjectBigScreenService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/ProjectBigScreenService.java @@ -1,6 +1,8 @@ package org.dromara.bigscreen.service; +import org.dromara.bigscreen.domain.dto.ProjectImageProgressDetailReq; import org.dromara.bigscreen.domain.dto.TanchuangInfoReq; +import org.dromara.bigscreen.domain.vo.ProjectImageProgressDetailVo; import org.dromara.bigscreen.domain.vo.ProjectImageProgressVo; import org.dromara.bigscreen.domain.vo.ProjectPeopleVo; import org.dromara.bigscreen.domain.vo.ProjectSafetyInspectionVo; @@ -66,6 +68,14 @@ public interface ProjectBigScreenService { */ List getProjectImageProgress(Long projectId); + /** + * 获取项目形象进度详情 + * + * @param req 项目形象进度名称 + * @return 项目形象进度详情 + */ + List getProjectImageProgressDetail(ProjectImageProgressDetailReq req); + /** * 获取项目概括 * 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 15d151d1..9179bd0f 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 @@ -4,12 +4,11 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import jakarta.annotation.Resource; +import org.dromara.bigscreen.domain.dto.ProjectImageProgressDetailReq; import org.dromara.bigscreen.domain.dto.TanchuangInfoReq; -import org.dromara.bigscreen.domain.vo.ProjectImageProgressVo; -import org.dromara.bigscreen.domain.vo.ProjectPeopleVo; -import org.dromara.bigscreen.domain.vo.ProjectSafetyInspectionVo; -import org.dromara.bigscreen.domain.vo.ProjectTeamAttendanceVo; +import org.dromara.bigscreen.domain.vo.*; import org.dromara.bigscreen.service.ProjectBigScreenService; import org.dromara.common.core.constant.HttpStatus; import org.dromara.common.core.exception.ServiceException; @@ -19,7 +18,6 @@ import org.dromara.contractor.domain.SubConstructionUser; import org.dromara.contractor.service.ISubConstructionUserService; import org.dromara.drone.service.IDroProjectDroneService; import org.dromara.gps.domain.bo.GpsEquipmentBo; -import org.dromara.gps.domain.vo.DeviceVo; import org.dromara.gps.domain.vo.GpsEquipmentSonVo; import org.dromara.gps.domain.vo.LocationVo; import org.dromara.gps.service.IDeviceService; @@ -286,13 +284,19 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService { // 如果有叶子节点,统计进度和状态;否则初始化为未完成 if (CollUtil.isNotEmpty(leafNodesByTopIds)) { topVo.setProgressTotal(progressCategoryService.getCompletedPercentage(leafNodesByTopIds)); + topVo.setValueTotal(progressCategoryService.getValueTotal(leafNodesByTopIds, true)); } else { topVo.setProgressTotal(BigDecimal.ZERO); + topVo.setValueTotal(BigDecimal.ZERO); } // 加入结果集 topList.add(topVo); } } + // 计算总完成产值 + BigDecimal valueTotal = topList.stream().map(ProjectImageProgressVo::getValueTotal) + .reduce(BigDecimal.ZERO, BigDecimal::add); + topList.forEach(vo -> vo.setValuePercentage(BigDecimalUtil.toPercentage(vo.getValueTotal(), valueTotal))); return topList; /* ProjectImageProgressVo vo = new ProjectImageProgressVo(); // 获取所有子项目列表 @@ -422,6 +426,79 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService { return vo;*/ } + /** + * 获取项目形象进度详情 + * + * @param req 项目形象进度名称 + * @return 项目形象进度详情 + */ + @Override + public List getProjectImageProgressDetail(ProjectImageProgressDetailReq req) { + Long projectId = req.getProjectId(); + String progressName = req.getProgressName(); + checkProject(projectId); + // 获取对应进度 + PgsProgressCategory progressCategory = progressCategoryService.lambdaQuery() + .eq(PgsProgressCategory::getProjectId, projectId) + .eq(PgsProgressCategory::getName, progressName) + .last("limit 1") + .one(); + if (progressCategory == null) { + return List.of(); + } + Long topId = progressCategory.getId(); + // 查出所有属于该顶级节点的子孙节点 + List allChildren = progressCategoryService.list( + Wrappers.lambdaQuery() + .and(wrapper -> { + wrapper.like(PgsProgressCategory::getAncestors, "," + topId + ",") + .or() + .like(PgsProgressCategory::getAncestors, "," + topId); + }) + ); + if (allChildren.isEmpty()) { + return Collections.emptyList(); + } + // 判断层级 + Set parentIds = allChildren.stream() + .map(PgsProgressCategory::getParentId) + .collect(Collectors.toSet()); + + List dierList = allChildren.stream() + .filter(item -> parentIds.contains(item.getId())) + .toList(); + if (CollUtil.isEmpty(dierList)) { + return allChildren.stream().map(c -> { + ProjectImageProgressDetailVo vo = new ProjectImageProgressDetailVo(); + vo.setProgressName(c.getName()); + vo.setPlanProgress(c.getPlanTotal()); + vo.setActualProgress(c.getCompleted()); + vo.setTotalProgress(c.getTotal()); + return vo; + }).toList(); + } else { + return dierList.stream().map(c -> { + // 获取子集 + List children = allChildren.stream() + .filter(item -> item.getParentId().equals(c.getId())) + .toList(); + // 计算 + BigDecimal plan = children.stream().map(PgsProgressCategory::getPlanTotal) + .reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal actual = children.stream().map(PgsProgressCategory::getCompleted) + .reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal total = children.stream().map(PgsProgressCategory::getTotal) + .reduce(BigDecimal.ZERO, BigDecimal::add); + ProjectImageProgressDetailVo vo = new ProjectImageProgressDetailVo(); + vo.setProgressName(c.getName()); + vo.setPlanProgress(plan); + vo.setActualProgress(actual); + vo.setTotalProgress(total); + return vo; + }).toList(); + } + } + /** * 获取项目概括 * @@ -577,7 +654,7 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService { wrj.put("lng", object1.getJSONObject("data").get("longitude")); wrj.put("alt", object1.getJSONObject("data").get("height")); wrjChildrenMap.add(wrj); - }else { + } else { Object object2 = stringRedisTemplate.opsForValue().get("wrj:osd3:" + key); if (object2 != null) { JSONObject object3 = JSONUtil.parseObj(object2); @@ -627,7 +704,7 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService { @Override public void setWrjHc() { - RedisUtils.setCacheObject("xmjdap:ws",System.currentTimeMillis() ); + RedisUtils.setCacheObject("xmjdap:ws", System.currentTimeMillis()); } @Override diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/domain/vo/OutConstructionValueVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/domain/vo/OutConstructionValueVo.java index 578ab876..71d3925a 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/domain/vo/OutConstructionValueVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/domain/vo/OutConstructionValueVo.java @@ -127,6 +127,16 @@ public class OutConstructionValueVo implements Serializable { */ private Integer planNum; + /** + * 综合单价(业主) + */ + private BigDecimal ownerPrice; + + /** + * 综合单价(分包) + */ + private BigDecimal constructionPrice; + /** * 产值 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/service/impl/OutConstructionValueServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/service/impl/OutConstructionValueServiceImpl.java index 1345fc84..c21d2432 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/service/impl/OutConstructionValueServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/service/impl/OutConstructionValueServiceImpl.java @@ -360,6 +360,8 @@ public class OutConstructionValueServiceImpl extends ServiceImpl categoryList, List planList); + /** + * 获取项目进度产值 + * + * @param categoryList 项目进度列表 + * @param selectValue true:业主产值 false:分包产值 + * @return 项目进度产值 + */ + BigDecimal getValueTotal(List categoryList, Boolean selectValue); + /** * 获取项目进度类别未完成数量 * 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 d16940c0..d8fcf093 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 @@ -1389,7 +1389,11 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl allChildren = this.list( Wrappers.lambdaQuery() - .like(PgsProgressCategory::getAncestors, "," + topId + ",") + .and(wrapper -> { + wrapper.like(PgsProgressCategory::getAncestors, "," + topId + ",") + .or() + .like(PgsProgressCategory::getAncestors, "," + topId); + }) ); if (allChildren.isEmpty()) { @@ -1596,6 +1600,35 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl categoryList, Boolean selectValue) { + // 如果没有数据,则返回0 + if (CollUtil.isEmpty(categoryList)) { + return BigDecimal.ZERO; + } + + BigDecimal totalValue = BigDecimal.ZERO; + + // 遍历所有项目进度,计算总完成数和总数 + for (PgsProgressCategory category : categoryList) { + BigDecimal completed = category.getCompleted(); + BigDecimal total = category.getTotal(); + BigDecimal price = selectValue ? category.getOwnerPrice() : category.getConstructionPrice(); + if (PgsProgressUnitTypeEnum.PERCENTAGE.getValue().equals(category.getUnitType())) { + completed = completed.divide(BigDecimal.valueOf(100L), 4, RoundingMode.HALF_UP).multiply(total); + } + totalValue = totalValue.add(completed.multiply(price)); + } + return totalValue.setScale(4, RoundingMode.HALF_UP); + } + /** * 获取项目进度类别未完成数量 *