|
@@ -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();
|
|
|
|
+ }
|
|
|
|
+}
|