进度计划大屏数据

This commit is contained in:
lcj
2025-11-03 19:25:48 +08:00
parent c17c084095
commit 659146a2cf
10 changed files with 238 additions and 11 deletions

View File

@ -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<List<ProjectImageProgressDetailVo>> getProjectImageProgressDetail(@Validated ProjectImageProgressDetailReq req) {
List<ProjectImageProgressDetailVo> list = projectBigScreenService.getProjectImageProgressDetail(req);
return R.ok(list);
}
/**
* 查询项目概括
*/

View File

@ -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;
}

View File

@ -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;
}

View File

@ -26,6 +26,16 @@ public class ProjectImageProgressVo implements Serializable {
*/
private BigDecimal progressTotal;
/**
* 产值
*/
private BigDecimal valueTotal;
/**
* 产值百分比
*/
private BigDecimal valuePercentage;
/**
* 场区百分比
*/

View File

@ -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<ProjectImageProgressVo> getProjectImageProgress(Long projectId);
/**
* 获取项目形象进度详情
*
* @param req 项目形象进度名称
* @return 项目形象进度详情
*/
List<ProjectImageProgressDetailVo> getProjectImageProgressDetail(ProjectImageProgressDetailReq req);
/**
* 获取项目概括
*

View File

@ -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<ProjectImageProgressDetailVo> 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<PgsProgressCategory> allChildren = progressCategoryService.list(
Wrappers.<PgsProgressCategory>lambdaQuery()
.and(wrapper -> {
wrapper.like(PgsProgressCategory::getAncestors, "," + topId + ",")
.or()
.like(PgsProgressCategory::getAncestors, "," + topId);
})
);
if (allChildren.isEmpty()) {
return Collections.emptyList();
}
// 判断层级
Set<Long> parentIds = allChildren.stream()
.map(PgsProgressCategory::getParentId)
.collect(Collectors.toSet());
List<PgsProgressCategory> 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<PgsProgressCategory> 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();
}
}
/**
* 获取项目概括
*

View File

@ -127,6 +127,16 @@ public class OutConstructionValueVo implements Serializable {
*/
private Integer planNum;
/**
* 综合单价(业主)
*/
private BigDecimal ownerPrice;
/**
* 综合单价(分包)
*/
private BigDecimal constructionPrice;
/**
* 产值
*/

View File

@ -360,6 +360,8 @@ public class OutConstructionValueServiceImpl extends ServiceImpl<OutConstruction
vo.setWorkType(pgsProgressCategoryVo.getWorkType());
vo.setUnitType(pgsProgressCategoryVo.getUnitType());
vo.setUnit(pgsProgressCategoryVo.getUnit());
vo.setOwnerPrice(pgsProgressCategoryVo.getOwnerPrice());
vo.setConstructionPrice(pgsProgressCategoryVo.getConstructionPrice());
PgsProgressCategoryVo pgsProgressCategoryVo1 = pgsProgressCategoryService.queryById(pgsProgressCategoryVo.getParentId());
vo.setCategoryId(pgsProgressCategoryVo1.getId());
vo.setCategoryName(pgsProgressCategoryVo1.getName());

View File

@ -212,6 +212,15 @@ public interface IPgsProgressCategoryService extends IService<PgsProgressCategor
*/
PgsProgressCategoryProgressDto getProgressPercentage(List<PgsProgressCategory> categoryList, List<PgsProgressPlan> planList);
/**
* 获取项目进度产值
*
* @param categoryList 项目进度列表
* @param selectValue true:业主产值 false:分包产值
* @return 项目进度产值
*/
BigDecimal getValueTotal(List<PgsProgressCategory> categoryList, Boolean selectValue);
/**
* 获取项目进度类别未完成数量
*

View File

@ -1389,7 +1389,11 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl<PgsProgressCateg
// 1. 查出所有属于该顶级节点的子孙节点
List<PgsProgressCategory> allChildren = this.list(
Wrappers.<PgsProgressCategory>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<PgsProgressCateg
return dto;
}
/**
* 获取项目进度产值
*
* @param categoryList 项目进度列表
* @param selectValue true:业主产值 false:分包产值
* @return 项目进度产值
*/
@Override
public BigDecimal getValueTotal(List<PgsProgressCategory> 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);
}
/**
* 获取项目进度类别未完成数量
*