Browse Source

新增定时任务

xusl 3 năm trước cách đây
mục cha
commit
ddcc2143b4
37 tập tin đã thay đổi với 2268 bổ sung0 xóa
  1. 21 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/AlarmStatusEnum.java
  2. 26 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/AlarmTypeEnum.java
  3. 19 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/ChannelFileRuleEnum.java
  4. 20 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/ChannelStatusEnum.java
  5. 21 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/ComChannelTypeEnum.java
  6. 35 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/DataObjectTypeEnum.java
  7. 28 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/DataSourceEnum.java
  8. 68 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/EquipmentTypeEnum.java
  9. 22 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/FeedbackFileStatusEnum.java
  10. 25 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/FileStatusEnum.java
  11. 163 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/FileTypeEnum.java
  12. 20 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/FtpPassiveModeEnum.java
  13. 36 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/HolidayTypeEnum.java
  14. 22 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/PvRotationModeEnum.java
  15. 20 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/SftpConnectModeEnum.java
  16. 92 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/TunnelStatus.java
  17. 83 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/TunnelType.java
  18. 20 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/UploadFileCharSetEnum.java
  19. 21 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/UploadFileNameLengthEnum.java
  20. 20 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/UploadFileSingleByteEnum.java
  21. 24 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/UploadProtocolEnum.java
  22. 43 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/InitJobClass.java
  23. 116 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/UploadFileLog.java
  24. 20 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/InitJobClassRepository.java
  25. 79 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/UploadFileLogRepository.java
  26. 534 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/service/uploadfilerule/E63UploadFileRuleService.java
  27. 25 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/service/uploadfilerule/IUploadFileRuleService.java
  28. 83 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/service/uploadfilerule/UploadFileRuleCommonService.java
  29. 26 0
      ipfcst-console/src/main/java/com/jiayue/ipfcst/fileupload/job/UploadFileE1Job.java
  30. 26 0
      ipfcst-console/src/main/java/com/jiayue/ipfcst/fileupload/job/UploadFileE26Job.java
  31. 26 0
      ipfcst-console/src/main/java/com/jiayue/ipfcst/fileupload/job/UploadFileE27Job.java
  32. 26 0
      ipfcst-console/src/main/java/com/jiayue/ipfcst/fileupload/job/UploadFileE2Job.java
  33. 26 0
      ipfcst-console/src/main/java/com/jiayue/ipfcst/fileupload/job/UploadFileE3Job.java
  34. 26 0
      ipfcst-console/src/main/java/com/jiayue/ipfcst/fileupload/job/UploadFileE7Job.java
  35. 26 0
      ipfcst-console/src/main/java/com/jiayue/ipfcst/fileupload/job/UploadFileE9Job.java
  36. 231 0
      ipfcst-console/src/main/java/com/jiayue/ipfcst/fileupload/service/BaseUploadFileService.java
  37. 149 0
      ipfcst-console/src/main/java/com/jiayue/ipfcst/fileupload/service/E63UploadFileService.java

+ 21 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/AlarmStatusEnum.java

@@ -0,0 +1,21 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 告警状态枚举
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/8/6 11:04
+ */
+@Getter
+@AllArgsConstructor
+public enum AlarmStatusEnum {
+	E1(1, "未处理"),
+	E2(2, "已处理");
+
+	private Integer code;
+	private String message;
+}

+ 26 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/AlarmTypeEnum.java

@@ -0,0 +1,26 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 告警类型枚举
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/8/6 11:04
+ */
+@Getter
+@AllArgsConstructor
+public enum AlarmTypeEnum {
+	// 告警类型枚举
+	E1(1, "文件生成"),
+	E2(2, "文件上报"),
+	E3(3, "通信通道"),
+	E4(4, "回传数据"),
+	E5(5, "接收数据"),
+	E6(6, "文件解析");
+
+	private Integer code;
+	private String message;
+}

+ 19 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/ChannelFileRuleEnum.java

@@ -0,0 +1,19 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 通道文件生成规则
+ *
+ * @author xsl
+ * @version 3.0
+ */
+@Getter
+@AllArgsConstructor
+public enum ChannelFileRuleEnum {
+	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/ChannelStatusEnum.java

@@ -0,0 +1,20 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 通道状态枚举类
+ *
+ * @author xsl
+ * @version 3.0
+ * @since 2020/4/15 19:30
+ */
+@Getter
+@AllArgsConstructor
+public enum ChannelStatusEnum {
+	E1(1, "使用"),
+	E2(2, "停用");
+	private Integer code;
+	private String message;
+}

+ 21 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/ComChannelTypeEnum.java

@@ -0,0 +1,21 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 通道类型
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/9/18 10:15
+ */
+@Getter
+@AllArgsConstructor
+public enum ComChannelTypeEnum {
+	E1(1, "数据接入"),
+	E2(2, "数据回传"),
+	E3(3, "文件上报");
+	private Integer code;
+	private String message;
+}

+ 35 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/DataObjectTypeEnum.java

@@ -0,0 +1,35 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 数据对象类型枚举
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/8/19 8:59
+ */
+@Getter
+@AllArgsConstructor
+public enum DataObjectTypeEnum {
+	E1(1, "实际功率"),
+	E2(2, "气象站"),
+	E3(3, "逆变器"),
+	E4(4, "测风塔"),
+	E5(5, "风机"),
+	E6(6, "可用超短期"),
+	E7(7, "可用短期"),
+	E8(8, "理论超短期"),
+	E9(9, "理论短期"),
+	E10(10, "可用功率"),
+	E11(11, "理论功率"),
+	E12(12, "站内受阻功率"),
+	E13(13, "站外受阻功率"),
+	E14(14, "装机容量"),
+	E15(15, "开机容量"),
+	E16(16, "并网设备数"),
+	E17(17, "告警信息");
+	private Integer code;
+	private String message;
+}

+ 28 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/DataSourceEnum.java

@@ -0,0 +1,28 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 接收数据类型
+ * modifying
+ * 20.3.27 修唯   自主生成修改为公式生成   新增 预测数据  类型  细化了数据来源方式
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/8/16 15:01
+ */
+@Getter
+@AllArgsConstructor
+/*@JsonFormat(shape = JsonFormat.Shape.OBJECT)*/
+public enum DataSourceEnum {
+
+	/***
+	 * 数据的集中来源方式
+	 */
+	GATHER(1, "外部接入"),
+	GENERATE(2, "公式生成"),
+	FORECAST(3, "预测生成");
+	private Integer code;
+	private String message;
+}

+ 68 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/EquipmentTypeEnum.java

@@ -0,0 +1,68 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 设备数据对象类型枚举
+ * lastModify
+ * 2020.3.26  修唯   枚举名修改,新增发电站类型,删除各种功率,设备数,开机容量等类型
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/8/19 8:59
+ */
+@Getter
+@AllArgsConstructor
+@JsonFormat(shape = JsonFormat.Shape.OBJECT)
+public enum EquipmentTypeEnum {
+
+	/**
+	 * 场站也视为设备类型的一种
+	 */
+	POWERSTATION(0, "发电站"),
+	WEATHERSTATION(1, "气象站"),
+	INVERTER(2, "逆变器"),
+	WINDTOWER(3, "测风塔"),
+	WINDTURBINE(4, "风机"),
+	FORECASTDATA(5, "预测数据"),
+	BOOSTERSTATION(6,"主升压变"),
+	AGC_AVC(7,"AGC_AVC"),
+	BWD(8,"并网点"),
+	CYB(9,"厂用变"),
+	JDX(10,"集电线"),
+	SYZMX(11,"升压站母线"),
+	WGBC(12,"无功补偿"),
+	DLQ(13,"断路器"),
+	DZ(14,"刀闸"),
+	JDDZ(15,"接地刀闸"),
+	DXFDJ(16,"等效发电机");
+
+	private Integer code;
+	private String message;
+
+
+	public static EquipmentTypeEnum valueOf(Integer code){
+		switch (code){
+			case 0 :return  POWERSTATION;
+			case 1 :return WEATHERSTATION;
+			case 2 :return INVERTER;
+			case 3 :return WINDTOWER;
+			case 4 :return WINDTURBINE;
+			case 5 :return FORECASTDATA;
+			case 6 :return BOOSTERSTATION;
+			case 7 :return AGC_AVC;
+			case 8 :return BWD;
+			case 9 :return CYB;
+			case 10 :return JDX;
+			case 11 :return SYZMX;
+			case 12 :return WGBC;
+			case 13 :return DLQ;
+			case 14 :return DZ;
+			case 15 :return JDDZ;
+			case 16 :return DXFDJ;
+		}
+		return null;
+	}
+}

+ 22 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/FeedbackFileStatusEnum.java

@@ -0,0 +1,22 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 反馈文件状态枚举
+ * @author zy
+ * @version 1.0
+ * @since 2019/8/19 8:59
+ */
+@Getter
+@AllArgsConstructor
+@JsonFormat(shape = JsonFormat.Shape.OBJECT)
+public enum FeedbackFileStatusEnum {
+	E1(1, "获取成功"),
+	E2(0, "获取失败");
+	private Integer code;
+	private String message;
+
+}

+ 25 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/FileStatusEnum.java

@@ -0,0 +1,25 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 文件状态枚举类
+ *
+ * @author xsl
+ * @version 3.0
+ * @since 2020/4/15 19:30
+ */
+@Getter
+@AllArgsConstructor
+public enum FileStatusEnum {
+    E1(1,"文件生成"),
+    E2(2,"上报成功"),
+    E3(3,"上报失败"),
+    E4(4,"文件未生成"),
+    E5(5,"上传D5000成功"),
+    E6(6,"上传D5000失败"),
+    E7(7,"文件过期");
+    private Integer code;
+    private String message;
+}

+ 163 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/FileTypeEnum.java

@@ -0,0 +1,163 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 文件类型枚举类
+ *
+ * @author xsl
+ * @version 2.0
+ * @since 2018/11/16 11:18
+ */
+@Getter
+@AllArgsConstructor
+public enum FileTypeEnum {
+	E1(1,"短期"),
+	E2(2,"超短期"),
+	E3(3,"理论功率"),
+	E4(4,"24NWP"),
+	E5(5,"72NWP"),
+	E6(6,"气象站"),
+	E7(7,"测风塔"),
+	E8(8,"逆变器"),
+	E9(9,"风机信息"),
+	E10(10,"光伏组件信息"),
+	E11(11,"检修计划"),
+	E12(12,"昨日开机容量"),
+	E13(13,"短期发电计划"),
+	E14(14,"超短期发电计划"),
+	E15(15,"日前预测"),
+	E16(16,"日前预测14"),
+	E17(17,"短期168"),
+	E18(18,"限电计划"),
+	E19(19,"弃电计划"),
+	E20(20,"场站信息"),
+	E21(21,"短期_集控"),
+	E22(22,"超短期_集控"),
+	E23(23,"测风塔_集控"),
+	E24(24,"72NWP_集控"),
+	E25(25,"短期_D5000"),
+	// 青海
+	E26(26,"可用短期"),
+	// 青海
+	E27(27,"可用超短期"),
+	// 宁夏
+	E28(28,"理论超短期"),
+	// 以下是青海新增
+	E29(29,"短期预测风速风向"),
+	E30(30,"实测功率"),
+	E31(31,"短期预测辐照度"),
+	E32(32,"短期日志"),
+	E33(33,"超短期日志"),
+	E34(34,"短期可用日志"),
+	E35(35,"超短期可用日志"),
+	E36(36,"气象站日志"),
+	E37(37,"理论功率日志"),
+	E38(38,"逆变器日志"),
+	E39(39,"风机信息日志"),
+	E40(40,"测风塔日志"),
+	E41(41,"指标数据"),
+	//贵州
+	E42(42,"电网上报状态"),
+	E43(43,"预测准确率"),
+	//海南
+	E44(44,"升压变"),
+	//青海
+	E45(45,"超短期预测风速风向"),
+	//广西
+	E46(46,"超短期SFTP"),
+	//青海
+	E47(47,"超短期预测辐照度"),
+	E48(48,"单机"),
+	//广西TODO
+	E49(49,"短期SFTP"),
+	//海南(南方)
+	E50(50,"升压站信息"),
+	E51(51,"AGC_AVC信息"),
+	E52(52,"风电总体信息"),
+	E53(53,"光伏总体信息"),
+	E54(54,"统计信息"),
+	E55(55,"逆变器/汇流箱信息"),
+	E56(56,"海南短期预测"),
+	E57(57,"海南超短期预测"),
+	E58(58,"D5000样板机"),
+	E59(59,"短期02"),
+	E60(60,"离线理论功率"),
+	E61(61,"在线理论功率"),
+	//湖北康桥旧文件和湖北其他站的地调
+	E62(62,"湖北短期"),
+	E63(63,"湖北超短期"),
+	E64(64,"湖北72nwp"),
+	E65(65,"湖北气象站"),
+	E66(66,"湖北测风塔"),
+	E67(67,"湖北单机"),
+	//湖北康桥地调
+	E68(68,"荆门地调短期"),
+	E69(69,"荆门地调超短期"),
+	E70(70,"荆门地调72nwp"),
+	E71(71,"荆门地调气象站"),
+	E72(72,"荆门地调测风塔"),
+	E73(73,"荆门地调单机"),
+	E74(74,"荆门地调风机信息"),
+	E75(75,"荆门地调逆变器"),
+	E76(76,"海南风电机组"),
+	//新疆网调光伏
+	E77(77,"新疆网调逆变器"),
+	E78(78,"新疆网调气象站"),
+	E79(79,"新疆网调超短期"),
+	E80(80,"新疆网调短期"),
+	E81(81,"新疆网调实时量测"),
+	E82(82,"新疆网调集电线"),
+
+	E83(83,"海南压缩包"),
+	E84(84,"湖北逆变器"),
+	E85(85,"青海理论功率(风)"),
+	E86(86,"短期_辽宁龙源集控"),
+	E87(87,"超短期_辽宁龙源集控"),
+	E88(88,"测风塔_辽宁龙源集控"),
+	E89(89,"风机_辽宁龙源集控"),
+	//浙江省调上报文件
+	E90(90,"省调短期"),
+	E91(91,"省调昨日开机容量"),
+
+	E92(92,"湖北逆变器信息"),
+
+	E93(93,"黄冈地调短期"),
+	E94(94,"黄冈地调超短期"),
+	E95(95,"黄冈地调72nwp"),
+	E96(96,"黄冈地调气象站"),
+	E97(97,"黄冈地调测风塔"),
+	E98(98,"黄冈地调风机"),
+	E99(99,"黄冈地调逆变器"),
+
+	E100(100,"随州地调短期"),
+	E101(101,"随州地调超短期"),
+	E102(102,"随州地调72nwp"),
+	E103(103,"随州地调气象站"),
+	E104(104,"随州地调逆变器"),
+
+	E105(105,"广东中调短期WPD"),
+	E106(106,"广东中调超短期WPD"),
+	E107(107,"广东中调气象站WPD"),
+	E108(108,"广东中调逆变器WPD"),
+	E109(109,"广东中调短期dat"),
+	E110(110,"广东中调超短期dat"),
+	E111(111,"广东中调气象站dat"),
+	E112(112,"广东中调逆变器dat"),
+
+	E113(113,"NWP_辽宁龙源集控"),
+
+	E114(114,"蒙东南瑞集控测风塔"),
+	E115(115,"龙源南瑞集控测风塔"),
+	E116(116,"贵州总调短期"),
+
+	E117(117,"贵州总调超短期"),
+
+	E118(118,"贵州总调气象站"),
+	E119(119,"贵州总调逆变器");
+	private Integer code;
+	private String message;
+
+
+}

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

@@ -0,0 +1,20 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * FTP模式
+ *
+ * @author xsl
+ * @version 3.0
+ * @since 2020/4/15 19:30
+ */
+@Getter
+@AllArgsConstructor
+public enum FtpPassiveModeEnum {
+	E1(1, "主动"),
+	E2(2, "被动");
+	private Integer code;
+	private String message;
+}

+ 36 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/HolidayTypeEnum.java

@@ -0,0 +1,36 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 假期类型
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/8/7 15:31
+ */
+@Getter
+@AllArgsConstructor
+public enum HolidayTypeEnum {
+	E1(1, "假期"),
+	E2(2, "特殊工作日");
+	private Integer code;
+	private String message;
+
+	/**
+	 * 根据code获取去value
+	 *
+	 * @param code
+	 * @return
+	 */
+	public static HolidayTypeEnum getEnumByCode(int code) {
+		for (HolidayTypeEnum platformFree : HolidayTypeEnum.values()) {
+			if (code == platformFree.getCode()) {
+				return platformFree;
+			}
+		}
+		return null;
+	}
+
+}

+ 22 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/PvRotationModeEnum.java

@@ -0,0 +1,22 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 光伏组件旋转方式
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/9/18 13:43
+ */
+@Getter
+@AllArgsConstructor
+public enum PvRotationModeEnum {
+	E1(1, "固定角度"),
+	E2(2, "水平旋转"),
+	E3(3, "上下旋转"),
+	E4(4, "混合旋转");
+	private Integer code;
+	private String message;
+}

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

@@ -0,0 +1,20 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * SFTP模式
+ *
+ * @author xsl
+ * @version 3.0
+ * @since 2020/4/15 19:30
+ */
+@Getter
+@AllArgsConstructor
+public enum SftpConnectModeEnum {
+    E1(1,"密码连接"),
+    E2(2,"密钥连接");
+    private Integer code;
+    private String message;
+}

+ 92 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/TunnelStatus.java

@@ -0,0 +1,92 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 通道的状态
+ *
+ * @author 修唯xiuwei
+ * @version 3.0
+ */
+@Getter
+@AllArgsConstructor
+public enum TunnelStatus {
+
+
+  /**
+   * 通道状态枚举
+   */
+  BUILT(0, "已创建"),
+  /**
+   * 已连接
+   */
+  CONNECTED(1, "已连接"),
+  /**
+   * 被动丢失连接
+   */
+  LOSECONN(2, "被动丢失连接"),
+  /**
+   * 通道已主动关闭
+   */
+  ACTIVECLOSE(3, "通道已主动关闭"),
+  /**
+   * 正在尝试连接
+   */
+  CONNECTING(4, "正在尝试连接"),
+
+  /**
+   * listeningport 监听网口成功
+   */
+  LISTENPORTSUCCESS(5, "监听端口成功"),
+
+  /**
+   * listeningSerial 监听串口成功
+   */
+  LISTENSERIALSUCCESS(6, "监听串口成功"),
+
+  /**
+   * listeningport 监听网口失败
+   */
+  LISTENPORTFAIL(7, "监听端口失败"),
+
+  /**
+   * listeningSerial 监听串口失败
+   */
+  LISTENSERIALFAIL(8, "监听串口失败"),
+
+  /**
+   * listeningport 正在监听网口
+   */
+  LISTENINGPORT(9, "正在监听端口"),
+
+  /**
+   * listeningSerial 正在监听串口
+   */
+  LISTENINGSERIAL(10, "正在监听串口");
+
+
+  /**
+   * 通道的类型代号
+   */
+  private Integer code;
+
+
+  /**
+   * 通道的类型描述
+   */
+  private String cnDescribe;
+
+
+  public static List<TunnelStatus> getRunningProperlyStatus() {
+    List<TunnelStatus> list = new ArrayList<>();
+    list.add(TunnelStatus.LISTENSERIALSUCCESS);
+    list.add(TunnelStatus.CONNECTED);
+    list.add(TunnelStatus.LISTENPORTSUCCESS);
+    return list;
+  }
+
+}

+ 83 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/TunnelType.java

@@ -0,0 +1,83 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import com.jiayue.ipfcst.common.data.entity.BaseTunnelInfo;
+import com.jiayue.ipfcst.common.data.entity.gathertunnelinfo.*;
+import com.jiayue.ipfcst.common.data.entity.sendertunnelinfo.Sender104TcpTunnelInfo;
+import com.jiayue.ipfcst.common.data.entity.sendertunnelinfo.SenderCdtRtuTunnelInfo;
+import com.jiayue.ipfcst.common.data.entity.sendertunnelinfo.SenderModbusRtuTunnelInfo;
+import com.jiayue.ipfcst.common.data.entity.sendertunnelinfo.SenderModbusTcpTunnelInfo;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 通道的类型
+ *
+ * @author 修唯xiuwei
+ * @version 3.0
+ */
+@Getter
+@AllArgsConstructor
+public enum TunnelType {
+
+
+  /**
+   * 通道类型枚举
+   */
+  MODBUSTCPMASTER("modbusTCP采集", "in", GatherModbusTcpTunnelInfo.class),
+  /**
+   * modbusRTU采集
+   */
+  MODBUSRTUMASTER("modbusRTU采集", "in", GatherModbusRtuTunnelInfo.class),
+  /**
+   * IEC104TCP采集
+   */
+  IEC104TCPMASTER("IEC104TCP采集", "in", Gather104TcpTunnelInfo.class),
+  /**
+   * CDTRTU采集
+   */
+  CDTRTUMASTER("CDTRTU采集", "in",GatherCdtRtuTunnelInfo.class),
+  /**
+   * modbusTCP转发
+   */
+  MODBUSTCPSLAVE("modbusTCP转发", "out", SenderModbusTcpTunnelInfo.class),
+  /**
+   * modbusRTU转发
+   */
+  MODBUSRTUSLAVE("modbusRTU转发", "out", SenderModbusRtuTunnelInfo.class),
+  /**
+   * IEC104TCP转发
+   */
+  IEC104TCPSLAVE("IEC104TCP转发", "out", Sender104TcpTunnelInfo.class),
+  /**
+   * CDTRTU转发
+   */
+  CDTRTUSLAVE("CDTRTU转发", "out", SenderCdtRtuTunnelInfo.class),
+
+  /**
+   * 隔离文件解析 暂时将这种传输方式视为一种通道
+   * 因为如果视为另一种数据源 点表页面将很难展示
+   */
+  FILEPARSE("穿隔离文件解析", "in", FileParseTunnelInfo.class),
+
+
+  TCPSERVERASMODBUSMASTER("TcpServer扮演RtuMaster","in",GatherModbusRtuWithTcpServerTunnelInfo.class),
+
+  TCPCLIENTASMODBUSMASTER("TcpClient扮演RtuMaster","in",GatherModbusRtuWithTcpClientTunnelInfo.class);
+
+
+  /**
+   * 通道的类型描述
+   */
+  private String cnDescribe;
+
+
+  /**
+   * 流向
+   */
+  private String flow;
+
+
+  private  Class<? extends BaseTunnelInfo>  tunnelInfoClazz;
+
+
+}

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

@@ -0,0 +1,20 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 上报文件字符集枚举类
+ *
+ * @author xsl
+ * @version 3.0
+ * @since 2020/4/15 19:30
+ */
+@Getter
+@AllArgsConstructor
+public enum UploadFileCharSetEnum {
+	E1(1, "UTF-8"),
+	E2(2, "GBK");
+	private Integer code;
+	private String message;
+}

+ 21 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/UploadFileNameLengthEnum.java

@@ -0,0 +1,21 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 上报文件名称长度字节枚举类
+ *
+ * @author xsl
+ * @version 3.0
+ * @since 2020/4/15 19:30
+ */
+@Getter
+@AllArgsConstructor
+public enum UploadFileNameLengthEnum {
+	E1(1, "32"),
+	E2(2, "64"),
+	E3(3, "128");
+	private Integer code;
+	private String message;
+}

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

@@ -0,0 +1,20 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 上报文件单次传输字节枚举类
+ *
+ * @author xsl
+ * @version 3.0
+ * @since 2020/4/15 19:30
+ */
+@Getter
+@AllArgsConstructor
+public enum UploadFileSingleByteEnum {
+	E1(1, "512"),
+	E2(2, "1024");
+	private Integer code;
+	private String message;
+}

+ 24 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/constant/enums/UploadProtocolEnum.java

@@ -0,0 +1,24 @@
+package com.jiayue.ipfcst.common.data.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 上报协议枚举类
+ *
+ * @author xsl
+ * @version 3.0
+ * @since 2020/4/15 19:30
+ */
+@Getter
+@AllArgsConstructor
+public enum UploadProtocolEnum {
+	E1("102s", "102服务端"),
+	E2("102m_sd_client", "102山东客户端"),
+	E3("102m_sd_server", "102山东服务端"),
+	E4("ftp", "ftp"),
+	E5("sftp", "sftp"),
+	E6("zj102_client", "102浙江客户端");
+	private String code;
+	private String message;
+}

+ 43 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/InitJobClass.java

@@ -0,0 +1,43 @@
+package com.jiayue.ipfcst.common.data.entity;
+
+import lombok.Data;
+import org.hibernate.annotations.GenericGenerator;
+import org.springframework.core.annotation.Order;
+
+import javax.persistence.*;
+
+/**
+ * InitJobClass
+ *
+ * @author bizy
+ * @version 1.0
+ * @since 2018/12/11 09:06
+ */
+@Entity
+@Data
+public class InitJobClass {
+
+    @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(length = 64)
+    private String jobClassName;
+
+    /*位置*/
+    @Column(length = 64)
+    private String jobClassPath;
+
+    /*类型*/
+    @Column(length = 64)
+    private String jobClassType;
+
+    /**
+     * 场站标识
+     */
+    @Column
+    private String stationCode;
+}

+ 116 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/UploadFileLog.java

@@ -0,0 +1,116 @@
+package com.jiayue.ipfcst.common.data.entity;
+
+import com.jiayue.ipfcst.common.data.abst.AbstractBaseEntity;
+import com.jiayue.ipfcst.common.data.constant.enums.FileStatusEnum;
+import com.jiayue.ipfcst.common.data.constant.enums.FileTypeEnum;
+import com.jiayue.ipfcst.common.data.constant.enums.UploadProtocolEnum;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.hibernate.annotations.GenericGenerator;
+import org.springframework.core.annotation.Order;
+
+import javax.persistence.*;
+
+/**
+ * 上报文件日志
+ *
+ * @author xsl
+ * @version 3.0
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Entity
+public class UploadFileLog extends AbstractBaseEntity {
+
+    /**
+     * BACKUPA存生成文件所属时刻
+     */
+
+    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;
+
+    /**
+     * 上报对象主键ID
+     */
+    @Column
+    private Integer uploadObjectId;
+
+    /**
+     * 上报对象名称
+     */
+    @Column
+    private String uploadObjectName;
+
+    /**
+     * 上报对象编号
+     */
+    @Column
+    private String uploadObjectNo;
+
+    /**
+     * 文件名称
+     */
+    @Column
+    private String fileName;
+
+    /**
+     * 文件类型
+     */
+    @Column
+    @Enumerated(EnumType.STRING)
+    private FileTypeEnum fileTypeEnum;
+
+    /**
+     * 文件状态
+     */
+    @Column
+    @Enumerated(EnumType.STRING)
+    private FileStatusEnum fileStatusEnum;
+
+    /**
+     * 上报协议
+     */
+    @Column
+    @Enumerated(EnumType.STRING)
+    private UploadProtocolEnum uploadProtocolEnum;
+
+    /**
+     * 上报次数
+     */
+    @Column
+    private Integer uploadCounter;
+
+    /**
+     * 文件备注
+     */
+    @Column
+    private String fileRemarks;
+
+    /**
+     * 上报设备ID(指定气象站或测风塔)
+     */
+    @Column
+    private String uploadEquipmentID;
+
+    /**
+     * 上报文件截止时间
+     */
+    @Column
+    private Long uploadFileEndTime;
+
+    /**
+     * 上报文件截止时间
+     * backupA 为补报时间,时间字符串
+     */
+
+    /**
+     * 场站标识
+     */
+    @Column
+    private String stationCode;
+}

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

@@ -0,0 +1,20 @@
+package com.jiayue.ipfcst.common.data.repository;
+
+import com.jiayue.ipfcst.common.data.entity.InitJobClass;
+
+import java.util.List;
+
+/**
+ * 定时任务实体仓储
+ *
+ * @author bizy
+ * @version 1.0
+ * @since 2018/12/10 11:24
+ */
+public interface InitJobClassRepository extends BaseRepository<InitJobClass, Integer> {
+    List<InitJobClass> findByJobClassType(String jobClassType);
+
+    InitJobClass findByJobClassName(String name);
+
+    InitJobClass findByJobClassPath(String path);
+}

+ 79 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/UploadFileLogRepository.java

@@ -0,0 +1,79 @@
+package com.jiayue.ipfcst.common.data.repository;
+
+
+import com.jiayue.ipfcst.common.data.constant.enums.FileStatusEnum;
+import com.jiayue.ipfcst.common.data.constant.enums.FileTypeEnum;
+import com.jiayue.ipfcst.common.data.entity.UploadFileLog;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 上报文件日志表仓储
+ *
+ * @author xsl
+ * @version 3.0
+ */
+public interface UploadFileLogRepository extends BaseRepository<UploadFileLog, Integer> {
+	/**
+	 * 查詢文件是否生成
+	 *
+	 * @param fileName
+	 * @return
+	 */
+	List<UploadFileLog> findByFileNameAndFileTypeEnumAndCreateTimeBetweenAndStationCode(String fileName, FileTypeEnum fileTypeEnum, Date jt, Date mt,String stationCode);
+
+	/**
+	 * 根据上报对象及文件名更新上报次数
+	 *
+	 * @param fileStatusEnum
+	 * @param uploadCounter
+	 * @param uploadObjectId
+	 * @param fileName
+	 */
+	@Modifying
+	@Query(value = "update UploadFileLog t set t.fileStatusEnum=?1,t.uploadCounter=?2 where t.uploadObjectId = ?3 and t.fileName = ?4")
+	void updateFileUploadCount(FileStatusEnum fileStatusEnum, Integer uploadCounter, Integer uploadObjectId, String fileName);
+
+	/**
+	 * 根据上报对象ID和文件名称查找文件日志
+	 *
+	 * @param uploadObjectId
+	 * @param fileName
+	 * @param st
+	 * @param et
+	 * @return
+	 */
+	UploadFileLog findByUploadObjectIdAndFileNameAndCreateTimeBetween(Integer uploadObjectId, String fileName, Date st, Date et);
+	/**
+	 * 查询上报成功文件
+	 * @param id 上报对象ID
+	 * @param fileTypeEnum 文件类型
+	 * @param fileStatusEnum 文件状态
+	 * @param startTime 开始时间
+	 * @param endTime 结束时间
+	 * @return 上报成功结果集
+	 */
+	List<UploadFileLog> findByUploadObjectIdAndFileTypeEnumAndFileStatusEnumAndCreateTimeBetween(Integer id, FileTypeEnum fileTypeEnum, FileStatusEnum fileStatusEnum, Date startTime, Date endTime);
+
+	/**
+	 * 删除指定日期之前的日志
+	 */
+	@Modifying
+	@Query(value = "delete from UploadFileLog t where t.createTime < ?1")
+	void deleteLessCreateTime(Date date);
+
+	/**
+	 * console启动获取未上报的文件
+	 */
+	@Query(value = "from UploadFileLog where fileStatusEnum=?1")
+	List<UploadFileLog> queryFileUploadCache(FileStatusEnum fileStatusEnum);
+
+
+	List<UploadFileLog> findByFileTypeEnumAndFileStatusEnumAndCreateTimeBetween(FileTypeEnum fileTypeEnum, FileStatusEnum fileStatusEnum, Date startTime, Date endTime);
+
+	List<UploadFileLog> findByFileTypeEnumAndBackupCAndCreateTimeBetween(FileTypeEnum fileTypeEnum, String backupC, Date startTime, Date endTime);
+
+}

+ 534 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/service/uploadfilerule/E63UploadFileRuleService.java

@@ -0,0 +1,534 @@
+package com.jiayue.ipfcst.common.data.service.uploadfilerule;
+
+import com.jiayue.ipfcst.common.core.util.DateMomentUtil;
+import com.jiayue.ipfcst.common.data.entity.ElectricField;
+import org.apache.commons.lang.time.DateFormatUtils;
+import org.apache.commons.lang.time.DateUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 青海文件规则
+ *
+ * @author tl
+ * @version 3.0
+ */
+@Service
+public class E63UploadFileRuleService extends UploadFileRuleCommonService implements IUploadFileRuleService {
+    /**
+     * 指定日期应该上报文件名称
+     *
+     * @param date
+     * @param fileType
+     * @return
+     */
+    public List<String> getShouldFile(ElectricField electricFieldInfo, Date date, String fileType, String cronStr) {
+        // 计算开始结束时间
+        super.caleTime(date);
+        Long startTime = 0L;
+        String fileName = "";
+        List<String> shouldFileNameList = new ArrayList<>();
+        Date currentDate = new Date();
+        switch (fileType) {
+            case "E1":
+                if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                    // 当天的
+                    if (cronStr != null && !"".equals(cronStr)) {
+                        if (!isSpecifiedTimeShouldFile(currentDate, cronStr)) {
+                            break;
+                        }
+                    }
+                }
+                // 短期
+                startTime = DateMomentUtil.getDayStartTime(DateUtils.addDays(date, 1).getTime());
+                fileName = getFileNameRule(electricFieldInfo, "E1", startTime);
+                shouldFileNameList.add(fileName);
+                break;
+            case "E26":
+                if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                    // 短期可用
+                    if (cronStr != null && !"".equals(cronStr)) {
+                        if (!isSpecifiedTimeShouldFile(currentDate, cronStr)) {
+                            break;
+                        }
+                    }
+                }
+                // 短期
+                startTime = DateMomentUtil.getDayStartTime(DateUtils.addDays(date, 1).getTime());
+                fileName = getFileNameRule(electricFieldInfo, "E26", startTime);
+                shouldFileNameList.add(fileName);
+                break;
+            case "E2":
+                // 超短期
+                for (Long tempDateTime = super.midNightTime; tempDateTime < super.endTime; tempDateTime = tempDateTime + 15 * 60 * 1000) {
+                    if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                        // 当天的
+                        if (cronStr != null && !"".equals(cronStr)) {
+                            if (!isEveryTimeShouldFile(tempDateTime, currentDate, cronStr, 15)) {
+                                continue;
+                            }
+                        }
+                    }
+                    fileName = getFileNameRule(electricFieldInfo, "E2", tempDateTime + 15 * 60 * 1000);
+                    shouldFileNameList.add(fileName);
+                }
+                break;
+            case "E27":
+                // 超短期可用
+                for (Long tempDateTime = super.midNightTime; tempDateTime < super.endTime; tempDateTime = tempDateTime + 15 * 60 * 1000) {
+                    if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                        // 当天的
+                        if (cronStr != null && !"".equals(cronStr)) {
+                            if (cronStr != null && !"".equals(cronStr)) {
+                                if (!isEveryTimeShouldFile(tempDateTime, currentDate, cronStr, 15)) {
+                                    continue;
+                                }
+                            }
+                        }
+                    }
+                    fileName = getFileNameRule(electricFieldInfo, "E27", tempDateTime + 15 * 60 * 1000);
+                    shouldFileNameList.add(fileName);
+                }
+                break;
+            case "E3":
+                // 理论功率
+                for (Long tempDateTime = super.midNightTime; tempDateTime < super.endTime; tempDateTime = tempDateTime + 5 * 60 * 1000) {
+                    if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                        // 当天的
+                        if (cronStr != null && !"".equals(cronStr)) {
+                            if (!isEveryTimeShouldFile(tempDateTime, currentDate, cronStr, 5)) {
+                                continue;
+                            }
+                        }
+                    }
+                    fileName = getFileNameRule(electricFieldInfo, "E3", tempDateTime);
+                    shouldFileNameList.add(fileName);
+                }
+                break;
+            case "E6":
+                // 气象站
+                for (Long tempDateTime = super.midNightTime; tempDateTime < super.endTime; tempDateTime = tempDateTime + 5 * 60 * 1000) {
+                    if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                        // 当天的
+                        if (cronStr != null && !"".equals(cronStr)) {
+                            if (!isEveryTimeShouldFile(tempDateTime, currentDate, cronStr, 5)) {
+                                continue;
+                            }
+                        }
+                    }
+                    fileName = getFileNameRule(electricFieldInfo, "E6", tempDateTime);
+                    shouldFileNameList.add(fileName);
+                }
+                break;
+            case "E7":
+                // 测风塔
+                for (Long tempDateTime = super.midNightTime; tempDateTime < super.endTime; tempDateTime = tempDateTime + 5 * 60 * 1000) {
+                    if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                        // 当天的
+                        if (cronStr != null && !"".equals(cronStr)) {
+                            if (!isEveryTimeShouldFile(tempDateTime, currentDate, cronStr, 5)) {
+                                continue;
+                            }
+                        }
+                    }
+                    fileName = getFileNameRule(electricFieldInfo, "E7", tempDateTime);
+                    shouldFileNameList.add(fileName);
+                }
+                break;
+            case "E8":
+                // 逆变器
+                for (Long tempDateTime = super.midNightTime; tempDateTime < super.endTime; tempDateTime = tempDateTime + 5 * 60 * 1000) {
+                    if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                        // 当天的
+                        if (cronStr != null && !"".equals(cronStr)) {
+                            if (!isEveryTimeShouldFile(tempDateTime, currentDate, cronStr, 5)) {
+                                continue;
+                            }
+                        }
+                    }
+                    fileName = getFileNameRule(electricFieldInfo, "E8", tempDateTime);
+                    shouldFileNameList.add(fileName);
+                }
+                break;
+            case "E9":
+                // 风机
+                for (Long tempDateTime = super.midNightTime; tempDateTime < super.endTime; tempDateTime = tempDateTime + 5 * 60 * 1000) {
+                    if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                        // 当天的
+                        if (cronStr != null && !"".equals(cronStr)) {
+                            if (!isEveryTimeShouldFile(tempDateTime, currentDate, cronStr, 5)) {
+                                continue;
+                            }
+                        }
+                    }
+                    fileName = getFileNameRule(electricFieldInfo, "E9", tempDateTime);
+                    shouldFileNameList.add(fileName);
+                }
+                break;
+            case "E29":
+                //短期预测风速风向
+                if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                    // 短期可用
+                    if (cronStr != null && !"".equals(cronStr)) {
+                        if (!isSpecifiedTimeShouldFile(currentDate, cronStr)) {
+                            break;
+                        }
+                    }
+                }
+                // 短期
+                startTime = DateMomentUtil.getDayStartTime(DateUtils.addDays(date, 1).getTime());
+                fileName = getFileNameRule(electricFieldInfo, "E29", startTime);
+                shouldFileNameList.add(fileName);
+                break;
+            case "E45":
+                // 超短期预测风速风向
+                for (Long tempDateTime = super.midNightTime; tempDateTime < super.endTime; tempDateTime = tempDateTime + 15 * 60 * 1000) {
+                    if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                        // 当天的
+                        if (cronStr != null && !"".equals(cronStr)) {
+                            if (!isEveryTimeShouldFile(tempDateTime, currentDate, cronStr, 15)) {
+                                continue;
+                            }
+                        }
+                    }
+                    fileName = getFileNameRule(electricFieldInfo, "E45", tempDateTime + 15 * 60 * 1000);
+                    shouldFileNameList.add(fileName);
+                }
+                break;
+            case "E30":
+                // 实测功率
+                for (Long tempDateTime = super.midNightTime; tempDateTime < super.endTime; tempDateTime = tempDateTime + 5 * 60 * 1000) {
+                    if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                        // 当天的
+                        if (cronStr != null && !"".equals(cronStr)) {
+                            if (!isEveryTimeShouldFile(tempDateTime, currentDate, cronStr, 5)) {
+                                continue;
+                            }
+                        }
+                    }
+                    fileName = getFileNameRule(electricFieldInfo, "E30", tempDateTime);
+                    shouldFileNameList.add(fileName);
+                }
+                break;
+            case "E31":
+                //短期预测辐照度
+                if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                    // 短期可用
+                    if (cronStr != null && !"".equals(cronStr)) {
+                        if (!isSpecifiedTimeShouldFile(currentDate, cronStr)) {
+                            break;
+                        }
+                    }
+                }
+                // 短期
+                startTime = DateMomentUtil.getDayStartTime(DateUtils.addDays(date, 1).getTime());
+                fileName = getFileNameRule(electricFieldInfo, "E31", startTime);
+                shouldFileNameList.add(fileName);
+                break;
+            case "E47":
+                // 超短期预测辐照度
+                for (Long tempDateTime = super.midNightTime; tempDateTime < super.endTime; tempDateTime = tempDateTime + 15 * 60 * 1000) {
+                    if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                        // 当天的
+                        if (cronStr != null && !"".equals(cronStr)) {
+                            if (!isEveryTimeShouldFile(tempDateTime, currentDate, cronStr, 15)) {
+                                continue;
+                            }
+                        }
+                    }
+                    fileName = getFileNameRule(electricFieldInfo, "E47", tempDateTime + 15 * 60 * 1000);
+                    shouldFileNameList.add(fileName);
+                }
+                break;
+            case "E32":
+                //短期日志
+                if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                    // 当天的
+                    if (cronStr != null && !"".equals(cronStr)) {
+                        if (!isSpecifiedTimeShouldFile(currentDate, cronStr)) {
+                            break;
+                        }
+                    }
+                }
+                // 短期
+                startTime = DateMomentUtil.getDayStartTime(DateUtils.addDays(date, 0).getTime());
+                fileName = getFileNameRule(electricFieldInfo, "E32", startTime);
+                shouldFileNameList.add(fileName);
+                break;
+            case "E33":
+                //可用短期日志
+                if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                    // 短期可用
+                    if (cronStr != null && !"".equals(cronStr)) {
+                        if (!isSpecifiedTimeShouldFile(currentDate, cronStr)) {
+                            break;
+                        }
+                    }
+                }
+                // 短期
+                startTime = DateMomentUtil.getDayStartTime(DateUtils.addDays(date, 0).getTime());
+                fileName = getFileNameRule(electricFieldInfo, "E33", startTime);
+                shouldFileNameList.add(fileName);
+                break;
+            case "E34":
+                // 超短期日志
+                for (Long tempDateTime = super.midNightTime - 15 * 60 * 1000; tempDateTime < super.endTime; tempDateTime = tempDateTime + 15 * 60 * 1000) {
+                    if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                        // 当天的
+                        if (cronStr != null && !"".equals(cronStr)) {
+                            if (!isEveryTimeShouldFile(tempDateTime, currentDate, cronStr, 15)) {
+                                continue;
+                            }
+                        }
+                    }
+                    fileName = getFileNameRule(electricFieldInfo, "E34", tempDateTime + 15 * 60 * 1000);
+                    shouldFileNameList.add(fileName);
+                }
+                break;
+            case "E35":
+                // 超短期可用日志
+                for (Long tempDateTime = super.midNightTime - 5 * 60 * 1000; tempDateTime < super.endTime; tempDateTime = tempDateTime + 5 * 60 * 1000) {
+                    if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                        // 当天的
+                        if (cronStr != null && !"".equals(cronStr)) {
+                            if (!isEveryTimeShouldFile(tempDateTime, currentDate, cronStr, 5)) {
+                                continue;
+                            }
+                        }
+                    }
+                    fileName = getFileNameRule(electricFieldInfo, "E35", tempDateTime);
+                    shouldFileNameList.add(fileName);
+                }
+                break;
+            case "E36":
+                // 理论功率日志
+                for (Long tempDateTime = super.midNightTime - 5 * 60 * 1000; tempDateTime < super.endTime; tempDateTime = tempDateTime + 5 * 60 * 1000) {
+                    if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                        // 当天的
+                        if (cronStr != null && !"".equals(cronStr)) {
+                            if (!isEveryTimeShouldFile(tempDateTime, currentDate, cronStr, 5)) {
+                                continue;
+                            }
+                        }
+                    }
+                    fileName = getFileNameRule(electricFieldInfo, "E36", tempDateTime);
+                    shouldFileNameList.add(fileName);
+                }
+                break;
+            case "E37":
+                // 气象站日志
+                for (Long tempDateTime = super.midNightTime - 5 * 60 * 1000; tempDateTime < super.endTime; tempDateTime = tempDateTime + 5 * 60 * 1000) {
+                    if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                        // 当天的
+                        if (cronStr != null && !"".equals(cronStr)) {
+                            if (!isEveryTimeShouldFile(tempDateTime, currentDate, cronStr, 5)) {
+                                continue;
+                            }
+                        }
+                    }
+                    fileName = getFileNameRule(electricFieldInfo, "E37", tempDateTime);
+                    shouldFileNameList.add(fileName);
+                }
+                break;
+            case "E38":
+                // 测风塔日志
+                for (Long tempDateTime = super.midNightTime - 5 * 60 * 1000; tempDateTime < super.endTime; tempDateTime = tempDateTime + 5 * 60 * 1000) {
+                    if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                        // 当天的
+                        if (cronStr != null && !"".equals(cronStr)) {
+                            if (!isEveryTimeShouldFile(tempDateTime, currentDate, cronStr, 5)) {
+                                continue;
+                            }
+                        }
+                    }
+                    fileName = getFileNameRule(electricFieldInfo, "E38", tempDateTime);
+                    shouldFileNameList.add(fileName);
+                }
+                break;
+            case "E39":
+                // 逆变器日志
+                for (Long tempDateTime = super.midNightTime - 5 * 60 * 1000; tempDateTime < super.endTime; tempDateTime = tempDateTime + 5 * 60 * 1000) {
+                    if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                        // 当天的
+                        if (cronStr != null && !"".equals(cronStr)) {
+                            if (!isEveryTimeShouldFile(tempDateTime, currentDate, cronStr, 5)) {
+                                continue;
+                            }
+                        }
+                    }
+                    fileName = getFileNameRule(electricFieldInfo, "E39", tempDateTime);
+                    shouldFileNameList.add(fileName);
+                }
+                break;
+            case "E40":
+                // 风机日志
+                for (Long tempDateTime = super.midNightTime - 5 * 60 * 1000; tempDateTime < super.endTime; tempDateTime = tempDateTime + 5 * 60 * 1000) {
+                    if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                        // 当天的
+                        if (cronStr != null && !"".equals(cronStr)) {
+                            if (!isEveryTimeShouldFile(tempDateTime, currentDate, cronStr, 5)) {
+                                continue;
+                            }
+                        }
+                    }
+                    fileName = getFileNameRule(electricFieldInfo, "E40", tempDateTime);
+                    shouldFileNameList.add(fileName);
+                }
+                break;
+            case "E85":
+                // 理论功率
+                for (Long tempDateTime = super.midNightTime; tempDateTime < super.endTime; tempDateTime = tempDateTime + 5 * 60 * 1000) {
+                    if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                        // 当天的
+                        if (cronStr != null && !"".equals(cronStr)) {
+                            if (!isEveryTimeShouldFile(tempDateTime, currentDate, cronStr, 5)) {
+                                continue;
+                            }
+                        }
+                    }
+                    fileName = getFileNameRule(electricFieldInfo, "E85", tempDateTime);
+                    shouldFileNameList.add(fileName);
+                }
+                break;
+            case "E41":
+                if (DateFormatUtils.format(super.endTime, "yyyyMMdd").equals(DateFormatUtils.format(currentDate, "yyyyMMdd"))) {
+                    // 当天的
+                    if (cronStr != null && !"".equals(cronStr)) {
+                        if (!isSpecifiedTimeShouldFile(currentDate, cronStr)) {
+                            break;
+                        }
+                    }
+                }
+                // 短期
+                startTime = DateMomentUtil.getDayStartTime(DateUtils.addDays(date, -1).getTime());
+                fileName = getFileNameRule(electricFieldInfo, "E41", startTime);
+                shouldFileNameList.add(fileName);
+                break;
+            default:
+                break;
+        }
+        return shouldFileNameList;
+    }
+
+    /**
+     * 文件名称生成规则
+     *
+     * @param electricFieldInfo
+     * @param fileType
+     * @param fileNameTime
+     * @return
+     */
+    public String getFileNameRule(ElectricField electricFieldInfo, String fileType, Long fileNameTime) {
+        String fileName = "";
+        switch (fileType) {
+            case "E1":
+                // 短期
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd") + "_0000_DQ.PVD";
+                break;
+            case "E26":
+                // 可用短期
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd") + "_0000_DQ_USE.PVD";
+                break;
+            case "E2":
+                // 超短期
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd_HHmm") + "_CDQ.PVD";
+                break;
+            case "E27":
+                // 可用超短期
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd_HHmm") + "_CDQ_USE.PVD";
+                break;
+            case "E3":
+                // 理论功率
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd_HHmm") + "_THEROY.PVD";
+                break;
+            case "E6":
+                // 气象站
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd_HHmm") + "_QXZ.PVD";
+                break;
+            case "E7":
+                // 测风塔
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd_HHmm") + "_CFT.PVD";
+                break;
+            case "E8":
+                // 逆变器
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd_HHmm") + "_NBQ.PVD";
+                break;
+            case "E9":
+                // 风机
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd_HHmm") + "_FJ.PVD";
+                break;
+            case "E29":
+                // 短期预测风速风向
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd_HHmm") + "_DQFS.PVD";
+                break;
+            case "E45":
+                // 超短期预测风速风向
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd_HHmm") + "_CDQFS.PVD";
+                break;
+            case "E30":
+                // 实测功率
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd_HHmm") + "_SC.PVD";
+                break;
+            case "E31":
+                // 预测短期辐照度
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd_HHmm") + "_DQFZD.PVD";
+                break;
+            case "E47":
+                // 预测超短期辐照度
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd_HHmm") + "_CDQFZD.PVD";
+                break;
+            case "E41":
+                // 指标数据
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd") + "_INDICATORS.json";
+                break;
+            case "E32":
+                // 短期日志
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd") + "_0000_DQ.json";
+                break;
+            case "E33":
+                // 超短期日志
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd") + "_0000_DQ_USE.json";
+                break;
+            case "E34":
+                // 短期可用日志
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd_HHmm") + "_CDQ.json";
+                break;
+            case "E35":
+                // 超短期可用日志
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd_HHmm") + "_CDQ_USE.json";
+                break;
+            case "E36":
+                // 气象站日志
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd_HHmm") + "_QXZ.json";
+                break;
+            case "E37":
+                // 理论功率日志
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd_HHmm") + "_THEROY.json";
+                break;
+            case "E38":
+                // 逆变器日志
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd_HHmm") + "_NBQ.json";
+                break;
+            case "E39":
+                // 风机日志
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd_HHmm") + "_FJ.json";
+                break;
+            case "E40":
+                // 测风塔日志
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd_HHmm") + "_CFT.json";
+                break;
+            case "E85":
+                // 理论功率
+                fileName = electricFieldInfo.getSign() + "_" + DateFormatUtils.format(fileNameTime, "yyyyMMdd_HHmm") + "_THEROY.PVD";
+                break;
+            default:
+                break;
+        }
+        return fileName;
+    }
+
+
+}

+ 25 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/service/uploadfilerule/IUploadFileRuleService.java

@@ -0,0 +1,25 @@
+package com.jiayue.ipfcst.common.data.service.uploadfilerule;
+
+import com.jiayue.ipfcst.common.data.entity.ElectricField;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 短期预测功率上报文件生成接口类
+ *
+ * @author xsl
+ * @version 3.0
+ * @since 2020/4/13 20:00
+ */
+public interface IUploadFileRuleService {
+    /**
+     * 指定日期应该上报文件名称
+     */
+    public List<String> getShouldFile(ElectricField electricFieldInfo, Date date, String fileType, String cronStr);
+
+    /**
+     * 文件名称生成规则
+     */
+    public String getFileNameRule(ElectricField electricFieldInfo, String fileType, Long fileNameTime);
+}

+ 83 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/service/uploadfilerule/UploadFileRuleCommonService.java

@@ -0,0 +1,83 @@
+package com.jiayue.ipfcst.common.data.service.uploadfilerule;
+
+import com.jiayue.ipfcst.common.core.util.DateMomentUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.time.DateFormatUtils;
+import org.springframework.scheduling.support.CronSequenceGenerator;
+
+import java.util.Date;
+
+/**
+ * 上报文件规则公共类
+ *
+ * @author xsl
+ * @version 3.0
+ */
+@Slf4j
+public class UploadFileRuleCommonService {
+    Long midNightTime = 0L;
+    Long endTime = 0L;
+
+    public void caleTime(Date inputParamDate) {
+        Date nowDate = new Date();
+        // 今日凌晨时间
+        Long nowNightTime = DateMomentUtil.getDayStartTime(nowDate.getTime());
+        // 指定日期的凌晨时间
+        midNightTime = DateMomentUtil.getDayStartTime(inputParamDate.getTime());
+        if (nowNightTime.longValue() != midNightTime.longValue()) {
+            endTime = midNightTime + 1000 * 60 * 60 * 24;
+        } else {
+            endTime = nowDate.getTime();
+        }
+    }
+
+    /**
+     * 对每分钟的定时统计是否产生应上报
+     *
+     * @param tempDateTime
+     * @param currentDate
+     * @param cronStr
+     * @return
+     */
+    public boolean isEveryTimeShouldFile(Long tempDateTime, Date currentDate, String cronStr, Integer fileRate) {
+        // 此判断为了当前时刻应上报的文件还没执行定时,产生的多余的应上报
+        try {
+            if (DateFormatUtils.format(tempDateTime, "HH:mm").equals(DateFormatUtils.format(currentDate, "HH:mm"))) {
+                final CronSequenceGenerator generator = new CronSequenceGenerator(cronStr);
+                final Date nextExecutionDate = generator.next(currentDate);
+                if (Integer.parseInt(DateFormatUtils.format(currentDate, "mm")) % fileRate == 0) {
+                    String ss = DateFormatUtils.format(nextExecutionDate, "ss");
+                    if (Integer.parseInt(DateFormatUtils.format(currentDate, "ss")) < Integer.parseInt(ss)) {
+                        System.out.println("jin:" + tempDateTime);
+
+                        return false;
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("计算每分钟应上报文件数量出错:" + e);
+        }
+        return true;
+    }
+
+    /**
+     * 对指定时间的定时统计是否产生应上报
+     *
+     * @param currentDate
+     * @param cronStr
+     * @return
+     */
+    public boolean isSpecifiedTimeShouldFile(Date currentDate, String cronStr) {
+        // 此判断为了当前时刻应上报的文件还没执行定时,产生的多余的应上报
+        try {
+            final CronSequenceGenerator generator = new CronSequenceGenerator(cronStr);
+            final Date nextExecutionDate = generator.next(currentDate);
+            if (DateFormatUtils.format(currentDate, "HH:mm:ss").compareTo(DateFormatUtils.format(nextExecutionDate, "HH:mm:ss")) < 0) {
+                return false;
+            }
+        } catch (Exception e) {
+            log.error("计算指定时间应上报文件数量出错:" + e);
+        }
+        return true;
+    }
+}

+ 26 - 0
ipfcst-console/src/main/java/com/jiayue/ipfcst/fileupload/job/UploadFileE1Job.java

@@ -0,0 +1,26 @@
+package com.jiayue.ipfcst.fileupload.job;
+
+import com.jiayue.ipfcst.common.data.job.BaseJob;
+import com.jiayue.ipfcst.fileupload.service.E63UploadFileService;
+import org.quartz.JobDataMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 短期预测功率文件生成任务
+ *
+ * @author xsl
+ * @version 3.0
+ * @since 2020/4/15 9:16
+ */
+@Service
+public class UploadFileE1Job extends BaseJob {
+  @Autowired
+  E63UploadFileService e63UploadFileService;
+
+  @Override
+  public boolean execute(JobDataMap jobDataMap) {
+    e63UploadFileService.generateE1File(null);
+    return true;
+  }
+}

+ 26 - 0
ipfcst-console/src/main/java/com/jiayue/ipfcst/fileupload/job/UploadFileE26Job.java

@@ -0,0 +1,26 @@
+package com.jiayue.ipfcst.fileupload.job;
+
+import com.jiayue.ipfcst.common.data.job.BaseJob;
+import com.jiayue.ipfcst.fileupload.service.E63UploadFileService;
+import org.quartz.JobDataMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 可用短期生成任务
+ *
+ * @author xsl
+ * @version 3.0
+ * @since 2020/4/15 9:16
+ */
+@Service
+public class UploadFileE26Job extends BaseJob {
+  @Autowired
+  E63UploadFileService e63UploadFileService;
+
+  @Override
+  public boolean execute(JobDataMap jobDataMap) {
+    return true;
+  }
+}
+

+ 26 - 0
ipfcst-console/src/main/java/com/jiayue/ipfcst/fileupload/job/UploadFileE27Job.java

@@ -0,0 +1,26 @@
+package com.jiayue.ipfcst.fileupload.job;
+
+import com.jiayue.ipfcst.common.data.job.BaseJob;
+import com.jiayue.ipfcst.fileupload.service.E63UploadFileService;
+import org.quartz.JobDataMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 可用超短期生成任务
+ *
+ * @author xsl
+ * @version 3.0
+ * @since 2020/4/15 9:16
+ */
+@Service
+public class UploadFileE27Job extends BaseJob {
+  @Autowired
+  E63UploadFileService e63UploadFileService;
+
+  @Override
+  public boolean execute(JobDataMap jobDataMap) {
+    return true;
+  }
+}
+

+ 26 - 0
ipfcst-console/src/main/java/com/jiayue/ipfcst/fileupload/job/UploadFileE2Job.java

@@ -0,0 +1,26 @@
+package com.jiayue.ipfcst.fileupload.job;
+
+
+import com.jiayue.ipfcst.common.data.job.BaseJob;
+import com.jiayue.ipfcst.fileupload.service.E63UploadFileService;
+import org.quartz.JobDataMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 超短期预测功率文件生成任务
+ *
+ * @author xsl
+ * @version 3.0
+ * @since 2020/4/15 9:16
+ */
+@Service
+public class UploadFileE2Job extends BaseJob {
+  @Autowired
+  E63UploadFileService e63UploadFileService;
+
+  @Override
+  public boolean execute(JobDataMap jobDataMap) {
+    return true;
+  }
+}

+ 26 - 0
ipfcst-console/src/main/java/com/jiayue/ipfcst/fileupload/job/UploadFileE3Job.java

@@ -0,0 +1,26 @@
+package com.jiayue.ipfcst.fileupload.job;
+
+import com.jiayue.ipfcst.common.data.job.BaseJob;
+import com.jiayue.ipfcst.fileupload.service.E63UploadFileService;
+import org.quartz.JobDataMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 青海理论功率(风)
+ *
+ * @author xsl
+ * @version 3.0
+ * @since 2020/4/15 9:16
+ */
+@Service
+public class UploadFileE3Job extends BaseJob {
+  @Autowired
+  E63UploadFileService e63UploadFileService;
+
+  @Override
+  public boolean execute(JobDataMap jobDataMap) {
+    return true;
+  }
+}
+

+ 26 - 0
ipfcst-console/src/main/java/com/jiayue/ipfcst/fileupload/job/UploadFileE7Job.java

@@ -0,0 +1,26 @@
+package com.jiayue.ipfcst.fileupload.job;
+
+import com.jiayue.ipfcst.common.data.job.BaseJob;
+import com.jiayue.ipfcst.fileupload.service.E63UploadFileService;
+import org.quartz.JobDataMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 测风塔文件生成任务
+ *
+ * @author xsl
+ * @version 3.0
+ * @since 2020/4/15 9:16
+ */
+@Service
+public class UploadFileE7Job extends BaseJob {
+  @Autowired
+  E63UploadFileService e63UploadFileService;
+
+  @Override
+  public boolean execute(JobDataMap jobDataMap) {
+    return true;
+  }
+}
+

+ 26 - 0
ipfcst-console/src/main/java/com/jiayue/ipfcst/fileupload/job/UploadFileE9Job.java

@@ -0,0 +1,26 @@
+package com.jiayue.ipfcst.fileupload.job;
+
+import com.jiayue.ipfcst.common.data.job.BaseJob;
+import com.jiayue.ipfcst.fileupload.service.E63UploadFileService;
+import org.quartz.JobDataMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 风机文件生成任务
+ *
+ * @author xsl
+ * @version 3.0
+ * @since 2020/4/15 9:16
+ */
+@Service
+public class UploadFileE9Job extends BaseJob {
+  @Autowired
+  E63UploadFileService e63UploadFileService;
+
+  @Override
+  public boolean execute(JobDataMap jobDataMap) {
+    return true;
+  }
+}
+

+ 231 - 0
ipfcst-console/src/main/java/com/jiayue/ipfcst/fileupload/service/BaseUploadFileService.java

@@ -0,0 +1,231 @@
+package com.jiayue.ipfcst.fileupload.service;
+
+import com.jiayue.ipfcst.common.core.util.DateTimeUtil;
+import com.jiayue.ipfcst.common.data.constant.enums.AlarmTypeEnum;
+import com.jiayue.ipfcst.common.data.constant.enums.FileStatusEnum;
+import com.jiayue.ipfcst.common.data.constant.enums.FileTypeEnum;
+import com.jiayue.ipfcst.common.data.entity.UploadFileLog;
+import com.jiayue.ipfcst.common.data.repository.UploadFileLogRepository;
+import com.jiayue.ipfcst.common.data.service.BaseService;
+import com.jiayue.ipfcst.fileupload.util.FileUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.FileUtils;
+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.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+/**
+ * 上报文件生成基础类
+ *
+ * @author xsl
+ * @version 3.0
+ */
+
+@Service
+@Slf4j
+public abstract class BaseUploadFileService extends BaseService {
+  @Autowired
+  UploadFileLogRepository uploadFileLogRepository;
+
+  /**
+   * 获取文件上报数值类型参数
+   *
+   * @param key
+   * @param defaultValue
+   * @return
+   */
+  protected int getTranSysParameter(String key, String defaultValue, String stationCode) {
+    int returnValue = 0;
+    try {
+      String value = super.getSysParameter(key, defaultValue, stationCode);
+      returnValue = Integer.parseInt(value);
+    } catch (RuntimeException e) {
+      String errorInfo = "参数表" + key + "获取失败";
+      log.error(errorInfo, e);
+      String name = "参数表" + key + "获取失败";
+      String describe = "参数表" + key + "获取失败";
+      String solution = "使用默认值" + defaultValue;
+      returnValue = Integer.parseInt(defaultValue);
+    }
+    return returnValue;
+  }
+
+  /**
+   * 查詢文件是否生成
+   *
+   * @param fileName
+   * @return 存在则返回false,不存在返回true
+   */
+  @Transactional(propagation = Propagation.REQUIRED)
+  protected boolean getFileName(String fileName, String fileType, String stationCode) {
+    int cdqUpMin = getTranSysParameter("CDQ_UP_MIN", "0", stationCode);
+    //今日凌晨
+    Long jt = DateTimeUtil.getMillisecondsSubDay() - (15 * 60 * 1000 + cdqUpMin * 1000 * 60);
+    //明日凌晨
+    Long mt = DateTimeUtil.getMillisecondsSubDay() + 1000 * 60 * 60 * 24;
+    List<UploadFileLog> list = this.uploadFileLogRepository.findByFileNameAndFileTypeEnumAndCreateTimeBetweenAndStationCode(fileName, FileTypeEnum.valueOf(fileType), new Date(jt), new Date(mt), stationCode);
+    if (null != list && list.size() > 0) {
+      return false;
+    } else {
+      return true;
+    }
+  }
+
+  /**
+   * 创建临时文件
+   *
+   * @param fileName 文件名
+   * @return 临时文件
+   */
+  protected File createTempFile(String fileName) {
+    // 获取临时目录
+    String tempDir = FileUtil.getTempFilePath() + File.separator + UUID.randomUUID().toString().replace("-", "");
+    boolean b = new File(tempDir).mkdir();
+    if (!b) {
+      throw new RuntimeException("创建文件" + fileName + "失败");
+    }
+    File file = new File(tempDir + File.separator + fileName);
+    try {
+      b = file.createNewFile();
+      if (!b)
+        throw new RuntimeException("创建文件" + fileName + "失败");
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+    return file;
+  }
+
+  /**
+   * 生成上报文件
+   *
+   * @param writer
+   * @param file
+   * @param fileType
+   * @param uploadFileEndTime
+   */
+  protected void copyUploadFile(StringWriter writer, File file, String fileType, Long uploadFileEndTime, Date createTime) {
+    FileOutputStream os = null;
+    try {
+      os = new FileOutputStream(file);
+      // 采用UTF-8字符集
+      os.write(writer.toString().getBytes("UTF-8"));
+      os.flush();
+      // 将文件复制到上报路径中
+      copyFileToUploadDir(file, fileType, uploadFileEndTime, createTime);
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    } finally {
+      if (os != null) {
+        try {
+          os.close();
+        } catch (IOException e) {
+          log.error("文件生成关闭流失败", e);
+        }
+      }
+      try {
+        FileUtils.forceDelete(file.getParentFile());
+      } catch (IOException e) {
+        log.error("", e);
+      }
+    }
+  }
+
+  /**
+   * 复制上报文件到上报路径
+   *
+   * @param file              需要上报的文件
+   * @param fileType          文件类型
+   * @param uploadFileEndTime 上报文件截止时间
+   */
+  @Transactional(propagation = Propagation.REQUIRED)
+  protected void copyFileToUploadDir(File file, String fileType, Long uploadFileEndTime, Date createTime) {
+//    String destFileDir = null;
+//
+//    try {
+//      // 获取上报对象
+//      List<UploadObject> uploadObjectList = uploadObjectService.get();
+//      if (uploadObjectList.isEmpty()) {
+//        // 没有有效上报通道进行告警
+//        String errorInfo = "文件生成没有上报对象可用";
+//        String name = file.getName() + "生成失败";
+//        String describe = FileTypeEnum.valueOf(fileType).getMessage();
+//        String solution = "请配置相关上报对象";
+//        super.saveSysAlarm(AlarmTypeEnum.E1, name, describe, errorInfo, solution);
+//      } else {
+//        // 遍历上报对象生成对应的文件
+//        for (UploadObject uploadObject : uploadObjectList) {
+//          List<UploadFileChannel> uploadFileChannelList = uploadFileChannelService.getByObjectId(uploadObject.getId());
+//          // 找出对象下是否有可用的通道
+//          List<UploadFileChannel> filterUploadFileChannelList = uploadFileChannelList.stream().filter(s -> "E1".equals(s.getChannelStatusEnum().toString())).collect(Collectors.toList());
+//          if (filterUploadFileChannelList.size() > 0) {
+//            String[] uploadFileType = uploadObject.getUploadFileType().split(",");
+//            for (int k = 0; k < uploadFileType.length; k++) {
+//              if (uploadFileType[k].equals(fileType)) {
+//                // 上报文件目录
+//                destFileDir = FileUtil.getFileUploadPath() + File.separator + "process" + File.separator + uploadObject.getObjectNo() + File.separator + fileType;
+//                File destDir = new File(destFileDir);
+//                if (!destDir.exists()) {// 如果目录不存在则创建uploadFileEndTime目录
+//                  boolean b = destDir.mkdirs();
+//                  if (!b) // 如果创建失败则抛出异常
+//                    throw new RuntimeException(destFileDir + " 目录创建失败");
+//                }
+//                if (!new File(destDir + File.separator + file.getName()).exists()) {
+//                  FileUtils.copyFileToDirectory(file, destDir);
+//                  UploadFileLog uploadFileLog = new UploadFileLog();
+//                  uploadFileLog.setUploadObjectId(uploadObject.getId());
+//                  uploadFileLog.setUploadObjectName(uploadObject.getUploadObjectName());
+//                  uploadFileLog.setUploadObjectNo(uploadObject.getObjectNo());
+//                  uploadFileLog.setFileName(file.getName());
+//                  uploadFileLog.setFileTypeEnum(FileTypeEnum.valueOf(fileType));
+//                  uploadFileLog.setFileStatusEnum(FileStatusEnum.E1);
+//                  uploadFileLog.setUploadProtocolEnum(uploadObject.getUploadProtocolEnum());
+//                  uploadFileLog.setUploadCounter(0);
+//                  uploadFileLog.setUploadFileEndTime(uploadFileEndTime);
+//
+//                  uploadFileLog = this.uploadFileLogRepository.save(uploadFileLog);
+//
+//                  if (createTime != null) {
+//                    uploadFileLog.setCreateTime(createTime);
+//                    Date date = new Date();
+//                    String format = DateFormatUtils.format(date, "yyyy-MM-dd HH:mm:ss");
+//                    uploadFileLog.setBackupA(format);
+//                    uploadFileLog = this.uploadFileLogRepository.save(uploadFileLog);
+//                  }
+//                  String readyFileKey = uploadObject.getObjectNo() + "@" + fileType + "@" + file.getName();
+//                  FileConstant.fileShouldMomentMap.put(readyFileKey, uploadFileLog.getId());
+//                  FileConstant.readyUploadFileMap.put(readyFileKey, uploadFileLog);
+//
+//                  log.debug("文件生成存入缓存:" + file.getName());
+//                  log.info("上报对象编号:" + uploadObject.getObjectNo() + ",生成文件" + file.getName() + "成功");
+//                } else {
+//                  log.info("本地文件已经生成,上报对象编号:" + uploadObject.getObjectNo() + "," + file.getName() + "不再生成了");
+//                }
+//                break;
+//              }
+//            }
+//          }
+//        }
+//      }
+//    } catch (Exception e) {
+//      // 文件复制失败进行告警
+//      String errorInfo = "复制文件[" + file.getName() + "]到上报目录[" + destFileDir + "]失败";
+//      log.error(errorInfo, e);
+//      // 进行告警
+//      String name = file.getName() + "生成失败";
+//      String describe = FileTypeEnum.valueOf(fileType).getMessage();
+//      String solution = "请查看日志异常信息";
+//      super.saveSysAlarm(AlarmTypeEnum.E1, name, describe, errorInfo, solution);
+//    }
+  }
+}

+ 149 - 0
ipfcst-console/src/main/java/com/jiayue/ipfcst/fileupload/service/E63UploadFileService.java

@@ -0,0 +1,149 @@
+package com.jiayue.ipfcst.fileupload.service;
+
+import com.jiayue.ipfcst.common.core.exception.BusinessException;
+import com.jiayue.ipfcst.common.core.util.DateMomentUtil;
+import com.jiayue.ipfcst.common.data.entity.ElectricField;
+import com.jiayue.ipfcst.common.data.entity.ForecastPowerShortTermHis;
+import com.jiayue.ipfcst.common.data.service.uploadfilerule.E63UploadFileRuleService;
+import com.jiayue.ipfcst.console.service.ForecastPowerShortTermService;
+import com.jiayue.ipfcst.console.service.ForecastPowerUltraShortTermService;
+import com.jiayue.ipfcst.fileupload.util.FileUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.time.DateUtils;
+import org.apache.velocity.Template;
+import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.VelocityEngine;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.io.StringWriter;
+import java.math.BigDecimal;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 青海上报文件生成
+ *
+ * @author tl
+ * @version 3.0
+ */
+@Service
+@Slf4j
+public class E63UploadFileService extends BaseUploadFileService {
+
+  private String vmsPath = FileUtil.getResourceBasePath() + "/vms/E63";
+
+  private final VelocityEngine velocityEngine;
+
+  private final ForecastPowerShortTermService forecastPowerShortTermService;
+
+  private final ForecastPowerUltraShortTermService forecastPowerUltraShortTermService;
+
+  private final E63UploadFileRuleService e63UploadFileRuleService;
+
+  public E63UploadFileService(VelocityEngine velocityEngine, ForecastPowerShortTermService forecastPowerShortTermService, ForecastPowerUltraShortTermService forecastPowerUltraShortTermService, E63UploadFileRuleService e63UploadFileRuleService) {
+    this.velocityEngine = velocityEngine;
+    this.forecastPowerShortTermService = forecastPowerShortTermService;
+    this.forecastPowerUltraShortTermService = forecastPowerUltraShortTermService;
+    this.e63UploadFileRuleService = e63UploadFileRuleService;
+  }
+
+  /**
+   * 生成短期预测上报文件。
+   */
+  public void generateE1File(Date date) {
+    List<ElectricField> electricFieldList = null;
+    try {
+      electricFieldList = super.getMultipleStation();
+    } catch (BusinessException e) {
+      log.error("场站获取失败", e);
+    }
+
+    // 循环场站生成短期
+    for (ElectricField electricField : electricFieldList) {
+      String stationCode = electricField.getStationCode();
+      try {
+        Template template = null;
+        // 获取短期模板
+        if (electricField.getElectricFieldTypeEnum().equals("E1")) {
+          template = this.velocityEngine.getTemplate(this.vmsPath + "/DQ.vm");
+        } else {
+          template = this.velocityEngine.getTemplate(this.vmsPath + "/DQ_F.vm");
+        }
+
+        if (template != null) {
+          VelocityContext velocityContext = null;
+          StringWriter writer = null;
+          String fileName = null;
+          File file = null;
+
+          // 获取当前系统时间
+          Date systemDate = new Date();
+          if (date != null) {
+            systemDate = date;
+          }
+
+          // 短期默认天数
+          int dqDays = super.getTranSysParameter("FILE_FORECAST_DAYS", "3", stationCode);
+          // 开始时间
+          Long startTime = DateMomentUtil.getDayStartTime(DateUtils.addDays(systemDate, 1).getTime());
+          // 结束时间(开始加24小时再减去1秒)
+          Long endTime = DateMomentUtil.getDayLastTime(DateUtils.addDays(systemDate, dqDays).getTime());
+          // 生成上报文件名格式
+          fileName = e63UploadFileRuleService.getFileNameRule(electricField, "E1", startTime);
+          if (getFileName(fileName, "E1", stationCode)) {
+            // 查询短期预测功率
+            List<ForecastPowerShortTermHis> forecastPowerShortTermHisList = this.forecastPowerShortTermService.getForecastPowerShortTerm(startTime, endTime, stationCode);
+            // 按照预测时间进行升序
+            forecastPowerShortTermHisList.sort(Comparator.comparing(ForecastPowerShortTermHis::getForecastTime));
+            // 创建上报文件
+            file = super.createTempFile(fileName);
+            // 根据模板生成文件内容
+            velocityContext = new VelocityContext();
+            velocityContext.put("vList", forecastPowerShortTermHisList);
+            //场站标识
+            velocityContext.put("sign", electricFieldInfo.getSign());
+            //场站装机容量
+            velocityContext.put("capacity", electricFieldInfo.getCapacity());
+            //系统当前日期
+            if (electricFieldInfo.getElectricFieldTypeEnum().equals("E1")) {
+              velocityContext.put("currentTime", DateFormatUtils.format(systemDate, "yyyy-MM-dd_" + "00:00:00"));
+            } else {
+              velocityContext.put("currentTime", DateFormatUtils.format(systemDate, "yyyy-MM-dd " + "00:00"));
+            }
+            //上报数据开始日期
+            velocityContext.put("uploadTime", DateFormatUtils.format(startTime, "yyyy-MM-dd_") + "00:00");
+            writer = new StringWriter();
+            template.merge(velocityContext, writer);
+
+            // 将文件复制到上报路径中
+            super.copyUploadFile(writer, file, FileTypeEnum.E1.name(), null, date);
+          }
+        } else {
+          log.error(electricField.getStationCode() + "短期上报模板不存在!");
+        }
+      } catch (Exception e) {
+        log.error(electricField.getStationCode() + "生成短期异常");
+        System.out.println(e.toString());
+      }
+
+    }
+  }
+
+
+  /**
+   * 除法
+   *
+   * @param v1
+   * @param v2
+   * @param scale 精度,到小数点后几位
+   * @return
+   */
+  private BigDecimal div(BigDecimal v1, BigDecimal v2, int scale) {
+    if (scale < 0) {
+      throw new IllegalArgumentException("The scale must be a positive integer or zero");
+    }
+    return v1.divide(v2, scale, BigDecimal.ROUND_HALF_UP);
+  }
+}