进度计划大屏数据
This commit is contained in:
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询项目概括
|
||||
*/
|
||||
|
||||
@ -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 valueTotal;
|
||||
|
||||
/**
|
||||
* 产值百分比
|
||||
*/
|
||||
private BigDecimal valuePercentage;
|
||||
|
||||
/**
|
||||
* 场区百分比
|
||||
*/
|
||||
|
||||
@ -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);
|
||||
|
||||
/**
|
||||
* 获取项目概括
|
||||
*
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取项目概括
|
||||
*
|
||||
|
||||
@ -127,6 +127,16 @@ public class OutConstructionValueVo implements Serializable {
|
||||
*/
|
||||
private Integer planNum;
|
||||
|
||||
/**
|
||||
* 综合单价(业主)
|
||||
*/
|
||||
private BigDecimal ownerPrice;
|
||||
|
||||
/**
|
||||
* 综合单价(分包)
|
||||
*/
|
||||
private BigDecimal constructionPrice;
|
||||
|
||||
/**
|
||||
* 产值
|
||||
*/
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -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);
|
||||
|
||||
/**
|
||||
* 获取项目进度类别未完成数量
|
||||
*
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取项目进度类别未完成数量
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user