diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/vo/matrix/FacMatrixStructureVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/vo/matrix/FacMatrixStructureVo.java new file mode 100644 index 00000000..2a9f9971 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/vo/matrix/FacMatrixStructureVo.java @@ -0,0 +1,39 @@ +package org.dromara.facility.domain.vo.matrix; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.progress.domain.vo.progresscategory.PgsProgressCategoryStructureVo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author lilemy + * @date 2025-08-23 01:17 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FacMatrixStructureVo implements Serializable { + + @Serial + private static final long serialVersionUID = 7526403047030009646L; + + /** + * 主键 + */ + private Long id; + + /** + * 方阵名称 + */ + private String name; + + /** + * 分项工程 + */ + private List children; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacBoxTransformerServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacBoxTransformerServiceImpl.java index 7f27eee5..1fcaa5e7 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacBoxTransformerServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacBoxTransformerServiceImpl.java @@ -239,16 +239,19 @@ public class FacBoxTransformerServiceImpl extends ServiceImpl children; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progresscategory/PgsProgressCategoryVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progresscategory/PgsProgressCategoryVo.java index dcb272f8..8bcfc54c 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progresscategory/PgsProgressCategoryVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progresscategory/PgsProgressCategoryVo.java @@ -52,6 +52,12 @@ public class PgsProgressCategoryVo implements Serializable { */ private Long matrixId; + /** + * 祖级列表 + */ + @ExcelProperty(value = "祖级列表") + private String ancestors; + /** * 类别名称 */ @@ -66,24 +72,22 @@ public class PgsProgressCategoryVo implements Serializable { private String unitType; /** - * 总数量/百分比 + * 总数量 */ @JsonSerialize(using = BigDecimalToIntegerSerializer.class) - @ExcelProperty(value = "总数量/百分比") + @ExcelProperty(value = "总数量") private BigDecimal total; /** - * 已完成数量/百分比 + * 已完成数量 */ @JsonSerialize(using = BigDecimalToIntegerSerializer.class) - @ExcelProperty(value = "已完成数量/百分比") private BigDecimal completed; /** - * 计划总数量/百分比 + * 计划总数量 */ @JsonSerialize(using = BigDecimalToIntegerSerializer.class) - @ExcelProperty(value = "计划总数量/百分比") private BigDecimal planTotal; /** @@ -101,23 +105,13 @@ public class PgsProgressCategoryVo implements Serializable { /** * 是否超期(0否 1是) */ - @ExcelProperty(value = "是否超期", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "0=否,1=是") private String isDelay; /** * 完成状态(0未开始 1进行中 2已完成) */ - @ExcelProperty(value = "完成状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "0=未开始,1=进行中,2=已完成") private String status; - /** - * 备注 - */ - @ExcelProperty(value = "备注") - private String remark; - /** * 计量单位 */ @@ -139,13 +133,11 @@ public class PgsProgressCategoryVo implements Serializable { /** * 产值金额(业主) */ - @ExcelProperty(value = "产值金额(业主)") private BigDecimal ownerOutputValue; /** * 产值金额(分包) */ - @ExcelProperty(value = "产值金额(分包)") private BigDecimal constructionOutputValue; /** @@ -153,4 +145,10 @@ public class PgsProgressCategoryVo implements Serializable { */ private String workType; + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + } 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 4f4a8c5f..f82e5129 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 @@ -181,8 +181,8 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl= 0 && total.compareTo(BigDecimal.ZERO) >= 0) { - progressCategory.setOwnerOutputValue(unitPrice.multiply(total)); + if (ownerPrice != null && total != null && ownerPrice.compareTo(BigDecimal.ZERO) >= 0 && total.compareTo(BigDecimal.ZERO) >= 0) { + progressCategory.setOwnerOutputValue(ownerPrice.multiply(total)); + } + if (constructionPrice != null && total != null && constructionPrice.compareTo(BigDecimal.ZERO) >= 0 && total.compareTo(BigDecimal.ZERO) >= 0) { + progressCategory.setConstructionOutputValue(constructionPrice.multiply(total)); } if (StringUtils.isNotBlank(workType) && PgsProgressCategoryConstant.WORK_TYPE_LIST.contains(workType)) { List progressCategoryList = this.lambdaQuery() @@ -260,18 +263,21 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl getProjectStructure(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(projectService.getStructure(id)); + } + /** * 查询项目以及项目下的分包公司列表 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectStructureVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectStructureVo.java new file mode 100644 index 00000000..eac360e5 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectStructureVo.java @@ -0,0 +1,33 @@ +package org.dromara.project.domain.vo.project; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author lilemy + * @date 2025-08-23 01:14 + */ +@Data +public class BusProjectStructureVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1774638688311795906L; + + /** + * 项目主键 + */ + private Long id; + + /** + * 项目名称 + */ + private String name; + + /** + * 子项目列表 + */ + private List children; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusSubProjectStructureVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusSubProjectStructureVo.java new file mode 100644 index 00000000..4183e0ea --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusSubProjectStructureVo.java @@ -0,0 +1,38 @@ +package org.dromara.project.domain.vo.project; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.facility.domain.vo.matrix.FacMatrixStructureVo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author lilemy + * @date 2025-08-23 01:15 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class BusSubProjectStructureVo implements Serializable { + + @Serial + private static final long serialVersionUID = 6993209784456857540L; + + /** + * 项目主键 + */ + private Long id; + + /** + * 项目名称 + */ + private String name; + + /** + * 方阵列表 + */ + private List children; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectService.java index 50f3fd4d..61be3b58 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectService.java @@ -187,4 +187,12 @@ public interface IBusProjectService extends IService { * @return 项目地址信息列表 */ List getGisList(); + + /** + * 获取项目结构信息 + * + * @param projectId 项目id + * @return 项目结构信息 + */ + BusProjectStructureVo getStructure(Long projectId); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java index 31c6b1f1..68391d06 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java @@ -32,9 +32,13 @@ import org.dromara.contractor.service.ISubContractorService; import org.dromara.design.service.IDesTechnicalStandardService; import org.dromara.facility.domain.FacMatrix; import org.dromara.facility.domain.vo.matrix.FacMatrixBySubProjectVo; +import org.dromara.facility.domain.vo.matrix.FacMatrixStructureVo; import org.dromara.facility.service.IFacMatrixService; import org.dromara.manager.weathermanager.WeatherConstant; import org.dromara.manager.weathermanager.WeatherManager; +import org.dromara.progress.domain.PgsProgressCategory; +import org.dromara.progress.domain.vo.progresscategory.PgsProgressCategoryStructureVo; +import org.dromara.progress.service.IPgsProgressCategoryService; import org.dromara.progress.service.IPgsProgressCategoryTemplateService; import org.dromara.project.constant.BusProjectConstant; import org.dromara.project.domain.BusProject; @@ -131,6 +135,10 @@ public class BusProjectServiceImpl extends ServiceImpl WEATHER_CACHE = Caffeine.newBuilder().initialCapacity(1024) .maximumSize(10000L) @@ -905,6 +913,106 @@ public class BusProjectServiceImpl extends ServiceImpl subProjects = this.lambdaQuery() + .eq(BusProject::getPId, projectId) + .list(); + if (CollUtil.isEmpty(subProjects)) { + return vo; + } + Set subProjectIds = subProjects.stream().map(BusProject::getId).collect(Collectors.toSet()); + + // 获取方阵信息 + List matrixList = matrixService.lambdaQuery() + .in(FacMatrix::getProjectId, subProjectIds) + .list(); + + Map> matrixMap = matrixList.stream() + .collect(Collectors.groupingBy(FacMatrix::getProjectId)); + + // 获取分项工程 + Set matrixIds = matrixList.stream().map(FacMatrix::getId).collect(Collectors.toSet()); + List progressCategoryList = progressCategoryService.lambdaQuery() + .in(PgsProgressCategory::getMatrixId, matrixIds) + .list(); + + // 构造子项目结构 + List subProjectStructures = subProjects.stream().map(subProject -> { + BusSubProjectStructureVo subProjectVo = new BusSubProjectStructureVo(); + subProjectVo.setId(subProject.getId()); + subProjectVo.setName(subProject.getProjectName()); + + // 找到该子项目下的方阵 + List matrices = matrixMap.getOrDefault(subProject.getId(), new ArrayList<>()); + List matrixVos = matrices.stream().map(matrix -> { + FacMatrixStructureVo matrixVo = new FacMatrixStructureVo(); + matrixVo.setId(matrix.getId()); + matrixVo.setName(matrix.getMatrixName()); + + // 找到该方阵下的分项工程 + List categories = progressCategoryList.stream() + .filter(c -> Objects.equals(c.getMatrixId(), matrix.getId())) + .toList(); + + // 构造分项工程树 + List categoryTree = buildCategoryTree(categories); + matrixVo.setChildren(categoryTree); + return matrixVo; + }).toList(); + + subProjectVo.setChildren(matrixVos); + return subProjectVo; + }).toList(); + + vo.setChildren(subProjectStructures); + return vo; + } + + /** + * 构造分项工程树 + */ + private List buildCategoryTree(List categories) { + Map map = new HashMap<>(); + List roots = new ArrayList<>(); + + for (PgsProgressCategory c : categories) { + PgsProgressCategoryStructureVo node = new PgsProgressCategoryStructureVo(c.getId(), c.getName(), new ArrayList<>()); + map.put(c.getId(), node); + } + + for (PgsProgressCategory c : categories) { + PgsProgressCategoryStructureVo node = map.get(c.getId()); + if (c.getParentId() == 0) { + roots.add(node); + } else { + PgsProgressCategoryStructureVo parent = map.get(c.getParentId()); + if (parent != null) { + parent.getChildren().add(node); + } + } + } + + return roots; + } + /** * 根据天气图标获取天气类别 *