FiveLossService.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. package com.gyee.runeconomy.service.fiveloss;
  2. import cn.hutool.core.date.DateUtil;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.gyee.common.vo.benchmark.FjjxbVo;
  5. import com.gyee.runeconomy.dto.FiveLoss.AnnotationTool;
  6. import com.gyee.runeconomy.dto.FiveLoss.FixedVo;
  7. import com.gyee.runeconomy.dto.FiveLoss.TableTitle;
  8. import com.gyee.runeconomy.dto.FiveLoss.exception.CustomException;
  9. import com.gyee.runeconomy.dto.result.PowerPointData;
  10. import com.gyee.runeconomy.dto.result.ResultCode;
  11. import com.gyee.runeconomy.model.auto.ProEconEquipmentInfoDay1;
  12. import com.gyee.runeconomy.service.auto.IProEconEquipmentInfoDay1Service;
  13. import lombok.extern.slf4j.Slf4j;
  14. import lombok.val;
  15. import org.springframework.stereotype.Service;
  16. import javax.annotation.Resource;
  17. import java.math.BigDecimal;
  18. import java.math.RoundingMode;
  19. import java.util.*;
  20. import java.util.stream.Collectors;
  21. @Slf4j
  22. @Service
  23. public class FiveLossService {
  24. @Resource
  25. private ProEconPowerFittingAnalySisService analysisService;
  26. @Resource
  27. private IProEconEquipmentInfoDay1Service equipmentInfoDay1Service;
  28. @Resource
  29. private ITurbineInfoDayService turbineInfoDayService;
  30. /**
  31. * 损失电量计算 eg: 1.5MW 一小时发电:1500kWh 一分钟发电:1500/60 == 25kW
  32. *
  33. * @param ztmxData 状态明细
  34. * @param zsglData 设备的理论功率
  35. * @param interval 原始数据的间隔
  36. * @param status 风机当前状态
  37. * @return
  38. */
  39. private double generalLoss(List<PowerPointData> ztmxData, Map<Double, Double> zsglData, int interval, double status) {
  40. double ssdl = 0.0;
  41. List<PowerPointData> pointData = ztmxData.stream().filter(zt -> zt.getMxzt() == status).collect(Collectors.toList());
  42. if (status == 0.0 || status == 2.0 || status == 3.0 || status == 4.0 || status == 9.0 || status == 10.0 || status == 11.0) {
  43. for (PowerPointData obj : pointData) {
  44. double speed = new BigDecimal(obj.getSpeed()).setScale(2, RoundingMode.FLOOR).doubleValue();
  45. double zsgl = null == zsglData.get(speed) ? 0:zsglData.get(speed);
  46. double power = obj.getPower();
  47. double temp = (zsgl - power) > 0 ? zsgl - power : 0;
  48. ssdl = ssdl + (temp / 60) * (interval / 60);
  49. }
  50. } else {
  51. for (PowerPointData obj : pointData) {
  52. if (obj.getSpeed() < 3.0) continue;
  53. double speed = new BigDecimal(obj.getSpeed()).setScale(2, RoundingMode.FLOOR).doubleValue();
  54. double zsgl = null == zsglData.get(speed) ? 0:zsglData.get(speed);
  55. ssdl = ssdl + (zsgl / 60) * (interval / 60);
  56. }
  57. }
  58. //理论发电量 status < 0
  59. if (status < 0){
  60. for (PowerPointData obj : ztmxData) {
  61. if (obj.getSpeed() < 3.0) continue;
  62. double speed = new BigDecimal(obj.getSpeed()).setScale(2, RoundingMode.FLOOR).doubleValue();
  63. double zsgl = null == zsglData.get(speed) ? 0:zsglData.get(speed);
  64. ssdl = ssdl + (zsgl / 60) * (interval / 60);
  65. }
  66. }
  67. return ssdl > 0 ? ssdl : 0;
  68. }
  69. //新的五损计算方法
  70. //1.思路整理 实际电量、计划检修损失电量、非计划检修损失电量、限电损失电量、受累损失电量、性能损失电量、理论发电量
  71. //计算思路 实际电量 当前功率 * 时间 = 电量
  72. //计划检修损失电量
  73. /**
  74. * 使用文件,通过自诉案功率计算五损数据
  75. * @param ids 准备的数据ID
  76. */
  77. public Map<String, Object> fiveLossCalByZSGL(String ids) {
  78. Map<String, Object> promise = null;
  79. try {
  80. log.info("======风机绩效榜计算开始.............");
  81. promise = new HashMap<>();
  82. List<FjjxbVo> result = new ArrayList<>();
  83. Map<String, Map<Double, Double>> zsglmap = InitialRunner.zsllglNewMap;
  84. List<ProEconPowerFittingAnalySis> analyses = analysisService.selectListByIds(ids);
  85. if (analyses.isEmpty()){
  86. log.info("======风机榜效帮计算结束,数据为空.............");
  87. throw new CustomException(ResultCode.ERROR);
  88. }
  89. for (ProEconPowerFittingAnalySis p : analyses) {
  90. List<String> content = FileUtil.readFile(p.getPath(), true);
  91. if (content.isEmpty() || zsglmap.isEmpty() || zsglmap.get(p.getWindturbineId()) == null){
  92. log.info("======风机榜效帮计算结束," + p.getWindturbineId() + "文件内容或当前风机的自算功率为空.............");
  93. continue;
  94. }
  95. log.info("======风机绩效榜计算:" + p.getWindturbineId());
  96. double llfdl = 0.0; //理论发电量
  97. double rfdl = 0.0; //日发电量
  98. double jhjxssdl = 0.0;//计划检修损失电量
  99. double fjhjxssdl =0.0;//非计划检修电量
  100. double xdssdl = 0.0;//限电损失电量
  101. double slssdl = 0.0;//受累损失电量
  102. double xnssdl = 0.0;//性能损失电量
  103. double speed = 0.0;//风速
  104. content.remove(0); //去掉标题栏
  105. int count = 86400 / p.getInterp(); //一天86400s 一天的条数
  106. List<List<String>> coll = CollectUtil.groupListByQty(content, count);
  107. for (List<String> ls : coll) {
  108. List<PowerPointData> pdl = ls.stream().map(mp -> new PowerPointData(mp.split(","), false)).collect(Collectors.toList());
  109. double lldl = generalLoss(pdl, zsglmap.get(p.getWindturbineId()), p.getInterp(), -1); //理论发电量
  110. double dj = generalLoss(pdl, zsglmap.get(p.getWindturbineId()), p.getInterp(), 0); //待机
  111. double sdtj = generalLoss(pdl, zsglmap.get(p.getWindturbineId()), p.getInterp(), 1); //手动停机
  112. double zcfd = generalLoss(pdl, zsglmap.get(p.getWindturbineId()), p.getInterp(), 2); //正常发电
  113. double xdss = generalLoss(pdl, zsglmap.get(p.getWindturbineId()), p.getInterp(), 5); //限电损失电量
  114. double qxjcl = generalLoss(pdl, zsglmap.get(p.getWindturbineId()), p.getInterp(), 3); //缺陷降出力损失电量
  115. double xdjcl = generalLoss(pdl, zsglmap.get(p.getWindturbineId()), p.getInterp(), 4); //限电降出力损失电量
  116. double cnsltj = generalLoss(pdl, zsglmap.get(p.getWindturbineId()), p.getInterp(), 7); //场内受累停机损失电量
  117. double cnsljx = generalLoss(pdl, zsglmap.get(p.getWindturbineId()), p.getInterp(), 9); //场内受累检修损失电量
  118. double dwsl = generalLoss(pdl, zsglmap.get(p.getWindturbineId()), p.getInterp(), 10); //电网受累损失电量
  119. double hjsl = generalLoss(pdl, zsglmap.get(p.getWindturbineId()), p.getInterp(), 11); //环境受累损失电量
  120. double gzss = generalLoss(pdl, zsglmap.get(p.getWindturbineId()), p.getInterp(), 6); //故障损失电量
  121. double tjjx = generalLoss(pdl, zsglmap.get(p.getWindturbineId()), p.getInterp(), 8); //停机检修
  122. llfdl += lldl;
  123. jhjxssdl += (tjjx + cnsljx);
  124. fjhjxssdl += (gzss + cnsltj);
  125. xdssdl += (xdjcl + xdss);
  126. slssdl += (dwsl + hjsl);
  127. xnssdl += (dj + sdtj + zcfd + qxjcl);
  128. rfdl += pdl.get(pdl.size() - 1).getDl();
  129. speed += pdl.stream().mapToDouble(PowerPointData::getSpeed).sum();
  130. }
  131. FjjxbVo vo = new FjjxbVo();
  132. vo.setId(p.getWindturbineId());
  133. vo.setName(p.getCode());
  134. vo.setLlfdl(new BigDecimal(llfdl).setScale(2, RoundingMode.FLOOR).doubleValue());
  135. vo.setSjfdl(new BigDecimal(rfdl).setScale(2, RoundingMode.FLOOR).doubleValue());
  136. vo.setJhjx(new BigDecimal(jhjxssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
  137. vo.setFjhjx(new BigDecimal(fjhjxssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
  138. vo.setXd(new BigDecimal(xdssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
  139. vo.setXn(new BigDecimal(xnssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
  140. vo.setSl(new BigDecimal(slssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
  141. vo.setSpeed(new BigDecimal(speed/content.size()).setScale(2, RoundingMode.FLOOR).doubleValue());
  142. vo.setFnlly(llfdl > 0 ? new BigDecimal(rfdl / llfdl).setScale(2, RoundingMode.FLOOR).doubleValue() : 0);
  143. result.add(vo);
  144. }
  145. log.info("======风机榜效帮计算结束.............");
  146. result.stream().sorted(Comparator.comparing(FjjxbVo::getId));
  147. /** 添加标题 **/
  148. val fxList = AnnotationTool.getFixedVoList(FjjxbVo.class);
  149. List<TableTitle> lt = fxList.stream().map(d -> new TableTitle(d.getName(), d.getDes())).collect(Collectors.toList());
  150. promise.put("title", lt);
  151. promise.put("data", result);
  152. } catch (Exception e) {
  153. e.printStackTrace();
  154. }
  155. return promise;
  156. }
  157. public Map<String, Object> fiveLossCalByZSGL2(String ids) {
  158. Map<String, Object> promise = null;
  159. try {
  160. log.info("======风机绩效榜计算开始.............");
  161. promise = new HashMap<>();
  162. List<FjjxbVo> result = new ArrayList<>();
  163. Map<String, Map<Double, Double>> zsglmap = InitialRunner.zsllglNewMap;
  164. List<ProEconPowerFittingAnalySis> analyses = analysisService.selectListByIds(ids);
  165. if (analyses.isEmpty()){
  166. log.info("======风机榜效帮计算结束,数据为空.............");
  167. throw new CustomException(ResultCode.ERROR);
  168. }
  169. QueryWrapper<ProEconEquipmentInfoDay1> wrapper = new QueryWrapper<>();
  170. String[] split = analyses.get(0).getTime().split("-");
  171. Date start = DateUtil.parse(split[0]).toJdkDate();
  172. Date end = DateUtil.parse(split[1]).toJdkDate();
  173. wrapper.lambda().between(ProEconEquipmentInfoDay1::getRecordDate, start, end);
  174. List<ProEconEquipmentInfoDay1> list = equipmentInfoDay1Service.list(wrapper);
  175. Map<String, List<ProEconEquipmentInfoDay1>> collect = list.stream().collect(Collectors.groupingBy(ProEconEquipmentInfoDay1::getWindturbineId));
  176. List<ProEconEquipmentInfoDay1> day1s;
  177. for (ProEconPowerFittingAnalySis p : analyses) {
  178. day1s = collect.get(p.getWindturbineId());
  179. double llfdl = day1s.stream().mapToDouble(ProEconEquipmentInfoDay1::getRllfdl).sum(); //理论发电量
  180. double rfdl = day1s.stream().mapToDouble(ProEconEquipmentInfoDay1::getRfdl).sum(); //日发电量
  181. double jhjxssdl = day1s.stream().mapToDouble(ProEconEquipmentInfoDay1::getRjxssdl).sum();//计划检修损失电量
  182. double fjhjxssdl = day1s.stream().mapToDouble(ProEconEquipmentInfoDay1::getRgzssdl).sum();//非计划检修电量
  183. double xdssdl = day1s.stream().mapToDouble(ProEconEquipmentInfoDay1::getRxdtjssdl).sum()+
  184. day1s.stream().mapToDouble(ProEconEquipmentInfoDay1::getRxdjclssdl).sum();//限电损失电量
  185. double slssdl = 0.0;//受累损失电量
  186. double xnssdl = day1s.stream().mapToDouble(ProEconEquipmentInfoDay1::getRxnssdl).sum();//性能损失电量
  187. double speed = day1s.stream().mapToDouble(ProEconEquipmentInfoDay1::getRpjfs).average().orElse(0.0);//风速
  188. FjjxbVo vo = new FjjxbVo();
  189. vo.setId(p.getWindturbineId());
  190. vo.setName(p.getCode());
  191. vo.setLlfdl(new BigDecimal(llfdl).setScale(2, RoundingMode.FLOOR).doubleValue());
  192. vo.setSjfdl(new BigDecimal(rfdl).setScale(2, RoundingMode.FLOOR).doubleValue());
  193. vo.setJhjx(new BigDecimal(jhjxssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
  194. vo.setFjhjx(new BigDecimal(fjhjxssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
  195. vo.setXd(new BigDecimal(xdssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
  196. vo.setXn(new BigDecimal(xnssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
  197. vo.setSl(new BigDecimal(slssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
  198. vo.setSpeed(new BigDecimal(speed).setScale(2, RoundingMode.FLOOR).doubleValue());
  199. vo.setFnlly(llfdl > 0 ? new BigDecimal(rfdl / llfdl).setScale(2, RoundingMode.FLOOR).doubleValue() : 0);
  200. result.add(vo);
  201. }
  202. log.info("======风机榜效帮计算结束.............");
  203. result.stream().sorted(Comparator.comparing(FjjxbVo::getId));
  204. /** 添加标题 **/
  205. List<FixedVo> fxList = AnnotationTool.getFixedVoList(FjjxbVo.class);
  206. List<TableTitle> lt = fxList.stream().map(d -> new TableTitle(d.getName(), d.getDes())).collect(Collectors.toList());
  207. promise.put("title", lt);
  208. promise.put("data", result);
  209. } catch (Exception e) {
  210. e.printStackTrace();
  211. }
  212. return promise;
  213. }
  214. public Map<String, Object> fiveLossCalByZSGL3(String ids) {
  215. Map<String, Object> promise = null;
  216. try {
  217. log.info("======风机绩效榜计算开始.............");
  218. promise = new HashMap<>();
  219. List<FjjxbVo> result = new ArrayList<>();
  220. // Map<String, Map<Double, Double>> zsglmap = InitialRunner.zsllglNewMap;
  221. List<ProEconPowerFittingAnalySis> analyses = analysisService.selectListByIds(ids);
  222. if (analyses.isEmpty()){
  223. log.info("======风机榜效帮计算结束,数据为空.............");
  224. throw new CustomException(ResultCode.ERROR);
  225. }
  226. QueryWrapper<TurbineInfoDay> wrapper = new QueryWrapper<>();
  227. String[] split = analyses.get(0).getTime().split("-");
  228. Date start = DateUtil.parse(split[0]).toJdkDate();
  229. Date end = DateUtil.parse(split[1]).toJdkDate();
  230. wrapper.lambda().between(TurbineInfoDay::getRecordDate, start, end);
  231. List<TurbineInfoDay> list = turbineInfoDayService.list(wrapper);
  232. Map<String, List<TurbineInfoDay>> collect = list.stream().collect(Collectors.groupingBy(TurbineInfoDay::getTurbineId));
  233. Map<String, List<TurbineInfoDay>> collectcz = list.stream().collect(Collectors.groupingBy(TurbineInfoDay::getStationId));
  234. List<TurbineInfoDay> day1s;
  235. for (ProEconPowerFittingAnalySis p : analyses) {
  236. FjjxbVo vo = new FjjxbVo();
  237. if("A".equals(p.getWindturbineId())){
  238. day1s = collectcz.get(p.getStation());
  239. vo.setId(p.getStation());
  240. vo.setName(p.getStationcn().replaceFirst("风电场",""));
  241. }else {
  242. day1s = collect.get(p.getWindturbineId());
  243. vo.setId(p.getWindturbineId());
  244. vo.setName(p.getCode());
  245. }
  246. double llfdl = day1s.stream().mapToDouble(TurbineInfoDay::getLlfdl).sum(); //理论发电量
  247. double rfdl = day1s.stream().mapToDouble(TurbineInfoDay::getRfdl).sum(); //日发电量
  248. double jhjxssdl = day1s.stream().mapToDouble(TurbineInfoDay::getJhjxss).sum();//计划检修损失电量
  249. double fjhjxssdl = day1s.stream().mapToDouble(TurbineInfoDay::getFjhjxss).sum();//非计划检修电量
  250. double xdssdl = day1s.stream().mapToDouble(TurbineInfoDay::getXdss).sum();//限电损失电量
  251. double slssdl = 0.0;//受累损失电量
  252. double xnssdl = day1s.stream().mapToDouble(TurbineInfoDay::getXnss).sum();//性能损失电量
  253. double speed = day1s.stream().mapToDouble(TurbineInfoDay::getPjfs).average().orElse(0.0);//风速
  254. llfdl = llfdl/1000;
  255. rfdl = rfdl/1000;
  256. jhjxssdl = jhjxssdl/1000;
  257. fjhjxssdl = fjhjxssdl/1000;
  258. xdssdl = xdssdl/1000;
  259. xnssdl = xnssdl/1000;
  260. vo.setLlfdl(new BigDecimal(llfdl).setScale(2, RoundingMode.FLOOR).doubleValue());
  261. vo.setSjfdl(new BigDecimal(rfdl).setScale(2, RoundingMode.FLOOR).doubleValue());
  262. vo.setJhjx(new BigDecimal(jhjxssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
  263. vo.setFjhjx(new BigDecimal(fjhjxssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
  264. vo.setXd(new BigDecimal(xdssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
  265. vo.setXn(new BigDecimal(xnssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
  266. vo.setSl(new BigDecimal(slssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
  267. vo.setSpeed(new BigDecimal(speed).setScale(2, RoundingMode.FLOOR).doubleValue());
  268. vo.setFnlly(llfdl > 0 ? new BigDecimal(rfdl / llfdl).setScale(2, RoundingMode.FLOOR).doubleValue() : 0);
  269. result.add(vo);
  270. }
  271. log.info("======风机榜效帮计算结束.............");
  272. result.stream().sorted(Comparator.comparing(FjjxbVo::getId));
  273. /** 添加标题 **/
  274. List<FixedVo> fxList = AnnotationTool.getFixedVoList(FjjxbVo.class);
  275. List<TableTitle> lt = fxList.stream().map(d -> new TableTitle(d.getName(), d.getDes())).collect(Collectors.toList());
  276. promise.put("title", lt);
  277. promise.put("data", result);
  278. } catch (Exception e) {
  279. e.printStackTrace();
  280. }
  281. return promise;
  282. }
  283. }