From ede1e501b403d7e7a6533bbb0143916f586405e4 Mon Sep 17 00:00:00 2001 From: lcj <2331845269@qq.com> Date: Tue, 9 Sep 2025 23:42:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=81=E4=B8=9A=E7=BA=A7=E5=A4=A7=E5=B1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EnterpriseBigScreenController.java | 24 ++- .../domain/vo/RiskEarlyWarningVo.java | 48 +++++ .../service/EnterpriseBigScreenService.java | 8 + .../impl/EnterpriseBigScreenServiceImpl.java | 172 +++++++++++++++--- .../impl/FacPhotovoltaicPanelServiceImpl.java | 2 +- .../vo/progressplan/PgsProgressPlanVo.java | 15 ++ 6 files changed, 233 insertions(+), 36 deletions(-) create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/RiskEarlyWarningVo.java 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 19bd3f61..36176c08 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 @@ -23,12 +23,8 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; import java.util.*; +import java.util.stream.Collectors; /** * 企业级大屏 @@ -81,6 +77,15 @@ public class EnterpriseBigScreenController { return R.ok(enterpriseBigScreenService.getProjectOutputValueComparison()); } + /** + * 风险预警 + */ + @SaCheckPermission("enterprise:bigScreen:riskEarlyWarning") + @GetMapping("/riskEarlyWarning") + public R> getRiskEarlyWarning() { + return R.ok(enterpriseBigScreenService.getRiskEarlyWarning()); + } + /** * 查询天气 */ @@ -197,9 +202,14 @@ public class EnterpriseBigScreenController { .map(BusAttendance::getUserId) .distinct() .count(); - BigDecimal rate = new BigDecimal(count * 100) - .divide(new BigDecimal(projectUserCountMap.get(projectId)), 1, RoundingMode.HALF_UP); + Integer i = projectUserCountMap.get(projectId); + BigDecimal rate = new BigDecimal("0.0"); + if (i > 0) { + rate = new BigDecimal(count * 100) + .divide(new BigDecimal(projectUserCountMap.get(projectId)), 1, RoundingMode.HALF_UP); + } projectAttendanceCountVo.setAttendanceRate(rate.doubleValue()); + projectAttendanceCountVos.add(projectAttendanceCountVo); } return R.ok(projectAttendanceCountVos); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/RiskEarlyWarningVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/RiskEarlyWarningVo.java new file mode 100644 index 00000000..aeccd31d --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/RiskEarlyWarningVo.java @@ -0,0 +1,48 @@ +package org.dromara.bigscreen.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; + +/** + * @author lilemy + * @date 2025-09-09 20:04 + */ +@Data +public class RiskEarlyWarningVo implements Serializable { + + @Serial + private static final long serialVersionUID = 5250172770638676715L; + + /** + * 时间 + */ + private LocalDate date; + + /** + * 风险类型 + */ + private String riskType; + + /** + * 报警内容 + */ + private String alarmContent; + + /** + * 威胁等级 + */ + private String dangerLevel; + + /** + * 来源 + */ + private String source; + + /** + * 告警等级 + */ + private String alarmLevel; +} 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 7169e1c2..e8c89118 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 @@ -4,6 +4,7 @@ import org.dromara.bigscreen.domain.dto.WeatherQueryReq; 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.RiskEarlyWarningVo; import org.dromara.manager.weathermanager.vo.WeatherVo; import java.util.List; @@ -35,6 +36,13 @@ public interface EnterpriseBigScreenService { */ List getProjectOutputValueComparison(); + /** + * 获取风险预警 + * + * @return 风险预警 + */ + List getRiskEarlyWarning(); + /** * 获取3天的天气列表 * 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 4ebc6bb7..f7e95db0 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 @@ -3,12 +3,10 @@ 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.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.domain.vo.*; import org.dromara.bigscreen.service.EnterpriseBigScreenService; import org.dromara.common.core.enums.BusinessStatusEnum; +import org.dromara.common.core.utils.DateUtils; import org.dromara.common.utils.BigDecimalUtil; import org.dromara.ctr.domain.CtrExpensesContract; import org.dromara.ctr.domain.CtrIncomeContract; @@ -17,9 +15,11 @@ 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.BusProcurement; import org.dromara.out.domain.OutConstructionValue; import org.dromara.out.domain.OutMonthPlanAudit; import org.dromara.out.domain.OutValueAllocation; +import org.dromara.out.service.IBusProcurementService; import org.dromara.out.service.IOutConstructionValueService; import org.dromara.out.service.IOutMonthPlanAuditService; import org.dromara.out.service.IOutValueAllocationService; @@ -29,14 +29,18 @@ 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.dromara.safety.domain.HseRecognizeRecord; +import org.dromara.safety.domain.HseViolationLevel; +import org.dromara.safety.domain.HseViolationRecord; +import org.dromara.safety.service.IHseRecognizeRecordService; +import org.dromara.safety.service.IHseViolationLevelService; +import org.dromara.safety.service.IHseViolationRecordService; import org.springframework.stereotype.Service; import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +77,18 @@ public class EnterpriseBigScreenServiceImpl implements EnterpriseBigScreenServic @Resource private IOutConstructionValueService outConstructionValueService; + @Resource + private IHseViolationRecordService hseViolationRecordService; + + @Resource + private IHseViolationLevelService hseViolationLevelService; + + @Resource + private IBusProcurementService busProcurementService; + + @Resource + private IHseRecognizeRecordService hseRecognizeRecordService; + /** * 获取关键指标 * @@ -162,14 +178,22 @@ public class EnterpriseBigScreenServiceImpl implements EnterpriseBigScreenServic // 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 + // 并网容量 =(完工产值/计划总产值)* 计划容量 + List list = getProjectOutputValueComparison(); + BigDecimal actualValue = list.stream() + .map(OutputValueComparisonVo::getActualValue) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal planValue = list.stream() + .map(OutputValueComparisonVo::getPlanValue) + .filter(Objects::nonNull) .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); + BigDecimal gridConnectedCapacity = plannedCapacity.multiply(actualValue.divide(planValue, 2, RoundingMode.HALF_UP)); + vo.setGridConnectedCapacity(gridConnectedCapacity); List detailVoList = projectList.stream().map(project -> { ProjectProgressDetailVo detailVo = new ProjectProgressDetailVo(); detailVo.setProjectName(project.getProjectName()); @@ -205,7 +229,6 @@ public class EnterpriseBigScreenServiceImpl implements EnterpriseBigScreenServic */ @Override public List getProjectOutputValueComparison() { - List list = new ArrayList<>(); // 查询顶级项目 List projectList = projectService.lambdaQuery() .select(BusProject::getId, BusProject::getProjectName, BusProject::getActual, BusProject::getPlan) @@ -225,30 +248,123 @@ public class EnterpriseBigScreenServiceImpl implements EnterpriseBigScreenServic .eq(OutConstructionValue::getAuditStatus, BusinessStatusEnum.FINISH.getStatus()) .list(); // 采购产值 - + List purchaseValueList = busProcurementService.lambdaQuery() + .select(BusProcurement::getProjectId, BusProcurement::getAcceptedQuantity, BusProcurement::getUnitPrice) + .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 projectList.stream().map(project -> { + OutputValueComparisonVo vo = new OutputValueComparisonVo(); + vo.setProjectId(project.getId()); + vo.setProjectName(project.getProjectName()); + vo.setPlanValue(planMap.getOrDefault(project.getId(), BigDecimal.ZERO)); + BigDecimal actualValue = BigDecimal.ZERO; + // 设计产值 + List designValue = designValueList.stream() + .filter(design -> design.getProjectId().equals(project.getId())) + .toList(); + if (CollUtil.isNotEmpty(designValue)) { + BigDecimal dValue = designValue.stream() + .filter(Objects::nonNull) + .map(OutMonthPlanAudit::getDesignValue) + .reduce(BigDecimal.ZERO, BigDecimal::add); + actualValue = actualValue.add(dValue); + } + // 施工产值 + List constructionValue = constructionValueList.stream() + .filter(construction -> construction.getProjectId().equals(project.getId())) + .toList(); + if (CollUtil.isNotEmpty(constructionValue)) { + BigDecimal cValue = constructionValue.stream() + .filter(Objects::nonNull) + .map(OutConstructionValue::getOwnerValue) + .reduce(BigDecimal.ZERO, BigDecimal::add); + actualValue = actualValue.add(cValue); + } + // 采购产值 + List purchaseValue = purchaseValueList.stream() + .filter(purchase -> purchase.getProjectId().equals(project.getId())) + .toList(); + if (CollUtil.isNotEmpty(purchaseValue)) { + BigDecimal pValue = purchaseValue.stream() + .filter(Objects::nonNull) + .filter(purchase -> purchase.getAcceptedQuantity() != null && purchase.getUnitPrice() != null) + .map(purchase -> purchase.getAcceptedQuantity().multiply(purchase.getUnitPrice())) + .reduce(BigDecimal.ZERO, BigDecimal::add); + actualValue = actualValue.add(pValue); + } + vo.setActualValue(actualValue); + return vo; + }).filter(vo -> vo.getActualValue().compareTo(BigDecimal.ZERO) > 0) + .toList(); + } + + /** + * 获取风险预警 + * + * @return 风险预警 + */ + @Override + public List getRiskEarlyWarning() { + List recordList = hseViolationRecordService.lambdaQuery() + .last("limit 10") + .list(); + recordList = recordList.stream() + .filter(record -> record.getReviewType() == null || record.getReviewType().equals("2")) + .toList(); + if (CollUtil.isEmpty(recordList)) { + return Collections.emptyList(); + } + // 项目映射 + Set projectIds = recordList.stream() + .map(HseViolationRecord::getProjectId) + .collect(Collectors.toSet()); + List projectList = projectService.lambdaQuery() + .select(BusProject::getId, BusProject::getProjectName) + .in(BusProject::getId, projectIds) + .list(); + Map projectMap = projectList.stream() + .collect(Collectors.toMap(BusProject::getId, BusProject::getProjectName)); + // 风险映射 + Set levelIds = recordList.stream() + .map(HseViolationRecord::getLevelId) + .collect(Collectors.toSet()); + List levelList = hseViolationLevelService.lambdaQuery() + .select(HseViolationLevel::getId, HseViolationLevel::getRiskType, HseViolationLevel::getViolationLevel) + .in(HseViolationLevel::getId, levelIds) + .list(); + Map levelMap = levelList.stream() + .collect(Collectors.toMap(HseViolationLevel::getId, level -> level)); + // 识别记录映射 + Set recognizeIds = recordList.stream() + .map(HseViolationRecord::getRecognizeId) + .collect(Collectors.toSet()); + List recognizeRecordList = hseRecognizeRecordService.lambdaQuery() + .in(HseRecognizeRecord::getId, recognizeIds) + .list(); + Map recognizeRecordMap = recognizeRecordList.stream() + .collect(Collectors.toMap(HseRecognizeRecord::getId, recognize -> recognize)); + return recordList.stream().map(record -> { + RiskEarlyWarningVo vo = new RiskEarlyWarningVo(); + Date violationTime = record.getViolationTime() != null ? record.getViolationTime() : record.getCreateTime(); + vo.setDate(DateUtils.toLocalDate(violationTime)); + vo.setSource(projectMap.getOrDefault(record.getProjectId(), "未知项目")); + vo.setRiskType(record.getViolationType()); + if (levelMap.containsKey(record.getLevelId())) { + HseViolationLevel level = levelMap.get(record.getLevelId()); + vo.setAlarmLevel(level.getRiskType()); + vo.setDangerLevel(level.getViolationLevel()); + } + if (recognizeRecordMap.containsKey(record.getRecognizeId())) { + HseRecognizeRecord hseRecognizeRecord = recognizeRecordMap.get(record.getRecognizeId()); + vo.setAlarmContent(hseRecognizeRecord.getDescription()); + } return vo; }).toList(); - return list; } /** diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelServiceImpl.java index 868df63e..f054875d 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelServiceImpl.java @@ -277,7 +277,7 @@ public class FacPhotovoltaicPanelServiceImpl extends ServiceImpl panelList = new ArrayList<>(); // ② 找到该点对应的 polygon(优先包含,否则最近) FacFeatureByPlane matchedPolygon = JSTUtil.findNearestOrContainingPolygon(nameFeature, locationFeatures); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplan/PgsProgressPlanVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplan/PgsProgressPlanVo.java index 46aa2b5f..6fcd9640 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplan/PgsProgressPlanVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplan/PgsProgressPlanVo.java @@ -34,6 +34,21 @@ public class PgsProgressPlanVo implements Serializable { @ExcelProperty(value = "主键id") private Long id; + /** + * 项目id + */ + private Long projectId; + + /** + * 方阵id + */ + private Long matrixId; + + /** + * 方阵名称 + */ + private String matrixName; + /** * 进度类型id */