|
|
|
@ -1,14 +1,19 @@
|
|
|
|
|
package com.hnac.hzims.operational.homePage.service.impl; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import com.alibaba.fastjson.JSONObject; |
|
|
|
|
import com.alibaba.fastjson.TypeReference; |
|
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
|
|
|
|
import com.hnac.hzims.equipment.entity.PlanGenerationEntity; |
|
|
|
|
import com.hnac.hzims.equipment.feign.IPlanGenertionClient; |
|
|
|
|
import com.hnac.hzims.equipment.vo.EminfoAndEmParamVo; |
|
|
|
|
import com.hnac.hzims.equipment.vo.PlanPowerYearVo; |
|
|
|
|
import com.hnac.hzims.hzimsweather.feign.IRainfallClient; |
|
|
|
|
import com.hnac.hzims.hzimsweather.response.weather.Daily; |
|
|
|
|
import com.hnac.hzims.hzimsweather.response.weather.HeWeatherWeatherDailyResponse; |
|
|
|
|
import com.hnac.hzims.operational.homePage.Hydroelectric.vo.*; |
|
|
|
|
import com.hnac.hzims.hzimsweather.response.weather.HeWeatherWeatherNowResponse; |
|
|
|
|
import com.hnac.hzims.operational.homePage.hydroelectric.constant.HydroelectricConstant; |
|
|
|
|
import com.hnac.hzims.operational.homePage.hydroelectric.vo.*; |
|
|
|
|
import com.hnac.hzims.operational.homePage.service.HydroelectricService; |
|
|
|
|
import com.hnac.hzims.operational.main.service.IWeatherService; |
|
|
|
|
import com.hnac.hzims.operational.main.vo.HydropowerUnitRealVo; |
|
|
|
@ -23,11 +28,15 @@ import org.springblade.core.tool.utils.BeanUtil;
|
|
|
|
|
import org.springblade.core.tool.utils.CollectionUtil; |
|
|
|
|
import org.springblade.core.tool.utils.DateUtil; |
|
|
|
|
import org.springblade.core.tool.utils.ObjectUtil; |
|
|
|
|
import org.springblade.system.entity.Dept; |
|
|
|
|
import org.springblade.system.feign.ISysClient; |
|
|
|
|
import org.springframework.data.redis.core.RedisTemplate; |
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
|
|
|
|
|
import java.math.BigDecimal; |
|
|
|
|
import java.math.RoundingMode; |
|
|
|
|
import java.time.LocalDate; |
|
|
|
|
import java.time.format.DateTimeFormatter; |
|
|
|
|
import java.util.*; |
|
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
|
@ -40,11 +49,12 @@ import java.util.stream.Collectors;
|
|
|
|
|
@Slf4j |
|
|
|
|
public class HydroelectricServiceImpl implements HydroelectricService { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final IStationService stationService; |
|
|
|
|
|
|
|
|
|
private final IWeatherService weatherService; |
|
|
|
|
|
|
|
|
|
private final ISysClient sysClient; |
|
|
|
|
|
|
|
|
|
private final IRainfallClient rainClient; |
|
|
|
|
|
|
|
|
|
private final IPlanGenertionClient planClient; |
|
|
|
@ -97,8 +107,10 @@ public class HydroelectricServiceImpl implements HydroelectricService {
|
|
|
|
|
} |
|
|
|
|
// 设备
|
|
|
|
|
if(CollectionUtil.isNotEmpty(devices)){ |
|
|
|
|
result.setDevices(devices.stream().map(iter->{ |
|
|
|
|
result.setDevices(devices.stream().filter(device-> station.getRefDept().equals(device.getCreateDept())).map(iter->{ |
|
|
|
|
HydroelectricDeviceVo device = new HydroelectricDeviceVo(); |
|
|
|
|
device.setDeivceCode(iter.getEmCode()); |
|
|
|
|
device.setDeivceName(iter.getName()); |
|
|
|
|
Optional<HydropowerUnitRealVo> real = reals.stream().filter(o-> iter.getEmCode().equals(o.getDeviceCode())).findFirst(); |
|
|
|
|
// 实时数据
|
|
|
|
|
if(real.isPresent()){ |
|
|
|
@ -145,13 +157,18 @@ public class HydroelectricServiceImpl implements HydroelectricService {
|
|
|
|
|
}else{ |
|
|
|
|
result.setCapacityRate(0.0); |
|
|
|
|
} |
|
|
|
|
// 月计划发电量、月已发电量
|
|
|
|
|
// 月计划发电量、月已发电量、月完成率
|
|
|
|
|
if(CollectionUtil.isNotEmpty(plans)){ |
|
|
|
|
result.setPowerMonPlan(plans.stream().filter(plan -> plan.getMon().contains(DateUtil.format(new Date(),"yyyy-NM"))).mapToDouble(PlanPowerYearVo::getPlanPower).sum()); |
|
|
|
|
result.setPowerMonPlan(plans.stream().filter(plan -> plan.getMon().contains(DateUtil.format(new Date(),"yyyy-MM"))).mapToDouble(PlanPowerYearVo::getPlanPower).sum()); |
|
|
|
|
}else{ |
|
|
|
|
result.setPowerMonPlan(0.0); |
|
|
|
|
} |
|
|
|
|
result.setPowerMon(result.getDevices().stream().mapToDouble(HydroelectricDeviceVo::getPowerMon).sum()); |
|
|
|
|
if(result.getPowerMonPlan() <= 0 || result.getPowerMon() <= 0){ |
|
|
|
|
result.setPowerRateMon(0.0); |
|
|
|
|
}else{ |
|
|
|
|
result.setPowerRateMon(BigDecimal.valueOf(result.getPowerMon() / result.getPowerMonPlan() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 年计划发电量、年已发电量
|
|
|
|
|
if(CollectionUtil.isNotEmpty(plans)){ |
|
|
|
@ -160,6 +177,11 @@ public class HydroelectricServiceImpl implements HydroelectricService {
|
|
|
|
|
result.setPowerYearPlan(0.0); |
|
|
|
|
} |
|
|
|
|
result.setPowerYear(result.getDevices().stream().mapToDouble(HydroelectricDeviceVo::getPowerYear).sum()); |
|
|
|
|
if(result.getPowerYearPlan() <= 0 || result.getPowerYear() <= 0){ |
|
|
|
|
result.setPowerRateYear(0.0); |
|
|
|
|
}else{ |
|
|
|
|
result.setPowerRateYear(BigDecimal.valueOf(result.getPowerYear() / result.getPowerYearPlan() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 今日发电量、昨日发电量
|
|
|
|
|
result.setPowerDay(result.getDevices().stream().mapToDouble(HydroelectricDeviceVo::getPowerDay).sum()); |
|
|
|
@ -174,6 +196,493 @@ public class HydroelectricServiceImpl implements HydroelectricService {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 水电站区域指标 |
|
|
|
|
* @param deptId |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
@Override |
|
|
|
|
public HydroelectricAreaVo area(Long deptId) { |
|
|
|
|
HydroelectricAreaVo area = new HydroelectricAreaVo(); |
|
|
|
|
// 区域下站点
|
|
|
|
|
List<StationEntity> stations = this.stationByArea(deptId); |
|
|
|
|
if(CollectionUtil.isEmpty(stations)){ |
|
|
|
|
return area; |
|
|
|
|
} |
|
|
|
|
// 站点计划发电量数据
|
|
|
|
|
List<PlanGenerationEntity> plans = planClient.getPlanGenerationByParam(stations.stream().map(StationEntity::getCode).collect(Collectors.toList()),null,DateUtil.format(new Date(),"yyyy")); |
|
|
|
|
|
|
|
|
|
// 机构名称
|
|
|
|
|
R<Dept> dept = sysClient.getDept(deptId); |
|
|
|
|
if(dept.isSuccess() && ObjectUtil.isNotEmpty(dept.getData())){ |
|
|
|
|
area.setDeptId(dept.getData().getId()); |
|
|
|
|
area.setDeptName(dept.getData().getDeptName()); |
|
|
|
|
} |
|
|
|
|
List<Long> refDepts = stations.stream().map(StationEntity::getRefDept).collect(Collectors.toList()); |
|
|
|
|
// 站点数量
|
|
|
|
|
area.setCount(stations.size()); |
|
|
|
|
// 实时数据
|
|
|
|
|
List<HydropowerUnitRealVo> reals = (List<HydropowerUnitRealVo>) redisTemplate.opsForValue().get(LOAD_HYDROPOWER_REAL_KEY); |
|
|
|
|
if (CollectionUtil.isNotEmpty(reals)) { |
|
|
|
|
List<HydropowerUnitRealVo> stationReals = reals.stream().filter(real -> refDepts.contains(real.getDeptId())).collect(Collectors.toList()); |
|
|
|
|
if (CollectionUtil.isNotEmpty(stationReals)) { |
|
|
|
|
// 容量
|
|
|
|
|
area.setCapacity(stationReals.stream().mapToDouble(HydropowerUnitRealVo::getInstalledCapacity).sum()); |
|
|
|
|
// 负荷
|
|
|
|
|
area.setLoad(reals.stream().mapToDouble(o->{ |
|
|
|
|
if("MW".equalsIgnoreCase(o.getPowerUnit())){ |
|
|
|
|
return o.getActivePower() * 1000; |
|
|
|
|
} |
|
|
|
|
return o.getActivePower(); |
|
|
|
|
}).sum()); |
|
|
|
|
// 容量利用率
|
|
|
|
|
if (area.getCapacity() <= 0 || area.getLoad() <= 0) { |
|
|
|
|
area.setCapacityRate(0.0); |
|
|
|
|
}else{ |
|
|
|
|
area.setCapacityRate(BigDecimal.valueOf(area.getLoad() / area.getCapacity() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// 指标数据
|
|
|
|
|
List<HydropowerUnitTargetVo> targets = (List<HydropowerUnitTargetVo>) redisTemplate.opsForValue().get(LOAD_HYDROPOWER_TARGET_KEY); |
|
|
|
|
if (CollectionUtil.isNotEmpty(targets)) { |
|
|
|
|
List<HydropowerUnitTargetVo> stationTargets = targets.stream().filter(device -> refDepts.contains(device.getDeptId())).collect(Collectors.toList()); |
|
|
|
|
if (CollectionUtil.isNotEmpty(targets)) { |
|
|
|
|
// 年发电量
|
|
|
|
|
area.setGenerateYear(targets.stream().mapToDouble(HydropowerUnitTargetVo::getPowerYear).sum()); |
|
|
|
|
// 月发电量
|
|
|
|
|
area.setGenerateMon(targets.stream().mapToDouble(HydropowerUnitTargetVo::getPowerMon).sum()); |
|
|
|
|
// 日发电量
|
|
|
|
|
area.setGenerateDay(targets.stream().mapToDouble(HydropowerUnitTargetVo::getPowerDay).sum()); |
|
|
|
|
// 年计划发电量
|
|
|
|
|
area.setGeneratePlanYear(planClient.getPlanPowerYear(stations.stream().map(StationEntity::getCode).collect(Collectors.toList()), DateUtil.format(new Date(),"yyyy"))); |
|
|
|
|
if(area.getGeneratePlanYear() <= 0 || area.getGenerateYear() <= 0){ |
|
|
|
|
area.setGenerateRate(0.0); |
|
|
|
|
}else{ |
|
|
|
|
area.setGenerateRate(BigDecimal.valueOf(area.getGenerateYear() / area.getGeneratePlanYear() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// 站点近年发电数据 key - id value - 月份,发电量
|
|
|
|
|
Map<String, Map<String, Float>> maps = (Map<String, Map<String, Float>>) redisTemplate.opsForValue().get(RECENT_YEAR_POWER_DATA); |
|
|
|
|
// 近3年发电量
|
|
|
|
|
area.setRecentYears(this.recentYears(stations,maps)); |
|
|
|
|
// 发电量完成趋势
|
|
|
|
|
area.setCompletes(this.completes(stations,maps,plans)); |
|
|
|
|
// 站点综合信息
|
|
|
|
|
area.setStations(this.comprehensive(stations,plans,reals,targets)); |
|
|
|
|
return area; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 水电站集团指标 |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
@Override |
|
|
|
|
public HydroelectricGroupVo group() { |
|
|
|
|
HydroelectricGroupVo group = new HydroelectricGroupVo(); |
|
|
|
|
|
|
|
|
|
// 查询用户当前权限站点
|
|
|
|
|
List<StationEntity> stations = stationService.list(Wrappers.<StationEntity>lambdaQuery() |
|
|
|
|
.eq(StationEntity::getServeType,HydroelectricConstant.PROXY_OPEARIONAL) |
|
|
|
|
.eq(StationEntity::getType,HydroelectricConstant.HYDROPOWER) |
|
|
|
|
); |
|
|
|
|
if(CollectionUtil.isEmpty(stations)){ |
|
|
|
|
return group; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 查询用户权限机构
|
|
|
|
|
R<List<Dept>> currents = sysClient.getDeptByCurrentUser(); |
|
|
|
|
if(!currents.isSuccess() || CollectionUtil.isEmpty(currents.getData())){ |
|
|
|
|
return group; |
|
|
|
|
} |
|
|
|
|
// 区域机构
|
|
|
|
|
List<Dept> areas = currents.getData().stream().filter(o->o.getDeptCategory().equals(3)).collect(Collectors.toList()); |
|
|
|
|
if(CollectionUtil.isEmpty(areas)){ |
|
|
|
|
return group; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
List<PlanGenerationEntity> plans = planClient.getPlanGenerationByParam(stations.stream().map(StationEntity::getCode).collect(Collectors.toList()),null,DateUtil.format(new Date(),"yyyy")); |
|
|
|
|
|
|
|
|
|
// 机构名称
|
|
|
|
|
Optional<Dept> dept = currents.getData().stream().min(Comparator.comparing(Dept::getDeptCategory)); |
|
|
|
|
if(dept.isPresent()){ |
|
|
|
|
group.setDeptId(dept.get().getId()); |
|
|
|
|
group.setDeptName(dept.get().getDeptName()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
List<Long> refDepts = stations.stream().map(StationEntity::getRefDept).collect(Collectors.toList()); |
|
|
|
|
// 站点数量
|
|
|
|
|
group.setCount(stations.size()); |
|
|
|
|
// 实时数据
|
|
|
|
|
List<HydropowerUnitRealVo> reals = (List<HydropowerUnitRealVo>) redisTemplate.opsForValue().get(LOAD_HYDROPOWER_REAL_KEY); |
|
|
|
|
if (CollectionUtil.isNotEmpty(reals)) { |
|
|
|
|
List<HydropowerUnitRealVo> stationReals = reals.stream().filter(real -> refDepts.contains(real.getDeptId())).collect(Collectors.toList()); |
|
|
|
|
if (CollectionUtil.isNotEmpty(stationReals)) { |
|
|
|
|
// 容量
|
|
|
|
|
group.setCapacity(stationReals.stream().mapToDouble(HydropowerUnitRealVo::getInstalledCapacity).sum()); |
|
|
|
|
// 负荷
|
|
|
|
|
group.setLoad(reals.stream().mapToDouble(o->{ |
|
|
|
|
if("MW".equalsIgnoreCase(o.getPowerUnit())){ |
|
|
|
|
return o.getActivePower() * 1000; |
|
|
|
|
} |
|
|
|
|
return o.getActivePower(); |
|
|
|
|
}).sum()); |
|
|
|
|
// 容量利用率
|
|
|
|
|
if (group.getCapacity() <= 0 || group.getLoad() <= 0) { |
|
|
|
|
group.setCapacityRate(0.0); |
|
|
|
|
}else{ |
|
|
|
|
group.setCapacityRate(BigDecimal.valueOf(group.getLoad() / group.getCapacity() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// 指标数据
|
|
|
|
|
List<HydropowerUnitTargetVo> targets = (List<HydropowerUnitTargetVo>) redisTemplate.opsForValue().get(LOAD_HYDROPOWER_TARGET_KEY); |
|
|
|
|
if (CollectionUtil.isNotEmpty(targets)) { |
|
|
|
|
List<HydropowerUnitTargetVo> stationTargets = targets.stream().filter(device -> refDepts.contains(device.getDeptId())).collect(Collectors.toList()); |
|
|
|
|
if (CollectionUtil.isNotEmpty(targets)) { |
|
|
|
|
// 年发电量
|
|
|
|
|
group.setGenerateYear(targets.stream().mapToDouble(HydropowerUnitTargetVo::getPowerYear).sum()); |
|
|
|
|
// 月发电量
|
|
|
|
|
group.setGenerateMon(targets.stream().mapToDouble(HydropowerUnitTargetVo::getPowerMon).sum()); |
|
|
|
|
// 日发电量
|
|
|
|
|
group.setGenerateDay(targets.stream().mapToDouble(HydropowerUnitTargetVo::getPowerDay).sum()); |
|
|
|
|
// 年计划发电量
|
|
|
|
|
group.setGeneratePlanYear(planClient.getPlanPowerYear(stations.stream().map(StationEntity::getCode).collect(Collectors.toList()), DateUtil.format(new Date(),"yyyy"))); |
|
|
|
|
if(group.getGeneratePlanYear() <= 0 || group.getGenerateYear() <= 0){ |
|
|
|
|
group.setGenerateRate(0.0); |
|
|
|
|
}else{ |
|
|
|
|
group.setGenerateRate(BigDecimal.valueOf(group.getGenerateYear() / group.getGeneratePlanYear() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 站点近年发电数据 key - id value - 月份,发电量
|
|
|
|
|
Map<String, Map<String, Float>> maps = (Map<String, Map<String, Float>>) redisTemplate.opsForValue().get(RECENT_YEAR_POWER_DATA); |
|
|
|
|
|
|
|
|
|
// 近3年发电量
|
|
|
|
|
group.setRecentYears(this.recentYears(stations,maps)); |
|
|
|
|
|
|
|
|
|
// 发电量完成趋势
|
|
|
|
|
group.setCompletes(this.completes(stations,maps,plans)); |
|
|
|
|
|
|
|
|
|
// 区域综合信息
|
|
|
|
|
Map<Dept,List<StationEntity>> groupArea = areas.stream().collect(Collectors.toMap(obj -> obj, obj -> { |
|
|
|
|
List<Dept> groups = currents.getData().stream().filter(o->o.getParentId().equals(obj.getId())).collect(Collectors.toList()); |
|
|
|
|
return stations.stream().filter(station -> groups.stream().map(Dept::getId).collect(Collectors.toList()).contains(station.getRefDept())).collect(Collectors.toList()); |
|
|
|
|
})); |
|
|
|
|
group.setAreas(this.comprehensiveArea(groupArea,plans,reals,targets)); |
|
|
|
|
return group; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 区域综合信息 |
|
|
|
|
* @param areas |
|
|
|
|
* @param plans |
|
|
|
|
* @param reals |
|
|
|
|
* @param targets |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private List<HydroelectricGroupAreaVo> comprehensiveArea(Map<Dept,List<StationEntity>> areas, List<PlanGenerationEntity> plans, List<HydropowerUnitRealVo> reals, List<HydropowerUnitTargetVo> targets) { |
|
|
|
|
// 站点 : 利用情况 && 天气 && 排名
|
|
|
|
|
List<String> codes = areas.values().stream().filter(CollectionUtil::isNotEmpty).map(values -> values.get(0).getCode()).collect(Collectors.toList()); |
|
|
|
|
// 获取站点实时天气
|
|
|
|
|
Map<String, HeWeatherWeatherNowResponse> nowWeather = this.weatherService.getNowWeather(codes); |
|
|
|
|
// 获取站点7日天气
|
|
|
|
|
Map<String, HeWeatherWeatherDailyResponse> weekWeather = this.weatherService.getWeekWeather(codes); |
|
|
|
|
// 计划发电量
|
|
|
|
|
List<HydroelectricGroupAreaVo> result = areas.entrySet().stream().filter(entry->CollectionUtil.isNotEmpty(entry.getValue())).map(itr->{ |
|
|
|
|
HydroelectricGroupAreaVo groupArea = new HydroelectricGroupAreaVo(); |
|
|
|
|
groupArea.setDeptId(itr.getKey().getId()); |
|
|
|
|
groupArea.setDeptName(itr.getKey().getDeptName()); |
|
|
|
|
// 站点温度、近7日天气
|
|
|
|
|
groupArea.setTemp(this.stationTemp(nowWeather,itr.getValue().get(0).getCode())); |
|
|
|
|
groupArea.setWeather(this.stationWeather(weekWeather,itr.getValue().get(0).getCode())); |
|
|
|
|
List<Long> refDepts = itr.getValue().stream().map(StationEntity::getRefDept).collect(Collectors.toList()); |
|
|
|
|
List<String> stationCodes = itr.getValue().stream().map(StationEntity::getCode).collect(Collectors.toList()); |
|
|
|
|
// 指标数据: 发电量完成率
|
|
|
|
|
if(CollectionUtil.isNotEmpty(targets)){ |
|
|
|
|
// 当年发电量
|
|
|
|
|
groupArea.setGenerateYear(targets.stream().filter(target-> refDepts.contains(target.getDeptId())).mapToDouble(HydropowerUnitTargetVo::getPowerYear).sum()); |
|
|
|
|
if(CollectionUtil.isNotEmpty(plans)){ |
|
|
|
|
// 当年计划发电量
|
|
|
|
|
double generatePlan = plans.stream().filter(plan-> stationCodes.contains(plan.getStationId())).mapToDouble(PlanGenerationEntity::getPlanGeneration).sum(); |
|
|
|
|
if(groupArea.getGenerateYear() <= 0 || generatePlan <= 0.0){ |
|
|
|
|
groupArea.setGenerateRate(0.0); |
|
|
|
|
}else{ |
|
|
|
|
groupArea.setGenerateRate(BigDecimal.valueOf(groupArea.getGenerateYear() / generatePlan * 100).setScale(2, RoundingMode.HALF_UP).doubleValue()); |
|
|
|
|
} |
|
|
|
|
}else{ |
|
|
|
|
groupArea.setGenerateRate(0.0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
// 实时数据: 容量利用率、电站利用率
|
|
|
|
|
if(CollectionUtil.isNotEmpty(reals)){ |
|
|
|
|
// 实时功率
|
|
|
|
|
double use = reals.stream().filter(real-> refDepts.contains(real.getDeptId())).mapToDouble(o->{ |
|
|
|
|
if("MW".equalsIgnoreCase(o.getPowerUnit())){ |
|
|
|
|
return o.getActivePower() * 1000; |
|
|
|
|
} |
|
|
|
|
return o.getActivePower(); |
|
|
|
|
}).sum(); |
|
|
|
|
if(CollectionUtil.isNotEmpty(plans)){ |
|
|
|
|
// 装机容量
|
|
|
|
|
double capacity = reals.stream().filter(real-> refDepts.contains(real.getDeptId())).mapToDouble(HydropowerUnitRealVo::getInstalledCapacity).sum(); |
|
|
|
|
if(Math.abs(capacity) > 0){ |
|
|
|
|
groupArea.setCapacityUse(BigDecimal.valueOf(use / capacity * 100).setScale(1, RoundingMode.HALF_UP).doubleValue()); |
|
|
|
|
}else{ |
|
|
|
|
groupArea.setCapacityUse(0.0); |
|
|
|
|
} |
|
|
|
|
}else{ |
|
|
|
|
groupArea.setCapacityUse(0.0); |
|
|
|
|
} |
|
|
|
|
// 开机数量
|
|
|
|
|
long on = reals.stream().filter(real -> refDepts.contains(real.getDeptId()) && real.getState()).count(); |
|
|
|
|
long sum = reals.stream().filter(real-> refDepts.contains(real.getDeptId())).count(); |
|
|
|
|
if(sum > 0){ |
|
|
|
|
groupArea.setDeviceUse(BigDecimal.valueOf(on / (double)sum * 100).setScale(2, RoundingMode.HALF_UP).doubleValue()); |
|
|
|
|
}else{ |
|
|
|
|
groupArea.setDeviceUse(0.0); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return groupArea; |
|
|
|
|
}).collect(Collectors.toList()); |
|
|
|
|
|
|
|
|
|
double generateSum = result.stream().mapToDouble(HydroelectricGroupAreaVo::getGenerateYear).sum(); |
|
|
|
|
// 返回结果集
|
|
|
|
|
if(generateSum <= 0){ |
|
|
|
|
return result.stream().peek(scale-> scale.setAreaMakeUp(0.0)).filter(scale-> Math.abs(scale.getCapacityUse()) > 0 || Math.abs(scale.getAreaMakeUp()) > 0 |
|
|
|
|
|| Math.abs(scale.getDeviceUse()) > 0 || Math.abs(scale.getGenerateRate()) > 0) |
|
|
|
|
.sorted(Comparator.comparing(HydroelectricGroupAreaVo::getGenerateYear).reversed()).collect(Collectors.toList()); |
|
|
|
|
} |
|
|
|
|
return result.stream().peek(scale-> scale.setAreaMakeUp(BigDecimal.valueOf(scale.getGenerateYear() / generateSum * 100).setScale(1, RoundingMode.HALF_UP).doubleValue())). |
|
|
|
|
filter(scale-> Math.abs(scale.getCapacityUse()) > 0 || Math.abs(scale.getAreaMakeUp()) > 0 |
|
|
|
|
|| Math.abs(scale.getDeviceUse()) > 0 || Math.abs(scale.getGenerateRate()) > 0) |
|
|
|
|
.sorted(Comparator.comparing(HydroelectricGroupAreaVo::getGenerateYear).reversed()).collect(Collectors.toList()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 区域近3年发电量 |
|
|
|
|
* @param stations |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private List<HydroelectricGenerateYearVo> recentYears(List<StationEntity> stations, Map<String, Map<String, Float>> maps) { |
|
|
|
|
// 过滤站点发电量数据
|
|
|
|
|
List<Map<String, Float>> generates = maps.entrySet().stream().filter(entry -> stations.stream().map(StationEntity::getCode).collect(Collectors.toList()).contains(entry.getKey())).map(Map.Entry::getValue).collect(Collectors.toList()); |
|
|
|
|
|
|
|
|
|
// 根据月份分组
|
|
|
|
|
List<HydroelectricGenerateMonVo> generateMons = new ArrayList<>(); |
|
|
|
|
if(CollectionUtil.isNotEmpty(generates)){ |
|
|
|
|
generates.forEach(item -> item.forEach((key, value) -> { |
|
|
|
|
HydroelectricGenerateMonVo generateMon = new HydroelectricGenerateMonVo(); |
|
|
|
|
generateMon.setStrMonth(key); |
|
|
|
|
generateMon.setGenerate(Double.valueOf(value)); |
|
|
|
|
generateMons.add(generateMon); |
|
|
|
|
})); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 月份发电量数据整合
|
|
|
|
|
List<String> mons = this.mons(2,12,false); |
|
|
|
|
List<HydroelectricGenerateMonVo> integrations = mons.stream().map(mon->{ |
|
|
|
|
HydroelectricGenerateMonVo integration = new HydroelectricGenerateMonVo(); |
|
|
|
|
integration.setStrMonth(mon); |
|
|
|
|
LocalDate localDate = LocalDate.parse(DateUtil.format(new Date(), mon), DateTimeFormatter.ofPattern(DateUtil.PATTERN_DATE)); |
|
|
|
|
integration.setYear(localDate.getYear()); |
|
|
|
|
integration.setMonth(localDate.getMonthValue()); |
|
|
|
|
integration.setGenerate(generateMons.stream().filter(o->o.getStrMonth().equals(mon)).mapToDouble(HydroelectricGenerateMonVo::getGenerate).sum()); |
|
|
|
|
return integration; |
|
|
|
|
}).collect(Collectors.toList()); |
|
|
|
|
|
|
|
|
|
// 根据年份分组
|
|
|
|
|
Map<Integer, List<HydroelectricGenerateMonVo>> year = integrations.stream().collect(Collectors.groupingBy(HydroelectricGenerateMonVo::getYear)); |
|
|
|
|
// 返回结果集
|
|
|
|
|
return year.entrySet().stream().map(entry -> { |
|
|
|
|
HydroelectricGenerateYearVo generateYear = new HydroelectricGenerateYearVo(); |
|
|
|
|
generateYear.setYear(entry.getKey()); |
|
|
|
|
List<HydroelectricGenerateMonVo> sortValue = entry.getValue().stream().sorted(Comparator.comparing(HydroelectricGenerateMonVo::getMonth)).collect(Collectors.toList()); |
|
|
|
|
generateYear.setGenerateMons(sortValue); |
|
|
|
|
return generateYear; |
|
|
|
|
}).collect(Collectors.toList()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 计划完成完成趋势 |
|
|
|
|
* @param stations |
|
|
|
|
* @param maps |
|
|
|
|
* @param plans |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private List<HydroelectricGenerateMonVo> completes(List<StationEntity> stations, Map<String, Map<String, Float>> maps, List<PlanGenerationEntity> plans) { |
|
|
|
|
// 获取月份集合
|
|
|
|
|
List<String> monList = this.mons(0,12,false); |
|
|
|
|
return monList.stream().map(o->{ |
|
|
|
|
HydroelectricGenerateMonVo generate = new HydroelectricGenerateMonVo(); |
|
|
|
|
LocalDate localDate = LocalDate.parse(DateUtil.format(new Date(), o), DateTimeFormatter.ofPattern(DateUtil.PATTERN_DATE)); |
|
|
|
|
generate.setStrMonth(o); |
|
|
|
|
generate.setYear(localDate.getYear()); |
|
|
|
|
generate.setMonth(localDate.getMonthValue()); |
|
|
|
|
// 实际发电量
|
|
|
|
|
if(CollectionUtil.isEmpty(maps)){ |
|
|
|
|
generate.setGenerate(0.0); |
|
|
|
|
}else{ |
|
|
|
|
generate.setGenerate(maps.entrySet().stream(). |
|
|
|
|
filter(entry->stations.stream().map(StationEntity::getCode).collect(Collectors.toList()).contains(entry.getKey())). |
|
|
|
|
mapToDouble(valueMap-> valueMap.getValue().entrySet().stream().filter(entry->entry.getKey().equals(o)) |
|
|
|
|
.mapToDouble(Map.Entry::getValue).sum()).sum()); |
|
|
|
|
} |
|
|
|
|
// 计划发电量
|
|
|
|
|
if(CollectionUtil.isEmpty(plans)){ |
|
|
|
|
generate.setPlanGenerate(0.0); |
|
|
|
|
}else{ |
|
|
|
|
String mon = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM")); |
|
|
|
|
generate.setPlanGenerate(plans.stream().filter(plan->mon.equals(plan.getDateTime())).mapToDouble(PlanGenerationEntity::getPlanGeneration).sum()); |
|
|
|
|
} |
|
|
|
|
return generate; |
|
|
|
|
}).collect(Collectors.toList()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 站点综合信息 |
|
|
|
|
* @param reals |
|
|
|
|
* @param targets |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private List<HydroelectricAreaStationVo> comprehensive(List<StationEntity> stations, List<PlanGenerationEntity> plans , List<HydropowerUnitRealVo> reals, List<HydropowerUnitTargetVo> targets) { |
|
|
|
|
// 站点 : 利用情况 && 天气 && 排名
|
|
|
|
|
List<String> codes = stations.stream().map(StationEntity::getCode).collect(Collectors.toList()); |
|
|
|
|
// 获取站点实时天气
|
|
|
|
|
Map<String, HeWeatherWeatherNowResponse> nowWeather = this.weatherService.getNowWeather(codes); |
|
|
|
|
// 获取站点7日天气
|
|
|
|
|
Map<String, HeWeatherWeatherDailyResponse> weekWeather = this.weatherService.getWeekWeather(codes); |
|
|
|
|
// 计划发电量
|
|
|
|
|
List<HydroelectricAreaStationVo> result = stations.stream().map(itr->{ |
|
|
|
|
HydroelectricAreaStationVo station = new HydroelectricAreaStationVo(); |
|
|
|
|
station.setDeptId(itr.getRefDept()); |
|
|
|
|
station.setStationCode(itr.getCode()); |
|
|
|
|
station.setStationName(itr.getName()); |
|
|
|
|
// 站点温度、近7日天气
|
|
|
|
|
station.setTemp(this.stationTemp(nowWeather,itr.getCode())); |
|
|
|
|
station.setWeather(this.stationWeather(weekWeather,itr.getCode())); |
|
|
|
|
// 指标数据: 发电量完成率
|
|
|
|
|
if(CollectionUtil.isNotEmpty(targets)){ |
|
|
|
|
// 当年发电量
|
|
|
|
|
station.setGenerateYear(targets.stream().filter(target-> itr.getRefDept().equals(target.getDeptId())).mapToDouble(HydropowerUnitTargetVo::getPowerYear).sum()); |
|
|
|
|
if(CollectionUtil.isNotEmpty(plans)){ |
|
|
|
|
// 当年计划发电量
|
|
|
|
|
double generatePlan = plans.stream().filter(plan-> itr.getCode().equals(plan.getStationId())).mapToDouble(PlanGenerationEntity::getPlanGeneration).sum(); |
|
|
|
|
if(station.getGenerateYear() <= 0 || generatePlan <= 0.0){ |
|
|
|
|
station.setGenerateRate(0.0); |
|
|
|
|
}else{ |
|
|
|
|
station.setGenerateRate(BigDecimal.valueOf(station.getGenerateYear() / generatePlan * 100).setScale(2, RoundingMode.HALF_UP).doubleValue()); |
|
|
|
|
} |
|
|
|
|
}else{ |
|
|
|
|
station.setGenerateRate(0.0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
// 实时数据: 容量利用率、电站利用率
|
|
|
|
|
if(CollectionUtil.isNotEmpty(reals)){ |
|
|
|
|
// 实时功率
|
|
|
|
|
double use = reals.stream().filter(real-> itr.getRefDept().equals(real.getDeptId())).mapToDouble(o->{ |
|
|
|
|
if("MW".equalsIgnoreCase(o.getPowerUnit())){ |
|
|
|
|
return o.getActivePower() * 1000; |
|
|
|
|
} |
|
|
|
|
return o.getActivePower(); |
|
|
|
|
}).sum(); |
|
|
|
|
if(CollectionUtil.isNotEmpty(plans)){ |
|
|
|
|
// 装机容量
|
|
|
|
|
double capacity = reals.stream().filter(real-> itr.getRefDept().equals(real.getDeptId())).mapToDouble(HydropowerUnitRealVo::getInstalledCapacity).sum(); |
|
|
|
|
if(Math.abs(capacity) > 0){ |
|
|
|
|
station.setCapacityUse(BigDecimal.valueOf(use / capacity * 100).setScale(1, RoundingMode.HALF_UP).doubleValue()); |
|
|
|
|
}else{ |
|
|
|
|
station.setCapacityUse(0.0); |
|
|
|
|
} |
|
|
|
|
}else{ |
|
|
|
|
station.setCapacityUse(0.0); |
|
|
|
|
} |
|
|
|
|
// 开机数量
|
|
|
|
|
long on = reals.stream().filter(real -> itr.getRefDept().equals(real.getDeptId()) && real.getState()).count(); |
|
|
|
|
long sum = reals.stream().filter(real-> itr.getRefDept().equals(real.getDeptId())).count(); |
|
|
|
|
if(sum > 0){ |
|
|
|
|
station.setDeviceUse(BigDecimal.valueOf(on / (double)sum * 100).setScale(2, RoundingMode.HALF_UP).doubleValue()); |
|
|
|
|
}else{ |
|
|
|
|
station.setDeviceUse(0.0); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return station; |
|
|
|
|
}).collect(Collectors.toList()); |
|
|
|
|
|
|
|
|
|
double generateSum = result.stream().mapToDouble(HydroelectricAreaStationVo::getGenerateYear).sum(); |
|
|
|
|
// 返回结果集
|
|
|
|
|
if(generateSum <= 0){ |
|
|
|
|
return result.stream().peek(scale-> scale.setAreaMakeUp(0.0)).filter(scale-> Math.abs(scale.getCapacityUse()) > 0 || Math.abs(scale.getAreaMakeUp()) > 0 |
|
|
|
|
|| Math.abs(scale.getDeviceUse()) > 0 || Math.abs(scale.getGenerateRate()) > 0) |
|
|
|
|
.sorted(Comparator.comparing(HydroelectricAreaStationVo::getGenerateYear).reversed()).collect(Collectors.toList()); |
|
|
|
|
} |
|
|
|
|
return result.stream().peek(scale-> scale.setAreaMakeUp(BigDecimal.valueOf(scale.getGenerateYear() / generateSum * 100).setScale(1, RoundingMode.HALF_UP).doubleValue())). |
|
|
|
|
filter(scale-> Math.abs(scale.getCapacityUse()) > 0 || Math.abs(scale.getAreaMakeUp()) > 0 |
|
|
|
|
|| Math.abs(scale.getDeviceUse()) > 0 || Math.abs(scale.getGenerateRate()) > 0) |
|
|
|
|
.sorted(Comparator.comparing(HydroelectricAreaStationVo::getGenerateYear).reversed()).collect(Collectors.toList()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 温度 |
|
|
|
|
* @param nowWeather |
|
|
|
|
* @param code |
|
|
|
|
*/ |
|
|
|
|
private String stationTemp(Map<String, HeWeatherWeatherNowResponse> nowWeather, String code) { |
|
|
|
|
// 实时天气
|
|
|
|
|
if(MapUtils.isNotEmpty(nowWeather) && nowWeather.containsKey(code)){ |
|
|
|
|
HeWeatherWeatherNowResponse nowData = nowWeather.get(code); |
|
|
|
|
if(ObjectUtil.isNotEmpty(nowData.getNow())){ |
|
|
|
|
return nowData.getNow().getTemp(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return "21"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 站点七日内天气
|
|
|
|
|
private List<Daily> stationWeather(Map<String, HeWeatherWeatherDailyResponse> weekWeather, String code) { |
|
|
|
|
// 实时天气
|
|
|
|
|
if(MapUtils.isNotEmpty(weekWeather) && weekWeather.containsKey(code)){ |
|
|
|
|
HeWeatherWeatherDailyResponse weekData = weekWeather.get(code); |
|
|
|
|
return weekData.getDaily(); |
|
|
|
|
} |
|
|
|
|
return new ArrayList<>(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 区域下站点 |
|
|
|
|
* @param deptId |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private List<StationEntity> stationByArea(Long deptId) { |
|
|
|
|
// 用户权限机构
|
|
|
|
|
R<List<Dept>> depts = sysClient.getDeptByCurrentUser(); |
|
|
|
|
if(!depts.isSuccess() || CollectionUtil.isEmpty(depts.getData())){ |
|
|
|
|
return new ArrayList<>(); |
|
|
|
|
} |
|
|
|
|
List<Long> deptIds = depts.getData().stream().filter(dept->dept.getParentId().equals(deptId)).map(Dept::getId).collect(Collectors.toList()); |
|
|
|
|
if (CollectionUtil.isEmpty(deptIds)) { |
|
|
|
|
return new ArrayList<>(); |
|
|
|
|
} |
|
|
|
|
return stationService.list(Wrappers.<StationEntity>lambdaQuery() |
|
|
|
|
.eq(StationEntity::getType, HydroelectricConstant.HYDROPOWER) |
|
|
|
|
.eq(StationEntity::getServeType,HydroelectricConstant.PROXY_OPEARIONAL) |
|
|
|
|
.in(StationEntity::getRefDept,deptIds) |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 站点近30天降雨数据 |
|
|
|
|
* @param station |
|
|
|
|
* @return |
|
|
|
@ -209,7 +718,7 @@ public class HydroelectricServiceImpl implements HydroelectricService {
|
|
|
|
|
* @param devices |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private List<HydroelectricPowerRainVo> stationPowerRains(List<HydroelectricDeviceVo> devices,List<Map<String, Object>> rains) { |
|
|
|
|
private List<HydroelectricPowerRainVo> stationPowerRains(List<HydroelectricDeviceVo> devices, List<Map<String, Object>> rains) { |
|
|
|
|
List<HydroelectricDeviceGenerateVo> generates = new ArrayList<>(); |
|
|
|
|
devices.forEach(device->{ |
|
|
|
|
generates.addAll(device.getGenerates()); |
|
|
|
@ -269,15 +778,15 @@ public class HydroelectricServiceImpl implements HydroelectricService {
|
|
|
|
|
generateMon.setMonth(date.getMonth() + 1); |
|
|
|
|
// 计划发电量
|
|
|
|
|
if(CollectionUtil.isNotEmpty(plans)){ |
|
|
|
|
generateMon.setPlanPower(plans.stream().filter(plan -> plan.getMon().contains(DateUtil.format(date,"yyyy-MM"))).mapToDouble(PlanPowerYearVo::getPlanPower).sum()); |
|
|
|
|
generateMon.setPlanGenerate(plans.stream().filter(plan -> plan.getMon().contains(DateUtil.format(date,"yyyy-MM"))).mapToDouble(PlanPowerYearVo::getPlanPower).sum()); |
|
|
|
|
}else{ |
|
|
|
|
generateMon.setPlanPower(0.0); |
|
|
|
|
generateMon.setPlanGenerate(0.0); |
|
|
|
|
} |
|
|
|
|
// 实际发电
|
|
|
|
|
if(MapUtils.isNotEmpty(map)){ |
|
|
|
|
generateMon.setPower(map.entrySet().stream().filter(entry->entry.getKey().equals(mon)).mapToDouble(Map.Entry::getValue).sum()); |
|
|
|
|
generateMon.setGenerate(map.entrySet().stream().filter(entry->entry.getKey().equals(mon)).mapToDouble(Map.Entry::getValue).sum()); |
|
|
|
|
}else{ |
|
|
|
|
generateMon.setPlanPower(0.0); |
|
|
|
|
generateMon.setGenerate(0.0); |
|
|
|
|
} |
|
|
|
|
return generateMon; |
|
|
|
|
}).collect(Collectors.toList()); |
|
|
|
|