DataProcessService.java 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package com.gyee.power.fitting.service.custom.curve;
  2. import com.gyee.power.fitting.common.alg.PowerProcessALG;
  3. import com.gyee.power.fitting.common.alg.WindDirectionALG;
  4. import com.gyee.power.fitting.common.config.GyeeConfig;
  5. import com.gyee.power.fitting.common.constants.Constants;
  6. import com.gyee.power.fitting.common.spring.InitialRunner;
  7. import com.gyee.power.fitting.common.util.FileUtil;
  8. import com.gyee.power.fitting.common.util.PowerFittingUtil;
  9. import com.gyee.power.fitting.common.util.SnowFlakeUtil;
  10. import com.gyee.power.fitting.model.ProBasicModelPower;
  11. import com.gyee.power.fitting.model.ProEconPowerFittingAnalySis;
  12. import com.gyee.power.fitting.model.anno.AnnotationTool;
  13. import com.gyee.power.fitting.model.anno.FixedVo;
  14. import com.gyee.power.fitting.model.custom.PowerPointData;
  15. import com.gyee.power.fitting.model.custom.TableTitle;
  16. import com.gyee.power.fitting.service.ProEconPowerFittingAnalySisService;
  17. import org.apache.commons.lang3.StringUtils;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.stereotype.Service;
  20. import java.util.ArrayList;
  21. import java.util.HashMap;
  22. import java.util.List;
  23. import java.util.Map;
  24. import java.util.stream.Collectors;
  25. @Service
  26. public class DataProcessService {
  27. @Autowired
  28. private GyeeConfig config;
  29. @Autowired
  30. private ProEconPowerFittingAnalySisService powerService;
  31. /**
  32. * 数据预处理
  33. *
  34. * @param ids 预处理数据的ID
  35. * @param maxs 最大风速
  36. * @param mins 最小风速
  37. * @param maxp 最大功率
  38. * @param minp 最小功率
  39. * @param isfbw 是否并网
  40. * @param isfhl 是否合理值
  41. * @param isbw 并网后10分钟
  42. * @param istj 停机前10分钟
  43. * @param isglpc 功率曲线偏差
  44. * @param isqfh 是否欠符合
  45. * @param qfhdj 欠符合等级
  46. * @return
  47. */
  48. public void dataProcess(List<String> ids, Double maxs, Double mins, Double maxp, Double minp, Boolean isfbw,
  49. Boolean isfhl, Boolean isbw, Boolean istj, Boolean isglpc, Boolean isqfh, Integer qfhdj) {
  50. ids.forEach(id -> {
  51. ProEconPowerFittingAnalySis obj = powerService.selectItemById(id);
  52. if (obj == null)
  53. return;
  54. /** 读取csv数据 转换成对象数组 **/
  55. List<PowerPointData> eis = new ArrayList<>();
  56. List<String> list = FileUtil.readFile(obj.getPath(), true);
  57. for (int i = 1; i < list.size(); i++) {
  58. eis.add(new PowerPointData(list.get(i).split(","), false));
  59. }
  60. /** 风速 -> 保证功率 来自数据库 **/
  61. List<ProBasicModelPower> modelPowerList = InitialRunner.modelPowerDetailNewMap.get(InitialRunner.wtNewMap.get(obj.getWindturbineId()).getModelId());
  62. Map<Double, Double> modelPowerMap = modelPowerList.stream().collect(Collectors.toMap(ProBasicModelPower::getSpeed, ProBasicModelPower::getEnsurePower));
  63. /** 数据预处理 **/
  64. List<PowerPointData> data = PowerProcessALG.dataProcess(eis, modelPowerMap, maxs, mins, maxp, minp, isfbw, isfhl, isbw, istj, isglpc, isqfh, qfhdj);
  65. /** 静风频率 **/
  66. List<Double> ls = WindDirectionALG.frequency(data.stream().map(PowerPointData::getSpeed).collect(Collectors.toList()), 3);
  67. double frequency = ls.get(0);
  68. double speed = ls.get(1);
  69. String content = assemble(data);
  70. String fileName = config.getFilePathProcess() + obj.getStation() + "_" + obj.getCode() + "_" + SnowFlakeUtil.generateIdL() / 100000 + ".csv";
  71. boolean flag = FileUtil.writeFile(fileName, content);
  72. if (flag) { // TODO 保存数据库
  73. obj.setPath(fileName);
  74. obj.setFrequency(frequency);
  75. obj.setSpeedavg(speed);
  76. obj.setType(Constants.DATA_PROCESS);
  77. powerService.insertItem(obj);
  78. }
  79. System.out.println("功率曲线拟合数据预处理完成:" + obj.getWindturbineId());
  80. });
  81. }
  82. /**
  83. * 数据预处理模块展示 tree
  84. *
  85. * @return
  86. */
  87. public List<Object> dataProcessTree() {
  88. List<ProEconPowerFittingAnalySis> list = powerService.selectList(Constants.DATA_PROCESS);
  89. List<Object> ls = PowerFittingUtil.powerDataTree(list, Constants.DATA_PROCESS);
  90. return ls;
  91. }
  92. /**
  93. * 组装表格数据
  94. * @param id
  95. * @return
  96. */
  97. public Map<String, Object> dataProcessShow(String id){
  98. Map<String, Object> map = new HashMap<>();
  99. /** 添加标题 **/
  100. List<FixedVo> fxList = AnnotationTool.getFixedVoList(PowerPointData.class);
  101. List<TableTitle> lt = fxList.stream().map(d -> new TableTitle(d.getName(), d.getDes())).collect(Collectors.toList());
  102. /** 添加内容 读取前500行 **/
  103. List<PowerPointData> list = new ArrayList<>();
  104. ProEconPowerFittingAnalySis obj = powerService.selectItemById(id);
  105. List<String> ls = FileUtil.readFile(obj.getPath(), false);
  106. for (int i = 1; i < ls.size(); i++){
  107. String[] split = ls.get(i).split(",");
  108. PowerPointData data = new PowerPointData(split, true);
  109. list.add(data);
  110. }
  111. map.put("title", lt);
  112. map.put("data", list);
  113. return map;
  114. }
  115. private String assemble(List<PowerPointData> list) {
  116. StringBuilder sb = setTitle();
  117. for (PowerPointData obj : list){
  118. List<FixedVo> ls = AnnotationTool.getValueList(obj);
  119. String data = ls.stream().filter(f -> !StringUtils.isEmpty(f.getRemark())).map(FixedVo::getKey).collect(Collectors.joining(","));
  120. sb.append(data).append("\n");
  121. }
  122. return sb.toString();
  123. }
  124. private StringBuilder setTitle() {
  125. StringBuilder sb = new StringBuilder();
  126. List<FixedVo> list = AnnotationTool.getFixedVoList(PowerPointData.class);
  127. String columnName = list.stream().map(FixedVo::getDes).collect(Collectors.joining(","));
  128. sb.append(columnName).append("\n");
  129. return sb;
  130. }
  131. }