|
@@ -8,6 +8,8 @@ import com.gyee.gaia.common.utils.StringUtil;
|
|
|
import com.gyee.gaia.meter.entity.*;
|
|
|
import com.gyee.gaia.meter.entity.vo.MeterInfoVo;
|
|
|
import com.gyee.gaia.meter.service.impl.*;
|
|
|
+import com.gyee.gaia.meter.util.ScriptShell;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
import org.jetbrains.annotations.Nullable;
|
|
|
import org.springframework.stereotype.Service;
|
|
@@ -18,9 +20,7 @@ import java.math.RoundingMode;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.temporal.ChronoUnit;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Date;
|
|
|
-import java.util.List;
|
|
|
+import java.util.*;
|
|
|
import java.util.function.Function;
|
|
|
|
|
|
/**
|
|
@@ -249,7 +249,7 @@ public class GetMeterInfo {
|
|
|
List<MeterInfoEquipment> meterInfoEquipments = meterInfoEquipmentService.list(new QueryWrapper<MeterInfoEquipment>()
|
|
|
.in("date", dateTimes)
|
|
|
.eq(StringUtil.isNotBlank(windId), "powerstation_nem_code", windId)
|
|
|
- .eq(StringUtil.isNotBlank(id),"equipment_nem_code", id)
|
|
|
+ .eq(StringUtil.isNotBlank(id), "equipment_nem_code", id)
|
|
|
);
|
|
|
//遍历每月
|
|
|
for (int i = 0; i <= between; i++) {
|
|
@@ -278,7 +278,7 @@ public class GetMeterInfo {
|
|
|
}
|
|
|
}
|
|
|
//VO对象赋值月发电量,添加入VO对象集合
|
|
|
- meterInfoVo.setRdl(ydl.divide(BigDecimal.valueOf(10000),2,RoundingMode.HALF_EVEN));
|
|
|
+ meterInfoVo.setRdl(ydl.divide(BigDecimal.valueOf(10000), 2, RoundingMode.HALF_EVEN));
|
|
|
meterInfoVos.add(meterInfoVo);
|
|
|
}
|
|
|
}
|
|
@@ -358,7 +358,7 @@ public class GetMeterInfo {
|
|
|
meterInfoVo.setEndCode(meterInfoBottomcode.getEndValue());
|
|
|
}
|
|
|
}
|
|
|
- meterInfoVo.setRdl(ydl.divide(BigDecimal.valueOf(10000),4,RoundingMode.HALF_EVEN));
|
|
|
+ meterInfoVo.setRdl(ydl.divide(BigDecimal.valueOf(10000), 4, RoundingMode.HALF_EVEN));
|
|
|
meterInfoVos.add(meterInfoVo);
|
|
|
}
|
|
|
}
|
|
@@ -366,6 +366,78 @@ public class GetMeterInfo {
|
|
|
}
|
|
|
|
|
|
//获取计算场站指标,每月
|
|
|
+ public ArrayList<MeterInfoVo> getCalculatingInfoMonthByWindId1(String windId, String meterType, String meterClass, String name, long startTime, long endTime) {
|
|
|
+ //时间戳转为字符串
|
|
|
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+ String format1 = simpleDateFormat.format(new Date(startTime));
|
|
|
+ String format2 = simpleDateFormat.format(new Date(endTime));
|
|
|
+ //字符串转为DateTime类型
|
|
|
+ DateTime startDateTime1 = DateUtil.parse(format1);
|
|
|
+ DateTime endDateTime1 = DateUtil.parse(format2);
|
|
|
+ //开始时间月的第一天,结束时间月的最后一天
|
|
|
+ DateTime startDateTime = DateUtil.beginOfMonth(startDateTime1);
|
|
|
+ DateTime endDateTime = DateUtil.endOfMonth(endDateTime1);
|
|
|
+ //转为LocalDateTime计算间隔数
|
|
|
+ LocalDateTime day1 = LocalDateTimeUtil.of(startDateTime);
|
|
|
+ LocalDateTime day2 = LocalDateTimeUtil.of(endDateTime);
|
|
|
+ //相隔月数
|
|
|
+ long between = ChronoUnit.MONTHS.between(day1, day2);
|
|
|
+ //相隔天数
|
|
|
+ long betweenDays = ChronoUnit.DAYS.between(day1, day2);
|
|
|
+ //VO对象集合
|
|
|
+ ArrayList<MeterInfoVo> meterInfoVos = new ArrayList<>();
|
|
|
+ //条件构造器查询计算点
|
|
|
+ List<MeterPoint> meterPoints = meterPointService.list(new QueryWrapper<MeterPoint>()
|
|
|
+ .eq("windpowerstation_id", windId)
|
|
|
+ .in("property", "JSD", "JSD_QCFDL")
|
|
|
+ .eq(StringUtil.isNotBlank(meterType), "meter_type", meterType)
|
|
|
+ .eq(StringUtil.isNotBlank(meterClass), "meter_class", meterClass)
|
|
|
+ .eq(StringUtil.isNotBlank(name), "name", name)
|
|
|
+
|
|
|
+ );
|
|
|
+
|
|
|
+ //时间集合,以便后面批量查询
|
|
|
+ List<DateTime> dateTimes = new ArrayList<>();
|
|
|
+ for (int i = 0; i <= betweenDays; i++) {
|
|
|
+ DateTime dateTime4 = DateUtil.offsetDay(startDateTime, i);
|
|
|
+ dateTimes.add(dateTime4);
|
|
|
+ }
|
|
|
+ //批量查询拿到计算点数据
|
|
|
+ List<MeterInfoCalculating> meterInfoCalculatings = meterInfoCalculatingService.list(new QueryWrapper<MeterInfoCalculating>()
|
|
|
+ .in("date", dateTimes));
|
|
|
+
|
|
|
+ //遍历每月
|
|
|
+ for (int i = 0; i <= between; i++) {
|
|
|
+ //每月开始时间和结束时间
|
|
|
+ DateTime dateTime1 = DateUtil.offsetMonth(startDateTime, i);
|
|
|
+ DateTime dateTime2 = DateUtil.endOfMonth(dateTime1);
|
|
|
+ //转为LocalDateTime类型计算间隔数
|
|
|
+ LocalDateTime day3 = LocalDateTimeUtil.of(dateTime1);
|
|
|
+ LocalDateTime day4 = LocalDateTimeUtil.of(dateTime2);
|
|
|
+ //当月天数
|
|
|
+ long betweenDay = ChronoUnit.DAYS.between(day3, day4);
|
|
|
+ //循环遍历每个测点
|
|
|
+ for (MeterPoint meterPoint : meterPoints) {
|
|
|
+ MeterInfoVo meterInfoVo = new MeterInfoVo();
|
|
|
+ meterInfoVo.setDate(dateTime1);
|
|
|
+ meterInfoVo.setName(meterPoint.getName());
|
|
|
+ BigDecimal ydl = BigDecimal.valueOf(0);
|
|
|
+ for (int j = 0; j <= betweenDay; j++) {
|
|
|
+ DateTime dateTime3 = DateUtil.offsetDay(dateTime1, j);
|
|
|
+// meterInfoCalculating = findMeterInfoCalculating(meterInfoCalculatings, meterPoint.getNemCode(), dateTime3);
|
|
|
+ MeterInfoCalculating meterInfoCalculating = findObjectByCodeAndDate(meterInfoCalculatings, meterPoint.getNemCode(), dateTime3.toLocalDateTime(), MeterInfoCalculating::getCode, MeterInfoCalculating::getDate);
|
|
|
+ if (meterInfoCalculating != null) {
|
|
|
+ ydl = ydl.add(meterInfoCalculating.getValue());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ meterInfoVo.setRdl(ydl);
|
|
|
+ meterInfoVos.add(meterInfoVo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return meterInfoVos;
|
|
|
+ }
|
|
|
+
|
|
|
public ArrayList<MeterInfoVo> getCalculatingInfoMonthByWindId(String windId, String meterType, String meterClass, String name, long startTime, long endTime) {
|
|
|
//时间戳转为字符串
|
|
|
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
@@ -389,7 +461,7 @@ public class GetMeterInfo {
|
|
|
//条件构造器查询计算点
|
|
|
List<MeterPoint> meterPoints = meterPointService.list(new QueryWrapper<MeterPoint>()
|
|
|
.eq("windpowerstation_id", windId)
|
|
|
- .in("property", "JSD","JSD_QCFDL")
|
|
|
+ .in("property", "JSD", "JSD_QCFDL")
|
|
|
.eq(StringUtil.isNotBlank(meterType), "meter_type", meterType)
|
|
|
.eq(StringUtil.isNotBlank(meterClass), "meter_class", meterClass)
|
|
|
.eq(StringUtil.isNotBlank(name), "name", name)
|
|
@@ -421,6 +493,7 @@ public class GetMeterInfo {
|
|
|
MeterInfoVo meterInfoVo = new MeterInfoVo();
|
|
|
meterInfoVo.setDate(dateTime1);
|
|
|
meterInfoVo.setName(meterPoint.getName());
|
|
|
+ meterInfoVo.setNemCode(meterPoint.getNemCode());
|
|
|
BigDecimal ydl = BigDecimal.valueOf(0);
|
|
|
for (int j = 0; j <= betweenDay; j++) {
|
|
|
DateTime dateTime3 = DateUtil.offsetDay(dateTime1, j);
|
|
@@ -435,6 +508,58 @@ public class GetMeterInfo {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ //遍历计算点集合,如果meter_type中包含率,则取这个测点的nem_code和公式formula,解析公式中的nem_code
|
|
|
+ for (MeterPoint meterPoint : meterPoints) {
|
|
|
+ if (meterPoint.getMeterType().endsWith("率")){
|
|
|
+
|
|
|
+ String nemCode = meterPoint.getNemCode();
|
|
|
+
|
|
|
+ String formula1 = meterPoint.getFormula();
|
|
|
+ String formula2 = formula1.replaceAll("DL.NX", "DL_NX").replaceAll("DJL.", "DJL_");
|
|
|
+
|
|
|
+ //分割公式字符串,得到code数组
|
|
|
+ String[] meterPointCodes = StringUtils.split(formula1, "[+-*/()]");
|
|
|
+ meterPointCodes = Arrays.stream(meterPointCodes)
|
|
|
+ .filter(meterPointCode -> !(meterPointCode.length() < 8))
|
|
|
+ .toArray(String[]::new);
|
|
|
+
|
|
|
+ HashMap<String, Object> map = new HashMap<>();
|
|
|
+
|
|
|
+ //遍历code数组,拿到每一个code
|
|
|
+ for (String meterPointCode : meterPointCodes) {
|
|
|
+ String meterPointCode_ = meterPointCode.replaceAll("DL.", "DL_").replaceAll("DJL.", "DJL_");
|
|
|
+ System.out.println("要查询的点code:" + meterPointCode);
|
|
|
+ System.out.println("替换后的点code:" + meterPointCode_);
|
|
|
+
|
|
|
+ //拿公式中的nem_code在meterInfoVos集合中取出VO数据点
|
|
|
+ for (MeterInfoVo meterInfoVo: meterInfoVos) {
|
|
|
+ if( meterInfoVo.getNemCode().equals(meterPointCode)){
|
|
|
+ map.put(meterPointCode_, meterInfoVo.getRdl());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //公式重新计算率
|
|
|
+ BigDecimal bigDecimal1 = (BigDecimal) ScriptShell.parseExpr(formula2, map);
|
|
|
+
|
|
|
+ for (MeterInfoVo meterInfoVo: meterInfoVos) {
|
|
|
+ if(meterInfoVo.getNemCode().equals(nemCode)){
|
|
|
+ meterInfoVo.setRdl(bigDecimal1);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 新建一个集合存重新计算后的VO对象和原来的VO对象
|
|
|
+ ArrayList<MeterInfoVo> updatedMeterInfoVos = new ArrayList<>();
|
|
|
+ for (MeterInfoVo meterInfoVo : meterInfoVos) {
|
|
|
+ if (meterInfoVo.getNemCode().equals(nemCode)) {
|
|
|
+ updatedMeterInfoVos.add(meterInfoVo); // 添加修改后的对象
|
|
|
+ } else {
|
|
|
+ updatedMeterInfoVos.add(meterInfoVo); // 添加原来不匹配的对象
|
|
|
+ }
|
|
|
+ }
|
|
|
+ meterInfoVos = updatedMeterInfoVos;
|
|
|
+ }
|
|
|
+ }
|
|
|
return meterInfoVos;
|
|
|
}
|
|
|
|
|
@@ -476,8 +601,8 @@ public class GetMeterInfo {
|
|
|
//条件构造器批量查询
|
|
|
List<MeterInfoEquipment> meterInfoEquipments = meterInfoEquipmentService.list(new QueryWrapper<MeterInfoEquipment>()
|
|
|
.in("date", dateTimes)
|
|
|
- .eq(StringUtil.isNotBlank(windId),"powerstation_nem_code", windId)
|
|
|
- .eq(StringUtil.isNotBlank(id),"equipment_nem_code", id)
|
|
|
+ .eq(StringUtil.isNotBlank(windId), "powerstation_nem_code", windId)
|
|
|
+ .eq(StringUtil.isNotBlank(id), "equipment_nem_code", id)
|
|
|
);
|
|
|
//遍历每年
|
|
|
for (int i = 0; i <= between; i++) {
|
|
@@ -506,7 +631,7 @@ public class GetMeterInfo {
|
|
|
}
|
|
|
}
|
|
|
//VO对象赋值月发电量,添加入VO对象集合
|
|
|
- meterInfoVo.setRdl(ndl.divide(BigDecimal.valueOf(10000),2,RoundingMode.HALF_EVEN));
|
|
|
+ meterInfoVo.setRdl(ndl.divide(BigDecimal.valueOf(10000), 2, RoundingMode.HALF_EVEN));
|
|
|
meterInfoVos.add(meterInfoVo);
|
|
|
}
|
|
|
}
|
|
@@ -586,7 +711,7 @@ public class GetMeterInfo {
|
|
|
meterInfoVo.setEndCode(meterInfoBottomcode.getEndValue());
|
|
|
}
|
|
|
}
|
|
|
- meterInfoVo.setRdl(ndl.divide(BigDecimal.valueOf(10000),4,RoundingMode.HALF_EVEN));
|
|
|
+ meterInfoVo.setRdl(ndl.divide(BigDecimal.valueOf(10000), 4, RoundingMode.HALF_EVEN));
|
|
|
meterInfoVos.add(meterInfoVo);
|
|
|
}
|
|
|
}
|
|
@@ -617,7 +742,7 @@ public class GetMeterInfo {
|
|
|
//条件构造器查询计算点
|
|
|
List<MeterPoint> meterPoints = meterPointService.list(new QueryWrapper<MeterPoint>()
|
|
|
.eq("windpowerstation_id", windId)
|
|
|
- .in("property", "JSD","JSD_QCFDL")
|
|
|
+ .in("property", "JSD", "JSD_QCFDL")
|
|
|
.eq(StringUtil.isNotBlank(meterType), "meter_type", meterType)
|
|
|
.eq(StringUtil.isNotBlank(meterClass), "meter_class", meterClass)
|
|
|
.eq(StringUtil.isNotBlank(name), "name", name)
|