35 changed files with 759 additions and 174 deletions
			
			
		@ -0,0 +1,26 @@
					 | 
				
			||||
package com.hnac.hzims.operational.homePage.Hydroelectric.vo; | 
				
			||||
 | 
				
			||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize; | 
				
			||||
import com.fasterxml.jackson.databind.ser.std.NullSerializer; | 
				
			||||
import io.swagger.annotations.ApiModel; | 
				
			||||
import io.swagger.annotations.ApiModelProperty; | 
				
			||||
import lombok.Data; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
@Data | 
				
			||||
@ApiModel(value = "站点首页-设备近30天发电量") | 
				
			||||
public class HydroelectricDeviceGenerateVo { | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "日期") | 
				
			||||
    private String date; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "发电量") | 
				
			||||
    @JsonSerialize(nullsUsing = NullSerializer.class) | 
				
			||||
    private Float generate; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "功率") | 
				
			||||
    @JsonSerialize(nullsUsing = NullSerializer.class) | 
				
			||||
    private Float load; | 
				
			||||
} | 
				
			||||
@ -0,0 +1,22 @@
					 | 
				
			||||
package com.hnac.hzims.operational.homePage.Hydroelectric.vo; | 
				
			||||
 | 
				
			||||
import io.swagger.annotations.ApiModel; | 
				
			||||
import io.swagger.annotations.ApiModelProperty; | 
				
			||||
import lombok.Data; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
@Data | 
				
			||||
@ApiModel(value = "站点首页-设备近24小时功率曲线") | 
				
			||||
public class HydroelectricDevicePowerVo { | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "字符串时间") | 
				
			||||
    private String strHour; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "小时") | 
				
			||||
    private Integer hour; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "有功功率") | 
				
			||||
    private String activePower; | 
				
			||||
} | 
				
			||||
@ -0,0 +1,72 @@
					 | 
				
			||||
package com.hnac.hzims.operational.homePage.Hydroelectric.vo; | 
				
			||||
 | 
				
			||||
import io.swagger.annotations.ApiModel; | 
				
			||||
import io.swagger.annotations.ApiModelProperty; | 
				
			||||
import lombok.Data; | 
				
			||||
 | 
				
			||||
import java.util.List; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
@Data | 
				
			||||
@ApiModel(value = "站点首页-设备信息") | 
				
			||||
public class HydroelectricDeviceVo { | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "设备编号") | 
				
			||||
    private String deivceCode; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "设备名称") | 
				
			||||
    private String deivceName; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "开关机状态: 0 - 关机 1 - 开机") | 
				
			||||
    private Boolean state; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "总装机容量") | 
				
			||||
    private Double installedCapacity; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "有功功率") | 
				
			||||
    private Double activePower; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "容量利用率") | 
				
			||||
    private Double capacityRate; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "无功功率") | 
				
			||||
    private Double reactivePower; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "导叶开度") | 
				
			||||
    private Double guideOpen; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "今日发电量") | 
				
			||||
    private Float powerDay; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "昨日发电量") | 
				
			||||
    private Float powerYesterDay; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "当年发电量") | 
				
			||||
    private Float powerYear; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "去年发电量") | 
				
			||||
    private Float powerYesterYear; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "当月发电量") | 
				
			||||
    private Float powerMon; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "本次开机时间") | 
				
			||||
    private String startDownTime; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "本次开机时长") | 
				
			||||
    private Double startupDownDuration; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "年停机时长") | 
				
			||||
    private Double shutDownDurationYear; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "年开机时长") | 
				
			||||
    private Double startupDurationYear; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "设备近24小时有功功率") | 
				
			||||
    private List<HydroelectricDevicePowerVo> powers; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "设备近30日发电量") | 
				
			||||
    private List<HydroelectricDeviceGenerateVo> generates; | 
				
			||||
} | 
				
			||||
@ -0,0 +1,28 @@
					 | 
				
			||||
package com.hnac.hzims.operational.homePage.Hydroelectric.vo; | 
				
			||||
 | 
				
			||||
import io.swagger.annotations.ApiModel; | 
				
			||||
import io.swagger.annotations.ApiModelProperty; | 
				
			||||
import lombok.Data; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
@Data | 
				
			||||
@ApiModel(value = "月发电对象") | 
				
			||||
public class HydroelectricGenerateMonVo { | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "年份") | 
				
			||||
	private Integer year; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "月份") | 
				
			||||
	private Integer month; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "字符串格式月份") | 
				
			||||
	private String strMonth; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "月发电量") | 
				
			||||
	private Double power; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "计划发电量") | 
				
			||||
	private Double planPower; | 
				
			||||
} | 
				
			||||
@ -0,0 +1,22 @@
					 | 
				
			||||
package com.hnac.hzims.operational.homePage.Hydroelectric.vo; | 
				
			||||
 | 
				
			||||
import io.swagger.annotations.ApiModel; | 
				
			||||
import io.swagger.annotations.ApiModelProperty; | 
				
			||||
import lombok.Data; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
@Data | 
				
			||||
@ApiModel(value = "站点首页-最近30日发电量/降雨量") | 
				
			||||
public class HydroelectricPowerRainVo { | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "日期") | 
				
			||||
	private String date; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "发电量") | 
				
			||||
	private Double generate; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "降雨") | 
				
			||||
	private Double rain; | 
				
			||||
} | 
				
			||||
@ -0,0 +1,68 @@
					 | 
				
			||||
package com.hnac.hzims.operational.homePage.Hydroelectric.vo; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.hzimsweather.response.weather.Daily; | 
				
			||||
import io.swagger.annotations.ApiModel; | 
				
			||||
import io.swagger.annotations.ApiModelProperty; | 
				
			||||
import lombok.Data; | 
				
			||||
 | 
				
			||||
import java.util.List; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
@Data | 
				
			||||
@ApiModel(value = "水电站首页-站点") | 
				
			||||
public class HydroelectricStationVo { | 
				
			||||
 | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "站点编号") | 
				
			||||
	private String stationCode; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "站点名称") | 
				
			||||
	private String stationName; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "总装机容量") | 
				
			||||
	private Double installedCapacity; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "总发电负荷") | 
				
			||||
	private Double powerSum; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "容量利用率") | 
				
			||||
	private Double capacityRate; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "月计划发电量") | 
				
			||||
	private Double powerMonPlan; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "月发电量") | 
				
			||||
	private Double powerMon; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "月发电量完成率") | 
				
			||||
	private Double powerRateMon; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "年计划发电量") | 
				
			||||
	private Double powerYearPlan; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "年发电量") | 
				
			||||
	private Double powerYear; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "年发电完成率") | 
				
			||||
	private Double powerRateYear; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "今日发电量") | 
				
			||||
	private Double powerDay; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "昨日发电量") | 
				
			||||
	private Double powerYesterDay; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "七日内天气") | 
				
			||||
	private List<Daily> weather; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "设备集合") | 
				
			||||
	private List<HydroelectricDeviceVo> devices; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "降雨/发电量曲线") | 
				
			||||
	private List<HydroelectricPowerRainVo> powerRains; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "降雨/发电量曲线") | 
				
			||||
	private List<HydroelectricGenerateMonVo> generateMons; | 
				
			||||
} | 
				
			||||
@ -1,4 +1,4 @@
					 | 
				
			||||
package com.hnac.hzims.operational.home.wind; | 
				
			||||
package com.hnac.hzims.operational.homePage.wind.vo; | 
				
			||||
 | 
				
			||||
import io.swagger.annotations.ApiModel; | 
				
			||||
import io.swagger.annotations.ApiModelProperty; | 
				
			||||
@ -1,26 +0,0 @@
					 | 
				
			||||
package com.hnac.hzims.operational.main.vo.pv; | 
				
			||||
 | 
				
			||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize; | 
				
			||||
import com.fasterxml.jackson.databind.ser.std.NullSerializer; | 
				
			||||
import io.swagger.annotations.ApiModel; | 
				
			||||
import io.swagger.annotations.ApiModelProperty; | 
				
			||||
import lombok.Data; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
@Data | 
				
			||||
@ApiModel(value = "当日机组有功功率") | 
				
			||||
public class PowerRainVo { | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "日期") | 
				
			||||
	private String date; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "发电量") | 
				
			||||
	@JsonSerialize(nullsUsing = NullSerializer.class) | 
				
			||||
	private Double generate; | 
				
			||||
 | 
				
			||||
	@ApiModelProperty(value = "降雨") | 
				
			||||
	@JsonSerialize(nullsUsing = NullSerializer.class) | 
				
			||||
	private Double rain; | 
				
			||||
} | 
				
			||||
@ -0,0 +1,35 @@
					 | 
				
			||||
package com.hnac.hzims.operational.homePage.controller; | 
				
			||||
 | 
				
			||||
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; | 
				
			||||
import com.hnac.hzims.operational.homePage.Hydroelectric.vo.HydroelectricStationVo; | 
				
			||||
import com.hnac.hzims.operational.homePage.service.HydroelectricService; | 
				
			||||
import io.swagger.annotations.Api; | 
				
			||||
import io.swagger.annotations.ApiOperation; | 
				
			||||
import io.swagger.annotations.ApiParam; | 
				
			||||
import lombok.AllArgsConstructor; | 
				
			||||
import org.springblade.core.boot.ctrl.BladeController; | 
				
			||||
import org.springblade.core.tool.api.R; | 
				
			||||
import org.springframework.web.bind.annotation.GetMapping; | 
				
			||||
import org.springframework.web.bind.annotation.RequestMapping; | 
				
			||||
import org.springframework.web.bind.annotation.RequestParam; | 
				
			||||
import org.springframework.web.bind.annotation.RestController; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
@RestController | 
				
			||||
@RequestMapping("/hydroelectric") | 
				
			||||
@Api(value = "水电站-首页", tags = "水电站-首页") | 
				
			||||
@AllArgsConstructor | 
				
			||||
public class HydroelectricController extends BladeController { | 
				
			||||
 | 
				
			||||
 | 
				
			||||
	private final HydroelectricService hydroelectricService; | 
				
			||||
 | 
				
			||||
	@ApiOperation("水电站站点指标") | 
				
			||||
	@GetMapping("/station") | 
				
			||||
	@ApiOperationSupport(order = 1) | 
				
			||||
	public R<HydroelectricStationVo> station(@RequestParam("deptId") Long deptId) { | 
				
			||||
		return R.data(hydroelectricService.station(deptId)); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,12 @@
					 | 
				
			||||
package com.hnac.hzims.operational.homePage.service; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.operational.homePage.Hydroelectric.vo.HydroelectricStationVo; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * 水电站-首页接口 | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
public interface HydroelectricService { | 
				
			||||
 | 
				
			||||
	HydroelectricStationVo station(Long deptId); | 
				
			||||
} | 
				
			||||
@ -0,0 +1,316 @@
					 | 
				
			||||
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.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.HeWeatherWeatherDailyResponse; | 
				
			||||
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; | 
				
			||||
import com.hnac.hzims.operational.main.vo.HydropowerUnitTargetVo; | 
				
			||||
import com.hnac.hzims.operational.station.entity.StationEntity; | 
				
			||||
import com.hnac.hzims.operational.station.service.IStationService; | 
				
			||||
import lombok.RequiredArgsConstructor; | 
				
			||||
import lombok.extern.slf4j.Slf4j; | 
				
			||||
import org.apache.commons.collections4.MapUtils; | 
				
			||||
import org.springblade.core.tool.api.R; | 
				
			||||
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.springframework.data.redis.core.RedisTemplate; | 
				
			||||
import org.springframework.stereotype.Service; | 
				
			||||
 | 
				
			||||
import java.math.BigDecimal; | 
				
			||||
import java.math.RoundingMode; | 
				
			||||
import java.util.*; | 
				
			||||
import java.util.stream.Collectors; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * 水电站-首页接口实现类 | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
@Service | 
				
			||||
@RequiredArgsConstructor | 
				
			||||
@Slf4j | 
				
			||||
public class HydroelectricServiceImpl implements HydroelectricService { | 
				
			||||
 | 
				
			||||
 | 
				
			||||
    private final IStationService stationService; | 
				
			||||
 | 
				
			||||
    private final IWeatherService weatherService; | 
				
			||||
 | 
				
			||||
    private final IRainfallClient rainClient; | 
				
			||||
 | 
				
			||||
    private final IPlanGenertionClient planClient; | 
				
			||||
 | 
				
			||||
    private final RedisTemplate redisTemplate; | 
				
			||||
 | 
				
			||||
    private final static String RECENT_YEAR_POWER_DATA = "hzims:operation:key:power:data"; | 
				
			||||
    private final static String LOAD_HYDROPOWER_REAL_KEY = "hzims:operation:loadhydropowerunit:real:key"; | 
				
			||||
    private final static String LOAD_HYDROPOWER_TARGET_KEY = "hzims:operation:loadhydropowerunit:target:key"; | 
				
			||||
    private final static String DEVICE_CACHE_COFIG_FINAL = "hzims:equipment:emInfo:deviceCode.emInfoList"; | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 水电站首页-站点首页 | 
				
			||||
     * @param deptId | 
				
			||||
     * @return | 
				
			||||
     */ | 
				
			||||
    @Override | 
				
			||||
    public HydroelectricStationVo station(Long deptId) { | 
				
			||||
        // 步骤1.查询站点
 | 
				
			||||
        StationEntity station = stationService.getOne(Wrappers.<StationEntity>lambdaQuery().eq(StationEntity::getRefDept,deptId)); | 
				
			||||
        if(ObjectUtil.isEmpty(station)){ | 
				
			||||
            return new HydroelectricStationVo(); | 
				
			||||
        } | 
				
			||||
        // 步骤2.数据准备
 | 
				
			||||
        // 设备
 | 
				
			||||
        List<EminfoAndEmParamVo> devices = JSONObject.parseObject(redisTemplate.opsForValue().get(DEVICE_CACHE_COFIG_FINAL).toString(),new TypeReference<List<EminfoAndEmParamVo>>() {}); | 
				
			||||
        // 实时数据
 | 
				
			||||
        List<HydropowerUnitRealVo> reals = (List<HydropowerUnitRealVo>) redisTemplate.opsForValue().get(LOAD_HYDROPOWER_REAL_KEY); | 
				
			||||
        // 指标数据
 | 
				
			||||
        List<HydropowerUnitTargetVo> targets = (List<HydropowerUnitTargetVo>) redisTemplate.opsForValue().get(LOAD_HYDROPOWER_TARGET_KEY); | 
				
			||||
        // 降雨数据
 | 
				
			||||
        List<Map<String, Object>> rains = this.nearThirtyRains(station.getCode()); | 
				
			||||
        // 七日天气
 | 
				
			||||
        Map<String, HeWeatherWeatherDailyResponse> weathers = this.weekWeather(Collections.singletonList(station.getCode())); | 
				
			||||
        // 近3年发电量
 | 
				
			||||
        Map<String, Map<String, Float>> map = (Map<String, Map<String, Float>>) redisTemplate.opsForValue().get(RECENT_YEAR_POWER_DATA); | 
				
			||||
        // 计划发电量
 | 
				
			||||
        List<PlanPowerYearVo> plans = planClient.getPlanPowerByYear(station.getCode(), Integer.parseInt(DateUtil.format(new Date(),"yyyy"))); | 
				
			||||
 | 
				
			||||
        // 步骤3.数据处理、赋值
 | 
				
			||||
        HydroelectricStationVo result = new HydroelectricStationVo(); | 
				
			||||
        result.setStationCode(station.getCode()); | 
				
			||||
        result.setStationName(station.getName()); | 
				
			||||
        // 天气
 | 
				
			||||
        if(MapUtils.isNotEmpty(weathers) && weathers.containsKey(station.getCode())){ | 
				
			||||
            HeWeatherWeatherDailyResponse week = weathers.get(station.getCode()); | 
				
			||||
            if(ObjectUtil.isNotEmpty(week) && CollectionUtil.isNotEmpty(week.getDaily())){ | 
				
			||||
                result.setWeather(week.getDaily()); | 
				
			||||
            } | 
				
			||||
        } | 
				
			||||
        // 设备
 | 
				
			||||
        if(CollectionUtil.isNotEmpty(devices)){ | 
				
			||||
            result.setDevices(devices.stream().map(iter->{ | 
				
			||||
                HydroelectricDeviceVo device = new HydroelectricDeviceVo(); | 
				
			||||
                Optional<HydropowerUnitRealVo> real = reals.stream().filter(o-> iter.getEmCode().equals(o.getDeviceCode())).findFirst(); | 
				
			||||
                // 实时数据
 | 
				
			||||
                if(real.isPresent()){ | 
				
			||||
                    device.setState(real.get().getState()); | 
				
			||||
                    device.setInstalledCapacity(real.get().getInstalledCapacity()); | 
				
			||||
                    device.setActivePower(real.get().getActivePower()); | 
				
			||||
                    device.setReactivePower(real.get().getReactivePower()); | 
				
			||||
                    device.setGuideOpen(real.get().getGuideOpen()); | 
				
			||||
                    if(device.getActivePower() > 0 && device.getReactivePower() > 0){ | 
				
			||||
                        device.setCapacityRate(BigDecimal.valueOf(device.getActivePower() / device.getInstalledCapacity() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue()); | 
				
			||||
                    }else{ | 
				
			||||
                        device.setCapacityRate(0.0); | 
				
			||||
                    } | 
				
			||||
                } | 
				
			||||
                // 指标数据
 | 
				
			||||
                Optional<HydropowerUnitTargetVo> target = targets.stream().filter(o-> iter.getEmCode().equals(o.getDeviceCode())).findFirst(); | 
				
			||||
                if(target.isPresent()){ | 
				
			||||
                    device.setPowerDay(target.get().getPowerDay()); | 
				
			||||
                    device.setPowerYesterDay(target.get().getPowerYesterDay()); | 
				
			||||
                    device.setPowerYear(target.get().getPowerYear()); | 
				
			||||
                    device.setPowerYesterYear(target.get().getPowerYesterYear()); | 
				
			||||
                    device.setPowerMon(target.get().getPowerMon()); | 
				
			||||
                    device.setStartDownTime(target.get().getStartDownTime()); | 
				
			||||
                    device.setStartupDownDuration(target.get().getStartupDownDuration()); | 
				
			||||
                    device.setStartupDurationYear(target.get().getStartupDurationYear()); | 
				
			||||
                    device.setShutDownDurationYear(target.get().getShutDownDurationYear()); | 
				
			||||
                    if(CollectionUtil.isNotEmpty(target.get().getActivePowerVoList())){ | 
				
			||||
                        device.setPowers(target.get().getActivePowerVoList().stream().map(o-> BeanUtil.copy(o, HydroelectricDevicePowerVo.class)).collect(Collectors.toList())); | 
				
			||||
                    } | 
				
			||||
                    if(CollectionUtil.isNotEmpty(target.get().getActivePowerVoList())){ | 
				
			||||
                        device.setGenerates(target.get().getGenerationPowerVoList().stream().map(o-> BeanUtil.copy(o, HydroelectricDeviceGenerateVo.class)).collect(Collectors.toList())); | 
				
			||||
                    } | 
				
			||||
                } | 
				
			||||
                return device; | 
				
			||||
            }).collect(Collectors.toList())); | 
				
			||||
        } | 
				
			||||
        // 站点指标数据
 | 
				
			||||
        if(CollectionUtil.isNotEmpty(result.getDevices())){ | 
				
			||||
            // 装机容量、发电负荷
 | 
				
			||||
            result.setInstalledCapacity(result.getDevices().stream().mapToDouble(HydroelectricDeviceVo::getInstalledCapacity).sum()); | 
				
			||||
            result.setPowerSum(result.getDevices().stream().mapToDouble(HydroelectricDeviceVo::getActivePower).sum()); | 
				
			||||
            if(result.getInstalledCapacity() > 0 && result.getPowerSum() > 0 ){ | 
				
			||||
                result.setCapacityRate(BigDecimal.valueOf(result.getPowerSum() / result.getInstalledCapacity() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue()); | 
				
			||||
            }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()); | 
				
			||||
            }else{ | 
				
			||||
                result.setPowerMonPlan(0.0); | 
				
			||||
            } | 
				
			||||
            result.setPowerMon(result.getDevices().stream().mapToDouble(HydroelectricDeviceVo::getPowerMon).sum()); | 
				
			||||
 | 
				
			||||
            // 年计划发电量、年已发电量
 | 
				
			||||
            if(CollectionUtil.isNotEmpty(plans)){ | 
				
			||||
                result.setPowerYearPlan(plans.stream().mapToDouble(PlanPowerYearVo::getPlanPower).sum()); | 
				
			||||
            }else{ | 
				
			||||
                result.setPowerYearPlan(0.0); | 
				
			||||
            } | 
				
			||||
            result.setPowerYear(result.getDevices().stream().mapToDouble(HydroelectricDeviceVo::getPowerYear).sum()); | 
				
			||||
 | 
				
			||||
            // 今日发电量、昨日发电量
 | 
				
			||||
            result.setPowerDay(result.getDevices().stream().mapToDouble(HydroelectricDeviceVo::getPowerDay).sum()); | 
				
			||||
            result.setPowerYesterDay(result.getDevices().stream().mapToDouble(HydroelectricDeviceVo::getPowerYesterDay).sum()); | 
				
			||||
 | 
				
			||||
            // 近30日降雨量/发电量
 | 
				
			||||
            result.setPowerRains(this.stationPowerRains(result.getDevices(),rains)); | 
				
			||||
            // 电站月发电/计划发电
 | 
				
			||||
            result.setGenerateMons(this.stationGenerateMons(plans,map.get(station.getCode()))); | 
				
			||||
        } | 
				
			||||
        return result; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 站点近30天降雨数据 | 
				
			||||
     * @param station | 
				
			||||
     * @return | 
				
			||||
     */ | 
				
			||||
    private List<Map<String, Object>> nearThirtyRains(String station) { | 
				
			||||
        Calendar calendar = Calendar.getInstance(); | 
				
			||||
        calendar.add(Calendar.DAY_OF_MONTH,-1); | 
				
			||||
        String end = DateUtil.format(calendar.getTime(),DateUtil.PATTERN_DATE); | 
				
			||||
        calendar.add(Calendar.DAY_OF_MONTH,-29); | 
				
			||||
        String start = DateUtil.format(calendar.getTime(),DateUtil.PATTERN_DATE); | 
				
			||||
        R<List<Map<String, Object>>> rains = rainClient.getDurationRainFall(station,start,end); | 
				
			||||
        if(!rains.isSuccess() || CollectionUtil.isEmpty(rains.getData())){ | 
				
			||||
            return new ArrayList<>(); | 
				
			||||
        } | 
				
			||||
        return rains.getData(); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 站点七天天气 | 
				
			||||
     * @param stations | 
				
			||||
     */ | 
				
			||||
    private Map<String, HeWeatherWeatherDailyResponse> weekWeather(List stations) { | 
				
			||||
        if(CollectionUtil.isEmpty(stations)){ | 
				
			||||
            return new HashMap<>(); | 
				
			||||
        } | 
				
			||||
        // 实时天气
 | 
				
			||||
        return weatherService.getWeekWeather(stations); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 站点近30天降雨量/发电量 | 
				
			||||
     * @param devices | 
				
			||||
     * @return | 
				
			||||
     */ | 
				
			||||
    private List<HydroelectricPowerRainVo> stationPowerRains(List<HydroelectricDeviceVo> devices,List<Map<String, Object>> rains) { | 
				
			||||
        List<HydroelectricDeviceGenerateVo> generates = new ArrayList<>(); | 
				
			||||
        devices.forEach(device->{ | 
				
			||||
            generates.addAll(device.getGenerates()); | 
				
			||||
        }); | 
				
			||||
        Calendar calendar = Calendar.getInstance(); | 
				
			||||
        calendar.add(Calendar.DAY_OF_MONTH,-1); | 
				
			||||
        Date end = calendar.getTime(); | 
				
			||||
        calendar.add(Calendar.HOUR_OF_DAY,-calendar.get(Calendar.HOUR_OF_DAY)); | 
				
			||||
        calendar.add(Calendar.MINUTE,-calendar.get(Calendar.MINUTE)); | 
				
			||||
        calendar.add(Calendar.SECOND,-calendar.get(Calendar.SECOND)); | 
				
			||||
        calendar.add(Calendar.DAY_OF_MONTH,-29); | 
				
			||||
        Date start = calendar.getTime(); | 
				
			||||
        List<HydroelectricPowerRainVo> powerRains = new ArrayList<>(); | 
				
			||||
        while (start.compareTo(end) < 0) { | 
				
			||||
            HydroelectricPowerRainVo powerRain = new HydroelectricPowerRainVo(); | 
				
			||||
            // 日期
 | 
				
			||||
            powerRain.setDate(DateUtil.format(calendar.getTime(),"yyyy-MM-dd")); | 
				
			||||
            // 发电量
 | 
				
			||||
            powerRain.setGenerate(generates.stream().filter(o-> powerRain.getDate().equals(o.getDate())).mapToDouble(HydroelectricDeviceGenerateVo::getGenerate).sum()); | 
				
			||||
            // 降雨量
 | 
				
			||||
            if(CollectionUtil.isNotEmpty(rains)){ | 
				
			||||
                powerRain.setRain(rains.stream().mapToDouble(map->{ | 
				
			||||
                    if (map.get("fx_date").equals(powerRain.getDate())) { | 
				
			||||
                        Object object = map.get("precip"); | 
				
			||||
                        if(ObjectUtil.isEmpty(object)){ | 
				
			||||
                            return 0.0; | 
				
			||||
                        }else{ | 
				
			||||
                            return Double.parseDouble(object.toString()); | 
				
			||||
                        } | 
				
			||||
                    } | 
				
			||||
                    return 0.0; | 
				
			||||
                }).sum()); | 
				
			||||
            }else{ | 
				
			||||
                powerRain.setRain(0.0); | 
				
			||||
            } | 
				
			||||
            powerRains.add(powerRain); | 
				
			||||
            calendar.add(Calendar.DAY_OF_MONTH,1); | 
				
			||||
            start = calendar.getTime(); | 
				
			||||
        } | 
				
			||||
        return powerRains; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 站点电站月发电/计划发电 | 
				
			||||
     * @param plans | 
				
			||||
     * @param map | 
				
			||||
     * @return | 
				
			||||
     */ | 
				
			||||
    private List<HydroelectricGenerateMonVo> stationGenerateMons(List<PlanPowerYearVo> plans, Map<String, Float> map) { | 
				
			||||
        // 获取月份集合
 | 
				
			||||
        List<String> mons = this.mons(0,12,false); | 
				
			||||
        return mons.stream().map(mon->{ | 
				
			||||
            Date date = DateUtil.parse(mon,DateUtil.PATTERN_DATE); | 
				
			||||
            HydroelectricGenerateMonVo generateMon = new HydroelectricGenerateMonVo(); | 
				
			||||
            generateMon.setStrMonth(mon); | 
				
			||||
            generateMon.setYear(date.getYear()); | 
				
			||||
            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()); | 
				
			||||
            }else{ | 
				
			||||
                generateMon.setPlanPower(0.0); | 
				
			||||
            } | 
				
			||||
            // 实际发电
 | 
				
			||||
            if(MapUtils.isNotEmpty(map)){ | 
				
			||||
                generateMon.setPower(map.entrySet().stream().filter(entry->entry.getKey().equals(mon)).mapToDouble(Map.Entry::getValue).sum()); | 
				
			||||
            }else{ | 
				
			||||
                generateMon.setPlanPower(0.0); | 
				
			||||
            } | 
				
			||||
            return generateMon; | 
				
			||||
        }).collect(Collectors.toList()); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 获取近年月份集合 | 
				
			||||
     * @param year | 
				
			||||
     * @return | 
				
			||||
     */ | 
				
			||||
    public List<String> mons(int year, int endMoth, boolean nextMon) { | 
				
			||||
        List<String> list = new ArrayList<>(); | 
				
			||||
        // 开始日期
 | 
				
			||||
        Calendar endCal = Calendar.getInstance(); | 
				
			||||
        endCal.setTime(new Date()); | 
				
			||||
        endCal.add(Calendar.MONTH, -endCal.get(Calendar.MONTH) + endMoth); | 
				
			||||
        endCal.add(Calendar.DATE, -endCal.get(Calendar.DATE) + 1); | 
				
			||||
 | 
				
			||||
        // 结束日期
 | 
				
			||||
        Calendar startCal = Calendar.getInstance(); | 
				
			||||
        startCal.setTime(new Date()); | 
				
			||||
        startCal.set(Calendar.YEAR, startCal.get(Calendar.YEAR) - year); | 
				
			||||
        startCal.add(Calendar.MONTH, -startCal.get(Calendar.MONTH)); | 
				
			||||
        startCal.add(Calendar.DATE, -startCal.get(Calendar.DATE) + 1); | 
				
			||||
        // 获取日期之间的月份
 | 
				
			||||
        while (endCal.after(startCal)) { | 
				
			||||
            list.add(DateUtil.format(startCal.getTime(),DateUtil.PATTERN_DATE)); | 
				
			||||
            startCal.add(Calendar.MONTH, 1); | 
				
			||||
        } | 
				
			||||
        if(nextMon){ | 
				
			||||
            list.add(DateUtil.format(endCal.getTime(),DateUtil.PATTERN_DATE)); | 
				
			||||
        } | 
				
			||||
        return list; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue