diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/EnterpriseBigScreenController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/EnterpriseBigScreenController.java index 75a28a80..f47428e3 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/EnterpriseBigScreenController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/EnterpriseBigScreenController.java @@ -3,9 +3,12 @@ package org.dromara.bigscreen.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import jakarta.annotation.Resource; import org.dromara.bigscreen.domain.dto.WeatherQueryReq; -import org.dromara.bigscreen.domain.vo.WeatherVo; +import org.dromara.bigscreen.domain.vo.EnterpriseKeyIndexVo; +import org.dromara.bigscreen.domain.vo.OutputValueComparisonVo; +import org.dromara.bigscreen.domain.vo.ProjectProgressAnalysisVo; import org.dromara.bigscreen.service.EnterpriseBigScreenService; import org.dromara.common.core.domain.R; +import org.dromara.manager.weathermanager.vo.WeatherVo; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -29,6 +32,33 @@ public class EnterpriseBigScreenController { @Resource private EnterpriseBigScreenService enterpriseBigScreenService; + /** + * 获取关键指标 + */ + @SaCheckPermission("enterprise:bigScreen:keyIndex") + @GetMapping("/keyIndex") + public R getEnterpriseKeyIndex() { + return R.ok(enterpriseBigScreenService.getEnterpriseKeyIndex()); + } + + /** + * 项目进度分析 + */ + @SaCheckPermission("enterprise:bigScreen:projectProgress") + @GetMapping("/projectProgress") + public R getProjectProgress() { + return R.ok(enterpriseBigScreenService.getProjectProgressAnalysis()); + } + + /** + * 项目产值对比 + */ + @SaCheckPermission("enterprise:bigScreen:projectOutputValueComparison") + @GetMapping("/projectOutputValueComparison") + public R> getProjectOutputValueComparison() { + return R.ok(enterpriseBigScreenService.getProjectOutputValueComparison()); + } + /** * 查询天气 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/MoneyBigScreenController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/MoneyBigScreenController.java index 25bccc31..caa6e1c2 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/MoneyBigScreenController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/MoneyBigScreenController.java @@ -11,13 +11,13 @@ import org.dromara.ctr.domain.CtrExpensesContract; import org.dromara.ctr.domain.CtrIncomeContract; import org.dromara.ctr.service.ICtrExpensesContractService; import org.dromara.ctr.service.ICtrIncomeContractService; +import org.dromara.manager.weathermanager.vo.WeatherVo; import org.dromara.out.domain.OutSettlementValueOwner; import org.dromara.out.domain.OutSettlementValueSubcontract; import org.dromara.out.service.IOutSettlementValueOwnerService; import org.dromara.out.service.IOutSettlementValueSubcontractService; import org.dromara.project.domain.vo.project.BusProjectGisVo; import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo; -import org.dromara.project.domain.vo.project.BusProjectWeatherVo; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -114,7 +114,7 @@ public class MoneyBigScreenController { .eq(CtrIncomeContract::getProjectId, projectId) .last("limit 1") ); - if (contract != null && contract.getPayRatio()!= null) { + if (contract != null && contract.getPayRatio() != null) { actualAmount = actualAmount.add(projectMonthlyAmountMap.get(projectId).multiply(contract.getPayRatio()).divide(HUNDRED)); } @@ -169,7 +169,7 @@ public class MoneyBigScreenController { .last("limit 1") ); - if (contract != null && contract.getPayRatio()!= null) { + if (contract != null && contract.getPayRatio() != null) { actualAmount = actualAmount.add(projectAmountMap.get(contractCode).multiply(contract.getPayRatio()).divide(HUNDRED)); } @@ -243,7 +243,7 @@ public class MoneyBigScreenController { .filter(contract -> contract.getAmount() != null && contract.getAmount().compareTo(THIRD_PHASE) >= 0) .count(); - return R.ok(new MoneyContractCountVo(4, 4, 6, 6)); + return R.ok(new MoneyContractCountVo(4, 4, 6, 6)); // return R.ok(new MoneyContractCountVo(lessThan1M, between1MAnd5M, between5MAnd10M, greaterThanOrEqualTo10M)); } @@ -350,7 +350,7 @@ public class MoneyBigScreenController { .eq(CtrIncomeContract::getProjectId, projectId) .last("limit 1") ); - if (contract != null && contract.getPayRatio()!= null) { + if (contract != null && contract.getPayRatio() != null) { incomeAmount = incomeAmount.add(incomeGroupedByProject.get(projectId).multiply(contract.getPayRatio()).divide(HUNDRED)); } } @@ -380,7 +380,7 @@ public class MoneyBigScreenController { .last("limit 1") ); - if (contract != null && contract.getPayRatio()!= null) { + if (contract != null && contract.getPayRatio() != null) { expensesAmount = expensesAmount.add(expenseGroupedByContract.get(contractCode).multiply(contract.getPayRatio()).divide(HUNDRED)); } } @@ -448,7 +448,7 @@ public class MoneyBigScreenController { .eq(CtrIncomeContract::getProjectId, projectId) .last("limit 1") ); - if (contract != null && contract.getPayRatio()!= null) { + if (contract != null && contract.getPayRatio() != null) { incomeAmount = incomeAmount.add(incomeGroupedByProject.get(projectId).multiply(contract.getPayRatio()).divide(HUNDRED)); } } @@ -478,7 +478,7 @@ public class MoneyBigScreenController { .last("limit 1") ); - if (contract != null && contract.getPayRatio()!= null) { + if (contract != null && contract.getPayRatio() != null) { expensesAmount = expensesAmount.add(expenseGroupedByContract.get(contractCode).multiply(contract.getPayRatio()).divide(HUNDRED)); } } @@ -511,7 +511,7 @@ public class MoneyBigScreenController { .filter(java.util.Objects::nonNull) // 过滤掉 null 值 .reduce(BigDecimal.ZERO, BigDecimal::add); - List subcontractList = settlementValueSubcontractService.list(); + List subcontractList = settlementValueSubcontractService.list(); BigDecimal expensesCash = subcontractList.stream() .map(OutSettlementValueSubcontract::getSettlementValue) @@ -526,8 +526,6 @@ public class MoneyBigScreenController { } - - /** * 获取当前月份的开始时间和结束时间 * @@ -548,8 +546,8 @@ public class MoneyBigScreenController { */ @SaCheckPermission("project:bigScreen:weather") @GetMapping("/weather/{projectId}") - public R> getProjectWeather(@NotNull(message = "主键不能为空") - @PathVariable Long projectId) { + public R> getProjectWeather(@NotNull(message = "主键不能为空") + @PathVariable Long projectId) { return R.ok(moneyBigScreenService.getProjectWeather(projectId)); } 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 ddc7f7c7..6b954f27 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 @@ -23,8 +23,8 @@ import org.dromara.land.service.IBusLandBlockService; import org.dromara.land.service.IBusLandTransferLedgerService; import org.dromara.other.domain.OthYs7Device; import org.dromara.other.service.IOthYs7DeviceService; +import org.dromara.manager.weathermanager.vo.WeatherVo; import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo; -import org.dromara.project.domain.vo.project.BusProjectWeatherVo; import org.dromara.project.domain.vo.projectnews.BusProjectNewsVo; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -113,8 +113,8 @@ public class ProjectBigScreenController { */ @SaCheckPermission("project:bigScreen:weather") @GetMapping("/weather/{projectId}") - public R> getProjectWeather(@NotNull(message = "主键不能为空") - @PathVariable Long projectId) { + public R> getProjectWeather(@NotNull(message = "主键不能为空") + @PathVariable Long projectId) { return R.ok(projectBigScreenService.getProjectWeather(projectId)); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/dto/WeatherQueryReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/dto/WeatherQueryReq.java index 6072d69c..cd0bdef5 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/dto/WeatherQueryReq.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/dto/WeatherQueryReq.java @@ -1,5 +1,6 @@ package org.dromara.bigscreen.domain.dto; +import jakarta.validation.constraints.NotBlank; import lombok.Data; import java.io.Serial; @@ -18,11 +19,13 @@ public class WeatherQueryReq implements Serializable { /** * 经度 */ + @NotBlank(message = "经度不能为空") private String lng; /** * 纬度 */ + @NotBlank(message = "纬度不能为空") private String lat; } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/EnterpriseKeyIndexVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/EnterpriseKeyIndexVo.java new file mode 100644 index 00000000..f755e5a3 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/EnterpriseKeyIndexVo.java @@ -0,0 +1,38 @@ +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-09-09 15:59 + */ +@Data +public class EnterpriseKeyIndexVo implements Serializable { + + @Serial + private static final long serialVersionUID = -3987781906203623727L; + + /** + * 在建项目数量 + */ + private Long ongoingProject; + + /** + * 合同总额(单位:亿元) + */ + private BigDecimal totalContractAmount; + + /** + * 总容量 + */ + private BigDecimal totalCapacity; + + /** + * 今日施工项目数量 + */ + private Long todayProject; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/OutputValueComparisonVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/OutputValueComparisonVo.java new file mode 100644 index 00000000..85eeac4f --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/OutputValueComparisonVo.java @@ -0,0 +1,38 @@ +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-09-09 19:12 + */ +@Data +public class OutputValueComparisonVo implements Serializable { + + @Serial + private static final long serialVersionUID = -6902563869975528076L; + + /** + * 项目id + */ + private Long projectId; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 计划产值 + */ + private BigDecimal planValue; + + /** + * 实际产值 + */ + private BigDecimal actualValue; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/PeopleOverviewVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/PeopleOverviewVo.java new file mode 100644 index 00000000..6ede485b --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/PeopleOverviewVo.java @@ -0,0 +1,33 @@ +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-09-09 16:04 + */ +@Data +public class PeopleOverviewVo implements Serializable { + + @Serial + private static final long serialVersionUID = -4353811031023888101L; + + /** + * 出勤人数 + */ + private Long attendanceNumber; + + /** + * 出勤率 + */ + private BigDecimal attendanceRate; + + /** + * 施工人员数量 + */ + private Long constructorNumber; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectProgressAnalysisVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectProgressAnalysisVo.java new file mode 100644 index 00000000..4a6ba954 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectProgressAnalysisVo.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; +import java.util.List; + +/** + * @author lilemy + * @date 2025-09-09 16:51 + */ +@Data +public class ProjectProgressAnalysisVo implements Serializable { + + @Serial + private static final long serialVersionUID = -2170524608375159201L; + + /** + * 并网总容量 (MW) + */ + private BigDecimal gridConnectedCapacity; + + /** + * 计划总容量 (MW) + */ + private BigDecimal plannedCapacity; + + /** + * 延期项目数量 + */ + private Integer delayedProjectCount; + + /** + * 项目进度详情 + */ + List projectProgressDetailList; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectProgressDetailVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectProgressDetailVo.java new file mode 100644 index 00000000..e9643131 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectProgressDetailVo.java @@ -0,0 +1,33 @@ +package org.dromara.bigscreen.domain.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * @author lilemy + * @date 2025-09-09 16:55 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ProjectProgressDetailVo { + + /** + * 项目名称 + */ + private String projectName; + + /** + * 项目容量 + */ + private BigDecimal projectCapacity; + + /** + * 施工进度百分比 (0~100) + */ + private BigDecimal completionRate; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/EnterpriseBigScreenService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/EnterpriseBigScreenService.java index 931737ac..7169e1c2 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/EnterpriseBigScreenService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/EnterpriseBigScreenService.java @@ -1,7 +1,10 @@ package org.dromara.bigscreen.service; import org.dromara.bigscreen.domain.dto.WeatherQueryReq; -import org.dromara.bigscreen.domain.vo.WeatherVo; +import org.dromara.bigscreen.domain.vo.EnterpriseKeyIndexVo; +import org.dromara.bigscreen.domain.vo.OutputValueComparisonVo; +import org.dromara.bigscreen.domain.vo.ProjectProgressAnalysisVo; +import org.dromara.manager.weathermanager.vo.WeatherVo; import java.util.List; @@ -11,6 +14,27 @@ import java.util.List; */ public interface EnterpriseBigScreenService { + /** + * 获取关键指标 + * + * @return 关键指标 + */ + EnterpriseKeyIndexVo getEnterpriseKeyIndex(); + + /** + * 获取项目进度分析 + * + * @return 项目进度分析 + */ + ProjectProgressAnalysisVo getProjectProgressAnalysis(); + + /** + * 获取项目产值对比 + * + * @return 项目产值对比 + */ + List getProjectOutputValueComparison(); + /** * 获取3天的天气列表 * diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/MoneyBigScreenService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/MoneyBigScreenService.java index 48e5e017..95fa34b2 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/MoneyBigScreenService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/MoneyBigScreenService.java @@ -1,8 +1,8 @@ package org.dromara.bigscreen.service; +import org.dromara.manager.weathermanager.vo.WeatherVo; import org.dromara.project.domain.vo.project.BusProjectGisVo; import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo; -import org.dromara.project.domain.vo.project.BusProjectWeatherVo; import java.util.List; @@ -25,7 +25,7 @@ public interface MoneyBigScreenService { * @param projectId 项目id * @return 项目天气 */ - List getProjectWeather(Long projectId); + List getProjectWeather(Long projectId); /** * 获取项目安全天数 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 06074a6e..4a3e8edf 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 @@ -3,9 +3,9 @@ package org.dromara.bigscreen.service; import org.dromara.bigscreen.domain.vo.ProjectImageProgressVo; import org.dromara.bigscreen.domain.vo.ProjectPeopleVo; import org.dromara.bigscreen.domain.vo.ProjectSafetyInspectionVo; +import org.dromara.manager.weathermanager.vo.WeatherVo; import org.dromara.gps.domain.bo.GpsEquipmentBo; import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo; -import org.dromara.project.domain.vo.project.BusProjectWeatherVo; import org.dromara.project.domain.vo.projectnews.BusProjectNewsVo; import java.util.List; @@ -22,7 +22,7 @@ public interface ProjectBigScreenService { * @param projectId 项目id * @return 项目天气 */ - List getProjectWeather(Long projectId); + List getProjectWeather(Long projectId); /** * 获取项目安全天数 diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/EnterpriseBigScreenServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/EnterpriseBigScreenServiceImpl.java index d8157d94..4ebc6bb7 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/EnterpriseBigScreenServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/EnterpriseBigScreenServiceImpl.java @@ -1,11 +1,43 @@ package org.dromara.bigscreen.service.impl; +import cn.hutool.core.collection.CollUtil; +import jakarta.annotation.Resource; import org.dromara.bigscreen.domain.dto.WeatherQueryReq; -import org.dromara.bigscreen.domain.vo.WeatherVo; +import org.dromara.bigscreen.domain.vo.EnterpriseKeyIndexVo; +import org.dromara.bigscreen.domain.vo.OutputValueComparisonVo; +import org.dromara.bigscreen.domain.vo.ProjectProgressAnalysisVo; +import org.dromara.bigscreen.domain.vo.ProjectProgressDetailVo; import org.dromara.bigscreen.service.EnterpriseBigScreenService; +import org.dromara.common.core.enums.BusinessStatusEnum; +import org.dromara.common.utils.BigDecimalUtil; +import org.dromara.ctr.domain.CtrExpensesContract; +import org.dromara.ctr.domain.CtrIncomeContract; +import org.dromara.ctr.service.ICtrExpensesContractService; +import org.dromara.ctr.service.ICtrIncomeContractService; +import org.dromara.manager.weathermanager.WeatherConstant; +import org.dromara.manager.weathermanager.WeatherManager; +import org.dromara.manager.weathermanager.vo.WeatherVo; +import org.dromara.out.domain.OutConstructionValue; +import org.dromara.out.domain.OutMonthPlanAudit; +import org.dromara.out.domain.OutValueAllocation; +import org.dromara.out.service.IOutConstructionValueService; +import org.dromara.out.service.IOutMonthPlanAuditService; +import org.dromara.out.service.IOutValueAllocationService; +import org.dromara.progress.domain.PgsProgressCategory; +import org.dromara.progress.domain.PgsProgressPlanDetail; +import org.dromara.progress.service.IPgsProgressCategoryService; +import org.dromara.progress.service.IPgsProgressPlanDetailService; +import org.dromara.project.domain.BusProject; +import org.dromara.project.service.IBusProjectService; import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; /** * @author lilemy @@ -14,6 +46,211 @@ import java.util.List; @Service public class EnterpriseBigScreenServiceImpl implements EnterpriseBigScreenService { + @Resource + private WeatherManager weatherManager; + + @Resource + private IBusProjectService projectService; + + @Resource + private IPgsProgressCategoryService progressCategoryService; + + @Resource + private IPgsProgressPlanDetailService progressPlanDetailService; + + @Resource + private ICtrIncomeContractService incomeContractService; + + @Resource + private ICtrExpensesContractService expensesContractService; + + @Resource + private IOutValueAllocationService outValueAllocationService; + + @Resource + private IOutMonthPlanAuditService outMonthPlanAuditService; + + @Resource + private IOutConstructionValueService outConstructionValueService; + + /** + * 获取关键指标 + * + * @return 关键指标 + */ + @Override + public EnterpriseKeyIndexVo getEnterpriseKeyIndex() { + EnterpriseKeyIndexVo vo = new EnterpriseKeyIndexVo(); + // 在建项目 + List projectList = projectService.lambdaQuery() + .eq(BusProject::getStatus, 0) + .eq(BusProject::getPId, 0) + .list(); + // 总容量 + BigDecimal totalCapacity = projectList.stream().map(BusProject::getActual) + .filter(s -> s != null && !s.isBlank()) // 过滤掉空值 + .map(BigDecimal::new) // 转成 BigDecimal + .reduce(BigDecimal.ZERO, BigDecimal::add); + // 总合同金额 + List incomeContractList = incomeContractService.lambdaQuery() + .select(CtrIncomeContract::getAmount) + .list(); + BigDecimal totalIncomeAmount = incomeContractList.stream() + .map(CtrIncomeContract::getAmount) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + List expensesContractList = expensesContractService.lambdaQuery() + .select(CtrExpensesContract::getAmount) + .list(); + BigDecimal totalExpensesAmount = expensesContractList.stream() + .map(CtrExpensesContract::getAmount) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + // 今日施工项目数量 + Long todayProject = progressPlanDetailService.lambdaQuery() + .select(PgsProgressPlanDetail::getProjectId) + .eq(PgsProgressPlanDetail::getDate, LocalDate.now()) + .groupBy(PgsProgressPlanDetail::getProjectId) + .count(); + vo.setOngoingProject((long) projectList.size()); + vo.setTotalCapacity(totalCapacity); + vo.setTotalContractAmount(totalIncomeAmount.add(totalExpensesAmount)); + vo.setTodayProject(todayProject); + return vo; + } + + /** + * 获取项目进度分析 + * + * @return 项目进度分析 + */ + @Override + public ProjectProgressAnalysisVo getProjectProgressAnalysis() { + ProjectProgressAnalysisVo vo = new ProjectProgressAnalysisVo(); + // 1. 查询顶级项目 + List projectList = projectService.lambdaQuery() + .select(BusProject::getId, BusProject::getProjectName, BusProject::getActual, BusProject::getPlan) + .eq(BusProject::getStatus, 0) + .eq(BusProject::getPId, 0) + .list(); + if (CollUtil.isEmpty(projectList)) { + return vo; + } + // 2. 拿到顶级项目 id + List projectIds = projectList.stream() + .map(BusProject::getId) + .distinct() + .toList(); + // 3. 查询子项目(pId 在顶级项目id里) + List subProject = projectService.lambdaQuery() + .select(BusProject::getId, BusProject::getPId) + .in(BusProject::getPId, projectIds) + .list(); + // 4. 按父项目id分组子项目 + Map> subProjectMap = subProject.stream() + .collect(Collectors.groupingBy(BusProject::getPId)); + // 5. 查询所有子项目的进度分类 + List progressCategoryList = progressCategoryService.lambdaQuery() + .select(PgsProgressCategory::getId, + PgsProgressCategory::getProjectId, + PgsProgressCategory::getCompleted, + PgsProgressCategory::getTotal) + .in(CollUtil.isNotEmpty(subProject), + PgsProgressCategory::getProjectId, + subProject.stream().map(BusProject::getId).toList()) + .list(); + // 6. 按子项目id分组进度分类 + Map> progressCategoryMap = progressCategoryList.stream() + .collect(Collectors.groupingBy(PgsProgressCategory::getProjectId)); + BigDecimal gridConnectedCapacity = projectList.stream().map(BusProject::getActual) + .filter(s -> s != null && !s.isBlank()) // 过滤掉空值 + .map(BigDecimal::new) // 转成 BigDecimal + .reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal plannedCapacity = projectList.stream().map(BusProject::getPlan) + .filter(s -> s != null && !s.isBlank()) // 过滤掉空值 + .map(BigDecimal::new) // 转成 BigDecimal + .reduce(BigDecimal.ZERO, BigDecimal::add); + List detailVoList = projectList.stream().map(project -> { + ProjectProgressDetailVo detailVo = new ProjectProgressDetailVo(); + detailVo.setProjectName(project.getProjectName()); + detailVo.setProjectCapacity(new BigDecimal(project.getActual())); + List children = subProjectMap.getOrDefault(project.getId(), List.of()); + List categoryList = new ArrayList<>(); + for (BusProject child : children) { + categoryList.addAll(progressCategoryMap.getOrDefault(child.getId(), List.of())); + } + if (CollUtil.isNotEmpty(categoryList)) { + BigDecimal completed = categoryList.stream().map(PgsProgressCategory::getCompleted) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal total = categoryList.stream().map(PgsProgressCategory::getTotal) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + detailVo.setCompletionRate(BigDecimalUtil.toPercentage(completed, total)); + } + return detailVo; + }).toList(); + vo.setGridConnectedCapacity(gridConnectedCapacity); + vo.setPlannedCapacity(plannedCapacity); + // todo 获取延迟项目数 + vo.setDelayedProjectCount(0); + vo.setProjectProgressDetailList(detailVoList); + return vo; + } + + /** + * 获取项目产值对比 + * + * @return 项目产值对比 + */ + @Override + public List getProjectOutputValueComparison() { + List list = new ArrayList<>(); + // 查询顶级项目 + List projectList = projectService.lambdaQuery() + .select(BusProject::getId, BusProject::getProjectName, BusProject::getActual, BusProject::getPlan) + .eq(BusProject::getStatus, 0) + .eq(BusProject::getPId, 0) + .list(); + // 计划产值 + List planList = outValueAllocationService.lambdaQuery() + .select(OutValueAllocation::getProjectId, OutValueAllocation::getOwnerTotalValue) + .list(); + Map planMap = planList.stream() + .collect(Collectors.toMap(OutValueAllocation::getProjectId, OutValueAllocation::getOwnerTotalValue)); + // 实际产值 + // 施工产值 + List constructionValueList = outConstructionValueService.lambdaQuery() + .select(OutConstructionValue::getProjectId, OutConstructionValue::getOwnerValue) + .eq(OutConstructionValue::getAuditStatus, BusinessStatusEnum.FINISH.getStatus()) + .list(); + // 采购产值 + + // 设计产值 + List designValueList = outMonthPlanAuditService.lambdaQuery() + .select(OutMonthPlanAudit::getProjectId, OutMonthPlanAudit::getDesignValue) + .eq(OutMonthPlanAudit::getType, "1") + .list(); + // 封装数据 + projectList.stream().map(project -> { + OutputValueComparisonVo vo = new OutputValueComparisonVo(); + vo.setProjectId(project.getId()); + vo.setProjectName(project.getProjectName()); + vo.setPlanValue(planMap.getOrDefault(project.getId(), BigDecimal.ZERO)); + // 设计产值 + List designValue = designValueList.stream() + .filter(design -> design.getProjectId().equals(project.getId())) + .toList(); + vo.setActualValue(designValue.stream() + .filter(Objects::nonNull) + .map(OutMonthPlanAudit::getDesignValue) + .reduce(BigDecimal.ZERO, BigDecimal::add)); + // 施工产值 + return vo; + }).toList(); + return list; + } + /** * 获取3天的天气列表 * @@ -22,6 +259,6 @@ public class EnterpriseBigScreenServiceImpl implements EnterpriseBigScreenServic */ @Override public List getWeather3DaysList(WeatherQueryReq req) { - return List.of(); + return weatherManager.getWeatherListVo(req.getLng(), req.getLat(), WeatherConstant.THREE_DAYS_WEATHER_PATH); } } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/MoneyBigScreenServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/MoneyBigScreenServiceImpl.java index 0fffadf4..81c6fa0e 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/MoneyBigScreenServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/MoneyBigScreenServiceImpl.java @@ -4,10 +4,10 @@ import jakarta.annotation.Resource; import org.dromara.bigscreen.service.MoneyBigScreenService; import org.dromara.common.core.constant.HttpStatus; import org.dromara.common.core.exception.ServiceException; +import org.dromara.manager.weathermanager.vo.WeatherVo; import org.dromara.project.domain.BusProject; import org.dromara.project.domain.vo.project.BusProjectGisVo; import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo; -import org.dromara.project.domain.vo.project.BusProjectWeatherVo; import org.dromara.project.service.IBusProjectService; import org.springframework.stereotype.Service; @@ -40,7 +40,7 @@ public class MoneyBigScreenServiceImpl implements MoneyBigScreenService { * @return 项目天气 */ @Override - public List getProjectWeather(Long projectId) { + public List getProjectWeather(Long projectId) { checkProject(projectId); return projectService.getWeather(projectId); } 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 7fd05da8..f7ab97de 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 @@ -16,6 +16,7 @@ import org.dromara.common.utils.BigDecimalUtil; import org.dromara.contractor.domain.SubConstructionUser; import org.dromara.contractor.service.ISubConstructionUserService; import org.dromara.gps.domain.bo.GpsEquipmentBo; +import org.dromara.manager.weathermanager.vo.WeatherVo; import org.dromara.progress.domain.PgsProgressCategory; import org.dromara.progress.domain.enums.PgsProgressUnitTypeEnum; import org.dromara.progress.service.IPgsProgressCategoryService; @@ -23,7 +24,6 @@ import org.dromara.project.domain.BusProject; import org.dromara.project.domain.BusProjectTeam; import org.dromara.project.domain.BusProjectTeamMember; import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo; -import org.dromara.project.domain.vo.project.BusProjectWeatherVo; import org.dromara.project.domain.vo.projectnews.BusProjectNewsVo; import org.dromara.project.service.*; import org.dromara.safety.domain.HseRecognizeRecord; @@ -75,7 +75,7 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService { * @return 项目天气 */ @Override - public List getProjectWeather(Long projectId) { + public List getProjectWeather(Long projectId) { checkProject(projectId); return projectService.getWeather(projectId); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/weathermanager/WeatherManager.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/weathermanager/WeatherManager.java index 8c863373..b504b92b 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/weathermanager/WeatherManager.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/weathermanager/WeatherManager.java @@ -1,11 +1,17 @@ package org.dromara.manager.weathermanager; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.HttpStatus; import org.dromara.common.core.exception.ServiceException; +import org.dromara.manager.weathermanager.vo.WeatherVo; import org.springframework.stereotype.Component; import java.math.BigDecimal; @@ -16,7 +22,10 @@ import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.time.ZoneOffset; import java.time.ZonedDateTime; +import java.util.ArrayList; import java.util.Base64; +import java.util.List; +import java.util.Map; /** * @author lilemy @@ -58,6 +67,67 @@ public class WeatherManager { return body; } + /** + * 获取天气 + * + * @param lng 经度 + * @param lat 纬度 + * @param weatherPath 天气请求路径 + * @return 天气信息 + */ + public List getWeatherListVo(String lng, String lat, String weatherPath) { + String weather = this.getWeather(lng, lat, weatherPath); + // 解析为 JSONObject + JSONObject weatherJson = JSONUtil.parseObj(weather); + // 获取 daily 数组 + JSONArray dailyArray = weatherJson.getJSONArray(WeatherConstant.DAILY); + // 循环遍历,封装项目天气信息 + List weatherList = new ArrayList<>(); + for (int i = 0; i < dailyArray.size(); i++) { + JSONObject day = dailyArray.getJSONObject(i); + WeatherVo weatherVo = new WeatherVo(); + // 获取星期 + String dateStr = day.getStr(WeatherConstant.FX_DATE); + DateTime date = DateUtil.parse(dateStr, "yyyy-MM-dd"); + String week = DateUtil.format(date, "EEE"); + // 获取天气图标 + String textDay = day.getStr(WeatherConstant.TEXT_DAY); + String textNight = day.getStr(WeatherConstant.TEXT_NIGHT); + Map> weatherStatusMap = WeatherConstant.getWeatherStatusMap(); + String dayStatus = this.getWeatherCategory(textDay, weatherStatusMap); + String nightStatus = this.getWeatherCategory(textNight, weatherStatusMap); + // 封装数据 + weatherVo.setDate(dateStr); + weatherVo.setWeek(week); + weatherVo.setTempMax(day.getStr(WeatherConstant.TEMP_MAX)); + weatherVo.setTempMin(day.getStr(WeatherConstant.TEMP_MIN)); + weatherVo.setSunRise(day.getStr(WeatherConstant.SUN_RISE)); + weatherVo.setSunSet(day.getStr(WeatherConstant.SUN_SET)); + weatherVo.setDayStatus(textDay); + weatherVo.setNightStatus(textNight); + weatherVo.setDayIcon(dayStatus); + weatherVo.setNightIcon(nightStatus); + weatherList.add(weatherVo); + } + return weatherList; + } + + /** + * 根据天气图标获取天气类别 + * + * @param icon 天气图标 + * @param map 天气图标与天气类别的映射关系 + * @return 天气类别 + */ + public String getWeatherCategory(String icon, Map> map) { + for (Map.Entry> entry : map.entrySet()) { + if (entry.getValue().contains(icon)) { + return entry.getKey(); + } + } + return "cloudy"; + } + /** * 获取天气预报 Url * diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/WeatherVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/weathermanager/vo/WeatherVo.java similarity index 95% rename from xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/WeatherVo.java rename to xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/weathermanager/vo/WeatherVo.java index 6200f514..c45cc7ac 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/WeatherVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/weathermanager/vo/WeatherVo.java @@ -1,4 +1,4 @@ -package org.dromara.bigscreen.domain.vo; +package org.dromara.manager.weathermanager.vo; import lombok.Data; diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/controller/PgsProgressPlanDetailController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/controller/PgsProgressPlanDetailController.java index ce239ad0..08ecc565 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/controller/PgsProgressPlanDetailController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/controller/PgsProgressPlanDetailController.java @@ -8,10 +8,7 @@ import org.dromara.common.idempotent.annotation.RepeatSubmit; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; -import org.dromara.progress.domain.dto.progressplandetail.PgsProgressPlanDetailFinishedCreateReq; -import org.dromara.progress.domain.dto.progressplandetail.PgsProgressPlanDetailPercentageCreateReq; -import org.dromara.progress.domain.dto.progressplandetail.PgsProgressPlanDetailQueryReq; -import org.dromara.progress.domain.dto.progressplandetail.PgsProgressPlanDetailRemoveReq; +import org.dromara.progress.domain.dto.progressplandetail.*; import org.dromara.progress.domain.vo.progressplandetail.PgsProgressPlanDetailFinishedVo; import org.dromara.progress.domain.vo.progressplandetail.PgsProgressPlanDetailUnFinishVo; import org.dromara.progress.domain.vo.progressplandetail.PgsProgressPlanDetailVo; @@ -62,6 +59,16 @@ public class PgsProgressPlanDetailController extends BaseController { return toAjax(pgsProgressPlanDetailService.insertPercentageDetail(req)); } + /** + * 新增进度计划详情(数量设施) + */ + @SaCheckPermission("progress:progressPlanDetail:insertNumber") + @RepeatSubmit() + @PostMapping("/insert/number") + public R insertNumberDetail(@Validated @RequestBody PgsProgressPlanDetailNumberCreateReq req) { + return toAjax(pgsProgressPlanDetailService.insertNumberDetail(req)); + } + /** * 获取进度计划详情已完成设施详细信息 * diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/dto/progressplandetail/PgsProgressPlanDetailNumberCreateReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/dto/progressplandetail/PgsProgressPlanDetailNumberCreateReq.java new file mode 100644 index 00000000..7e6a1e84 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/dto/progressplandetail/PgsProgressPlanDetailNumberCreateReq.java @@ -0,0 +1,31 @@ +package org.dromara.progress.domain.dto.progressplandetail; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author lilemy + * @date 2025-09-09 18:06 + */ +@Data +public class PgsProgressPlanDetailNumberCreateReq implements Serializable { + + @Serial + private static final long serialVersionUID = 6264982582390127674L; + + /** + * 主键id + */ + @NotNull(message = "主键id不能为空") + private Long id; + + /** + * 完成数量 + */ + @NotNull(message = "完成数量不能为空") + private BigDecimal finishedNumber; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressPlanDetailService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressPlanDetailService.java index 6b2968cb..a4045ead 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressPlanDetailService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressPlanDetailService.java @@ -6,10 +6,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.progress.domain.PgsProgressPlanDetail; -import org.dromara.progress.domain.dto.progressplandetail.PgsProgressPlanDetailFinishedCreateReq; -import org.dromara.progress.domain.dto.progressplandetail.PgsProgressPlanDetailPercentageCreateReq; -import org.dromara.progress.domain.dto.progressplandetail.PgsProgressPlanDetailQueryReq; -import org.dromara.progress.domain.dto.progressplandetail.PgsProgressPlanDetailRemoveReq; +import org.dromara.progress.domain.dto.progressplandetail.*; import org.dromara.progress.domain.vo.progressplandetail.PgsProgressPlanDetailFinishedVo; import org.dromara.progress.domain.vo.progressplandetail.PgsProgressPlanDetailNumVo; import org.dromara.progress.domain.vo.progressplandetail.PgsProgressPlanDetailUnFinishVo; @@ -51,6 +48,14 @@ public interface IPgsProgressPlanDetailService extends IService= 0) { + progressCategory.setPlanTotal(progressCategory.getPlanTotal().subtract(progressPlan.getPlanNumber())); + } + boolean updateCategory = progressCategoryService.updateById(progressCategory); + if (!updateCategory) { + throw new ServiceException("更新进度分类异常", HttpStatus.ERROR); + } + return true; + } + + /** + * 插入进度计划详情设施 + * + * @param req 插入进度计划详情设施参数 + * @return 是否插入成功 + */ + @Override + public Boolean insertNumberDetail(PgsProgressPlanDetailNumberCreateReq req) { + // 校验 + BigDecimal finishedNumber = req.getFinishedNumber(); + // 判断是否小于 0 + if (finishedNumber.compareTo(BigDecimal.ZERO) < 0) { + throw new ServiceException("完成数量不能小于0", HttpStatus.BAD_REQUEST); + } + Long id = req.getId(); + PgsProgressPlanDetail progressPlanDetail = this.getById(id); + if (progressPlanDetail == null) { + throw new ServiceException("进度计划详情信息不存在", HttpStatus.NOT_FOUND); + } + Long progressPlanId = progressPlanDetail.getProgressPlanId(); + PgsProgressPlan progressPlan = progressPlanService.getById(progressPlanId); + if (progressPlan == null) { + throw new ServiceException("进度计划信息不存在", HttpStatus.NOT_FOUND); + } + Long progressCategoryId = progressPlanDetail.getProgressCategoryId(); + PgsProgressCategory progressCategory = progressCategoryService.getById(progressCategoryId); + if (progressCategory == null) { + throw new ServiceException("进度计划类别信息不存在", HttpStatus.NOT_FOUND); + } + // 校验:总完成数不能超过总计划数 + BigDecimal number = progressPlanDetail.getFinishedNumber(); // 旧的完成数 + BigDecimal oldFinishedNumberTotal = progressPlan.getFinishedNumber(); + BigDecimal newFinishedNumberTotal = oldFinishedNumberTotal.subtract(number).add(finishedNumber); + if (newFinishedNumberTotal.compareTo(progressPlan.getPlanNumber()) > 0) { + throw new ServiceException("总完成数量不能超过计划数量", HttpStatus.BAD_REQUEST); + } + // 更新 detail + progressPlanDetail.setFinishedNumber(finishedNumber); + boolean update = this.updateById(progressPlanDetail); + if (!update) { + throw new ServiceException("更新进度计划详情异常", HttpStatus.ERROR); + } + // 更新 plan + progressPlan.setFinishedNumber(newFinishedNumberTotal); + boolean result = progressPlanService.updateById(progressPlan); + if (!result) { + throw new ServiceException("更新进度计划异常", HttpStatus.ERROR); + } + // 更新 category + BigDecimal completed = progressCategory.getCompleted(); + BigDecimal completedTotal = completed.subtract(number).add(finishedNumber); + progressCategory.setCompleted(completedTotal); + // 如果完成数量 >= 总数量,标记为完成 + if (completedTotal.compareTo(progressCategory.getTotal()) >= 0) { progressCategory.setStatus(PgsFinishStatusEnum.FINISH.getValue()); } // 判断当前是否已完成计划数量 diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusProjectController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusProjectController.java index a4999f1a..889b7b82 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusProjectController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusProjectController.java @@ -17,6 +17,7 @@ import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; +import org.dromara.manager.weathermanager.vo.WeatherVo; import org.dromara.project.domain.dto.project.*; import org.dromara.project.domain.vo.project.*; import org.dromara.project.service.IBusProjectService; @@ -190,8 +191,8 @@ public class BusProjectController extends BaseController { * 查询项目天气 */ @GetMapping("/weather/{id}") - public R> getWeather(@NotNull(message = "主键不能为空") - @PathVariable Long id) { + public R> getWeather(@NotNull(message = "主键不能为空") + @PathVariable Long id) { return R.ok(projectService.getWeather(id)); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectWeatherVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectWeatherVo.java deleted file mode 100644 index 366d01de..00000000 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectWeatherVo.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.dromara.project.domain.vo.project; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * @author lilemy - * @date 2025/5/13 9:29 - */ -@Data -public class BusProjectWeatherVo implements Serializable { - - @Serial - private static final long serialVersionUID = 4173514725591666698L; - - /** - * 日期 - */ - private String date; - - /** - * 星期 - */ - private String week; - - /** - * 最高温度 - */ - private String tempMax; - - /** - * 最低温度 - */ - private String tempMin; - - /** - * 日出时间 - */ - private String sunRise; - - /** - * 日落时间 - */ - private String sunSet; - - /** - * 白天天气状态 - */ - private String dayStatus; - - /** - * 白天天气图标 - */ - private String dayIcon; - - /** - * 晚上天气状态 - */ - private String nightStatus; - - /** - * 晚上天气图标 - */ - private String nightIcon; - -} 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 bc5c2a39..a7a985bf 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.manager.weathermanager.vo.WeatherVo; import org.dromara.project.domain.BusProject; import org.dromara.project.domain.dto.project.*; import org.dromara.project.domain.vo.project.*; @@ -173,7 +174,7 @@ public interface IBusProjectService extends IService { * @param id 项目id * @return 天气信息列表 */ - List getWeather(Long id); + List getWeather(Long id); /** * 获取项目安全天数 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 232f5372..c827f359 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 @@ -3,12 +3,8 @@ package org.dromara.project.service.impl; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.date.DateTime; -import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.PhoneUtil; import cn.hutool.core.util.RandomUtil; -import cn.hutool.json.JSONArray; -import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -38,6 +34,7 @@ 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.manager.weathermanager.vo.WeatherVo; import org.dromara.progress.domain.PgsProgressCategory; import org.dromara.progress.domain.enums.PgsRelevancyStructureEnum; import org.dromara.progress.domain.vo.progresscategory.PgsProgressCategoryStructureVo; @@ -807,7 +804,7 @@ public class BusProjectServiceImpl extends ServiceImpl getWeather(Long id) { + public List getWeather(Long id) { BusProject project = this.getById(id); if (project == null) { throw new ServiceException("项目不存在"); @@ -818,7 +815,7 @@ public class BusProjectServiceImpl extends ServiceImpl valueOps = stringRedisTemplate.opsForValue(); @@ -826,7 +823,7 @@ public class BusProjectServiceImpl extends ServiceImpl weatherList = new ArrayList<>(); - for (int i = 0; i < dailyArray.size(); i++) { - JSONObject day = dailyArray.getJSONObject(i); - BusProjectWeatherVo weatherVo = new BusProjectWeatherVo(); - // 获取星期 - String dateStr = day.getStr(WeatherConstant.FX_DATE); - DateTime date = DateUtil.parse(dateStr, "yyyy-MM-dd"); - String week = DateUtil.format(date, "EEE"); - // 获取天气图标 - String textDay = day.getStr(WeatherConstant.TEXT_DAY); - String textNight = day.getStr(WeatherConstant.TEXT_NIGHT); - Map> weatherStatusMap = WeatherConstant.getWeatherStatusMap(); - String dayStatus = getWeatherCategory(textDay, weatherStatusMap); - String nightStatus = getWeatherCategory(textNight, weatherStatusMap); - // 封装数据 - weatherVo.setDate(dateStr); - weatherVo.setWeek(week); - weatherVo.setTempMax(day.getStr(WeatherConstant.TEMP_MAX)); - weatherVo.setTempMin(day.getStr(WeatherConstant.TEMP_MIN)); - weatherVo.setSunRise(day.getStr(WeatherConstant.SUN_RISE)); - weatherVo.setSunSet(day.getStr(WeatherConstant.SUN_SET)); - weatherVo.setDayStatus(textDay); - weatherVo.setNightStatus(textNight); - weatherVo.setDayIcon(dayStatus); - weatherVo.setNightIcon(nightStatus); - weatherList.add(weatherVo); - } + List weatherList = weatherManager.getWeatherListVo(lng, lat, WeatherConstant.THREE_DAYS_WEATHER_PATH); // 更新缓存 String cacheValue = JSONUtil.toJsonStr(weatherList); // 更新本地缓存 @@ -1172,20 +1137,4 @@ public class BusProjectServiceImpl extends ServiceImpl> map) { - for (Map.Entry> entry : map.entrySet()) { - if (entry.getValue().contains(icon)) { - return entry.getKey(); - } - } - return "cloudy"; - } - }