瀏覽代碼

加入短期相关类移植修改

xusl 3 年之前
父節點
當前提交
f75c0e4874
共有 25 個文件被更改,包括 1727 次插入0 次删除
  1. 109 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/abst/AbstractBaseEntity.java
  2. 34 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/abst/AbstractForecastPower.java
  3. 61 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/abst/AbstractForecastPowerBase.java
  4. 59 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/abst/AbstractForecastPowerHis.java
  5. 23 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/ElectricFieldStatrsEnum.java
  6. 20 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/ElectricFieldTypeEnum.java
  7. 38 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/PredictionModelEnum.java
  8. 52 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/ProvinceEnum.java
  9. 136 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/ElectricField.java
  10. 21 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/ForecastPowerShortTerm.java
  11. 48 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/ForecastPowerShortTermHis.java
  12. 39 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/ForecastPowerUltraShortTerm.java
  13. 39 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/ForecastPowerUltraShortTermHis.java
  14. 91 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/OverhaulPlan.java
  15. 53 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/SysParameter.java
  16. 75 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/job/BaseJob.java
  17. 14 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/ElectricFieldRepository.java
  18. 53 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/ForecastPowerShortTermHisRepository.java
  19. 35 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/ForecastPowerShortTermRepository.java
  20. 31 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/OverhaulPlanRepository.java
  21. 20 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/SysParameterRepository.java
  22. 343 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/service/BaseService.java
  23. 74 0
      ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/ElectricFieldService.java
  24. 221 0
      ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/ForecastPowerShortTermService.java
  25. 38 0
      ipfcst-console/src/main/java/com/jiayue/ipfcst/console/util/Constant.java

+ 109 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/abst/AbstractBaseEntity.java

@@ -0,0 +1,109 @@
+package com.jiayue.ipfcst.common.data.abst;
+
+import lombok.Data;
+import org.springframework.core.annotation.Order;
+import org.springframework.data.annotation.CreatedBy;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedBy;
+import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import javax.persistence.Column;
+import javax.persistence.EntityListeners;
+import javax.persistence.MappedSuperclass;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 所有实体的基类
+ *
+ * @author zzy
+ * @version 2.0
+ * @since 2018/10/11 11:08
+ */
+@Data
+@MappedSuperclass
+@EntityListeners(AuditingEntityListener.class)
+public
+class AbstractBaseEntity implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	@Order(2)
+	@Column
+	private String stationCode;
+
+	/**
+	 * 备用字段A
+	 */
+	@Order(200)
+	@Column
+	private String backupA;
+
+	/**
+	 * 备用字段B
+	 */
+	@Order(201)
+	@Column
+	private String backupB;
+
+	/**
+	 * 备用字段C
+	 */
+	@Order(202)
+	@Column
+	private String backupC;
+
+	/**
+	 * 备用字段D
+	 */
+	@Order(203)
+	@Column
+	private String backupD;
+
+	/**
+	 * 备用字段E
+	 */
+	@Order(204)
+	@Column
+	private String backupE;
+
+	/**
+	 * 备用字段F
+	 */
+	@Order(205)
+	@Column
+	private String backupF;
+
+
+	/**
+	 * 创建人,不允许修改
+	 */
+	@Order(206)
+	@CreatedBy
+	@Column(updatable = false)
+	private String creator;
+
+	/**
+	 * 创建时间,不允许修改
+	 */
+	@Order(207)
+	@CreatedDate
+	@Column(updatable = true)
+	private Date createTime;
+
+	/**
+	 * 最后修改者
+	 */
+	@Order(208)
+	@LastModifiedBy
+	@Column(insertable = false)
+	private String lastModifier;
+	/**
+	 * 最后修改时间
+	 */
+	@Order(209)
+	@LastModifiedDate
+	@Column(insertable = false)
+	private Date lastModifyTime;
+}

+ 34 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/abst/AbstractForecastPower.java

@@ -0,0 +1,34 @@
+package com.jiayue.ipfcst.common.data.abst;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.core.annotation.Order;
+
+import javax.persistence.Column;
+import javax.persistence.MappedSuperclass;
+import javax.validation.constraints.Digits;
+import java.math.BigDecimal;
+
+/**
+ * 实时预测功率抽象实体
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/11/28 16:04
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@MappedSuperclass
+public class AbstractForecastPower
+		extends AbstractForecastPowerBase {
+
+	/**
+	 * 预测功率(MW)
+	 */
+	@Order(20)
+	@Digits(integer = 10, fraction = 2)
+	@Column
+	private BigDecimal fpValue;
+
+
+}

+ 61 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/abst/AbstractForecastPowerBase.java

@@ -0,0 +1,61 @@
+package com.jiayue.ipfcst.common.data.abst;
+
+import com.jiayue.ipfcst.common.data.constant.enums.PredictionModelEnum;
+import lombok.Data;
+import org.hibernate.annotations.GenericGenerator;
+import org.springframework.core.annotation.Order;
+import org.springframework.data.annotation.CreatedDate;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 预测功率抽象实体
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2018/11/2 12:23
+ */
+@Data
+@MappedSuperclass
+public class AbstractForecastPowerBase implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+
+    @Id
+    @Order(1)
+    @GeneratedValue(strategy = GenerationType.AUTO, generator = "myid")
+    @GenericGenerator(name = "myid", strategy = "com.jiayue.ipfcst.common.data.entity.id.CustomIDGenerator")
+    private Integer id;
+
+    @Order(2)
+    @Column
+    private String stationCode;
+
+    /**
+     * 生成日期
+     */
+    @Order(100)
+    @Temporal(TemporalType.TIMESTAMP)
+    @CreatedDate
+    @Column
+    private Date genDate;
+
+    /**
+     * 预测时间
+     */
+    @Order(101)
+    @Column
+    private Long forecastTime;
+
+    /**
+     * 预测模型
+     */
+    @Order(102)
+    @Column
+    @Enumerated(EnumType.STRING)
+    private PredictionModelEnum predictionModelEnum;
+
+}

+ 59 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/abst/AbstractForecastPowerHis.java

@@ -0,0 +1,59 @@
+package com.jiayue.ipfcst.common.data.abst;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.core.annotation.Order;
+
+import javax.persistence.Column;
+import javax.persistence.MappedSuperclass;
+import javax.validation.constraints.Digits;
+import java.math.BigDecimal;
+
+/**
+ * 上报预测功率抽象实体
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/11/28 16:05
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@MappedSuperclass
+public class AbstractForecastPowerHis extends AbstractForecastPowerBase {
+
+	/**
+	 * 可用预测功率(MW)
+	 */
+	@Order(10)
+	@Digits(integer = 10, fraction = 2)
+	@Column
+	private BigDecimal ableValue;
+
+	/**
+	 * 理论预测功率(MW)
+	 */
+	@Order(11)
+	@Digits(integer = 10, fraction = 2)
+	@Column
+	private BigDecimal theoryValue;
+
+	/**
+	 * 开机容量(MW)
+	 */
+	@Order(12)
+	@Column
+	@Digits(integer = 10, fraction = 2)
+	private BigDecimal suCapacity;
+
+	/**
+	 * 装机容量(MW)
+	 */
+	@Order(13)
+	@Column
+	@Digits(integer = 10, fraction = 2)
+	private BigDecimal capacity;
+
+	/*提前多久预测*/
+	@Column
+	private Integer forecastHowLongAgo;
+}

+ 23 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/ElectricFieldStatrsEnum.java

@@ -0,0 +1,23 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 场站状态枚举
+ *
+ * @author bizy
+ * @version 3.0
+ */
+@Getter
+@AllArgsConstructor
+@JsonFormat(shape = JsonFormat.Shape.OBJECT)
+public enum ElectricFieldStatrsEnum {
+	E1(1, "未运维"),
+
+	E2(2, "运维中");
+
+	private Integer code;
+	private String message;
+}

+ 20 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/ElectricFieldTypeEnum.java

@@ -0,0 +1,20 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 场站类型枚举
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/8/2 11:33
+ */
+@Getter
+@AllArgsConstructor
+public enum ElectricFieldTypeEnum {
+	E1(1, "光伏电站"),
+	E2(2, "风力电站");
+	private Integer code;
+	private String message;
+}

+ 38 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/PredictionModelEnum.java

@@ -0,0 +1,38 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 预测模型枚举
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/9/27 9:39
+ */
+@Getter
+@AllArgsConstructor
+public enum PredictionModelEnum {
+	// 云端预测结果
+	E1(1, "云端模型"),
+	// 本地物理模型
+	E2(2, "物理模型"),
+	// 本地统计模型
+	E3(3, "统计模型"),
+	// 本地补录数据
+	E4(4, "补录数据"),
+	// 本地差值模型
+	E5(5, "差值模型"),
+	// 人工干预模型
+	E6(6, "干预模型"),
+	// 上下限修正
+	E7(7, "上下限修正"),
+	// 更新短期
+	E8(8, "更新短期"),
+	// 短期乘系数
+	E9(9, "短期乘系数"),
+	// 人工干预系数
+	E10(10, "干预系数模型");
+	private Integer code;
+	private String message;
+}

+ 52 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/ProvinceEnum.java

@@ -0,0 +1,52 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 省调度中心枚举
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/8/5 9:02
+ */
+@Getter
+@AllArgsConstructor
+public enum ProvinceEnum {
+	E11(11, "北京市"),
+	E12(12, "天津市"),
+	E13(13, "河北省-冀北"),
+	E17(17, "河北省-南网"),
+	E14(14, "山西省"),
+	E15(15, "内蒙古自治区-蒙东"),
+	E16(16, "内蒙古自治区-蒙西"),
+	E21(21, "辽宁省"),
+	E22(22, "吉林省"),
+	E23(23, "黑龙江省"),
+	E31(31, "上海市"),
+	E32(32, "江苏省"),
+	E33(33, "浙江省"),
+	E34(34, "安徽省"),
+	E35(35, "福建省"),
+	E36(36, "江西省"),
+	E37(37, "山东省"),
+	E41(41, "河南省"),
+	E42(42, "湖北省"),
+	E43(43, "湖南省"),
+	E44(44, "广东省"),
+	E45(45, "广西壮族自治区"),
+	E46(46, "海南省"),
+	E50(50, "重庆市"),
+	E51(51, "四川省"),
+	E52(52, "贵州省"),
+	E53(53, "云南省"),
+	E54(54, "西藏自治区"),
+	E61(61, "陕西省"),
+	E62(62, "甘肃省"),
+	E63(63, "青海省"),
+	E64(64, "宁夏回族自治区"),
+	E65(65, "新疆维吾尔自治区"),
+	E99(99, "华北直调");
+	private Integer code;
+	private String message;
+}

+ 136 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/ElectricField.java

@@ -0,0 +1,136 @@
+package com.jiayue.ipfcst.common.data.entity;
+
+import com.jiayue.ipfcst.common.data.abst.AbstractBaseEntity;
+import com.jiayue.ipfcst.common.data.constant.enums.ElectricFieldStatrsEnum;
+import com.jiayue.ipfcst.common.data.constant.enums.ElectricFieldTypeEnum;
+import com.jiayue.ipfcst.common.data.constant.enums.ProvinceEnum;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.persistence.*;
+import javax.validation.constraints.Digits;
+import java.math.BigDecimal;
+
+/**
+ * 场站实体
+ *
+ * @author yh
+ * @version 1.0
+ * @since 2019/7/22 11:16
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Entity
+public class ElectricField extends AbstractBaseEntity {
+    /**
+     * 备用字段A(用于所属地调字段)
+     */
+    /**
+     * 备用字段B(站内受阻容量,不需要页面显示)
+     */
+    /**
+     * 场站编号(运维标识,主键)
+     */
+    @Id
+    @Column
+    private String stationCode;
+
+    /**
+     * 场站状态
+     */
+    @Column
+    @Enumerated(EnumType.STRING)
+    private ElectricFieldStatrsEnum stationStatusEnum;
+
+    /**
+     * 电站名称
+     */
+    @Column
+    private String name;
+
+    /**
+     * 场站标识
+     */
+    @Column
+    private String sign;
+
+
+    /**
+     * 别名(上网变电站名称)
+     */
+    @Column
+    private String netSubstationName;
+
+    /**
+     * 场站装机容量(MW)
+     */
+    @Column
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal capacity;
+
+    /**
+     * 并网设备数
+     */
+    @Column
+    private Integer gridCE;
+
+    /**
+     * 场站经度
+     */
+    @Column
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal longitude;
+
+    /**
+     * 场站纬度
+     */
+    @Column
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal latitude;
+
+    /**
+     * 场站海拔
+     */
+    @Column
+    private BigDecimal altitude;
+
+
+    /**
+     * 场站类型
+     */
+    @Column
+    @Enumerated(EnumType.STRING)
+    private ElectricFieldTypeEnum electricFieldTypeEnum;
+
+    /**
+     * 上报省调
+     */
+    @Column
+    @Enumerated(EnumType.STRING)
+    private ProvinceEnum provinceEnum;
+
+    /**
+     * 入库时间间隔  单位 s
+     */
+    private Integer interval;
+
+
+    /**
+     * 场站所属公司
+     */
+    @Column
+    private String company;
+
+    /**
+     * 场站位置
+     */
+    @Column
+    private String location;
+
+    /**
+     * 场站面积
+     */
+    @Column
+    private BigDecimal area;
+
+}

+ 21 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/ForecastPowerShortTerm.java

@@ -0,0 +1,21 @@
+package com.jiayue.ipfcst.common.data.entity;
+
+import com.jiayue.ipfcst.common.data.abst.AbstractForecastPower;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.persistence.Entity;
+
+/**
+ * 短期预测功率实体
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2018/10/23 9:17
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Entity
+public class ForecastPowerShortTerm extends AbstractForecastPower {
+
+}

+ 48 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/ForecastPowerShortTermHis.java

@@ -0,0 +1,48 @@
+package com.jiayue.ipfcst.common.data.entity;
+
+import com.jiayue.ipfcst.common.data.abst.AbstractForecastPowerHis;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.persistence.Entity;
+import javax.persistence.Transient;
+import java.math.BigDecimal;
+
+/**
+ * 短期预测功率实体
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2018/10/23 9:17
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Entity
+public class ForecastPowerShortTermHis extends AbstractForecastPowerHis {
+
+	/**
+	 * ------------------------------------华北直调上报字段,不写入数据库--------------------------------------------
+	 */
+
+	//风速
+	@Transient
+	private BigDecimal windspeed;
+	//风向
+	@Transient
+	private BigDecimal windDir;
+	//气温
+	@Transient
+	private BigDecimal temperature;
+	//相对湿度
+	@Transient
+	private BigDecimal humidity;
+	//压力
+	@Transient
+	private BigDecimal pressure;
+	//经度
+	@Transient
+	private BigDecimal longitude;
+	//纬度
+	@Transient
+	private BigDecimal latitude;
+}

+ 39 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/ForecastPowerUltraShortTerm.java

@@ -0,0 +1,39 @@
+package com.jiayue.ipfcst.common.data.entity;
+
+import com.jiayue.ipfcst.common.data.abst.AbstractForecastPower;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.core.annotation.Order;
+
+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/1 10:56
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Entity
+public class ForecastPowerUltraShortTerm extends AbstractForecastPower {
+    /**
+     * 由差值计算出来的超短期(MW)
+     */
+    @Order(20)
+    @Digits(integer = 10, fraction = 2)
+    @Column
+    private BigDecimal DifferenceValue;
+
+    /**
+     * 由短期*系数计算出来的超短期(MW)
+     */
+    @Order(20)
+    @Digits(integer = 10, fraction = 2)
+    @Column
+    private BigDecimal CoefficientValue;
+}

+ 39 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/ForecastPowerUltraShortTermHis.java

@@ -0,0 +1,39 @@
+package com.jiayue.ipfcst.common.data.entity;
+
+import com.jiayue.ipfcst.common.data.abst.AbstractForecastPowerHis;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.core.annotation.Order;
+
+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/1 10:56
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Entity
+public class ForecastPowerUltraShortTermHis extends AbstractForecastPowerHis {
+    /**
+     * 由差值计算出来的超短期(MW)
+     */
+    @Order(20)
+    @Digits(integer = 10, fraction = 2)
+    @Column
+    private BigDecimal DifferenceValue;
+
+    /**
+     * 由短期*系数计算出来的超短期(MW)
+     */
+    @Order(20)
+    @Digits(integer = 10, fraction = 2)
+    @Column
+    private BigDecimal CoefficientValue;
+}

+ 91 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/OverhaulPlan.java

@@ -0,0 +1,91 @@
+package com.jiayue.ipfcst.common.data.entity;
+
+import com.jiayue.ipfcst.common.data.abst.AbstractBaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+import javax.validation.constraints.Digits;
+import java.math.BigDecimal;
+
+/**
+ * 检修计划
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/7/22 11:24
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Entity
+public class OverhaulPlan extends AbstractBaseEntity {
+
+
+    /**
+     * 编号
+     */
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO, generator = "myid")
+    @GenericGenerator(name = "myid", strategy = "com.jiayue.ipfcst.common.data.entity.id.CustomIDGenerator")
+    @Column
+    private Integer id;
+
+
+    /**
+     * 名称
+     */
+    @Column
+    private String name;
+
+    /**
+     * 描述
+     */
+    @Column
+    private String describe;
+
+    /**
+     * 开始时间
+     */
+    @Column
+    private Long startTime;
+
+    /**
+     * 结束时间
+     */
+    @Column
+    private Long endTime;
+
+    /**
+     * 检修容量,单位MW
+     */
+    @Column
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal overhaulCapactity;
+
+    /**
+     * 状态:改为执行中和关闭中
+     */
+    @Column
+    private Integer status;
+
+    /**
+     * 生效时间
+     */
+    @Column
+    private Long finalEntryTime;
+
+    /**
+     * 手动完成时间
+     * Manual completion time
+     */
+    private Long mcTime;
+
+    @Column
+    private String stationCode;
+
+    /*
+    backUpA 捆绑id
+     */
+
+}

+ 53 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/SysParameter.java

@@ -0,0 +1,53 @@
+package com.jiayue.ipfcst.common.data.entity;
+
+import com.jiayue.ipfcst.common.data.abst.AbstractBaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.hibernate.annotations.GenericGenerator;
+import org.springframework.core.annotation.Order;
+
+import javax.persistence.*;
+
+/**
+ * 参数实体
+ *
+ * @author bizy
+ * @version 1.0
+ * @since 2018/10/22 11:29
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Entity
+public class SysParameter extends AbstractBaseEntity {
+
+    @Id
+    @Order(1)
+    @GeneratedValue(strategy = GenerationType.AUTO, generator = "myid")
+    @GenericGenerator(name = "myid", strategy = "com.jiayue.ipfcst.common.data.entity.id.CustomIDGenerator")
+    private Integer id;
+
+    /**
+     * 参数标识
+     */
+    @Column(unique = true)
+    private String sysKey;
+
+    /**
+     * 参数值
+     */
+    @Column
+    private String sysValue;
+
+    /**
+     * 参数描述
+     */
+    @Column
+    private String describe;
+
+    /**
+     * 场站标识
+     */
+    @Column
+    private String stationCode;
+
+}

+ 75 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/job/BaseJob.java

@@ -0,0 +1,75 @@
+package com.jiayue.ipfcst.common.data.job;
+
+import com.jiayue.ipfcst.common.data.service.BaseService;
+import lombok.extern.slf4j.Slf4j;
+import net.sf.json.JSONArray;
+import org.quartz.Job;
+import org.quartz.JobDataMap;
+import org.quartz.JobExecutionContext;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+
+/**
+ * 任务继承类
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2018/10/25 16:04
+ */
+@Slf4j
+public abstract class BaseJob implements Job {
+
+	BaseService baseService;
+
+	@Autowired
+	public void setBaseService(BaseService baseService) {
+		this.baseService = baseService;
+	}
+
+	@Override
+	public void execute(JobExecutionContext context) {
+
+		String method = this.getClass().getName() + ".execute(JobDataMap jobDataMap)";// 执行方法
+		log.info("定时任务:" + method + ",执行开始");
+		String parameter = "";// 参数
+		String errorInfo = "";
+		boolean process;// 执行结果
+		try {
+			// 设置系统用户为job
+			Authentication auth = new UsernamePasswordAuthenticationToken("quartzJob", null);
+			SecurityContextHolder.getContext().setAuthentication(auth);
+			JobDataMap jobDataMap = context.getTrigger().getJobDataMap();
+			parameter = JSONArray.fromObject(jobDataMap).toString();
+			process = this.execute(jobDataMap);
+		} catch (RuntimeException e) {
+			errorInfo = "定时任务执行失败" + e.getMessage();
+			log.error("定时任务执行失败", e);
+			process = false;
+		}
+
+		if (log.isDebugEnabled()) {
+			log.debug("执行方法:" + method);
+			log.debug("参数:" + parameter);
+			log.debug("执行结果:" + process);
+		}
+		if (!process) {// 如果执行失败,进行告警
+			// 进行告警
+			String name = "定时任务执行失败";
+			String describe = "执行类:" + method + "/r/n参数:" + parameter;
+			String solution = "请检查定时任务";
+			//            this.baseService.saveSysAlarm(AlarmTypeEnum., name, describe,
+			//                SysAlarmPritorityEnum.AlarmPritorityMedium.name(), errorInfo, solution);
+		}
+		log.info("定时任务:" + method + ",执行完成");
+	}
+
+	/**
+	 * 任务执行方法
+	 *
+	 * @param jobDataMap 任务参数
+	 * @return 任务执行结果是否成功
+	 */
+	public abstract boolean execute(JobDataMap jobDataMap);
+}

+ 14 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/ElectricFieldRepository.java

@@ -0,0 +1,14 @@
+package com.jiayue.ipfcst.common.data.repository;
+
+import com.jiayue.ipfcst.common.data.entity.ElectricField;
+
+/**
+ * 场站信息仓储
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/8/5 9:15
+ */
+public interface ElectricFieldRepository extends BaseRepository<ElectricField, String> {
+	ElectricField findByStationCodeIsNotNull();
+}

+ 53 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/ForecastPowerShortTermHisRepository.java

@@ -0,0 +1,53 @@
+package com.jiayue.ipfcst.common.data.repository;
+
+import com.jiayue.ipfcst.common.data.entity.ForecastPowerShortTermHis;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.List;
+
+/**
+ * 上报短期预测功率仓储
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/8/2 10:57
+ */
+public interface ForecastPowerShortTermHisRepository extends BaseRepository<ForecastPowerShortTermHis, Integer> {
+	/**
+	 * 根据时间段删除当日凌晨零点以后生成的短期历史期数据
+	 *
+	 * @param startTime 开始时间
+	 * @param endTime   结束时间
+	 */
+	@Modifying
+	@Query(value = "delete from ForecastPowerShortTermHis t where t.genDate >= CURRENT_DATE and t.forecastTime >=?1 and t.forecastTime<=?2 and t.stationCode=?3")
+	void deleteToday(Long startTime, Long endTime,String stationCode);
+
+	/**
+	 * 根据提前多久,开始结束时间查询历史短期 yh
+	 *
+	 * @param startTime 开始时间
+	 * @param endTime   结束时间
+	 * @param ago       提前多久预测
+	 * @return 结果集
+	 */
+	List<ForecastPowerShortTermHis> findByForecastTimeBetweenAndForecastHowLongAgo(Long startTime, Long endTime, Integer ago);
+
+	/**
+	 * 根据提前多久,时间查询历史短期 yh
+	 *
+	 * @param queryTime 时间
+	 * @param ago       提前多久预测
+	 * @return 结果集
+	 */
+	ForecastPowerShortTermHis findByForecastTimeAndForecastHowLongAgo(Long queryTime, Integer ago);
+
+	/**
+	 * 根据时间段删除和提前多久预测删除短期数据
+	 *
+	 * @param startTime 开始时间
+	 * @param endTime   结束时间
+	 */
+	void deleteByForecastTimeBetweenAndForecastHowLongAgo(Long startTime, Long endTime,int HowLongAgo);
+}

+ 35 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/ForecastPowerShortTermRepository.java

@@ -0,0 +1,35 @@
+package com.jiayue.ipfcst.common.data.repository;
+
+
+import com.jiayue.ipfcst.common.data.entity.ForecastPowerShortTerm;
+
+import java.util.List;
+
+/**
+ * 实时短期预测功率仓储
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/8/2 10:57
+ */
+public interface ForecastPowerShortTermRepository extends BaseRepository<ForecastPowerShortTerm, Integer> {
+
+
+	/**
+	 * 按时间段删除数据
+	 *
+	 * @param startTime
+	 * @param endTime
+	 */
+	void deleteByForecastTimeBetweenAndStationCode(Long startTime, Long endTime,String stationCode);
+
+	/**
+	 * 按时间段查询数据
+	 *
+	 * @param startTime
+	 * @param endTime
+	 */
+	List<ForecastPowerShortTerm> findByForecastTimeBetweenAndStationCode(Long startTime, Long endTime,String stationCode);
+
+
+}

+ 31 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/OverhaulPlanRepository.java

@@ -0,0 +1,31 @@
+package com.jiayue.ipfcst.common.data.repository;
+
+import com.jiayue.ipfcst.common.data.entity.OverhaulPlan;
+
+import java.util.List;
+
+/**
+ * 检修计划
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/9/26 11:44
+ */
+public interface OverhaulPlanRepository extends BaseRepository<OverhaulPlan, Integer> {
+	/**
+	 * 查询检修记录
+	 *
+	 * @param stTime 开始时间
+	 * @param eTime  结束时间
+	 * @return 检修记录
+	 */
+	List<OverhaulPlan> findByEndTimeGreaterThanEqualAndStartTimeLessThanEqual(Long stTime, Long eTime);
+	List<OverhaulPlan> findByEndTimeGreaterThanEqualAndStartTimeLessThanEqualAndStatusAndStationCode(Long stTime, Long eTime,Integer status,String stationCode);
+	List<OverhaulPlan> findByStartTimeLessThanAndEndTimeGreaterThanAndStatus(Long startTime,Long endTime,Integer status);
+
+	List<OverhaulPlan> findByEndTimeAfterAndStatus(Long time,Integer status);
+
+	List<OverhaulPlan> findByBackupAIsNull();
+
+	List<OverhaulPlan> findByBackupAIsNotNull();
+}

+ 20 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/SysParameterRepository.java

@@ -0,0 +1,20 @@
+package com.jiayue.ipfcst.common.data.repository;
+
+import com.jiayue.ipfcst.common.data.entity.SysParameter;
+
+import java.util.Optional;
+
+/**
+ * 系统参数仓储
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/8/5 16:00
+ */
+public interface SysParameterRepository extends BaseRepository<SysParameter, Integer> {
+	Optional<SysParameter> findBySysKeyAndStationCode(String sysKey,String stationCode);
+
+	Boolean existsBySysKey(String sysKey);
+
+	SysParameter findBySysKeyEquals(String sysKey);
+}

+ 343 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/service/BaseService.java

@@ -0,0 +1,343 @@
+package com.jiayue.ipfcst.common.data.service;
+
+import cn.hutool.core.date.DateUtil;
+import com.jiayue.ipfcst.common.core.exception.BusinessException;
+import com.jiayue.ipfcst.common.core.util.NumberUtils;
+import com.jiayue.ipfcst.common.data.entity.ElectricField;
+import com.jiayue.ipfcst.common.data.entity.OverhaulPlan;
+import com.jiayue.ipfcst.common.data.entity.SysParameter;
+import com.jiayue.ipfcst.common.data.job.BaseJob;
+import com.jiayue.ipfcst.common.data.repository.ElectricFieldRepository;
+import com.jiayue.ipfcst.common.data.repository.OverhaulPlanRepository;
+import com.jiayue.ipfcst.common.data.repository.SysParameterRepository;
+import com.sun.istack.internal.NotNull;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
+import org.springframework.scheduling.quartz.JobDetailFactoryBean;
+import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.util.*;
+
+/**
+ * 业务基础类
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/8/5 16:02
+ */
+@Service
+@Slf4j
+public class BaseService {
+
+	private SysParameterRepository sysParameterRepository;
+
+	private ElectricFieldRepository electricFieldRepository;
+
+	private OverhaulPlanRepository overhaulPlanRepository;
+
+	private Scheduler scheduler;
+
+	@Autowired
+	public void setOverhaulPlanRepository(OverhaulPlanRepository overhaulPlanRepository) {
+		this.overhaulPlanRepository = overhaulPlanRepository;
+	}
+
+	@Autowired
+	public void setElectricFieldRepository(ElectricFieldRepository electricFieldRepository) {
+		this.electricFieldRepository = electricFieldRepository;
+	}
+
+	@Autowired
+	public void setSysParameterRepository(SysParameterRepository sysParameterRepository) {
+		this.sysParameterRepository = sysParameterRepository;
+	}
+
+	@Autowired
+	public void setScheduler(Scheduler scheduler) {
+		this.scheduler = scheduler;
+	}
+
+	/**
+	 * 获取系统参数
+	 * bzy 2020.04.13修改添加参数defaultValue,查询不到返回默认值。
+	 *
+	 * @param key 参数标识
+	 * @return 参数值
+	 */
+	@Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
+	public String getSysParameter(String key,
+	                              String defaultValue,String stationCode) {
+		Optional<SysParameter> optional = sysParameterRepository.findBySysKeyAndStationCode(key,stationCode);
+		return optional.map(SysParameter::getSysValue).orElse(defaultValue);
+	}
+
+	/**
+	 * 查询场站信息
+	 *
+	 * @return 场站信息
+	 */
+	@Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
+	public ElectricField getSingleStation(String stationCode) throws BusinessException {
+		Optional<ElectricField> electricFieldOptional = Optional.ofNullable(this.electricFieldRepository.getOne(stationCode));
+		if (electricFieldOptional.isPresent()) {
+			return electricFieldOptional.get();
+		} else {
+			log.error("场站信息未维护!!!");
+			throw new BusinessException("场站信息未维护!!!");
+		}
+	}
+
+	/**
+	 * 查询开机容量
+	 *
+	 * @param startTime 开始时间
+	 * @param endTime   结束时间
+	 * @return 开始时间-结束时间段内,以开始时间作为第一个时刻标记时间,15分为一个时刻长度,返回开机容量Map集合 key为对应时刻标记时间
+	 */
+	public Map<Long, BigDecimal> queryOpenCapacity(Long startTime, Long endTime, BigDecimal capacity,String stationCode) throws BusinessException {
+		// 查询检修计划
+		List<OverhaulPlan> overhaulPlans = this.overhaulPlanRepository.findByEndTimeGreaterThanEqualAndStartTimeLessThanEqualAndStatusAndStationCode(startTime, endTime,1,stationCode);
+
+		Map<Long, BigDecimal> resultMap = new HashMap<>();
+		BigDecimal openCapacity;
+		Date tempTime = new Date(startTime);
+		while (!tempTime.after(new Date(endTime))) {
+			resultMap.put(tempTime.getTime(), capacity);
+			for (OverhaulPlan overhaulPlan : overhaulPlans) {
+				// 当查询时间在检修时间范围内,修正开机容量
+				Date oStartTime = new Date(overhaulPlan.getStartTime());
+				Date oEndTime1 = new Date(overhaulPlan.getEndTime());
+				if (!tempTime.before(oStartTime) && !tempTime.after(oEndTime1)) {
+					openCapacity = NumberUtils.subtract(capacity, overhaulPlan.getOverhaulCapactity(), 2);
+					// 当同一时间段有多条检修纪录时,取检修容量最大值也就是开机容量最小值
+					if (resultMap.get(tempTime.getTime()).compareTo(openCapacity) > 0) {
+						resultMap.put(tempTime.getTime(), openCapacity);
+					}
+				}
+			}
+			tempTime = DateUtil.offsetMinute(tempTime, 15);
+		}
+		return resultMap;
+	}
+
+	/**
+	 * 创建或更新定时任务
+	 *
+	 * @param t                    定时任务执行类
+	 * @param jobCode              任务标识(每个人任务标识为一)
+	 * @param jobRunStartTime      任务执行开始时间,单位:毫秒
+	 * @param jobRunRepeatInterval 任务重复执行间隔时间,单位:毫秒
+	 * @param paramMap             任务参数
+	 * @param <T>                  定时任务执行类必须继承BaseJob
+	 * @throws SchedulerException 任务创建或更新异常
+	 * @throws ParseException     cron表达式异常
+	 */
+	public <T extends BaseJob> void scheduleJob(@NotNull Class<T> t, @NotNull final String jobCode,
+												@NotNull final Long jobRunStartTime, @NotNull final Long jobRunRepeatInterval,
+												final Map<String, Object> paramMap) throws SchedulerException, ParseException {
+		// 获取触发器
+		SimpleTrigger simpleTrigger = this.getSimpleTrigger(jobCode, jobRunStartTime, jobRunRepeatInterval, paramMap);
+		// 安排任务
+		this.scheduleJob(t, simpleTrigger, jobCode);
+		this.resumeJob(jobCode);// 启动任务
+	}
+
+	/**
+	 * 创建或更新定时任务
+	 *
+	 * @param t               定时任务执行类
+	 * @param jobCode         任务标识(每个人任务标识为一)
+	 * @param jobRunStartTime 任务执行开始时间,单位:毫秒
+	 * @param cronExpression  任务执行策略
+	 * @param paramMap        任务参数
+	 * @param <T>             定时任务执行类必须继承BaseJob
+	 * @throws SchedulerException 任务创建或更新异常
+	 * @throws ParseException     cron表达式异常
+	 */
+	public <T extends BaseJob> void scheduleJob(@NotNull Class<T> t, @NotNull final String jobCode,
+	                                            @NotNull final Long jobRunStartTime, @NotNull final String cronExpression, final Map<String, Object> paramMap)
+			throws SchedulerException, ParseException {
+		// 获取触发器
+		CronTrigger cronTrigger = this.getCronTrigger(jobCode, jobRunStartTime, cronExpression, paramMap);
+		// 安排任务
+		this.scheduleJob(t, cronTrigger, jobCode);
+		this.resumeJob(jobCode);// 启动任务
+	}
+
+	/**
+	 * 安排定时任务
+	 *
+	 * @param t       定时任务执行类
+	 * @param e       定时器
+	 * @param jobCode 任务标识
+	 * @param <T>     定时器实现类
+	 * @param <E>     触发器实现类
+	 * @throws SchedulerException 安排定时任务异常
+	 * @throws ParseException     cron表达式异常
+	 */
+	public <T extends BaseJob, E extends Trigger> void scheduleJob(@NotNull Class<T> t, @NonNull E e,
+                                                                 @NotNull final String jobCode) throws SchedulerException, ParseException {
+		// 如果触发器已存在,则重新安排该任务,否则将创建新的任务安排
+		if (scheduler.checkExists(e.getKey())) {
+			scheduler.rescheduleJob(e.getKey(), e);
+		} else {
+			JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();
+			jobDetailFactoryBean.setJobClass(t);
+			jobDetailFactoryBean.setName(jobCode);
+			jobDetailFactoryBean.afterPropertiesSet();
+			JobDetail jobDetail = jobDetailFactoryBean.getObject();
+			scheduler.scheduleJob(jobDetail, e);
+		}
+	}
+
+	/**
+	 * 删除任务
+	 *
+	 * @param jobCode 任务标识
+	 * @throws SchedulerException 任务删除异常
+	 */
+	public void deleteJob(@NotNull final String jobCode) throws SchedulerException {
+		JobKey jobKey = JobKey.jobKey(jobCode);
+		// 如果任务存在,则删除
+		if (scheduler.checkExists(jobKey))
+			scheduler.deleteJob(jobKey);
+	}
+
+	/**
+	 * 暂停任务
+	 *
+	 * @param jobCode 任务标识
+	 * @throws SchedulerException 任务暂停异常
+	 */
+	public void pauseJob(@NotNull final String jobCode) throws SchedulerException {
+		TriggerKey triggerKey = TriggerKey.triggerKey(jobCode);
+		if (scheduler.checkExists(triggerKey))
+			scheduler.pauseTrigger(triggerKey);
+	}
+
+	/**
+	 * 重启任务
+	 *
+	 * @param jobCode 任务标识
+	 * @throws SchedulerException 任务重启异常
+	 */
+	public void resumeJob(@NotNull final String jobCode) throws SchedulerException {
+		TriggerKey triggerKey = TriggerKey.triggerKey(jobCode);
+		if (scheduler.checkExists(triggerKey))
+			scheduler.resumeTrigger(triggerKey);
+	}
+
+	/**
+	 * 获取触发器
+	 *
+	 * @param jobCode              触发器标识
+	 * @param jobRunStartTime      开始执行时间, 单位:毫秒
+	 * @param jobRunRepeatInterval 重复执行间隔, 单位:毫秒
+	 * @param paramMap             触发器参数
+	 * @return 触发器
+	 * @throws SchedulerException 获取触发器异常
+	 */
+	private SimpleTrigger getSimpleTrigger(@NotNull final String jobCode, @NotNull final Long jobRunStartTime,
+	                                       @NotNull final Long jobRunRepeatInterval, final Map<String, Object> paramMap) throws SchedulerException {
+		SimpleTriggerFactoryBean simpleTriggerFactoryBean = new SimpleTriggerFactoryBean();
+		if (paramMap != null)
+			simpleTriggerFactoryBean.setJobDataAsMap(paramMap);// 设置任务执行参数
+		simpleTriggerFactoryBean.setStartTime(new Date(jobRunStartTime));// 开始执行时间
+		simpleTriggerFactoryBean.setRepeatInterval(jobRunRepeatInterval);//重复执行间隔时间 单位毫秒
+		simpleTriggerFactoryBean.setName(jobCode);
+		simpleTriggerFactoryBean.setMisfireInstruction(
+				SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT);// 定时任务失火后,将忽略未执行任务,继续下一次任务
+		simpleTriggerFactoryBean.afterPropertiesSet();
+		return simpleTriggerFactoryBean.getObject();
+	}
+
+	/**
+	 * 获取触发器
+	 *
+	 * @param jobCode         触发器标识
+	 * @param jobRunStartTime 开始执行时间,单位:毫秒
+	 * @param cronExpression  执行策略表达式
+	 * @param paramMap        触发器参数
+	 * @return 触发器
+	 * @throws SchedulerException 获取触发器异常
+	 * @throws ParseException     执行策略表达式异常
+	 */
+	private CronTrigger getCronTrigger(@NotNull final String jobCode, @NotNull final Long jobRunStartTime,
+	                                   @NotNull final String cronExpression, final Map<String, Object> paramMap)
+			throws SchedulerException, ParseException {
+		CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();
+		if (paramMap != null)
+			cronTriggerFactoryBean.setJobDataAsMap(paramMap);// 设置任务执行参数
+		cronTriggerFactoryBean.setStartTime(new Date(jobRunStartTime));// 开始执行时间
+		cronTriggerFactoryBean.setCronExpression(cronExpression);// 执行策略
+		cronTriggerFactoryBean.setName(jobCode);
+		cronTriggerFactoryBean
+				.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);// 定时任务失火后,目前不执行,然后就按照正常的计划执行。
+		cronTriggerFactoryBean.afterPropertiesSet();
+		return cronTriggerFactoryBean.getObject();
+	}
+
+	/**
+	 * 获取任务最后执行时间
+	 *
+	 * @param jobCode 任务标识
+	 * @return 任务最后执行时间
+	 * @throws SchedulerException 获取任务最后执行时间异常
+	 */
+	public Date getJobPreviousFireTime(@NotNull final String jobCode) throws SchedulerException {
+		TriggerKey triggerKey = new TriggerKey(jobCode);
+		Trigger trigger = this.scheduler.getTrigger(triggerKey);
+		if (trigger == null)
+			throw new SchedulerException(jobCode + "任务不存在!");
+		return trigger.getPreviousFireTime();
+	}
+
+	/**
+	 * 获取任务下次执行时间
+	 *
+	 * @param jobCode 任务标识
+	 * @return 任务下次执行时间
+	 * @throws SchedulerException 获取任务下次执行时间异常
+	 */
+	Date getJobNextFireTime(@NotNull final String jobCode) throws SchedulerException {
+		TriggerKey triggerKey = new TriggerKey(jobCode);
+		Trigger trigger = this.scheduler.getTrigger(triggerKey);
+		if (trigger == null)
+			throw new SchedulerException(jobCode + "任务不存在!");
+		return trigger.getNextFireTime();
+	}
+
+	/**
+	 * 获取任务状态
+	 *
+	 * @param jobCode 任务标识
+	 * @return 任务状态,中文描述
+	 * @throws SchedulerException 获取任务状态异常
+	 */
+	public String getJobStatus(@NotNull final String jobCode) throws SchedulerException {
+		TriggerKey triggerKey = new TriggerKey(jobCode);
+		String triggerStateName = this.scheduler.getTriggerState(triggerKey).name();
+		if ("NONE".equals(triggerStateName)) {// 不存在
+			return "不存在";
+		} else if ("NORMAL".equals(triggerStateName)) {// 正常
+			return "正常";
+		} else if ("PAUSED".equals(triggerStateName)) {// 暂停
+			return "暂停";
+		} else if ("COMPLETE".equals(triggerStateName)) {// 完成
+			return "完成";
+		} else if ("ERROR".equals(triggerStateName)) {// 错误
+			return "错误";
+		} else if ("BLOCKED".equals(triggerStateName)) {// 阻塞
+			return "阻塞";
+		}
+		return triggerStateName;
+	}
+}

+ 74 - 0
ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/ElectricFieldService.java

@@ -0,0 +1,74 @@
+package com.jiayue.ipfcst.console.service;
+
+import com.jiayue.ipfcst.common.core.exception.BusinessException;
+import com.jiayue.ipfcst.common.data.constant.enums.ElectricFieldStatrsEnum;
+import com.jiayue.ipfcst.common.data.entity.ElectricField;
+import com.jiayue.ipfcst.common.data.repository.ElectricFieldRepository;
+import com.jiayue.ipfcst.common.data.service.BaseService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.ehcache.EhCacheCacheManager;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 场站信息业务层
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/8/7 9:53
+ */
+@Service
+@Slf4j
+public class ElectricFieldService extends BaseService {
+  @Autowired
+  EhCacheCacheManager ehCacheCacheManager;
+
+  private final ElectricFieldRepository electricFieldRepository;
+
+  @Autowired
+  public ElectricFieldService(ElectricFieldRepository electricFieldRepository) {
+    this.electricFieldRepository = electricFieldRepository;
+  }
+
+  /**
+   * 修改场站信息
+   *
+   * @param electricField 场站信息
+   */
+  @Transactional(propagation = Propagation.SUPPORTS)
+  public void update(ElectricField electricField) {
+    delete(electricField.getStationCode());
+    this.electricFieldRepository.save(electricField);
+  }
+
+  /**
+   * 保存场站信息
+   *
+   * @param electricField 场站信息
+   */
+  @Transactional(propagation = Propagation.SUPPORTS)
+  public void add(ElectricField electricField) {
+    electricField.setStationStatusEnum(ElectricFieldStatrsEnum.E1);
+    this.electricFieldRepository.save(electricField);
+  }
+
+  /**
+   * 删除场站信息
+   */
+  @Transactional(propagation = Propagation.SUPPORTS)
+  public void delete(String stationCode){
+    electricFieldRepository.deleteById(stationCode);
+  }
+
+  public ElectricField getSingleStation(String stationCode){
+    ElectricField electricField = null;
+    try {
+      electricField = super.getSingleStation(stationCode);
+    } catch (BusinessException e) {
+      log.info("查找场站信息出错");
+    }
+    return electricField;
+  }
+}

+ 221 - 0
ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/ForecastPowerShortTermService.java

@@ -0,0 +1,221 @@
+package com.jiayue.ipfcst.console.service;
+
+import com.jiayue.ipfcst.common.core.exception.BusinessException;
+import com.jiayue.ipfcst.common.core.util.CommonUtil;
+import com.jiayue.ipfcst.common.core.util.DateMomentUtil;
+import com.jiayue.ipfcst.common.core.util.DateTimeUtil;
+import com.jiayue.ipfcst.common.core.util.NumberUtils;
+import com.jiayue.ipfcst.common.data.constant.enums.ElectricFieldTypeEnum;
+import com.jiayue.ipfcst.common.data.constant.enums.PredictionModelEnum;
+import com.jiayue.ipfcst.common.data.entity.ElectricField;
+import com.jiayue.ipfcst.common.data.entity.ForecastPowerShortTerm;
+import com.jiayue.ipfcst.common.data.entity.ForecastPowerShortTermHis;
+import com.jiayue.ipfcst.common.data.repository.ForecastPowerShortTermHisRepository;
+import com.jiayue.ipfcst.common.data.repository.ForecastPowerShortTermRepository;
+import com.jiayue.ipfcst.common.data.service.BaseService;
+import com.jiayue.ipfcst.console.util.Constant;
+import com.sun.istack.internal.NotNull;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.time.DateFormatUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+public class ForecastPowerShortTermService extends BaseService {
+
+  @Autowired
+  ForecastPowerShortTermRepository forecastPowerShortTermRepository;
+  @Autowired
+  ForecastPowerShortTermHisRepository forecastPowerShortTermHisRepository;
+  @Autowired
+  ElectricFieldService electricFieldService;
+
+  /**
+   * 按场站编号和时间段删除数据,再保存新数据
+   *
+   * @param startTime
+   * @param endTime
+   * @param listDq
+   */
+  @Transactional(propagation = Propagation.REQUIRED)
+  public void deleteBetweenAndGenTime(Long startTime, Long endTime, List<ForecastPowerShortTerm> listDq,String stationCode) {
+    forecastPowerShortTermRepository.deleteByForecastTimeBetweenAndStationCode(startTime, endTime,stationCode);
+    //保存短期数据
+    forecastPowerShortTermRepository.saveAll(listDq);
+  }
+
+  /**
+   * 获取短期预测功率,当数据库中短期预测记录不足查询所需时,进行本地化计算, 用于上报专用
+   *
+   * @param startTime 开始时间
+   * @param endTime   结束时间
+   * @return 预测功率结果集
+   */
+  @SuppressWarnings("WeakerAccess")
+  @Transactional(propagation = Propagation.REQUIRED)
+  public List<ForecastPowerShortTermHis> getForecastPowerShortTerm(@NotNull final Long startTime,
+                                                                   @NotNull final Long endTime, @NotNull final String stationCode) {
+    log.info(stationCode+"开始获取短期预测功率" + DateFormatUtils.format(startTime, "yyyy-MM-dd HH:mm:ss") + " 至 " + DateFormatUtils.format(endTime, "yyyy-MM-dd HH:mm:ss"));
+    // 查询场站信息
+    ElectricField electricFieldInfo = electricFieldService.getSingleStation(stationCode);
+    // 查询预测时间点对应的开机容量
+    Map<Long, BigDecimal> openCapacityMap = null;
+    try {
+      openCapacityMap = super.queryOpenCapacity(startTime, endTime, electricFieldInfo.getCapacity(),stationCode);
+    } catch (BusinessException e) {
+      log.error(stationCode+"预测数据生成获取开机容量出错:" + CommonUtil.printStackTraceToString(e));
+    }
+    // 查询短期预测功率
+    List<ForecastPowerShortTerm> forecastPowerShortTerms =
+      this.forecastPowerShortTermRepository.findByForecastTimeBetweenAndStationCode(startTime, endTime,stationCode);
+    forecastPowerShortTerms.sort(Comparator.comparing(ForecastPowerShortTerm::getForecastTime));
+    log.info(stationCode+"查询现有短期预测记录数:" + forecastPowerShortTerms.size());
+    // 判断查询结果是否满足查询所需
+    Long momentTime = 15 * 60 * 1000L; // 15分钟一个时刻
+    Integer moments = Math.toIntExact((endTime - startTime) / momentTime + 1);
+    log.info(stationCode+"获取所需记录数:" + moments);
+    if (moments > forecastPowerShortTerms.size()) {
+      Map<Long, List<ForecastPowerShortTerm>> forecastPowerShortTermsMap =
+        forecastPowerShortTerms.stream().collect(Collectors.groupingBy(ForecastPowerShortTerm::getForecastTime));
+      // 如果查询结果少于所需预测数,则进行本地化计算,补齐预测记录
+      List<ForecastPowerShortTerm> addForecastPowerShortTermList = new ArrayList<>();
+      for (Long tempTime = startTime; tempTime <= endTime; tempTime = tempTime + momentTime) {
+        if (forecastPowerShortTermsMap.get(tempTime) == null) {
+          // 缺失时间点
+          ForecastPowerShortTerm _forecastPowerShortTerms = this.generateForecastPowerShortTerm(tempTime,
+            electricFieldInfo, openCapacityMap.get(tempTime));
+          addForecastPowerShortTermList.add(_forecastPowerShortTerms);
+        }
+      }
+
+      if (!addForecastPowerShortTermList.isEmpty()) {
+        // 保存短期预测
+        this.forecastPowerShortTermRepository.saveAll(addForecastPowerShortTermList);
+        // 将补齐的预测功率追加到查询预测功率结果集中
+        forecastPowerShortTerms.addAll(addForecastPowerShortTermList);
+      }
+    }
+    forecastPowerShortTerms.sort(Comparator.comparing(ForecastPowerShortTerm::getForecastTime));
+
+    // 处理短期历史记录
+    List<ForecastPowerShortTermHis> forecastPowerShortTermHiss = new ArrayList<>();
+    ForecastPowerShortTermHis forecastPowerShortTermHis;
+    Long systemTime = System.currentTimeMillis();
+
+    //获取数据下限参数
+    String lowerPredictionLimit = super.getSysParameter("LowerPredictionLimit", "0",stationCode);
+    BigDecimal lpl = new BigDecimal(lowerPredictionLimit);
+    for (ForecastPowerShortTerm _forecastPowerShortTerm : forecastPowerShortTerms) {
+      forecastPowerShortTermHis = new ForecastPowerShortTermHis();
+      forecastPowerShortTermHis.setForecastTime(_forecastPowerShortTerm.getForecastTime());
+      forecastPowerShortTermHis.setTheoryValue(_forecastPowerShortTerm.getFpValue());
+      forecastPowerShortTermHis.setCapacity(electricFieldInfo.getCapacity());
+      // 预测可用功率=预测*(开机容量/装机容量)
+      BigDecimal ableValue =
+        _forecastPowerShortTerm.getFpValue().multiply(openCapacityMap.get(_forecastPowerShortTerm.getForecastTime()))
+          .divide(electricFieldInfo.getCapacity(), 2, BigDecimal.ROUND_HALF_UP);
+
+      forecastPowerShortTermHis.setAbleValue(ableValue.compareTo(lpl) == -1?lpl:ableValue);
+      forecastPowerShortTermHis.setPredictionModelEnum(_forecastPowerShortTerm.getPredictionModelEnum());
+      forecastPowerShortTermHis.setGenDate(new Date());
+      forecastPowerShortTermHis.setSuCapacity(openCapacityMap.get(_forecastPowerShortTerm.getForecastTime()));
+      // 设置提前几天预测
+      forecastPowerShortTermHis.setForecastHowLongAgo(DateMomentUtil.getDaysBetweenTwoDate(systemTime,
+        forecastPowerShortTermHis.getForecastTime()));
+      forecastPowerShortTermHis.setStationCode(_forecastPowerShortTerm.getStationCode());
+      forecastPowerShortTermHiss.add(forecastPowerShortTermHis);
+    }
+
+
+    // 按预测时间升序
+    forecastPowerShortTermHiss.sort(Comparator.comparing(ForecastPowerShortTermHis::getForecastTime));
+    // 删除当日生成的短期历史记录
+    this.forecastPowerShortTermHisRepository.deleteToday(forecastPowerShortTermHiss.get(0).getForecastTime(),
+      forecastPowerShortTermHiss.get(forecastPowerShortTermHiss.size() - 1).getForecastTime(),stationCode);
+    // 保存短期历史记录
+    this.forecastPowerShortTermHisRepository.saveAll(forecastPowerShortTermHiss);
+    return forecastPowerShortTermHiss;
+  }
+
+  /**
+   * 补数生成单点短期预测功率
+   *
+   * @param tempTime 预测时间
+   * @return 预测功率
+   */
+  @Transactional(propagation = Propagation.REQUIRED)
+  public ForecastPowerShortTerm generateForecastPowerShortTerm(@NotNull final Long tempTime,
+                                                               ElectricField electricFieldInfo,
+                                                               BigDecimal openCapacity) {
+    ForecastPowerShortTerm forecastPowerShortTerms;
+    // 根据场站类型调用不同的短期预测模型
+    if (ElectricFieldTypeEnum.E2.equals(electricFieldInfo.getElectricFieldTypeEnum())) {
+      // 风预测
+      forecastPowerShortTerms = this.generateWindPowerShortTerm(tempTime, openCapacity,electricFieldInfo.getStationCode());
+    } else {
+      // 光预测
+      forecastPowerShortTerms = this.generateSolarPowerShortTerm(tempTime, openCapacity, electricFieldInfo);
+    }
+    return forecastPowerShortTerms;
+  }
+
+  /**
+   * 光短期功率预测
+   *
+   * @param tempTime 预测时间
+   * @return 短期预测功率
+   */
+  @Transactional(propagation = Propagation.REQUIRED)
+  public ForecastPowerShortTerm generateSolarPowerShortTerm(@NotNull final Long tempTime, BigDecimal openCapacity,
+                                                            ElectricField electricFieldInfo) {
+    System.out.println("光补数");
+    ForecastPowerShortTerm forecastPowerShortTerm = new ForecastPowerShortTerm();
+    forecastPowerShortTerm.setForecastTime(tempTime);
+    BigDecimal tempValue;
+    BigDecimal randomValue = new BigDecimal(CommonUtil.getRandom(97, 99) / 100.0);
+    if (DateTimeUtil.checkInSunriseAndSunset(tempTime, electricFieldInfo.getLongitude().doubleValue(),
+      electricFieldInfo.getLatitude().doubleValue())) {
+      // 2021-4-22 xsl修改补数取固定系数
+      String a = Constant.forecastCoe(tempTime,electricFieldInfo.getElectricFieldTypeEnum());
+      tempValue = new BigDecimal(a);
+    } else {
+      // 日升日落
+      tempValue = BigDecimal.ZERO;
+    }
+
+    forecastPowerShortTerm.setFpValue(NumberUtils.multiply(tempValue, openCapacity).multiply(randomValue).setScale(2, BigDecimal.ROUND_HALF_UP));
+    forecastPowerShortTerm.setGenDate(new Date());
+    forecastPowerShortTerm.setPredictionModelEnum(PredictionModelEnum.E4);
+    forecastPowerShortTerm.setStationCode(electricFieldInfo.getStationCode());
+    return forecastPowerShortTerm;
+  }
+
+
+  /**
+   * 风短期功率预测
+   *
+   * @param tempTime 预测时间
+   * @return 短期预测功率
+   */
+  @Transactional(propagation = Propagation.REQUIRED)
+  public ForecastPowerShortTerm generateWindPowerShortTerm(@NotNull final Long tempTime, BigDecimal openCapacity,String stationCode) {
+    System.out.println("风补数");
+    ForecastPowerShortTerm forecastPowerShortTerm = new ForecastPowerShortTerm();
+    forecastPowerShortTerm.setForecastTime(tempTime);
+    BigDecimal randomValue = new BigDecimal(CommonUtil.getRandom(97, 99) / 100.0d);
+    // 2021-4-22 xsl修改补数取固定系数
+    BigDecimal tempValue = new BigDecimal(Constant.forecastCoe(tempTime,ElectricFieldTypeEnum.E2));
+    forecastPowerShortTerm.setFpValue(NumberUtils.multiply(tempValue, openCapacity).multiply(randomValue).setScale(2, BigDecimal.ROUND_HALF_UP));
+    forecastPowerShortTerm.setGenDate(new Date());
+    forecastPowerShortTerm.setPredictionModelEnum(PredictionModelEnum.E4);
+    forecastPowerShortTerm.setStationCode(stationCode);
+    return forecastPowerShortTerm;
+  }
+}

+ 38 - 0
ipfcst-console/src/main/java/com/jiayue/ipfcst/console/util/Constant.java

@@ -0,0 +1,38 @@
+package com.jiayue.ipfcst.console.util;
+
+import com.jiayue.ipfcst.common.core.util.DateMomentUtil;
+import com.jiayue.ipfcst.common.data.constant.enums.ElectricFieldTypeEnum;
+import java.util.Arrays;
+import java.util.List;
+
+
+/**
+ * 常量类
+ *
+ * @author bizy
+ * @version 3.0
+ */
+public class Constant {
+  /*风预测系数*/
+  public static List<String> windCoeList = Arrays.asList("0.3358", "0.335", "0.3352", "0.3366", "0.339", "0.342", "0.3456", "0.35", "0.3554", "0.3614", "0.3664", "0.3706", "0.3738", "0.3766", "0.3792", "0.3814", "0.3836", "0.3852", "0.3868", "0.388", "0.3892", "0.3894", "0.389", "0.3878", "0.3854", "0.381", "0.375", "0.3674", "0.358", "0.347", "0.334", "0.3186", "0.301", "0.2826", "0.2646", "0.2468", "0.229", "0.212", "0.1954", "0.1794", "0.1638", "0.1488", "0.1344", "0.1204", "0.107", "0.094", "0.0816", "0.0702", "0.0596", "0.0498", "0.041", "0.033", "0.0256", "0.0194", "0.0142", "0.0104", "0.0078", "0.0058", "0.0042", "0.0032", "0.0022", "0.0016", "0.0014", "0.0014", "0.0014", "0.0014", "0.0014", "0.0014", "0.0014", "0.0014", "0.0014", "0.0014", "0.0016", "0.0016", "0.0016", "0.0016", "0.0016", "0.0016", "0.0014", "0.0014", "0.0014", "0.0014", "0.0014", "0.0014", "0.0018", "0.0024", "0.0032", "0.0046", "0.0062", "0.0082", "0.011", "0.0144", "0.0188", "0.024", "0.0296", "0.0356");
+  /*光预测系数*/
+  public static List<String> photovoltaicCoeList = Arrays.asList("0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0.0097", "0.0272", "0.0504", "0.0778", "0.1103", "0.1572", "0.2032", "0.2540", "0.3088", "0.3781", "0.4350", "0.4943", "0.5422", "0.5901", "0.6314", "0.6636", "0.6901", "0.6980", "0.7119", "0.7206", "0.7244", "0.7186", "0.7121", "0.7109", "0.6996", "0.6930", "0.6740", "0.6569", "0.6361", "0.6365", "0.6058", "0.5794", "0.5434", "0.5240", "0.4824", "0.4403", "0.3986", "0.3764", "0.3358", "0.2890", "0.2464", "0.2207", "0.1802", "0.1439", "0.1138", "0.0985", "0.0748", "0.0545", "0.0358", "0.0238", "0.0102", "0.0019", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0");
+
+  /**
+   * 获取预测系数
+   *
+   * @param forecastTime          预测时间
+   * @param electricFieldTypeEnum 场站类型
+   * @return
+   */
+  public static String forecastCoe(Long forecastTime, ElectricFieldTypeEnum electricFieldTypeEnum) {
+    int point = DateMomentUtil.getMoment(forecastTime, 15 * 60 * 1000L);
+    String coe = "";
+    if (ElectricFieldTypeEnum.E1.equals(electricFieldTypeEnum)) {
+      coe = photovoltaicCoeList.get(point - 1);
+    } else {
+      coe = windCoeList.get(point - 1);
+    }
+    return coe;
+  }
+}