Bläddra i källkod

新增逆变器信息实体和数据实体,增加逆变器文件生成

xusl 3 år sedan
förälder
incheckning
16eccb925a

+ 117 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/InverterInfo.java

@@ -0,0 +1,117 @@
+package com.jiayue.ipfcst.common.data.entity;
+
+import com.jiayue.ipfcst.common.data.abst.equipmentinfo.AbstractEquipmentInfo;
+import com.jiayue.ipfcst.common.data.constant.enums.EquipmentTypeEnum;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.validation.constraints.Digits;
+import java.math.BigDecimal;
+
+/**
+ * 逆变器实体
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/8/2 10:12
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Entity
+public class InverterInfo extends AbstractEquipmentInfo {
+
+    public InverterInfo() {
+        super.setEquipmentType(EquipmentTypeEnum.INVERTER);
+    }
+    /**
+     * 备用字段A 应用于样板机编号
+     */
+    /**
+     * 逆变器名称
+     */
+    @Column
+    private String name;
+
+    /**
+     * 是否组串式
+     */
+    @Column
+    private Boolean groupSeries;
+
+    /**
+     * 逆变器效率(%)
+     */
+    @Digits(integer = 5, fraction = 2)
+    @Column
+    private BigDecimal efficiency;
+
+    /**
+     * 额定功率(KW)
+     */
+    @Digits(integer = 10, fraction = 2)
+    @Column
+    private BigDecimal capacity;
+
+    /**
+     * 箱式变压器
+     */
+    @Column
+    private String box;
+
+    /**
+     * 集电线路
+     */
+    @Column
+    private String collectorCircuit;
+
+
+    /**
+     * 光伏组件型号
+     */
+    @Column
+    private String batteryModel;
+
+    /**
+     * 光伏组件数量(个)
+     */
+    @Column
+    private Integer batteryNumber;
+
+    /*   *//**
+     * 光伏阵列的倾斜角(°)
+     *//*
+    @Column
+    private Float pvArrayAngle;
+
+    *//**
+     * 光伏阵列的方位(°),方位角为零。正南为0,正西为90,正北180,正东270
+     *//*
+    @Column
+    private Float pvPosition;
+
+    *//**
+     * 光伏组件旋转方式
+     *//*
+    @Column
+    private PvRotationModeEnum pvRotationModeEnum;
+*/
+    /**
+     * 逆变器是否样板机
+     */
+    @Column
+    private Boolean sample;
+
+    /**
+     * backupA 样板机编号
+     */
+
+    /**
+     * backupB 经度
+     */
+
+    /**
+     * backupC 纬度
+     */
+}

+ 84 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/InverterStatusData.java

@@ -0,0 +1,84 @@
+package com.jiayue.ipfcst.common.data.entity;
+
+import com.jiayue.ipfcst.common.data.abst.equipmentstatus.AbstractEquipmentStatusData;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.validation.constraints.Digits;
+import java.math.BigDecimal;
+
+/**
+ * 逆变器数据实体
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/7/22 11:21
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Entity
+public class InverterStatusData extends AbstractEquipmentStatusData {
+
+
+	/**
+	 * 有功(KW)
+	 */
+	@Digits(integer = 10, fraction = 2)
+	@Column
+	private BigDecimal activePower = new BigDecimal(-99);
+
+	/**
+	 * 无功(KVar)
+	 */
+	@Digits(integer = 10, fraction = 2)
+	@Column
+	private BigDecimal reactivePower = new BigDecimal(-99);
+
+	/**
+	 * 功率因数
+	 */
+	@Digits(integer = 10, fraction = 2)
+	@Column
+	private BigDecimal powerFactor = new BigDecimal(-99);
+
+	/**
+	 * 电压(V)
+	 */
+	@Digits(integer = 10, fraction = 2)
+	@Column
+	private BigDecimal voltage = new BigDecimal(-99);
+
+
+	/**
+	 * 电流(A)
+	 */
+	@Digits(integer = 10, fraction = 2)
+	@Column
+	private BigDecimal electricalCurrent = new BigDecimal(-99);
+
+	/**
+	 * 当日发电量(kW·h)
+	 */
+	@Digits(integer = 10, fraction = 2)
+	@Column
+	private BigDecimal dayElectricQuantity = new BigDecimal(-99);
+
+
+	/**
+	 * 累积发电量(MW·h)
+	 */
+	@Digits(integer = 10, fraction = 2)
+	@Column
+	private BigDecimal cumulativeGeneratedEnergy  = new BigDecimal(-99);
+
+	/**
+	 * 当日并网小时
+	 */
+	@Digits(integer = 10, fraction = 2)
+	@Column
+	private BigDecimal dayGridConnectedHours = new BigDecimal(-99);
+
+
+}

+ 24 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/InverterInfoRepository.java

@@ -0,0 +1,24 @@
+package com.jiayue.ipfcst.common.data.repository;
+
+import com.jiayue.ipfcst.common.data.entity.InverterInfo;
+
+import java.util.List;
+
+/**
+ * 逆变器实体仓储
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/8/6 13:00
+ */
+public interface InverterInfoRepository extends BaseRepository<InverterInfo, Integer> {
+
+    /**
+     * 根据ID排序查出所有逆变器设备信息
+     * yh
+     */
+    List<InverterInfo> findAllByOrderByIdAsc();
+
+    InverterInfo findByName(String name);
+
+}

+ 125 - 32
ipfcst-console/src/main/java/com/jiayue/ipfcst/fileupload/service/E63UploadFileService.java

@@ -59,10 +59,12 @@ public class E63UploadFileService extends BaseUploadFileService {
 
   private final NwpRepository nwpRepository;
 
+  private final InverterInfoRepository inverterInfoRepository;
+
   @Autowired
   private RedisUtils redisUtils;
 
-  public E63UploadFileService(VelocityEngine velocityEngine, ForecastPowerShortTermService forecastPowerShortTermService, ForecastPowerUltraShortTermService forecastPowerUltraShortTermService, E63UploadFileRuleService e63UploadFileRuleService, WeatherStationInfoRepository weatherStationInfoRepository, WindTurbineInfoRepository windTurbineInfoRepository, WeatherStationStatusDataRepository weatherStationStatusDataRepository, WindTowerInfoRepository windTowerInfoRepository, WindTowerStatusDataRepository windTowerStatusDataRepository, NwpRepository nwpRepository) {
+  public E63UploadFileService(VelocityEngine velocityEngine, ForecastPowerShortTermService forecastPowerShortTermService, ForecastPowerUltraShortTermService forecastPowerUltraShortTermService, E63UploadFileRuleService e63UploadFileRuleService, WeatherStationInfoRepository weatherStationInfoRepository, WindTurbineInfoRepository windTurbineInfoRepository, WeatherStationStatusDataRepository weatherStationStatusDataRepository, WindTowerInfoRepository windTowerInfoRepository, WindTowerStatusDataRepository windTowerStatusDataRepository, NwpRepository nwpRepository, InverterInfoRepository inverterInfoRepository) {
     this.velocityEngine = velocityEngine;
     this.forecastPowerShortTermService = forecastPowerShortTermService;
     this.forecastPowerUltraShortTermService = forecastPowerUltraShortTermService;
@@ -73,6 +75,7 @@ public class E63UploadFileService extends BaseUploadFileService {
     this.windTowerInfoRepository = windTowerInfoRepository;
     this.windTowerStatusDataRepository = windTowerStatusDataRepository;
     this.nwpRepository = nwpRepository;
+    this.inverterInfoRepository = inverterInfoRepository;
   }
 
   /**
@@ -144,7 +147,7 @@ public class E63UploadFileService extends BaseUploadFileService {
             template.merge(velocityContext, writer);
 
             // 将文件复制到上报路径中
-            super.copyUploadFile(writer, file, FileTypeEnum.E1.name(), null, date, stationCode);
+            super.copyUploadFile(writer, file, FileTypeEnum.E1.name(), null, systemDate, stationCode);
           }
         } else {
           log.error(stationCode + "短期上报模板不存在!");
@@ -217,7 +220,7 @@ public class E63UploadFileService extends BaseUploadFileService {
             writer = new StringWriter();
             template.merge(velocityContext, writer);
             // 将文件复制到上报路径中
-            super.copyUploadFile(writer, file, FileTypeEnum.E26.name(), null, date, stationCode);
+            super.copyUploadFile(writer, file, FileTypeEnum.E26.name(), null, systemDate, stationCode);
           }
         } else {
           log.error(stationCode + "可用短期上报模板不存在!");
@@ -297,7 +300,7 @@ public class E63UploadFileService extends BaseUploadFileService {
             writer = new StringWriter();
             template.merge(velocityContext, writer);
 
-            super.copyUploadFile(writer, file, FileTypeEnum.E2.name(), null, date, stationCode);
+            super.copyUploadFile(writer, file, FileTypeEnum.E2.name(), null, systemDate, stationCode);
           }
         } else {
           log.error(stationCode + "超短期上报模板不存在!");
@@ -379,7 +382,7 @@ public class E63UploadFileService extends BaseUploadFileService {
             velocityContext.put("uploadTime", DateFormatUtils.format(startTime - 15 * 60 * 1000, "yyyy-MM-dd_HH:mm"));
             writer = new StringWriter();
             template.merge(velocityContext, writer);
-            super.copyUploadFile(writer, file, FileTypeEnum.E27.name(), null, date, stationCode);
+            super.copyUploadFile(writer, file, FileTypeEnum.E27.name(), null, systemDate, stationCode);
           }
         } else {
           log.error(stationCode + "可用超短期上报模板不存在!");
@@ -421,13 +424,13 @@ public class E63UploadFileService extends BaseUploadFileService {
           template = this.velocityEngine.getTemplate(this.vmsPath + "/QXZ.vm");
           fileName = e63UploadFileRuleService.getFileNameRule(electricFieldInfo, "E6", endTime);
           if (getFileName(fileName, "E6", stationCode)) {
-            generateQxzFile(fileName, template, electricFieldInfo, date, startTime, endTime);
+            generateQxzFile(fileName, template, electricFieldInfo, systemDate, startTime, endTime);
           }
         } else {
           template = this.velocityEngine.getTemplate(this.vmsPath + "/CFT.vm");
           fileName = e63UploadFileRuleService.getFileNameRule(electricFieldInfo, "E7", endTime);
           if (getFileName(fileName, "E7", stationCode)) {
-            generateCftFile(fileName, template, electricFieldInfo, date, startTime, endTime);
+            generateCftFile(fileName, template, electricFieldInfo, systemDate, startTime, endTime);
           }
         }
       } catch (Exception e) {
@@ -654,8 +657,7 @@ public class E63UploadFileService extends BaseUploadFileService {
           p8 = nwpData.getPressure();
           p8 = p8.add(new BigDecimal(df.format(Math.random() * 1 + 0.01))).setScale(2, BigDecimal.ROUND_HALF_UP);
           log.info(electricFieldInfo.getStationCode() + "生成测风塔数据用nwp+随机数");
-        }
-        else{
+        } else {
           // 10米风速产生1-5随机数
           ws10 = cftRandomCreate("wsInst10");
           // 10米风向产生40-60随机数
@@ -756,23 +758,23 @@ public class E63UploadFileService extends BaseUploadFileService {
         if (date != null) {
           systemDate = date;
         }
-        Long startTime = DateMomentUtil.getMomentTime(systemDate.getTime() - 5 * 60 * 1000, 1, 5 * 60 * 1000L);
-        Long endTime = startTime + 5 * 60 * 1000 - 1000;
+        Long endTime = DateMomentUtil.getMomentTime(systemDate.getTime(), 1, 5 * 60 * 1000L);
+        Long startTime = endTime - 4 * 60 * 1000;
         // 生成上报文件名格式
         Template template = null;
 
         if (electricFieldInfo.getElectricFieldTypeEnum().toString().equals("E1")) {
           // 获取逆变器模板
           template = this.velocityEngine.getTemplate(this.vmsPath + "/NBQ.vm");
-          fileName = e63UploadFileRuleService.getFileNameRule(electricFieldInfo, "E8", endTime + 1000);
+          fileName = e63UploadFileRuleService.getFileNameRule(electricFieldInfo, "E8", endTime);
           if (getFileName(fileName, "E8", stationCode)) {
-            generateNbqFile(fileName, template, electricFieldInfo, date, startTime, endTime);
+            generateNbqFile(fileName, template, electricFieldInfo, systemDate, startTime, endTime);
           }
         } else {
           template = this.velocityEngine.getTemplate(this.vmsPath + "/FJ.vm");
-          fileName = e63UploadFileRuleService.getFileNameRule(electricFieldInfo, "E9", endTime + 1000);
+          fileName = e63UploadFileRuleService.getFileNameRule(electricFieldInfo, "E9", endTime);
           if (getFileName(fileName, "E9", stationCode)) {
-            generateFjFile(fileName, template, electricFieldInfo, date, startTime, endTime);
+            generateFjFile(fileName, template, electricFieldInfo, systemDate, startTime, endTime);
           }
         }
       } catch (Exception e) {
@@ -809,23 +811,114 @@ public class E63UploadFileService extends BaseUploadFileService {
    * 生成逆变器上报文件
    */
   private void generateNbqFile(String fileName, Template template, ElectricField electricFieldInfo, Date date, Long startTime, Long endTime) {
-    Map<String, Object> map = new HashMap<>();
-    // 创建上报文件
-    File file = super.createTempFile(fileName);
-    VelocityContext velocityContext = new VelocityContext();
-    // 根据模板生成文件内容
-    velocityContext.put("vList", null);
-    // 场站标识
-    velocityContext.put("sign", electricFieldInfo.getSign());
-    // 场站装机容量
-    velocityContext.put("capacity", electricFieldInfo.getCapacity());
-    // 系统当前日期
-    velocityContext.put("currentTime", DateFormatUtils.format(endTime + 1000, "yyyy-MM-dd_HH:mm") + ":00");
-    // 上报数据开始日期
-    velocityContext.put("uploadTime", DateFormatUtils.format(endTime + 1000, "yyyy-MM-dd_HH:mm"));
-    StringWriter writer = new StringWriter();
-    template.merge(velocityContext, writer);
-    super.copyUploadFile(writer, file, FileTypeEnum.E8.name(), null, date, electricFieldInfo.getStationCode());
+    // 获取逆变器
+    List<InverterInfo> inverterInfoList = inverterInfoRepository.findAll();
+    // 过滤上报的逆变器
+    List<InverterInfo> filterInverterInfoList = inverterInfoList.stream().filter(w -> w.getReport() == true).collect(Collectors.toList());
+    if (filterInverterInfoList.size() > 0) {
+      List<Map<String, String>> dtaInverterList = new ArrayList<>();
+      for (InverterInfo inverterInfo : filterInverterInfoList) {
+        Map<String, String> map = new HashMap<>();
+        //场站名称
+        map.put("czmc", electricFieldInfo.getName());
+        // 名称
+        map.put("name", inverterInfo.getName());
+        //集电线名称
+        map.put("CollectorCircuit", inverterInfo.getCollectorCircuit());
+        //额定容量
+        map.put("RatedCapacity", div(inverterInfo.getCapacity(), new BigDecimal("1000"), 2).toString());
+        // 开机容量
+        map.put("nbqCapacity", inverterInfo.getCapacity().toString());
+        //型号
+        map.put("modelNumber", inverterInfo.getModelNumber());
+        // 是否样板
+        map.put("sample", inverterInfo.getSample() ? "1" : "0");
+        //是否组串
+        map.put("IsString", inverterInfo.getGroupSeries() ? "1" : "0");
+        String inverterEquipmentNo = inverterInfo.getEquipmentNo();
+        Map<String, String> nbqMap = redisUtils.hgetall("nbq-" + electricFieldInfo.getStationCode() + "-" + inverterEquipmentNo);
+        DecimalFormat df = new DecimalFormat("0.00");
+        // 状态
+        String status = "1";
+        // 有功
+        BigDecimal activePower = new BigDecimal("0");
+        // 无功
+        BigDecimal reactivePower = new BigDecimal("0");
+        // 功率因数
+        BigDecimal powerFactor = new BigDecimal("0");
+        // 电压
+        BigDecimal voltage = new BigDecimal("0");
+        // 电流
+        BigDecimal electricalCurrent = new BigDecimal("0");
+        // 当日发电量
+        BigDecimal dayElectricQuantity = new BigDecimal("0");
+        // 累积发电量
+        BigDecimal cumulativeGeneratedEnergy = new BigDecimal("0");
+        if (!nbqMap.isEmpty()) {
+          String time = nbqMap.get("time");
+          if (StrUtil.isNotBlank(time)) {
+            if (Long.parseLong(time) >= startTime && Long.parseLong(time) <= endTime) {
+              if (nbqMap.get("status") != null) {
+                status = nbqMap.get("status");
+              }
+              if (nbqMap.get("activePower") != null) {
+                activePower = new BigDecimal(nbqMap.get("activePower"));
+              }
+              if (nbqMap.get("reactivePower") != null) {
+                reactivePower = new BigDecimal(nbqMap.get("reactivePower"));
+              }
+              if (nbqMap.get("powerFactor") != null) {
+                powerFactor = new BigDecimal(nbqMap.get("powerFactor"));
+              }
+              if (nbqMap.get("voltage") != null) {
+                voltage = new BigDecimal(nbqMap.get("voltage"));
+              }
+              if (nbqMap.get("electricalCurrent") != null) {
+                electricalCurrent = new BigDecimal(nbqMap.get("electricalCurrent"));
+              }
+              if (nbqMap.get("dayElectricQuantity") != null) {
+                dayElectricQuantity = new BigDecimal(nbqMap.get("dayElectricQuantity"));
+              }
+              if (nbqMap.get("cumulativeGeneratedEnergy") != null) {
+                cumulativeGeneratedEnergy = new BigDecimal(nbqMap.get("cumulativeGeneratedEnergy"));
+              }
+            }
+          }
+        }
+        map.put("status", status);
+        // 有功
+        map.put("NbqActivePower", div(activePower, new BigDecimal("1000"), 2).toString());
+        // 无功
+        map.put("NbqReActivePower", div(reactivePower, new BigDecimal("1000"), 2).toString());
+        // 电压
+        map.put("Voltage", df.format(voltage));
+        // 电流
+        map.put("GalvanicCurrent", df.format(electricalCurrent));
+        // 功率因数
+        map.put("PowerFactor", df.format(powerFactor));
+        // 日发电量
+        map.put("NbqDailyOutPut", df.format(dayElectricQuantity));
+        // 累计发电量
+        map.put("GeneratingCap", df.format(cumulativeGeneratedEnergy));
+        dtaInverterList.add(map);
+      }
+      // 创建上报文件
+      File file = super.createTempFile(fileName);
+      VelocityContext velocityContext = new VelocityContext();
+      // 根据模板生成文件内容
+      velocityContext.put("vList", dtaInverterList);
+      // 场站标识
+      velocityContext.put("sign", electricFieldInfo.getSign());
+      // 场站装机容量
+      velocityContext.put("capacity", electricFieldInfo.getCapacity());
+      // 系统当前日期
+      velocityContext.put("currentTime", DateFormatUtils.format(endTime, "yyyy-MM-dd_HH:mm") + ":00");
+      // 上报数据开始日期
+      velocityContext.put("uploadTime", DateFormatUtils.format(endTime, "yyyy-MM-dd_HH:mm"));
+      StringWriter writer = new StringWriter();
+      template.merge(velocityContext, writer);
+      super.copyUploadFile(writer, file, FileTypeEnum.E8.name(), null, date, electricFieldInfo.getStationCode());
+    }
   }
 
   /**