企业级大屏
This commit is contained in:
@ -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<List<RiskEarlyWarningVo>> 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);
|
||||
|
@ -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;
|
||||
}
|
@ -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<OutputValueComparisonVo> getProjectOutputValueComparison();
|
||||
|
||||
/**
|
||||
* 获取风险预警
|
||||
*
|
||||
* @return 风险预警
|
||||
*/
|
||||
List<RiskEarlyWarningVo> getRiskEarlyWarning();
|
||||
|
||||
/**
|
||||
* 获取3天的天气列表
|
||||
*
|
||||
|
@ -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<Long, List<PgsProgressCategory>> 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<OutputValueComparisonVo> 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<ProjectProgressDetailVo> 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<OutputValueComparisonVo> getProjectOutputValueComparison() {
|
||||
List<OutputValueComparisonVo> list = new ArrayList<>();
|
||||
// 查询顶级项目
|
||||
List<BusProject> 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<BusProcurement> purchaseValueList = busProcurementService.lambdaQuery()
|
||||
.select(BusProcurement::getProjectId, BusProcurement::getAcceptedQuantity, BusProcurement::getUnitPrice)
|
||||
.list();
|
||||
// 设计产值
|
||||
List<OutMonthPlanAudit> 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<OutMonthPlanAudit> 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<OutMonthPlanAudit> 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<OutConstructionValue> 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<BusProcurement> 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<RiskEarlyWarningVo> getRiskEarlyWarning() {
|
||||
List<HseViolationRecord> 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<Long> projectIds = recordList.stream()
|
||||
.map(HseViolationRecord::getProjectId)
|
||||
.collect(Collectors.toSet());
|
||||
List<BusProject> projectList = projectService.lambdaQuery()
|
||||
.select(BusProject::getId, BusProject::getProjectName)
|
||||
.in(BusProject::getId, projectIds)
|
||||
.list();
|
||||
Map<Long, String> projectMap = projectList.stream()
|
||||
.collect(Collectors.toMap(BusProject::getId, BusProject::getProjectName));
|
||||
// 风险映射
|
||||
Set<Long> levelIds = recordList.stream()
|
||||
.map(HseViolationRecord::getLevelId)
|
||||
.collect(Collectors.toSet());
|
||||
List<HseViolationLevel> levelList = hseViolationLevelService.lambdaQuery()
|
||||
.select(HseViolationLevel::getId, HseViolationLevel::getRiskType, HseViolationLevel::getViolationLevel)
|
||||
.in(HseViolationLevel::getId, levelIds)
|
||||
.list();
|
||||
Map<Long, HseViolationLevel> levelMap = levelList.stream()
|
||||
.collect(Collectors.toMap(HseViolationLevel::getId, level -> level));
|
||||
// 识别记录映射
|
||||
Set<Long> recognizeIds = recordList.stream()
|
||||
.map(HseViolationRecord::getRecognizeId)
|
||||
.collect(Collectors.toSet());
|
||||
List<HseRecognizeRecord> recognizeRecordList = hseRecognizeRecordService.lambdaQuery()
|
||||
.in(HseRecognizeRecord::getId, recognizeIds)
|
||||
.list();
|
||||
Map<Long, HseRecognizeRecord> 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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -277,7 +277,7 @@ public class FacPhotovoltaicPanelServiceImpl extends ServiceImpl<FacPhotovoltaic
|
||||
String name = nameProperties.getText();
|
||||
// ① 获取名称
|
||||
if (StringUtils.isBlank(name)) return Collections.emptyList();
|
||||
if (!name.startsWith("G")) return Collections.emptyList();
|
||||
// if (!name.startsWith("G")) return Collections.emptyList();
|
||||
List<FacPhotovoltaicPanel> panelList = new ArrayList<>();
|
||||
// ② 找到该点对应的 polygon(优先包含,否则最近)
|
||||
FacFeatureByPlane matchedPolygon = JSTUtil.findNearestOrContainingPolygon(nameFeature, locationFeatures);
|
||||
|
@ -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
|
||||
*/
|
||||
|
Reference in New Issue
Block a user