进度计划大屏数据
This commit is contained in:
@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.dromara.bigscreen.domain.dto.ProjectImageProgressDetailReq;
|
||||||
import org.dromara.bigscreen.domain.dto.ProjectUpdateDto;
|
import org.dromara.bigscreen.domain.dto.ProjectUpdateDto;
|
||||||
import org.dromara.bigscreen.domain.dto.TanchuangInfoReq;
|
import org.dromara.bigscreen.domain.dto.TanchuangInfoReq;
|
||||||
import org.dromara.bigscreen.domain.dto.Ys7DeviceUpdateReq;
|
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.BusProjectSafetyDayVo;
|
||||||
import org.dromara.project.domain.vo.project.BusProjectVo;
|
import org.dromara.project.domain.vo.project.BusProjectVo;
|
||||||
import org.dromara.project.domain.vo.projectnews.BusProjectNewsVo;
|
import org.dromara.project.domain.vo.projectnews.BusProjectNewsVo;
|
||||||
import org.dromara.project.service.IBusProjectNewsService;
|
|
||||||
import org.dromara.project.service.IBusProjectService;
|
import org.dromara.project.service.IBusProjectService;
|
||||||
import org.dromara.quality.domain.dto.qualityinspection.QltQualityInspectionGisReq;
|
import org.dromara.quality.domain.dto.qualityinspection.QltQualityInspectionGisReq;
|
||||||
import org.dromara.quality.domain.vo.qualityinspection.QltQualityInspectionListGisVo;
|
import org.dromara.quality.domain.vo.qualityinspection.QltQualityInspectionListGisVo;
|
||||||
@ -79,8 +79,6 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
|
|
||||||
private final IBusProjectService projectService;
|
private final IBusProjectService projectService;
|
||||||
|
|
||||||
private final IBusProjectNewsService projectNewsService;
|
|
||||||
|
|
||||||
private final IQltQualityInspectionService qualityInspectionService;
|
private final IQltQualityInspectionService qualityInspectionService;
|
||||||
|
|
||||||
private final IHseSafetyInspectionService safetyInspectionService;
|
private final IHseSafetyInspectionService safetyInspectionService;
|
||||||
@ -223,6 +221,15 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
return R.ok(projectBigScreenService.getProjectImageProgress(projectId));
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询项目概括
|
* 查询项目概括
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
@ -26,6 +26,16 @@ public class ProjectImageProgressVo implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private BigDecimal progressTotal;
|
private BigDecimal progressTotal;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 产值
|
||||||
|
*/
|
||||||
|
private BigDecimal valueTotal;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 产值百分比
|
||||||
|
*/
|
||||||
|
private BigDecimal valuePercentage;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 场区百分比
|
* 场区百分比
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
package org.dromara.bigscreen.service;
|
package org.dromara.bigscreen.service;
|
||||||
|
|
||||||
|
import org.dromara.bigscreen.domain.dto.ProjectImageProgressDetailReq;
|
||||||
import org.dromara.bigscreen.domain.dto.TanchuangInfoReq;
|
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.ProjectImageProgressVo;
|
||||||
import org.dromara.bigscreen.domain.vo.ProjectPeopleVo;
|
import org.dromara.bigscreen.domain.vo.ProjectPeopleVo;
|
||||||
import org.dromara.bigscreen.domain.vo.ProjectSafetyInspectionVo;
|
import org.dromara.bigscreen.domain.vo.ProjectSafetyInspectionVo;
|
||||||
@ -66,6 +68,14 @@ public interface ProjectBigScreenService {
|
|||||||
*/
|
*/
|
||||||
List<ProjectImageProgressVo> getProjectImageProgress(Long projectId);
|
List<ProjectImageProgressVo> getProjectImageProgress(Long projectId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取项目形象进度详情
|
||||||
|
*
|
||||||
|
* @param req 项目形象进度名称
|
||||||
|
* @return 项目形象进度详情
|
||||||
|
*/
|
||||||
|
List<ProjectImageProgressDetailVo> getProjectImageProgressDetail(ProjectImageProgressDetailReq req);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取项目概括
|
* 获取项目概括
|
||||||
*
|
*
|
||||||
|
|||||||
@ -4,12 +4,11 @@ import cn.hutool.core.collection.CollUtil;
|
|||||||
import cn.hutool.json.JSONArray;
|
import cn.hutool.json.JSONArray;
|
||||||
import cn.hutool.json.JSONObject;
|
import cn.hutool.json.JSONObject;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
|
import org.dromara.bigscreen.domain.dto.ProjectImageProgressDetailReq;
|
||||||
import org.dromara.bigscreen.domain.dto.TanchuangInfoReq;
|
import org.dromara.bigscreen.domain.dto.TanchuangInfoReq;
|
||||||
import org.dromara.bigscreen.domain.vo.ProjectImageProgressVo;
|
import org.dromara.bigscreen.domain.vo.*;
|
||||||
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.service.ProjectBigScreenService;
|
import org.dromara.bigscreen.service.ProjectBigScreenService;
|
||||||
import org.dromara.common.core.constant.HttpStatus;
|
import org.dromara.common.core.constant.HttpStatus;
|
||||||
import org.dromara.common.core.exception.ServiceException;
|
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.contractor.service.ISubConstructionUserService;
|
||||||
import org.dromara.drone.service.IDroProjectDroneService;
|
import org.dromara.drone.service.IDroProjectDroneService;
|
||||||
import org.dromara.gps.domain.bo.GpsEquipmentBo;
|
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.GpsEquipmentSonVo;
|
||||||
import org.dromara.gps.domain.vo.LocationVo;
|
import org.dromara.gps.domain.vo.LocationVo;
|
||||||
import org.dromara.gps.service.IDeviceService;
|
import org.dromara.gps.service.IDeviceService;
|
||||||
@ -286,13 +284,19 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
|
|||||||
// 如果有叶子节点,统计进度和状态;否则初始化为未完成
|
// 如果有叶子节点,统计进度和状态;否则初始化为未完成
|
||||||
if (CollUtil.isNotEmpty(leafNodesByTopIds)) {
|
if (CollUtil.isNotEmpty(leafNodesByTopIds)) {
|
||||||
topVo.setProgressTotal(progressCategoryService.getCompletedPercentage(leafNodesByTopIds));
|
topVo.setProgressTotal(progressCategoryService.getCompletedPercentage(leafNodesByTopIds));
|
||||||
|
topVo.setValueTotal(progressCategoryService.getValueTotal(leafNodesByTopIds, true));
|
||||||
} else {
|
} else {
|
||||||
topVo.setProgressTotal(BigDecimal.ZERO);
|
topVo.setProgressTotal(BigDecimal.ZERO);
|
||||||
|
topVo.setValueTotal(BigDecimal.ZERO);
|
||||||
}
|
}
|
||||||
// 加入结果集
|
// 加入结果集
|
||||||
topList.add(topVo);
|
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;
|
return topList;
|
||||||
/* ProjectImageProgressVo vo = new ProjectImageProgressVo();
|
/* ProjectImageProgressVo vo = new ProjectImageProgressVo();
|
||||||
// 获取所有子项目列表
|
// 获取所有子项目列表
|
||||||
@ -422,6 +426,79 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
|
|||||||
return vo;*/
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取项目概括
|
* 获取项目概括
|
||||||
*
|
*
|
||||||
|
|||||||
@ -127,6 +127,16 @@ public class OutConstructionValueVo implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private Integer planNum;
|
private Integer planNum;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 综合单价(业主)
|
||||||
|
*/
|
||||||
|
private BigDecimal ownerPrice;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 综合单价(分包)
|
||||||
|
*/
|
||||||
|
private BigDecimal constructionPrice;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 产值
|
* 产值
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -360,6 +360,8 @@ public class OutConstructionValueServiceImpl extends ServiceImpl<OutConstruction
|
|||||||
vo.setWorkType(pgsProgressCategoryVo.getWorkType());
|
vo.setWorkType(pgsProgressCategoryVo.getWorkType());
|
||||||
vo.setUnitType(pgsProgressCategoryVo.getUnitType());
|
vo.setUnitType(pgsProgressCategoryVo.getUnitType());
|
||||||
vo.setUnit(pgsProgressCategoryVo.getUnit());
|
vo.setUnit(pgsProgressCategoryVo.getUnit());
|
||||||
|
vo.setOwnerPrice(pgsProgressCategoryVo.getOwnerPrice());
|
||||||
|
vo.setConstructionPrice(pgsProgressCategoryVo.getConstructionPrice());
|
||||||
PgsProgressCategoryVo pgsProgressCategoryVo1 = pgsProgressCategoryService.queryById(pgsProgressCategoryVo.getParentId());
|
PgsProgressCategoryVo pgsProgressCategoryVo1 = pgsProgressCategoryService.queryById(pgsProgressCategoryVo.getParentId());
|
||||||
vo.setCategoryId(pgsProgressCategoryVo1.getId());
|
vo.setCategoryId(pgsProgressCategoryVo1.getId());
|
||||||
vo.setCategoryName(pgsProgressCategoryVo1.getName());
|
vo.setCategoryName(pgsProgressCategoryVo1.getName());
|
||||||
|
|||||||
@ -212,6 +212,15 @@ public interface IPgsProgressCategoryService extends IService<PgsProgressCategor
|
|||||||
*/
|
*/
|
||||||
PgsProgressCategoryProgressDto getProgressPercentage(List<PgsProgressCategory> categoryList, List<PgsProgressPlan> planList);
|
PgsProgressCategoryProgressDto getProgressPercentage(List<PgsProgressCategory> categoryList, List<PgsProgressPlan> planList);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取项目进度产值
|
||||||
|
*
|
||||||
|
* @param categoryList 项目进度列表
|
||||||
|
* @param selectValue true:业主产值 false:分包产值
|
||||||
|
* @return 项目进度产值
|
||||||
|
*/
|
||||||
|
BigDecimal getValueTotal(List<PgsProgressCategory> categoryList, Boolean selectValue);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取项目进度类别未完成数量
|
* 获取项目进度类别未完成数量
|
||||||
*
|
*
|
||||||
|
|||||||
@ -1389,7 +1389,11 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl<PgsProgressCateg
|
|||||||
// 1. 查出所有属于该顶级节点的子孙节点
|
// 1. 查出所有属于该顶级节点的子孙节点
|
||||||
List<PgsProgressCategory> allChildren = this.list(
|
List<PgsProgressCategory> allChildren = this.list(
|
||||||
Wrappers.<PgsProgressCategory>lambdaQuery()
|
Wrappers.<PgsProgressCategory>lambdaQuery()
|
||||||
.like(PgsProgressCategory::getAncestors, "," + topId + ",")
|
.and(wrapper -> {
|
||||||
|
wrapper.like(PgsProgressCategory::getAncestors, "," + topId + ",")
|
||||||
|
.or()
|
||||||
|
.like(PgsProgressCategory::getAncestors, "," + topId);
|
||||||
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
if (allChildren.isEmpty()) {
|
if (allChildren.isEmpty()) {
|
||||||
@ -1596,6 +1600,35 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl<PgsProgressCateg
|
|||||||
return dto;
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取项目进度类别未完成数量
|
* 获取项目进度类别未完成数量
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user