Commit 2d669ebf authored by ZWT's avatar ZWT

feat(零碳): 长庆

1.修改极短期间开预测定时任务逻辑,解决优化后部分优化结果时间段过短问题;
2.修改心知天气气象数据获取及接收定时任务,解决天气数据通过邮件下载后,部分数据精度丢失问题;

BREAKING CHANGE: 无

Closes 无

[skip ci]
parent f4bb3ff8
......@@ -247,12 +247,254 @@ public class SpaceOptimizeShortPeriodService extends SpaceOptimizeBaseService {
serviceRating = serviceRating.add(wellhead.getServiceRating());
//计算权重
List<SpaceOptimizeWeight> weightList = this.calculateWeightList(serviceRating, rangeToList, powerList, strategyList);
//每日开井时长
int dayOpenMinute = wellhead.getRunDuration()
//每日最小开井时长(分钟)
int minOpenMinute = wellhead.getMinOpen()
.multiply(BusinessConstant.SIXTY)
.intValue();
//分级取时间段
List<SpaceOptimizeWeightDuration> weightDurationList = this.weightListProcessing(ladder, weightList, minOpenMinute);
//时间段优化
List<SpaceOptimizeDurationDTO> optimizeDurationDTOList = new ArrayList<>(12);
firstOpenWellTime = this.timePeriodOptimization(optimizeDurationDTOList, weightDurationList, firstOpenWellTime, i,
startInterval, minOpenMinute, wellhead, weightList);
//创建优化后的间开区间
if (CollUtil.isNotEmpty(optimizeDurationDTOList)) {
//重新按开井时间排序
optimizeDurationDTOList.sort(Comparator.comparing(SpaceOptimizeDurationDTO::getOpenTime));
SpaceOptimizeDurationDTO durationDTO;
for (int i1 = 0; i1 < optimizeDurationDTOList.size(); i1++) {
durationDTO = optimizeDurationDTOList.get(i1);
DateTime startOffset = DateUtil.date(durationDTO.getOpenTime());
DateTime endOffset = DateUtil.date(durationDTO.getCloseTime());
if (startOffset.compareTo(BusinessConstant.DATE_FLAG) < 0 && endOffset.compareTo(BusinessConstant.DATE_FLAG) > 0) {
//如果时间超过当天,舍弃
this.createOptimizeDuration(durationDTOList, periodId, recordId, wellheadId, null,
startOffset.toString(BusinessConstant.MINUTES_FORMAT),
BusinessConstant.END_OF_DAY_TIME,
BusinessConstant.ONE, startDate
);
this.createOptimizeDuration(durationDTOList, periodId, recordId, wellheadId, null,
BusinessConstant.START_OF_DAY_TIME,
endOffset.toString(BusinessConstant.MINUTES_FORMAT),
BusinessConstant.ONE, startDate
);
tundraStrategyList.add(
SpaceOptimizeDurationDTO.builder()
.wellheadId(wellheadId)
.openTime(startOffset)
.closeTime(BusinessConstant.DATE_FLAG)
.build()
);
tundraStrategyList.add(
SpaceOptimizeDurationDTO.builder()
.wellheadId(wellheadId)
.openTime(BusinessConstant.DATE_FLAG_BEGIN)
.closeTime(endOffset)
.build()
);
} else if (endOffset.compareTo(BusinessConstant.DATE_FLAG) == 0) {
this.createOptimizeDuration(durationDTOList, periodId, recordId, wellheadId, null,
startOffset.toString(BusinessConstant.MINUTES_FORMAT),
BusinessConstant.END_OF_DAY_TIME,
BusinessConstant.ONE, startDate
);
tundraStrategyList.add(
SpaceOptimizeDurationDTO.builder()
.wellheadId(wellheadId)
.openTime(startOffset)
.closeTime(BusinessConstant.DATE_FLAG)
.build()
);
} else {
//计算偏移
this.createOptimizeDuration(durationDTOList, periodId, recordId, wellheadId, null,
startOffset.toString(BusinessConstant.MINUTES_FORMAT),
endOffset.toString(BusinessConstant.MINUTES_FORMAT),
BusinessConstant.ONE, startDate
);
tundraStrategyList.add(
SpaceOptimizeDurationDTO.builder()
.wellheadId(wellheadId)
.openTime(startOffset)
.closeTime(endOffset)
.build()
);
}
}
}
}
//防冻井
if (ObjectUtil.isNotNull(tundraStrategyWellhead) && CollUtil.isNotEmpty(tundraStrategyList)) {
List<SpaceOptimizeDurationDTO> closeList = new ArrayList<>(32);
long totalOpenTime = 0;
if (tundraStrategyList.size() == 1) {
//记录第一段开始时间之前的关井时间
if (BusinessConstant.DATE_FLAG_BEGIN.compareTo(tundraStrategyList.get(0).getOpenTime()) != 0) {
closeList.add(
SpaceOptimizeDurationDTO.builder()
.openTime(BusinessConstant.DATE_FLAG_BEGIN)
.closeTime(tundraStrategyList.get(0).getOpenTime())
.build()
);
totalOpenTime += DateUtil.between(BusinessConstant.DATE_FLAG_BEGIN, tundraStrategyList.get(0).getOpenTime(), DateUnit.MINUTE);
}
//记录最后一段停井时间之后的关井时间
if (BusinessConstant.DATE_FLAG.compareTo(tundraStrategyList.get(0).getCloseTime()) != 0) {
closeList.add(
SpaceOptimizeDurationDTO.builder()
.openTime(tundraStrategyList.get(0).getCloseTime())
.closeTime(BusinessConstant.DATE_FLAG)
.build()
);
totalOpenTime += DateUtil.between(tundraStrategyList.get(0).getCloseTime(), BusinessConstant.DATE_FLAG, DateUnit.MINUTE);
}
} else {
//初始化时间轴
List<SpaceOptimizeTundraStrategy> axis = new ArrayList<>(timerShaft_5.size());
for (DateTime dateTime : timerShaft_5) {
axis.add(
SpaceOptimizeTundraStrategy.builder()
.timestamp(dateTime)
.beUsing(Boolean.FALSE)
.build()
);
}
//先按开井时间再按关井时间排序
tundraStrategyList.sort(Comparator.comparing(SpaceOptimizeDurationDTO::getOpenTime).thenComparing(SpaceOptimizeDurationDTO::getCloseTime));
//渲染时间轴
int nextBegin = 0;
for (SpaceOptimizeDurationDTO durationDTO : tundraStrategyList) {
Date openTime = durationDTO.getOpenTime();
Date closeTime = durationDTO.getCloseTime();
for (int i = nextBegin; i < axis.size(); i++) {
SpaceOptimizeTundraStrategy z = axis.get(i);
if (DateUtil.isIn(z.getTimestamp(), openTime, closeTime)) {
z.setBeUsing(Boolean.TRUE);
}
//记录下一次开始位置
if (z.getTimestamp().compareTo(closeTime) > 0) {
nextBegin = i;
break;
}
}
}
//取关井时间段
int beginIndex = 0;
boolean isClose = Boolean.FALSE;
for (int i = 0; i < axis.size(); i++) {
SpaceOptimizeTundraStrategy z = axis.get(i);
Boolean beUsing = z.getBeUsing();
if (isClose && beUsing) {
//存时间段,重置状态
closeList.add(
SpaceOptimizeDurationDTO.builder()
.openTime(axis.get(beginIndex).getTimestamp())
.closeTime(axis.get(i).getTimestamp())
.build()
);
totalOpenTime += DateUtil.between(axis.get(beginIndex).getTimestamp(), axis.get(i).getTimestamp(), DateUnit.MINUTE);
isClose = Boolean.FALSE;
} else if (!isClose && !beUsing) {
//确定开始位置
beginIndex = i;
isClose = Boolean.TRUE;
}
}
//补充最后一段
if (isClose) {
closeList.add(
SpaceOptimizeDurationDTO.builder()
.openTime(axis.get(beginIndex).getTimestamp())
.closeTime(axis.get(axis.size() - 1).getTimestamp())
.build()
);
totalOpenTime += DateUtil.between(axis.get(beginIndex).getTimestamp(), axis.get(axis.size() - 1).getTimestamp(), DateUnit.MINUTE);
}
}
//计算权重时间轴
//每日最小开井时长(分钟)
int minOpenMinute = wellhead.getMinOpen()
int minOpenMinute = tundraStrategyWellhead.getMinOpen()
.multiply(BusinessConstant.SIXTY)
.intValue();
serviceRating = serviceRating.add(tundraStrategyWellhead.getServiceRating());
List<SpaceOptimizeWeight> weightList = this.calculateWeightList(serviceRating, rangeToList, powerList, strategyList);
List<SpaceOptimizeWeightDuration> weightDurationList = this.weightListProcessing(ladder, weightList, minOpenMinute);
//关井时间优化
if (CollUtil.isNotEmpty(closeList)) {
//补时间
} else {
//todo 不需要补时间,需要优化计算
List<SpaceOptimizeDurationDTO> optimizeDurationDTOList = new ArrayList<>(12);
this.timePeriodOptimization(optimizeDurationDTOList, weightDurationList, firstOpenWellTime, wellheadList.size(),
startInterval, minOpenMinute, tundraStrategyWellhead, weightList);
}
System.out.println();
}
}
}
//开启事务
return XTransactionHelper.begin(context, () -> {
// int size;
// SpaceOptimizeViewMapper optimizeViewMapper = context.getBean(SpaceOptimizeViewMapper.class);
// if (CollUtil.isNotEmpty(periodDTOList)) {
// size = periodDTOList.size();
// if (size > BaseUtils.BATCH_SIZE) {
// List<List<SpaceOptimizePeriodDTO>> subList = BaseUtils.getSubList(periodDTOList);
// subList.forEach(optimizeViewMapper::shortPeriodBatchInsertList);
// } else {
// optimizeViewMapper.shortPeriodBatchInsertList(periodDTOList);
// }
// }
// if (CollUtil.isNotEmpty(wellheadDTOList)) {
// size = wellheadDTOList.size();
// if (size > BaseUtils.BATCH_SIZE) {
// List<List<SpaceOptimizeWellheadDTO>> subList = BaseUtils.getSubList(wellheadDTOList);
// subList.forEach(optimizeViewMapper::shortWellheadBatchInsertList);
// } else {
// optimizeViewMapper.shortWellheadBatchInsertList(wellheadDTOList);
// }
// }
// if (CollUtil.isNotEmpty(unOptimizeDurationList)) {
// size = unOptimizeDurationList.size();
// if (size > BaseUtils.BATCH_SIZE) {
// List<List<SpaceOptimizeDurationDTO>> subList = BaseUtils.getSubList(unOptimizeDurationList);
// subList.forEach(optimizeViewMapper::shortDurationBatchInsertList);
// } else {
// optimizeViewMapper.shortDurationBatchInsertList(unOptimizeDurationList);
// }
// }
// if (CollUtil.isNotEmpty(durationDTOList)) {
// size = durationDTOList.size();
// if (size > BaseUtils.BATCH_SIZE) {
// List<List<SpaceOptimizeDurationDTO>> subList = BaseUtils.getSubList(durationDTOList);
// subList.forEach(optimizeViewMapper::shortDurationBatchInsertList);
// } else {
// optimizeViewMapper.shortDurationBatchInsertList(durationDTOList);
// }
// }
return XServiceResult.OK;
});
}
/**
* 时间段优化
*
* @param optimizeDurationDTOList 优化工期dtolist
* @param weightDurationList 重量持续时间列表
* @param firstOpenWellTime 首次开井时间
* @param i 我
* @param startInterval 开始间隔
* @param minOpenMinute 最小开放分钟
* @param wellhead 井口
* @param weightList 重量清单
* @return {@link DateTime}
*/
private DateTime timePeriodOptimization(List<SpaceOptimizeDurationDTO> optimizeDurationDTOList, List<SpaceOptimizeWeightDuration> weightDurationList, DateTime firstOpenWellTime,
int i, Integer startInterval, int minOpenMinute, SpaceInstitutionWellheadView wellhead, List<SpaceOptimizeWeight> weightList) {
//每日开井时长
int dayOpenMinute = wellhead.getRunDuration()
.multiply(BusinessConstant.SIXTY)
.intValue();
//每日最大开井时长(分钟)
......@@ -267,10 +509,6 @@ public class SpaceOptimizeShortPeriodService extends SpaceOptimizeBaseService {
int maxCloseMinute = wellhead.getMaxClose()
.multiply(BusinessConstant.SIXTY)
.intValue();
SpaceOptimizeWeight weight;
//分级取时间段
List<SpaceOptimizeWeightDuration> weightDurationList = this.weightListProcessing(ladder, weightList, minOpenMinute);
List<SpaceOptimizeDurationDTO> optimizeDurationDTOList = new ArrayList<>(12);
//总开井时间
long sumOpenTime = 0;
/* //中断标识 [第一次开井时间优化]
......@@ -635,223 +873,8 @@ public class SpaceOptimizeShortPeriodService extends SpaceOptimizeBaseService {
//todo : 没法补时间
}
}
//创建优化后的间开区间
if (CollUtil.isNotEmpty(optimizeDurationDTOList)) {
//重新按开井时间排序
optimizeDurationDTOList.sort(Comparator.comparing(SpaceOptimizeDurationDTO::getOpenTime));
SpaceOptimizeDurationDTO durationDTO;
for (int i1 = 0; i1 < optimizeDurationDTOList.size(); i1++) {
durationDTO = optimizeDurationDTOList.get(i1);
DateTime startOffset = DateUtil.date(durationDTO.getOpenTime());
DateTime endOffset = DateUtil.date(durationDTO.getCloseTime());
if (startOffset.compareTo(BusinessConstant.DATE_FLAG) < 0 && endOffset.compareTo(BusinessConstant.DATE_FLAG) > 0) {
//如果时间超过当天,舍弃
this.createOptimizeDuration(durationDTOList, periodId, recordId, wellheadId, null,
startOffset.toString(BusinessConstant.MINUTES_FORMAT),
BusinessConstant.END_OF_DAY_TIME,
BusinessConstant.ONE, startDate
);
this.createOptimizeDuration(durationDTOList, periodId, recordId, wellheadId, null,
BusinessConstant.START_OF_DAY_TIME,
endOffset.toString(BusinessConstant.MINUTES_FORMAT),
BusinessConstant.ONE, startDate
);
tundraStrategyList.add(
SpaceOptimizeDurationDTO.builder()
.wellheadId(wellheadId)
.openTime(startOffset)
.closeTime(BusinessConstant.DATE_FLAG)
.build()
);
tundraStrategyList.add(
SpaceOptimizeDurationDTO.builder()
.wellheadId(wellheadId)
.openTime(BusinessConstant.DATE_FLAG_BEGIN)
.closeTime(endOffset)
.build()
);
} else if (endOffset.compareTo(BusinessConstant.DATE_FLAG) == 0) {
this.createOptimizeDuration(durationDTOList, periodId, recordId, wellheadId, null,
startOffset.toString(BusinessConstant.MINUTES_FORMAT),
BusinessConstant.END_OF_DAY_TIME,
BusinessConstant.ONE, startDate
);
tundraStrategyList.add(
SpaceOptimizeDurationDTO.builder()
.wellheadId(wellheadId)
.openTime(startOffset)
.closeTime(BusinessConstant.DATE_FLAG)
.build()
);
} else {
//计算偏移
this.createOptimizeDuration(durationDTOList, periodId, recordId, wellheadId, null,
startOffset.toString(BusinessConstant.MINUTES_FORMAT),
endOffset.toString(BusinessConstant.MINUTES_FORMAT),
BusinessConstant.ONE, startDate
);
tundraStrategyList.add(
SpaceOptimizeDurationDTO.builder()
.wellheadId(wellheadId)
.openTime(startOffset)
.closeTime(endOffset)
.build()
);
}
}
}
}
//防冻井
if (ObjectUtil.isNotNull(tundraStrategyWellhead) && CollUtil.isNotEmpty(tundraStrategyList)) {
List<SpaceOptimizeDurationDTO> closeList = new ArrayList<>(32);
long totalOpenTime = 0;
if (tundraStrategyList.size() == 1) {
//记录第一段开始时间之前的关井时间
if (BusinessConstant.DATE_FLAG_BEGIN.compareTo(tundraStrategyList.get(0).getOpenTime()) != 0) {
closeList.add(
SpaceOptimizeDurationDTO.builder()
.openTime(BusinessConstant.DATE_FLAG_BEGIN)
.closeTime(tundraStrategyList.get(0).getOpenTime())
.build()
);
totalOpenTime += DateUtil.between(BusinessConstant.DATE_FLAG_BEGIN, tundraStrategyList.get(0).getOpenTime(), DateUnit.MINUTE);
}
//记录最后一段停井时间之后的关井时间
if (BusinessConstant.DATE_FLAG.compareTo(tundraStrategyList.get(0).getCloseTime()) != 0) {
closeList.add(
SpaceOptimizeDurationDTO.builder()
.openTime(tundraStrategyList.get(0).getCloseTime())
.closeTime(BusinessConstant.DATE_FLAG)
.build()
);
totalOpenTime += DateUtil.between(tundraStrategyList.get(0).getCloseTime(), BusinessConstant.DATE_FLAG, DateUnit.MINUTE);
}
} else {
//初始化时间轴
List<SpaceOptimizeTundraStrategy> axis = new ArrayList<>(timerShaft_5.size());
for (DateTime dateTime : timerShaft_5) {
axis.add(
SpaceOptimizeTundraStrategy.builder()
.timestamp(dateTime)
.beUsing(Boolean.FALSE)
.build()
);
}
//先按开井时间再按关井时间排序
tundraStrategyList.sort(Comparator.comparing(SpaceOptimizeDurationDTO::getOpenTime).thenComparing(SpaceOptimizeDurationDTO::getCloseTime));
//渲染时间轴
int nextBegin = 0;
for (SpaceOptimizeDurationDTO durationDTO : tundraStrategyList) {
Date openTime = durationDTO.getOpenTime();
Date closeTime = durationDTO.getCloseTime();
for (int i = nextBegin; i < axis.size(); i++) {
SpaceOptimizeTundraStrategy z = axis.get(i);
if (DateUtil.isIn(z.getTimestamp(), openTime, closeTime)) {
z.setBeUsing(Boolean.TRUE);
}
//记录下一次开始位置
if (z.getTimestamp().compareTo(closeTime) > 0) {
nextBegin = i;
break;
return firstOpenWellTime;
}
}
}
//取关井时间段
int beginIndex = 0;
boolean isClose = Boolean.FALSE;
for (int i = 0; i < axis.size(); i++) {
SpaceOptimizeTundraStrategy z = axis.get(i);
Boolean beUsing = z.getBeUsing();
if (isClose && beUsing) {
//存时间段,重置状态
closeList.add(
SpaceOptimizeDurationDTO.builder()
.openTime(axis.get(beginIndex).getTimestamp())
.closeTime(axis.get(i).getTimestamp())
.build()
);
totalOpenTime += DateUtil.between(axis.get(beginIndex).getTimestamp(), axis.get(i).getTimestamp(), DateUnit.MINUTE);
isClose = Boolean.FALSE;
} else if (!isClose && !beUsing) {
//确定开始位置
beginIndex = i;
isClose = Boolean.TRUE;
}
}
//补充最后一段
if (isClose) {
closeList.add(
SpaceOptimizeDurationDTO.builder()
.openTime(axis.get(beginIndex).getTimestamp())
.closeTime(axis.get(axis.size() - 1).getTimestamp())
.build()
);
totalOpenTime += DateUtil.between(axis.get(beginIndex).getTimestamp(), axis.get(axis.size() - 1).getTimestamp(), DateUnit.MINUTE);
}
}
//计算权重时间轴
//每日最小开井时长(分钟)
int minOpenMinute = tundraStrategyWellhead.getMinOpen()
.multiply(BusinessConstant.SIXTY)
.intValue();
serviceRating = serviceRating.add(tundraStrategyWellhead.getServiceRating());
List<SpaceOptimizeWeight> weightList = this.calculateWeightList(serviceRating, rangeToList, powerList, strategyList);
List<SpaceOptimizeWeightDuration> weightDurationList = this.weightListProcessing(ladder, weightList, minOpenMinute);
//关井时间优化
if (CollUtil.isNotEmpty(closeList)) {
//补时间
} else {
//todo 不需要补时间,需要优化计算
}
System.out.println();
}
}
}
//开启事务
return XTransactionHelper.begin(context, () -> {
// int size;
// SpaceOptimizeViewMapper optimizeViewMapper = context.getBean(SpaceOptimizeViewMapper.class);
// if (CollUtil.isNotEmpty(periodDTOList)) {
// size = periodDTOList.size();
// if (size > BaseUtils.BATCH_SIZE) {
// List<List<SpaceOptimizePeriodDTO>> subList = BaseUtils.getSubList(periodDTOList);
// subList.forEach(optimizeViewMapper::shortPeriodBatchInsertList);
// } else {
// optimizeViewMapper.shortPeriodBatchInsertList(periodDTOList);
// }
// }
// if (CollUtil.isNotEmpty(wellheadDTOList)) {
// size = wellheadDTOList.size();
// if (size > BaseUtils.BATCH_SIZE) {
// List<List<SpaceOptimizeWellheadDTO>> subList = BaseUtils.getSubList(wellheadDTOList);
// subList.forEach(optimizeViewMapper::shortWellheadBatchInsertList);
// } else {
// optimizeViewMapper.shortWellheadBatchInsertList(wellheadDTOList);
// }
// }
// if (CollUtil.isNotEmpty(unOptimizeDurationList)) {
// size = unOptimizeDurationList.size();
// if (size > BaseUtils.BATCH_SIZE) {
// List<List<SpaceOptimizeDurationDTO>> subList = BaseUtils.getSubList(unOptimizeDurationList);
// subList.forEach(optimizeViewMapper::shortDurationBatchInsertList);
// } else {
// optimizeViewMapper.shortDurationBatchInsertList(unOptimizeDurationList);
// }
// }
// if (CollUtil.isNotEmpty(durationDTOList)) {
// size = durationDTOList.size();
// if (size > BaseUtils.BATCH_SIZE) {
// List<List<SpaceOptimizeDurationDTO>> subList = BaseUtils.getSubList(durationDTOList);
// subList.forEach(optimizeViewMapper::shortDurationBatchInsertList);
// } else {
// optimizeViewMapper.shortDurationBatchInsertList(durationDTOList);
// }
// }
return XServiceResult.OK;
});
}
/**
* 计算权重列表
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment