فهرست منبع

新整风电总功率预测对比功能节点及页面后端统计

xusl 3 روز پیش
والد
کامیت
d6c084ed90

+ 35 - 0
ipp-ap/src/api/windtotalpowercontrast.js

@@ -0,0 +1,35 @@
+/*
+ *    Copyright (c) 2018-2025, lengleng All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the pig4cloud.com developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: lengleng (wangiegie@gmail.com)
+ */
+
+import request from '@/router/axios'
+
+export function queryCharts(obj) {
+  return request({
+    url: '/windtotalpowercontrast/queryCharts',
+    method: 'post',
+    data: obj
+  })
+}
+
+
+export function queryTableData(obj) {
+  return request({
+    url: '/windtotalpowercontrast/queryTableData',
+    method: 'post',
+    data: obj
+  })
+}

+ 10 - 0
ipp-ap/src/router/page/index.js

@@ -43,6 +43,16 @@ export default [
     }],
   },
   {
+    path: '/idp/data/windtotalpowercontrast',
+    component: Layout,
+    children: [{
+      path: 'index',
+      name: '风电总功率预测对比',
+      component: () =>
+        import ( /* webpackChunkName: "views" */ '@/views/idp/data/windtotalpowercontrast')
+    }],
+  },
+  {
     path: '/idp/data/forecastpowerdata',
     component: Layout,
     children: [{

+ 14 - 0
ipp-ap/src/router/views/index.js

@@ -121,6 +121,20 @@ export default [
       children: [],
       hasChildren: false,
       icon: "",
+      id: "4079",
+      keepAlive: "0",
+      label: "风电总功率预测对比",
+      menuType: "0",
+      name: "总功率预测对比",
+      parentId: "4058",
+      path: "/idp/data/windtotalpowercontrast/index",
+      permission: "",
+      sort: 1,
+      spread: false
+    },{
+      children: [],
+      hasChildren: false,
+      icon: "",
       id: "4080",
       keepAlive: "0",
       label: "预测数据对比",

+ 343 - 0
ipp-ap/src/views/idp/data/windtotalpowercontrast/index.vue

@@ -0,0 +1,343 @@
+<!--
+  -    Copyright (c) 2018-2025, lengleng All rights reserved.
+  -
+  - Redistribution and use in source and binary forms, with or without
+  - modification, are permitted provided that the following conditions are met:
+  -
+  - Redistributions of source code must retain the above copyright notice,
+  - this list of conditions and the following disclaimer.
+  - Redistributions in binary form must reproduce the above copyright
+  - notice, this list of conditions and the following disclaimer in the
+  - documentation and/or other materials provided with the distribution.
+  - Neither the name of the pig4cloud.com developer nor the names of its
+  - contributors may be used to endorse or promote products derived from
+  - this software without specific prior written permission.
+  - Author: lengleng (wangiegie@gmail.com)
+  -->
+<template>
+  <div class="execution">
+    <div class="filter">
+      <div class="startTime" style="display: inline-block">
+        <span class="timeText" style="font-weight: bold;font-size: 14px">&#12288;起始时间:</span>
+        <el-date-picker
+          v-model="startTime"
+          :clearable="false"
+          type="datetime"
+          value-format="timestamp"
+          placeholder="选择日期">
+        </el-date-picker>
+      </div>
+      <div class="endTime" style="display: inline-block">
+        <span class="timeText" style="font-weight: bold;font-size: 14px">&#12288;截止时间:</span>
+        <el-date-picker
+          v-model="endTime"
+          :clearable="false"
+          type="datetime"
+          value-format="timestamp"
+          placeholder="选择日期">
+        </el-date-picker>
+      </div>
+      <div class="timeQuery" style="display: inline-block">
+        &#12288;<el-button size="small" :loading="loading" @click="queryDataForCharts">查询</el-button>
+        <el-button size="small" :loading="loading" @click="exportDataEvent">导出</el-button>
+      </div>
+    </div>
+    <el-tabs type="card" v-model="activeName" @tab-click="handleClick">
+      <el-tab-pane label="预测对比图" name="first">
+        <div style="width: 100%; height: calc(80vh - 50px)" id="echarts"></div>
+      </el-tab-pane>
+      <el-tab-pane label="预测表格" name="second">
+        <vxe-table
+            align="center"
+            :loading="loading"
+            ref="xTable"
+            auto-resize
+            border
+            resizable
+            highlight-current-row
+            show-overflow
+            :data="tableData.slice((currentPage-1)*pageSize,currentPage*pageSize)"
+        >
+          <vxe-table-column
+              v-for="(item, index) in fromHead"
+              :key="index"
+              align="center"
+              :title="item.label"
+              :field="item.field"
+          ></vxe-table-column>
+
+        </vxe-table>
+        <vxe-pager
+            perfect
+            :current-page.sync="currentPage"
+            :page-size.sync="pageSize"
+            :total="total"
+            :page-sizes=[10,50,100]
+            :layouts="['PrevJump', 'PrevPage','JumpNumber', 'NextPage', 'NextJump', 'Sizes', 'FullJump', 'Total']"
+            @page-change="handlePageChange"
+        >
+        </vxe-pager>
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+
+<script>
+import {mapGetters} from 'vuex'
+import * as echarts from 'echarts';
+import {
+  queryCharts
+
+} from '@/api/windtotalpowercontrast'
+import {queryTableData} from "@/api/windtowerstatusdata";
+export default {
+  name: 'windtotalpowercontrast',
+  data() {
+    return {
+      searchForm: {},
+      tableData: [],
+      page: {
+        total: 0, // 总页数
+        currentPage: 1, // 当前页数
+        pageSize: 20 // 每页显示多少条
+      },
+      total: 0, // 总页数
+      currentPage: 1, // 当前页数
+      pageSize: 10, // 每页显示多少条
+      wsChart:null,
+      tableLoading: false,
+      startTime: new Date(new Date().toLocaleDateString()).getTime(),
+      endTime: new Date(new Date().toLocaleDateString()).getTime() + 60 * 60 * 24 * 1000 - 1,
+      stationCode: '',
+      stationType:'',
+      stationList: [],
+      forecastManufactor: '',
+      forecastManufactorList: [],
+      drawData: {datas: [], times: []},
+      resizeKey: 1,
+      activeName: 'first',
+      loading: false,
+      ultraShortData: [],
+      shortData: [],
+      powerStationStatusData: [],
+      timeStamp: [],
+      arrays: [],
+      fromHead: []
+    }
+  },
+  computed: {
+    ...mapGetters(['permissions']),
+  },
+  mounted() {
+  },
+  methods: {
+    queryDataForCharts() {
+      if (this.startTime==null){
+        this.$message.warning('请选择开始时间')
+        return
+      }
+      if (this.endTime==null){
+        this.$message.warning('请选择结束时间')
+        return
+      }
+      const param = new URLSearchParams()
+      param.append('startTime', this.startTime)
+      param.append('endTime', this.endTime)
+
+      queryCharts(param).then((res) => {
+        this.drawData = res.data.data
+        this.fromHead = res.data.data.headList
+        this.tableData = res.data.data.tableList
+        this.total = res.data.data.tableList.length
+
+
+        this.dqDraw(this.drawData)
+      }).catch((error) => {
+        if (!this.tableLoading) {
+          this.loading = false
+        }
+        console.log(error)
+        this.$message.error('查询总功率charts出错' + error)
+      })
+
+    },
+    handleClick() {
+      if (this.activeName === "first") {
+        this.chart = null
+        this.$nextTick(() => {
+          this.dqDraw(this.drawData)
+          this.chart.resize()
+        })
+      } else if (this.activeName === "second") {
+        this.wsChart = null
+
+      }
+    },
+    dqDraw(dqData) {
+      this.wsChart = echarts.init(document.getElementById('echarts'))
+
+      var option = {
+        backgroundColor: 'transparent',
+        animation: false,
+        title: {
+          top: 20,
+          text: '总功率对比',
+          textStyle: {
+            fontWeight: 'normal',
+            fontSize: 16,
+            // color: this.lineColor
+          },
+          left: '1%'
+        },
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            lineStyle: {
+              color: '#57617B'
+            },
+          },
+        },
+        legend: {
+          top: 20,
+          width: '70%',
+          icon: 'rect',
+          itemWidth: 14,
+          itemHeight: 5,
+          itemGap: 13,
+          data: [],
+          right: '4%',
+          textStyle: {
+            fontSize: 12,
+            // color: this.lineColor
+          },
+          selected: {}
+        },
+        dataZoom: [{
+          show: true,
+          realtime: false,
+          start: 0,
+          end: 100,
+          left: "15%",
+          right: "15%",
+          textStyle: {
+            // color: this.lineColor
+          }
+        }, {
+          type: 'inside',
+        }],
+        grid: {
+          top: 100,
+          left: '2%',
+          right: '2%',
+          bottom: '10%',
+          containLabel: true
+        },
+        xAxis: [{
+          type: 'category',
+          boundaryGap: false,
+          axisLine: {
+            lineStyle: {
+              // color: this.lineColor
+            }
+          },
+          data: []
+        }],
+        yAxis: [{
+          type: 'value',
+          name: 'MW',
+          axisTick: {
+            show: false
+          },
+          axisLine: {
+            lineStyle: {
+              // color: this.lineColor
+            }
+          },
+
+          axisLabel: {
+            margin: 10,
+            textStyle: {
+              fontSize: 14,
+              // color: this.lineColor
+            },
+            formatter: '{value}',
+          },
+          splitLine: {
+            lineStyle: {
+              color: '#57617B'
+            }
+          }
+        }],
+        series: []
+      }
+      option.xAxis[0].data = dqData.time
+      var index = 0;
+
+      for (var key in dqData.chart) {
+        option.legend.data.push(key)
+        var sValue = {
+          name: '',
+          type: 'line',
+          smooth: false,
+          symbol: 'circle',
+          symbolSize: 5,
+          showSymbol: false,
+          lineStyle: {
+            normal: {
+              width: 2
+            }
+          },
+          itemStyle: {},
+          data: []
+        }
+        sValue.name = key
+        sValue.data = dqData.chart[key]
+        // sValue.itemStyle = this.lineStyle[index].itemStyle
+        sValue.connectNulls = true
+        option.series.push(sValue)
+        index++;
+      }
+      this.wsChart.setOption(option, true)
+      var _this = this
+      window.addEventListener("resize", function () {
+        _this.wsChart.resize();
+      });
+    },
+    exportDataEvent() {
+      if (this.startTime==null){
+        this.$message.warning('请选择开始时间')
+        return
+      }
+      if (this.endTime==null){
+        this.$message.warning('请选择结束时间')
+        return
+      }
+
+      this.$axios.get("/windtotalpowercontrast/exportDataEvent/" + this.startTime + "/" + this.endTime, {
+        responseType: 'blob'// 用于解决中文乱码
+      }).then((response) => {
+        this.loading = false
+      }).catch((error) => {
+        this.loading = false
+        this.$message.error('导出失败' + error)
+      })
+    },
+
+    getCapacity(param) {
+      return new Promise(function (resolve, reject) {
+        getCapacity(param).then(response => {
+          resolve(response.data.data)
+        })
+      })
+    },
+    handlePageChange({currentPage, pageSize}) {
+      this.currentPage = currentPage;//当前页
+      this.pageSize = pageSize//每页显示的条数
+    },
+    refreshChange() {
+      // this.getCompositeData()
+      this.getStationCode()
+    }
+  }
+}
+</script>

+ 264 - 0
ipp-idp/src/main/java/com/jiayue/ipp/idp/controller/WindtotalpowercontrastController.java

@@ -0,0 +1,264 @@
+package com.jiayue.ipp.idp.controller;
+
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.poi.excel.ExcelUtil;
+import cn.hutool.poi.excel.ExcelWriter;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.jiayue.ipp.common.data.entity.ElectricField;
+import com.jiayue.ipp.common.data.entity.ForecastPowerShortTerm;
+import com.jiayue.ipp.idp.service.ElectricFieldService;
+import com.jiayue.ipp.idp.service.ForecastPowerShortTermService;
+import com.jiayue.ipp.idp.util.DateTimeUtil;
+import com.jiayue.ipp.idp.util.R;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang.time.DateFormatUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+/**
+ * idp_wind_tower_status_data
+ *
+ * @author whc
+ * @date 2022-03-18 15:50:05
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/windtotalpowercontrast")
+@Api(value = "windtotalpowercontrast", tags = "idp_wind_tower_status_data管理")
+public class WindtotalpowercontrastController {
+
+    private final ForecastPowerShortTermService forecastPowerShortTermService;
+    private final ElectricFieldService electricFieldService;
+
+
+    @ApiOperation(value = "通过条件查询", notes = "通过条件查询")
+    @PostMapping("/queryCharts")
+    public R queryCharts(
+                         Long startTime,
+                         Long endTime
+                         ) throws Exception {
+
+        Date st = DateTimeUtil.getMomentTimeFor15Minute(startTime);
+        Date et = DateTimeUtil.getMomentTimeFor15Minute(endTime);
+        // 封装列表头信息
+        List headList = new ArrayList();
+        // 封装表格体数据
+        List<Map<String,Object>> tableList = new ArrayList();
+        Map<String,String> timeHeadMap = new HashMap<>();
+        timeHeadMap.put("field", "时间");
+        timeHeadMap.put("label", "时间");
+        headList.add(timeHeadMap);
+
+        // 获取所有站信息
+        List<ElectricField> allElectricField = electricFieldService.query().list();
+        allElectricField.sort(Comparator.comparing(ElectricField::getName));
+        QueryWrapper<ForecastPowerShortTerm> wrapper = new QueryWrapper<>();
+        wrapper.between("forecast_time", st, et);
+        wrapper.ne("forecast_manufactor", "SYJY");
+        List<ForecastPowerShortTerm> forecastPowerShortTermList = forecastPowerShortTermService.list(wrapper);
+        Map<String, Map<String, BigDecimal>> map = new HashMap<>();
+//        List<Map<String,List<BigDecimal>>> chartList = new ArrayList<>();
+        LinkedHashMap<String, List<BigDecimal>> everyMap = new LinkedHashMap<>();
+        Long momentTime = 15 * 60 * 1000L; // 15分钟一个时刻
+        for (ElectricField electricField:allElectricField){
+            // 动态添加表格头的场站名称
+            Map<String,String> tableHeadMap = new HashMap<>();
+            tableHeadMap.put("field", electricField.getName());
+            tableHeadMap.put("label", electricField.getName());
+            headList.add(tableHeadMap);
+
+            // 再找出每个站的短期实时
+            List<ForecastPowerShortTerm> shortTermList = forecastPowerShortTermList.stream().filter(w -> w.getStationCode().equals(electricField.getStationCode())).collect(Collectors.toList());
+            Map<String, BigDecimal> shortTermMap = new HashMap<>();
+
+            List<BigDecimal> valuePointList = new ArrayList<>();
+            if (!shortTermList.isEmpty()){
+                // 按时间分组
+                for (ForecastPowerShortTerm f:shortTermList){
+                    shortTermMap.put(f.getForecastTime().getTime() + "", f.getFpValue());
+                }
+            }
+            for (Long tempTime = startTime; tempTime <= endTime; tempTime = tempTime + momentTime) {
+                valuePointList.add(shortTermMap.get(tempTime.toString())!=null?shortTermMap.get(tempTime.toString()):new BigDecimal(0));
+            }
+            everyMap.put(electricField.getName(), valuePointList);
+//            chartList.add(everyMap);
+            map.put(electricField.getName(), shortTermMap);
+        }
+        Map<String,String> zglHeadMap = new HashMap<>();
+        zglHeadMap.put("field", "总功率");
+        zglHeadMap.put("label", "总功率");
+        headList.add(zglHeadMap);
+
+        // 页面x轴时间
+        List<String> timeList = new ArrayList<>();
+        List<BigDecimal> totalPowerValuePointList = new ArrayList<>();
+        for (Long tempTime = startTime; tempTime <= endTime; tempTime = tempTime + momentTime) {
+            Map<String,Object> map1 = new HashMap<>();
+            // 应用列表
+            map1.put("时间", DateFormatUtils.format(tempTime, "yyyy-MM-dd HH:mm"));
+            // 应用图表
+            timeList.add(DateFormatUtils.format(tempTime, "yyyy-MM-dd HH:mm"));
+            // 定义总功率每个点位值变量
+            BigDecimal totalPower = new BigDecimal(0);
+
+            for (Map.Entry<String, Map<String, BigDecimal>> entry : map.entrySet()) {
+                Map<String, BigDecimal> valueMap = entry.getValue();
+                if (valueMap.get(tempTime + "")!=null){
+                    totalPower = totalPower.add(valueMap.get(tempTime + ""));
+                    // 封装表格体数据每个场站的,应用列表
+                    map1.put(entry.getKey(), valueMap.get(tempTime + ""));
+                }
+                else{
+                    // 应用列表
+                    map1.put(entry.getKey(), new BigDecimal(0));
+                }
+            }
+            // 每个时间点总功率和,应用列表
+            map1.put("总功率", totalPower);
+            tableList.add(map1);
+            // 应用图表
+            totalPowerValuePointList.add(totalPower);
+        }
+        // 应用图表
+        everyMap.put("总功率",totalPowerValuePointList);
+
+        Map<String,Object> resultMap = new HashMap<>();
+        resultMap.put("time",timeList);
+        resultMap.put("chart",everyMap);
+        resultMap.put("headList",headList);
+        resultMap.put("tableList",tableList);
+        return R.ok(resultMap);
+    }
+
+    @GetMapping(value = {"/exportDataEvent/{startTime}/{endTime}","/exportDataEvent/{startTime}/{endTime}" })
+    public R exportDataEvent(
+            @PathVariable("startTime") Long startTime,
+            @PathVariable("endTime") Long endTime,
+            HttpServletResponse response) {
+
+        try {
+            Date st = DateTimeUtil.getMomentTimeFor15Minute(startTime);
+            Date et = DateTimeUtil.getMomentTimeFor15Minute(endTime);
+            // 封装列表头信息
+            List<Map<String,String>> headList = new ArrayList();
+            // 封装表格体数据
+            List<Map<String,Object>> tableList = new ArrayList();
+            Map<String,String> timeHeadMap = new HashMap<>();
+            timeHeadMap.put("field", "时间");
+            timeHeadMap.put("label", "时间");
+            headList.add(timeHeadMap);
+
+            // 获取所有站信息
+            List<ElectricField> allElectricField = electricFieldService.query().list();
+            allElectricField.sort(Comparator.comparing(ElectricField::getName));
+            QueryWrapper<ForecastPowerShortTerm> wrapper = new QueryWrapper<>();
+            wrapper.between("forecast_time", st, et);
+            wrapper.ne("forecast_manufactor", "SYJY");
+            List<ForecastPowerShortTerm> forecastPowerShortTermList = forecastPowerShortTermService.list(wrapper);
+            Map<String, Map<String, BigDecimal>> map = new HashMap<>();
+            LinkedHashMap<String, List<BigDecimal>> everyMap = new LinkedHashMap<>();
+            Long momentTime = 15 * 60 * 1000L; // 15分钟一个时刻
+            for (ElectricField electricField:allElectricField){
+                // 动态添加表格头的场站名称
+                Map<String,String> tableHeadMap = new HashMap<>();
+                tableHeadMap.put("field", electricField.getName());
+                tableHeadMap.put("label", electricField.getName());
+                headList.add(tableHeadMap);
+
+                // 再找出每个站的短期实时
+                List<ForecastPowerShortTerm> shortTermList = forecastPowerShortTermList.stream().filter(w -> w.getStationCode().equals(electricField.getStationCode())).collect(Collectors.toList());
+                Map<String, BigDecimal> shortTermMap = new HashMap<>();
+                if (!shortTermList.isEmpty()){
+                    // 按时间分组
+                    for (ForecastPowerShortTerm f:shortTermList){
+                        shortTermMap.put(f.getForecastTime().getTime() + "", f.getFpValue());
+                    }
+                }
+                map.put(electricField.getName(), shortTermMap);
+            }
+            Map<String,String> zglHeadMap = new HashMap<>();
+            zglHeadMap.put("field", "总功率");
+            zglHeadMap.put("label", "总功率");
+            headList.add(zglHeadMap);
+
+            // 页面x轴时间
+            for (Long tempTime = startTime; tempTime <= endTime; tempTime = tempTime + momentTime) {
+                Map<String,Object> map1 = new HashMap<>();
+                // 应用列表
+                map1.put("时间", DateFormatUtils.format(tempTime, "yyyy-MM-dd HH:mm"));
+                // 定义总功率每个点位值变量
+                BigDecimal totalPower = new BigDecimal(0);
+
+                for (Map.Entry<String, Map<String, BigDecimal>> entry : map.entrySet()) {
+                    Map<String, BigDecimal> valueMap = entry.getValue();
+                    if (valueMap.get(tempTime + "")!=null){
+                        totalPower = totalPower.add(valueMap.get(tempTime + ""));
+                        // 封装表格体数据每个场站的,应用列表
+                        map1.put(entry.getKey(), valueMap.get(tempTime + ""));
+                    }
+                    else{
+                        // 应用列表
+                        map1.put(entry.getKey(), new BigDecimal(0));
+                    }
+                }
+                // 每个时间点总功率和,应用列表
+                map1.put("总功率", totalPower);
+                tableList.add(map1);
+
+            }
+
+            ExcelWriter writer = ExcelUtil.getWriter(true);
+            writer.renameSheet(0, "风电总功率对比");
+            List<String> header = new ArrayList();
+            List<String> headFieldName = new ArrayList();
+            for (Map<String,String> headMap:headList){
+                header.add(headMap.get("label").toString());
+                headFieldName.add(headMap.get("field").toString());
+            }
+            List<List<String>> rowHeather = CollUtil.newArrayList();
+            rowHeather.add(header);
+            for (Map<String,Object> contentMap : tableList) {
+                List<String> rowList = new ArrayList();
+                for (String fieldStr:headFieldName){
+                    if (contentMap.get(fieldStr)==null){
+                        rowList.add("");
+                    }
+                    else{
+                        rowList.add(contentMap.get(fieldStr).toString());
+                    }
+                }
+                rowHeather.add(rowList);
+            }
+
+            writer.write(rowHeather, true);
+            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+            String fileName = "风电总功率对比" + simpleDateFormat.format(startTime) + "至" + simpleDateFormat.format(endTime) + ".xlsx";
+            response.setContentType("application/x-msdownload;charset=utf-8");
+            response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
+            ServletOutputStream out = null;
+            out = response.getOutputStream();
+            writer.flush(out, true);
+            // 关闭writer,释放内存
+            writer.close();
+            //此处记得关闭输出Servlet流
+            IoUtil.close(out);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return R.ok();
+    }
+}

+ 1 - 0
ipp-idp/src/main/java/com/jiayue/ipp/idp/service/ForecastPowerShortTermService.java

@@ -25,4 +25,5 @@ public interface ForecastPowerShortTermService extends IService<ForecastPowerSho
     List<ForecastPowerShortTerm> findByStationCodeAndStartTimeAndEndTime(String stationCode, Date startTime, Date endTime);
 
     List<ForecastPowerShortTerm> findByStationCodeAndStartTimeAndEndTimeAndForecastManufactor(String stationCode, Date startTime, Date endTime,String forecastManufactor);
+
 }