haungxing
6 months ago
20 changed files with 652 additions and 28 deletions
@ -0,0 +1,43 @@ |
|||||||
|
package com.hnac.hzims.equipment.entity; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||||
|
import io.swagger.annotations.ApiModel; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
import lombok.EqualsAndHashCode; |
||||||
|
import org.springblade.core.tenant.mp.TenantEntity; |
||||||
|
|
||||||
|
import java.math.BigDecimal; |
||||||
|
|
||||||
|
/** |
||||||
|
* 实体类 |
||||||
|
* |
||||||
|
* @author Chill |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
@TableName("hzims_em_thirty_generate") |
||||||
|
@EqualsAndHashCode(callSuper = true) |
||||||
|
@ApiModel(value = "设备30天发电量对象", description = "") |
||||||
|
public class ThirtyGenerationEntity extends TenantEntity { |
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点编码") |
||||||
|
private String stationId; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点名称") |
||||||
|
private String stationName; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "设备编号") |
||||||
|
private String deviceCode; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "设备名称") |
||||||
|
private String deviceName; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "月份 : String") |
||||||
|
private String strDay; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "月份 : Int") |
||||||
|
private Integer day; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "发电量") |
||||||
|
private BigDecimal generate; |
||||||
|
} |
@ -0,0 +1,43 @@ |
|||||||
|
package com.hnac.hzims.equipment.entity; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||||
|
import io.swagger.annotations.ApiModel; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
import lombok.EqualsAndHashCode; |
||||||
|
import org.springblade.core.tenant.mp.TenantEntity; |
||||||
|
|
||||||
|
import java.math.BigDecimal; |
||||||
|
|
||||||
|
/** |
||||||
|
* 实体类 |
||||||
|
* |
||||||
|
* @author Chill |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
@TableName("hzims_em_three_generate") |
||||||
|
@EqualsAndHashCode(callSuper = true) |
||||||
|
@ApiModel(value = "设备3年发电量对象", description = "") |
||||||
|
public class ThreeGenerationEntity extends TenantEntity { |
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点编码") |
||||||
|
private String stationId; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点名称") |
||||||
|
private String stationName; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "设备编号") |
||||||
|
private String deviceCode; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "设备名称") |
||||||
|
private String deviceName; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "月份 : String") |
||||||
|
private String strMonth; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "月份 : Int") |
||||||
|
private Integer month; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "发电量") |
||||||
|
private BigDecimal generate; |
||||||
|
} |
@ -0,0 +1,14 @@ |
|||||||
|
package com.hnac.hzims.operational.main.constant; |
||||||
|
|
||||||
|
/** |
||||||
|
* 定时任务JobHandler名称 |
||||||
|
* @author 11423 |
||||||
|
*/ |
||||||
|
public interface ScheduledConstant { |
||||||
|
|
||||||
|
String THREE_YEAR_POWER_GENERATION = "threeYearPowerGeneration"; |
||||||
|
|
||||||
|
String THIRTY_DAY_POWER_GENERATION = "thirtyDayPowerGeneration"; |
||||||
|
|
||||||
|
String THIS_DAY_POWER_GENERATION = "thisDayPowerGeneration"; |
||||||
|
} |
@ -0,0 +1,12 @@ |
|||||||
|
package com.hnac.hzims.scheduled.mapper.equipment; |
||||||
|
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||||
|
import com.hnac.hzims.equipment.entity.ThirtyGenerationEntity; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author ysj |
||||||
|
*/ |
||||||
|
public interface ThirtyGenerateMapper extends BaseMapper<ThirtyGenerationEntity> { |
||||||
|
|
||||||
|
} |
@ -0,0 +1,12 @@ |
|||||||
|
package com.hnac.hzims.scheduled.mapper.equipment; |
||||||
|
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||||
|
import com.hnac.hzims.equipment.entity.ThreeGenerationEntity; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author ysj |
||||||
|
*/ |
||||||
|
public interface ThreeGenerateMapper extends BaseMapper<ThreeGenerationEntity> { |
||||||
|
|
||||||
|
} |
@ -0,0 +1,72 @@ |
|||||||
|
package com.hnac.hzims.scheduled.scheduled; |
||||||
|
|
||||||
|
import com.hnac.hzims.operational.main.constant.HomePageConstant; |
||||||
|
import com.hnac.hzims.scheduled.service.operation.home.ObtainGenerationService; |
||||||
|
import com.xxl.job.core.biz.model.ReturnT; |
||||||
|
import com.xxl.job.core.handler.annotation.XxlJob; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springblade.core.tool.utils.DateUtil; |
||||||
|
import org.springblade.core.tool.utils.Func; |
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
|
||||||
|
import java.util.Arrays; |
||||||
|
import java.util.Date; |
||||||
|
|
||||||
|
import static com.hnac.hzims.operational.main.constant.ScheduledConstant.*; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 设备发电量定时任务 |
||||||
|
* @author ysj |
||||||
|
*/ |
||||||
|
@Slf4j |
||||||
|
@Component |
||||||
|
public class GenerationScheduledTask { |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private ObtainGenerationService service; |
||||||
|
|
||||||
|
/** |
||||||
|
* 设备近3年发电量数据 : 按月分割 |
||||||
|
* @param param |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
@XxlJob(THREE_YEAR_POWER_GENERATION) |
||||||
|
public ReturnT<String> threeYearPowerGeneration(String param) { |
||||||
|
if (Func.isBlank(param)) { |
||||||
|
param = DateUtil.format(new Date(), "yyyy-MM"); |
||||||
|
} |
||||||
|
service.threeYearPowerGeneration(param); |
||||||
|
return new ReturnT<>("SUCCESS"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 设备30天发电量数据 : 按日分割 |
||||||
|
* @param param |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
@XxlJob(THIRTY_DAY_POWER_GENERATION) |
||||||
|
public ReturnT<String> thirtyDayPowerGeneration(String param) { |
||||||
|
if (Func.isBlank(param)) { |
||||||
|
param = DateUtil.format(new Date(), "yyyy-MM"); |
||||||
|
} |
||||||
|
service.thirtyDayPowerGeneration(param); |
||||||
|
return new ReturnT<>("SUCCESS"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 当天发电量数据 |
||||||
|
* @param param |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
@XxlJob(THIS_DAY_POWER_GENERATION) |
||||||
|
public ReturnT<String> thisDayPowerGeneration(String param) { |
||||||
|
if (Func.isBlank(param)) { |
||||||
|
param = DateUtil.format(new Date(), "yyyy-MM"); |
||||||
|
} |
||||||
|
service.thisDayPowerGeneration(param); |
||||||
|
return new ReturnT<>("SUCCESS"); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,11 @@ |
|||||||
|
package com.hnac.hzims.scheduled.service.equipment; |
||||||
|
|
||||||
|
import com.hnac.hzims.equipment.entity.ThirtyGenerationEntity; |
||||||
|
import org.springblade.core.mp.base.BaseService; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author ysj |
||||||
|
*/ |
||||||
|
public interface ThirtyGenerateService extends BaseService<ThirtyGenerationEntity> { |
||||||
|
|
||||||
|
} |
@ -0,0 +1,11 @@ |
|||||||
|
package com.hnac.hzims.scheduled.service.equipment; |
||||||
|
|
||||||
|
import com.hnac.hzims.equipment.entity.ThreeGenerationEntity; |
||||||
|
import org.springblade.core.mp.base.BaseService; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author ysj |
||||||
|
*/ |
||||||
|
public interface ThreeGenerateService extends BaseService<ThreeGenerationEntity> { |
||||||
|
|
||||||
|
} |
@ -0,0 +1,22 @@ |
|||||||
|
package com.hnac.hzims.scheduled.service.equipment.impl; |
||||||
|
|
||||||
|
import com.baomidou.dynamic.datasource.annotation.DS; |
||||||
|
import com.hnac.hzims.equipment.entity.ThirtyGenerationEntity; |
||||||
|
import com.hnac.hzims.scheduled.mapper.equipment.ThirtyGenerateMapper; |
||||||
|
import com.hnac.hzims.scheduled.service.equipment.ThirtyGenerateService; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springblade.core.mp.base.BaseServiceImpl; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author ysj |
||||||
|
*/ |
||||||
|
@AllArgsConstructor |
||||||
|
@Service |
||||||
|
@Slf4j |
||||||
|
@DS("equipment") |
||||||
|
public class ThirtyGenerateServiceImpl extends BaseServiceImpl<ThirtyGenerateMapper, ThirtyGenerationEntity> implements ThirtyGenerateService { |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,22 @@ |
|||||||
|
package com.hnac.hzims.scheduled.service.equipment.impl; |
||||||
|
|
||||||
|
import com.baomidou.dynamic.datasource.annotation.DS; |
||||||
|
import com.hnac.hzims.equipment.entity.ThreeGenerationEntity; |
||||||
|
import com.hnac.hzims.scheduled.mapper.equipment.ThreeGenerateMapper; |
||||||
|
import com.hnac.hzims.scheduled.service.equipment.ThreeGenerateService; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springblade.core.mp.base.BaseServiceImpl; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author ysj |
||||||
|
*/ |
||||||
|
@AllArgsConstructor |
||||||
|
@Service |
||||||
|
@Slf4j |
||||||
|
@DS("equipment") |
||||||
|
public class ThreeGenerateServiceImpl extends BaseServiceImpl<ThreeGenerateMapper, ThreeGenerationEntity> implements ThreeGenerateService { |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,13 @@ |
|||||||
|
package com.hnac.hzims.scheduled.service.operation.home; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author ysj |
||||||
|
*/ |
||||||
|
public interface ObtainGenerationService { |
||||||
|
|
||||||
|
void threeYearPowerGeneration(String param); |
||||||
|
|
||||||
|
void thirtyDayPowerGeneration(String param); |
||||||
|
|
||||||
|
void thisDayPowerGeneration(String param); |
||||||
|
} |
@ -0,0 +1,299 @@ |
|||||||
|
package com.hnac.hzims.scheduled.service.operation.home.impl; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject; |
||||||
|
import com.alibaba.fastjson.TypeReference; |
||||||
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
||||||
|
import com.google.common.util.concurrent.ThreadFactoryBuilder; |
||||||
|
import com.hnac.hzims.equipment.entity.ThirtyGenerationEntity; |
||||||
|
import com.hnac.hzims.equipment.entity.ThreeGenerationEntity; |
||||||
|
import com.hnac.hzims.equipment.vo.EminfoAndEmParamVo; |
||||||
|
import com.hnac.hzims.operational.main.constant.HomePageConstant; |
||||||
|
import com.hnac.hzims.operational.main.vo.PowerMonthVo; |
||||||
|
import com.hnac.hzims.operational.station.entity.StationEntity; |
||||||
|
import com.hnac.hzims.scheduled.service.equipment.ThirtyGenerateService; |
||||||
|
import com.hnac.hzims.scheduled.service.equipment.ThreeGenerateService; |
||||||
|
import com.hnac.hzims.scheduled.service.operation.fill.GenerateService; |
||||||
|
import com.hnac.hzims.scheduled.service.operation.fill.PowerService; |
||||||
|
import com.hnac.hzims.scheduled.service.operation.home.ObtainGenerationService; |
||||||
|
import com.hnac.hzims.scheduled.service.operation.plate.DataService; |
||||||
|
import com.hnac.hzims.scheduled.service.operation.station.StationService; |
||||||
|
import com.hnac.hzinfo.datasearch.analyse.vo.AnalyseDataTaosVO; |
||||||
|
import lombok.RequiredArgsConstructor; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springblade.core.tool.utils.CollectionUtil; |
||||||
|
import org.springblade.core.tool.utils.DateUtil; |
||||||
|
import org.springblade.core.tool.utils.StringUtil; |
||||||
|
import org.springframework.beans.factory.annotation.Value; |
||||||
|
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.concurrent.*; |
||||||
|
import java.util.stream.Collectors; |
||||||
|
import java.util.stream.Stream; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author ysj |
||||||
|
*/ |
||||||
|
@Service |
||||||
|
@RequiredArgsConstructor |
||||||
|
@Slf4j |
||||||
|
public class ObtainGenerationServiceImpl implements ObtainGenerationService { |
||||||
|
|
||||||
|
private final DataService dataService; |
||||||
|
|
||||||
|
private final PowerService powerService; |
||||||
|
|
||||||
|
private final StationService stationService; |
||||||
|
|
||||||
|
private final GenerateService generateService; |
||||||
|
|
||||||
|
private final ThreeGenerateService threeGenerateService; |
||||||
|
|
||||||
|
private final ThirtyGenerateService thirtyGenerateService; |
||||||
|
|
||||||
|
private final RedisTemplate redisTemplate; |
||||||
|
|
||||||
|
@Value("${hzims.equipment.emInfo.emInfoList}") |
||||||
|
public String device_cache_cofig_final; |
||||||
|
|
||||||
|
private static final ExecutorService pool = new ThreadPoolExecutor(10, 10, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(1024), new ThreadFactoryBuilder().setNameFormat("obtain-generation-pool-%d").build() , new ThreadPoolExecutor.CallerRunsPolicy()); |
||||||
|
|
||||||
|
/** |
||||||
|
* 设备近3年发电量数据 : 按月分割 |
||||||
|
* @param param |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void threeYearPowerGeneration(String param) { |
||||||
|
// 步骤1.水电、光伏站点
|
||||||
|
List<StationEntity> stations = stationService.list(Wrappers.<StationEntity>lambdaQuery().in(StationEntity::getType, Arrays.asList(HomePageConstant.HYDROPOWER,HomePageConstant.PHOTOVOLTAIC))); |
||||||
|
|
||||||
|
// 步骤2.缓存设备信息
|
||||||
|
List<EminfoAndEmParamVo> devices = JSONObject.parseObject(redisTemplate.opsForValue().get(device_cache_cofig_final).toString(), new TypeReference<List<EminfoAndEmParamVo>>() {}); |
||||||
|
|
||||||
|
// 步骤3.站点-设备3年发电量
|
||||||
|
this.saveGeneration(stations,devices); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 设备30天发电量数据 : 按日分割 |
||||||
|
* @param param |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void thirtyDayPowerGeneration(String param) { |
||||||
|
// 步骤1.水电、光伏站点
|
||||||
|
List<StationEntity> stations = stationService.list(Wrappers.<StationEntity>lambdaQuery().in(StationEntity::getType, Arrays.asList(HomePageConstant.HYDROPOWER,HomePageConstant.PHOTOVOLTAIC))); |
||||||
|
|
||||||
|
// 步骤2.缓存设备信息
|
||||||
|
List<EminfoAndEmParamVo> devices = JSONObject.parseObject(redisTemplate.opsForValue().get(device_cache_cofig_final).toString(), new TypeReference<List<EminfoAndEmParamVo>>() {}); |
||||||
|
|
||||||
|
// 步骤3.站点-设备30发电量
|
||||||
|
this.saveThirtyGeneration(stations,devices); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 当天发电量 |
||||||
|
* @param param |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void thisDayPowerGeneration(String param) { |
||||||
|
// 步骤1.水电、光伏站点
|
||||||
|
List<StationEntity> stations = stationService.list(Wrappers.<StationEntity>lambdaQuery().in(StationEntity::getType, Arrays.asList(HomePageConstant.HYDROPOWER,HomePageConstant.PHOTOVOLTAIC))); |
||||||
|
|
||||||
|
// 步骤2.缓存设备信息
|
||||||
|
List<EminfoAndEmParamVo> devices = JSONObject.parseObject(redisTemplate.opsForValue().get(device_cache_cofig_final).toString(), new TypeReference<List<EminfoAndEmParamVo>>() {}); |
||||||
|
|
||||||
|
// 步骤3.站点-设备当日发电量
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 查询发电量 |
||||||
|
* @param stations |
||||||
|
* @param devices |
||||||
|
*/ |
||||||
|
private void saveThirtyGeneration(List<StationEntity> stations, List<EminfoAndEmParamVo> devices) { |
||||||
|
Calendar calendar = Calendar.getInstance(); |
||||||
|
String end = DateUtil.format(calendar.getTime(), DateUtil.PATTERN_DATETIME); |
||||||
|
calendar.add(Calendar.DAY_OF_MONTH,-29); |
||||||
|
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)); |
||||||
|
String start = DateUtil.format(calendar.getTime(), DateUtil.PATTERN_DATETIME); |
||||||
|
|
||||||
|
// 将站点切割
|
||||||
|
int limit = countStep(stations.size()); |
||||||
|
List<List<StationEntity>> limits = Stream.iterate(0, n -> n + 1).limit(limit).parallel().map(a -> stations.stream().skip((long) a * 3).limit(3).parallel().collect(Collectors.toList())).collect(Collectors.toList()); |
||||||
|
CountDownLatch countDownLatch = new CountDownLatch(limits.size()); |
||||||
|
for(List<StationEntity> item : limits){ |
||||||
|
try{ |
||||||
|
pool.submit(()->{ |
||||||
|
item.forEach(station->{ |
||||||
|
// 站点设备集合
|
||||||
|
List<EminfoAndEmParamVo> eminfos = devices.stream().filter(device -> device.getCreateDept().equals(station.getRefDept())).collect(Collectors.toList()); |
||||||
|
// 遍历查询发电量
|
||||||
|
eminfos.forEach(device->{ |
||||||
|
List<AnalyseDataTaosVO> records = dataService.periodTargetData(start,end,5,3,device.getEmCode(),HomePageConstant.HYDROPOWER_GENERATE_POWER); |
||||||
|
if(CollectionUtil.isEmpty(records)){ |
||||||
|
return; |
||||||
|
} |
||||||
|
// 保存设备发电量
|
||||||
|
thirtyGenerateService.saveBatch(records.stream().map(record -> { |
||||||
|
ThirtyGenerationEntity generate = new ThirtyGenerationEntity(); |
||||||
|
generate.setStationId(station.getCode()); |
||||||
|
generate.setStationName(station.getName()); |
||||||
|
generate.setDeviceCode(device.getEmCode()); |
||||||
|
generate.setDeviceName(device.getName()); |
||||||
|
generate.setTenantId(station.getTenantId()); |
||||||
|
generate.setCreateDept(station.getRefDept()); |
||||||
|
generate.setCreateUser(station.getCreateUser()); |
||||||
|
generate.setUpdateUser(station.getUpdateUser()); |
||||||
|
Date time = DateUtil.parse(record.getTs(), "yyyy-MM-dd HH:mm:ss.s"); |
||||||
|
generate.setStrDay(DateUtil.format(time,DateUtil.PATTERN_DATETIME)); |
||||||
|
generate.setDay(time.getDay()); |
||||||
|
if(StringUtil.isEmpty(record.getVal())){ |
||||||
|
generate.setGenerate(BigDecimal.ZERO); |
||||||
|
}else{ |
||||||
|
generate.setGenerate(BigDecimal.valueOf(Double.parseDouble(record.getVal()) * device.getRideCount())); |
||||||
|
} |
||||||
|
return generate; |
||||||
|
}).collect(Collectors.toList())); |
||||||
|
}); |
||||||
|
}); |
||||||
|
countDownLatch.countDown(); |
||||||
|
log.error("save_generation_execute_complete: {}" ,item.stream().map(StationEntity::getName).collect(Collectors.toList())); |
||||||
|
}); |
||||||
|
}catch (Exception e){ |
||||||
|
log.error("save_generation_execute_complete_error : {}" ,e.getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
// 等待所有线程执行完成
|
||||||
|
try { |
||||||
|
countDownLatch.await(); |
||||||
|
} catch (InterruptedException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
Thread.currentThread().interrupt(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 保存站点-设备查询发电量 |
||||||
|
* @param stations |
||||||
|
* @param devices |
||||||
|
*/ |
||||||
|
private void saveGeneration(List<StationEntity> stations, List<EminfoAndEmParamVo> devices) { |
||||||
|
// 开始时间
|
||||||
|
Calendar calendar = Calendar.getInstance(); |
||||||
|
calendar.add(Calendar.MONTH, -calendar.get(Calendar.MONTH) + 12); |
||||||
|
calendar.add(Calendar.DATE, -calendar.get(Calendar.DATE) + 1); |
||||||
|
String end = DateUtil.format(calendar.getTime(),DateUtil.PATTERN_DATE) + " 00:00:00"; |
||||||
|
// 结束日期
|
||||||
|
calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) - 3); |
||||||
|
calendar.add(Calendar.MONTH, -calendar.get(Calendar.MONTH)); |
||||||
|
String start = DateUtil.format(calendar.getTime(),DateUtil.PATTERN_DATE) + " 00:00:00"; |
||||||
|
// 将站点切割
|
||||||
|
int limit = countStep(stations.size()); |
||||||
|
List<List<StationEntity>> limits = Stream.iterate(0, n -> n + 1).limit(limit).parallel().map(a -> stations.stream().skip((long) a * 3).limit(3).parallel().collect(Collectors.toList())).collect(Collectors.toList()); |
||||||
|
CountDownLatch countDownLatch = new CountDownLatch(limits.size()); |
||||||
|
for(List<StationEntity> item : limits){ |
||||||
|
try{ |
||||||
|
pool.submit(()->{ |
||||||
|
item.forEach(station->{ |
||||||
|
// 站点设备集合
|
||||||
|
List<EminfoAndEmParamVo> eminfos = devices.stream().filter(device -> device.getCreateDept().equals(station.getRefDept())).collect(Collectors.toList()); |
||||||
|
// 遍历查询发电量
|
||||||
|
eminfos.forEach(device->{ |
||||||
|
List<AnalyseDataTaosVO> records = dataService.periodTargetData(start,end,5,5,device.getEmCode(),HomePageConstant.HYDROPOWER_GENERATE_POWER); |
||||||
|
if(CollectionUtil.isEmpty(records)){ |
||||||
|
return; |
||||||
|
} |
||||||
|
// 保存设备发电量
|
||||||
|
threeGenerateService.saveBatch(records.stream().map(record -> { |
||||||
|
ThreeGenerationEntity generate = new ThreeGenerationEntity(); |
||||||
|
generate.setStationId(station.getCode()); |
||||||
|
generate.setStationName(station.getName()); |
||||||
|
generate.setDeviceCode(device.getEmCode()); |
||||||
|
generate.setDeviceName(device.getName()); |
||||||
|
generate.setTenantId(station.getTenantId()); |
||||||
|
generate.setCreateDept(station.getRefDept()); |
||||||
|
generate.setCreateUser(station.getCreateUser()); |
||||||
|
generate.setUpdateUser(station.getUpdateUser()); |
||||||
|
Date time = DateUtil.parse(record.getTs(), "yyyy-MM-dd HH:mm:ss.s"); |
||||||
|
generate.setStrMonth(DateUtil.format(time,DateUtil.PATTERN_DATE)); |
||||||
|
generate.setMonth(time.getMonth() + 1); |
||||||
|
if(StringUtil.isEmpty(record.getVal())){ |
||||||
|
generate.setGenerate(BigDecimal.ZERO); |
||||||
|
}else{ |
||||||
|
generate.setGenerate(BigDecimal.valueOf(Double.parseDouble(record.getVal()) * device.getRideCount())); |
||||||
|
} |
||||||
|
return generate; |
||||||
|
}).collect(Collectors.toList())); |
||||||
|
}); |
||||||
|
// 填报发电量保存
|
||||||
|
threeGenerateService.saveBatch(this.saveFillGenerate(station,start,end)); |
||||||
|
}); |
||||||
|
countDownLatch.countDown(); |
||||||
|
log.error("save_generation_execute_complete: {}" ,item.stream().map(StationEntity::getName).collect(Collectors.toList())); |
||||||
|
}); |
||||||
|
}catch (Exception e){ |
||||||
|
log.error("save_generation_execute_complete_error : {}" ,e.getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
// 等待所有线程执行完成
|
||||||
|
try { |
||||||
|
countDownLatch.await(); |
||||||
|
} catch (InterruptedException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
Thread.currentThread().interrupt(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 补充填报数据 |
||||||
|
* @param station |
||||||
|
* @param start |
||||||
|
* @param end |
||||||
|
*/ |
||||||
|
private List<ThreeGenerationEntity> saveFillGenerate(StationEntity station, String start, String end) { |
||||||
|
start = DateUtil.format(DateUtil.parse(start,DateUtil.PATTERN_DATETIME),"yyyy-MM"); |
||||||
|
end = DateUtil.format(DateUtil.parse(end,DateUtil.PATTERN_DATETIME),"yyyy-MM"); |
||||||
|
List<PowerMonthVo> powerMonths; |
||||||
|
// 光伏
|
||||||
|
if(HomePageConstant.PHOTOVOLTAIC.equals(station.getType())){ |
||||||
|
powerMonths = powerService.generateThreeYear(start,end,station.getRefDept()); |
||||||
|
}else{ |
||||||
|
// 水电
|
||||||
|
powerMonths = generateService.generateThreeYear(start,end,station.getCode()); |
||||||
|
} |
||||||
|
if(CollectionUtil.isEmpty(powerMonths)){ |
||||||
|
return new ArrayList<>(); |
||||||
|
} |
||||||
|
return powerMonths.stream().map(power->{ |
||||||
|
ThreeGenerationEntity generation = new ThreeGenerationEntity(); |
||||||
|
generation.setStationId(station.getCode()); |
||||||
|
generation.setStationName(station.getName()); |
||||||
|
generation.setTenantId(station.getTenantId()); |
||||||
|
generation.setCreateDept(station.getRefDept()); |
||||||
|
generation.setCreateUser(station.getCreateUser()); |
||||||
|
generation.setUpdateUser(station.getUpdateUser()); |
||||||
|
generation.setStrMonth(power.getStrMonth()); |
||||||
|
generation.setMonth(power.getMonth()); |
||||||
|
if(power.getPower() <= 0){ |
||||||
|
generation.setGenerate(BigDecimal.ZERO); |
||||||
|
}else{ |
||||||
|
generation.setGenerate(BigDecimal.valueOf(Double.parseDouble(power.getPower().toString())).setScale(2, RoundingMode.HALF_UP)); |
||||||
|
} |
||||||
|
return generation; |
||||||
|
}).collect(Collectors.toList()); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 计算切分次数 |
||||||
|
*/ |
||||||
|
private static Integer countStep(Integer size) { |
||||||
|
return (size + 3 - 1) / 3; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,5 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?> |
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > |
||||||
|
<mapper namespace="com.hnac.hzims.scheduled.mapper.equipment.ThirtyGenerateMapper"> |
||||||
|
|
||||||
|
</mapper> |
@ -0,0 +1,5 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?> |
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > |
||||||
|
<mapper namespace="com.hnac.hzims.scheduled.mapper.equipment.ThreeGenerateMapper"> |
||||||
|
|
||||||
|
</mapper> |
Loading…
Reference in new issue