EquipmentInfoDayTopService.java 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203
  1. package com.gyee.generation.service;//package com.gyee.generation.service;
  2. import com.gyee.common.model.StringUtils;
  3. import com.gyee.generation.init.CacheContext;
  4. import com.gyee.generation.model.auto.*;
  5. import com.gyee.generation.service.auto.IProEconEquipmentInfoDay1Service;
  6. import com.gyee.generation.service.auto.IProEconEquipmentInfoDay2Service;
  7. import com.gyee.generation.service.auto.IProEconEquipmentInfoDay4Service;
  8. import com.gyee.generation.service.auto.IProEconEquipmentInfoDayTopService;
  9. import com.gyee.generation.util.DateUtils;
  10. import org.springframework.stereotype.Service;
  11. import javax.annotation.Resource;
  12. import java.math.BigDecimal;
  13. import java.math.RoundingMode;
  14. import java.util.*;
  15. import java.util.stream.Collectors;
  16. @Service
  17. public class EquipmentInfoDayTopService {
  18. // private static final Logger logger = LoggerFactory.getLogger(EquipmentInfoDayTopService.class);
  19. @Resource
  20. private IProEconEquipmentInfoDay1Service proEconEquipmentInfoDay1Service;
  21. @Resource
  22. private IProEconEquipmentInfoDay2Service proEconEquipmentInfoDay2Service;
  23. @Resource
  24. private IProEconEquipmentInfoDay4Service proEconEquipmentInfoDay4Service;
  25. @Resource
  26. private IProEconEquipmentInfoDayTopService proEconEquipmentInfoDayTopService;
  27. public void calEquipmentInfoDayTop(Date recordDate) throws Exception {
  28. Calendar c = Calendar.getInstance();
  29. c.setTime(recordDate);
  30. //判断是否有重复记录,先删除重复记录
  31. List<Integer> idls = proEconEquipmentInfoDayTopService.list().stream()
  32. .filter(i -> i.getRecordDate().compareTo(DateUtils.truncDay(recordDate)) == 0
  33. && CacheContext.wtmap.containsKey(i.getWindturbineId())).map(ProEconEquipmentInfoDayTop::getId)
  34. .collect(Collectors.toList());
  35. if (idls.size() > 0) {
  36. proEconEquipmentInfoDayTopService.removeByIds(idls);
  37. }
  38. for (ProBasicPowerstation wp : CacheContext.wpls) {
  39. List<ProEconEquipmentInfoDayTop> topls = new ArrayList<>();
  40. for (ProBasicEquipment wt : CacheContext.wpwtmap.get(wp.getId())) {
  41. ProEconEquipmentInfoDayTop peeidt = getEquipmentInfoDayTop(recordDate, c, wt);
  42. topls.add(peeidt);
  43. }
  44. // Map<指标, Map<风机编号,ProEconEquipmentInfoDayTop>>
  45. Map<String, Map<String, ProEconEquipmentInfoDayTop>> ordermap = new HashMap<>();
  46. List<String> filedls = initialFiled();
  47. //遍历循环排序,将序号赋值给rank,再通过风机编号转为,MAP
  48. orderObject(topls,ordermap,filedls);
  49. for (ProEconEquipmentInfoDayTop top : topls) {
  50. calLevels(top, topls.size(), ordermap, "day");
  51. calLevels(top, topls.size(), ordermap, "month");
  52. calLevels(top, topls.size(), ordermap, "year");
  53. }
  54. topls=topls.stream()
  55. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getDayScore).reversed()).collect(Collectors.toList());
  56. for (int i=0;i<topls.size();i++) {
  57. ProEconEquipmentInfoDayTop top =topls.get(i);
  58. top.setDayRank(i+1);
  59. }
  60. topls=topls.stream()
  61. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getMonthScore).reversed()).collect(Collectors.toList());
  62. for (int i=0;i<topls.size();i++) {
  63. ProEconEquipmentInfoDayTop top =topls.get(i);
  64. top.setMonthRank(i+1);
  65. }
  66. topls=topls.stream()
  67. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getYearScore).reversed()).collect(Collectors.toList());
  68. for (int i=0;i<topls.size();i++) {
  69. ProEconEquipmentInfoDayTop top =topls.get(i);
  70. top.setYearRank(i+1);
  71. proEconEquipmentInfoDayTopService.save(top);
  72. }
  73. }
  74. }
  75. private ProEconEquipmentInfoDayTop getEquipmentInfoDayTop(Date recordDate, Calendar c, ProBasicEquipment wt) {
  76. ProEconEquipmentInfoDayTop peeidt = new ProEconEquipmentInfoDayTop();
  77. peeidt.setWindpowerstationId(wt.getWindpowerstationId());
  78. peeidt.setLineId(wt.getLineId());
  79. peeidt.setProjectId(wt.getProjectId());
  80. peeidt.setWindturbineId(wt.getId());
  81. peeidt.setRecordDate(DateUtils.truncDay(recordDate));
  82. peeidt.setYear(DateUtils.getYear(recordDate));
  83. peeidt.setMonth(DateUtils.getMonth(recordDate) + 1);
  84. List<ProEconEquipmentInfoDay1> pepid1ls = proEconEquipmentInfoDay1Service.list().stream()
  85. .filter(i -> i.getRecordDate().compareTo(DateUtils.truncDay(recordDate)) == 0
  86. && i.getWindturbineId().equals(wt.getId())
  87. ).collect(Collectors.toList());
  88. if (!pepid1ls.isEmpty()) {
  89. ProEconEquipmentInfoDay1 pepid1 = pepid1ls.get(0);
  90. //发电量
  91. peeidt.setDayfdl(pepid1.getRfdl());
  92. peeidt.setMonthfdl(pepid1.getYfdl());
  93. peeidt.setYearfdl(pepid1.getNfdl());
  94. //理论发电量
  95. peeidt.setDayllfdl(pepid1.getRllfdl());
  96. peeidt.setMonthllfdl(pepid1.getYllfdl());
  97. peeidt.setYearllfdl(pepid1.getNllfdl());
  98. //平均风速
  99. peeidt.setDayfs(pepid1.getRpjfs());
  100. peeidt.setMonthfs(pepid1.getYpjfs());
  101. peeidt.setYearfs(pepid1.getNpjfs());
  102. //平均功率
  103. peeidt.setDaygl(pepid1.getRpjgl());
  104. peeidt.setMonthgl(pepid1.getYpjgl());
  105. peeidt.setYeargl(pepid1.getNpjgl());
  106. //故障损失电量
  107. peeidt.setDaygzssdl(pepid1.getRgzssdl());
  108. peeidt.setMonthgzssdl(pepid1.getYgzssdl());
  109. peeidt.setYeargzssdl(pepid1.getNgzssdl());
  110. //限电损失电量
  111. peeidt.setDayxdssdl(pepid1.getRxdtjssdl());
  112. peeidt.setMonthxdssdl(pepid1.getYxdtjssdl());
  113. peeidt.setYearxdssdl(pepid1.getNxdtjssdl());
  114. //维护损失电量
  115. peeidt.setDaywhssdl(pepid1.getRjxssdl());
  116. peeidt.setMonthwhssdl(pepid1.getYjxssdl());
  117. peeidt.setYearwhssdl(pepid1.getNjxssdl());
  118. //性能损失电量
  119. peeidt.setDayxnssdl(pepid1.getRqxjclssdl());
  120. peeidt.setMonthxnssdl(pepid1.getYqxjclssdl());
  121. peeidt.setYearxnssdl(pepid1.getNqxjclssdl());
  122. }
  123. List<ProEconEquipmentInfoDay2> pepid2ls = proEconEquipmentInfoDay2Service.list().stream()
  124. .filter(i -> i.getRecordDate().compareTo(DateUtils.truncDay(recordDate)) == 0
  125. && i.getWindturbineId().equals(wt.getId())
  126. ).collect(Collectors.toList());
  127. if (!pepid2ls.isEmpty()) {
  128. ProEconEquipmentInfoDay2 pepid2 = pepid2ls.get(0);
  129. //故障时间
  130. peeidt.setDaygzsj(pepid2.getRgzxsmx());
  131. peeidt.setMonthfdl(pepid2.getYgzxsmx());
  132. peeidt.setYearfdl(pepid2.getNgzxsmx());
  133. //维护时间
  134. peeidt.setDaywhsj(pepid2.getRjxxsmx());
  135. peeidt.setMonthwhsj(pepid2.getYjxxsmx());
  136. peeidt.setYearwhsj(pepid2.getNjxxsmx());
  137. //运行时间
  138. peeidt.setDayyxsj(pepid2.getRyxxs());
  139. peeidt.setMonthyxsj(pepid2.getYyxxs());
  140. peeidt.setYearyxsj(pepid2.getNyxxs());
  141. //停机时间
  142. peeidt.setDaytjsj(pepid2.getRgzxsmx());
  143. peeidt.setMonthtjsj(pepid2.getYgzxsmx());
  144. peeidt.setYeartjsj(pepid2.getNgzxsmx());
  145. //利用小时数
  146. double defaultpower = 1500.0;
  147. if (CacheContext.modelMap.containsKey(wt.getModelId())) {
  148. defaultpower = CacheContext.modelMap.get(wt.getModelId()).getPowerProduction();
  149. }
  150. peeidt.setDaylyxs(BigDecimal.valueOf(peeidt.getDayfdl()).divide(new BigDecimal(defaultpower), 2, RoundingMode.HALF_EVEN).doubleValue());
  151. peeidt.setMonthlyxs(BigDecimal.valueOf(peeidt.getMonthfdl()).divide(new BigDecimal(defaultpower), 2, RoundingMode.HALF_EVEN).doubleValue());
  152. peeidt.setDaylyxs(BigDecimal.valueOf(peeidt.getYearfdl()).divide(new BigDecimal(defaultpower), 2, RoundingMode.HALF_EVEN).doubleValue());
  153. //设备可利用率
  154. int dayhours = 24;
  155. double temp = StringUtils.round(dayhours - peeidt.getDaygzsj(), 2);
  156. peeidt.setDaysbklyl(temp);
  157. Calendar cal = Calendar.getInstance();
  158. cal.setTime(recordDate);
  159. int days = c.get(Calendar.DAY_OF_MONTH);
  160. dayhours = 24 * days;
  161. temp = StringUtils.round(dayhours - peeidt.getMonthgzsj(), 2);
  162. peeidt.setMonthsbklyl(temp);
  163. days = c.get(Calendar.DAY_OF_YEAR);
  164. dayhours = 24 * days;
  165. temp = StringUtils.round(dayhours - peeidt.getYeargzsj(), 2);
  166. peeidt.setYearsbklyl(temp);
  167. //等效可用系数
  168. dayhours = 24;
  169. temp = StringUtils.round(dayhours - peeidt.getDaygzsj() - peeidt.getDaywhsj(), 2);
  170. peeidt.setDaydxkyxs(temp);
  171. cal = Calendar.getInstance();
  172. cal.setTime(recordDate);
  173. days = c.get(Calendar.DAY_OF_MONTH);
  174. dayhours = 24 * days;
  175. temp = StringUtils.round(dayhours - peeidt.getMonthgzsj() - peeidt.getMonthwhsj(), 2);
  176. peeidt.setMonthdxkyxs(temp);
  177. days = c.get(Calendar.DAY_OF_YEAR);
  178. dayhours = 24 * days;
  179. temp = StringUtils.round(dayhours - peeidt.getYeargzsj() - peeidt.getMonthwhsj(), 2);
  180. peeidt.setYeardxkyxs(temp);
  181. }
  182. List<ProEconEquipmentInfoDay4> pepid4ls = proEconEquipmentInfoDay4Service.list().stream()
  183. .filter(i -> i.getRecordDate().compareTo(DateUtils.truncDay(recordDate)) == 0
  184. && i.getWindturbineId().equals(wt.getId())
  185. ).collect(Collectors.toList());
  186. if (!pepid4ls.isEmpty()) {
  187. ProEconEquipmentInfoDay4 pepid4 = pepid4ls.get(0);
  188. //拟合优度
  189. peeidt.setDaynhyd(pepid4.getRnhyd());
  190. peeidt.setMonthnhyd(pepid4.getYnhyd());
  191. peeidt.setYearnhyd(pepid4.getNnhyd());
  192. //有效风时数
  193. peeidt.setDayyxfss(pepid4.getRyxfss());
  194. peeidt.setMonthyxfss(pepid4.getYyxfss());
  195. peeidt.setYearyxfss(pepid4.getNyxfss());
  196. //小风切入
  197. peeidt.setDayxfqr(pepid4.getRxfqrfs());
  198. peeidt.setMonthxfqr(pepid4.getYxfqrfs());
  199. peeidt.setYearxfqr(pepid4.getNxfqrfs());
  200. //静风频率
  201. int dayhours = 24;
  202. double temp = BigDecimal.valueOf(pepid4.getRjfsc()).divide(new BigDecimal(dayhours), 2, RoundingMode.HALF_EVEN).multiply(new BigDecimal(100)).doubleValue();
  203. peeidt.setDayjfpl(temp);
  204. Calendar cal = Calendar.getInstance();
  205. cal.setTime(recordDate);
  206. int days = c.get(Calendar.DAY_OF_MONTH);
  207. dayhours = 24 * days;
  208. temp = BigDecimal.valueOf(pepid4.getYjfsc()).divide(new BigDecimal(dayhours), 2, RoundingMode.HALF_EVEN).multiply(new BigDecimal(100)).doubleValue();
  209. peeidt.setMonthjfpl(temp);
  210. days = c.get(Calendar.DAY_OF_YEAR);
  211. dayhours = 24 * days;
  212. temp = BigDecimal.valueOf(pepid4.getNjfsc()).divide(new BigDecimal(dayhours), 2, RoundingMode.HALF_EVEN).multiply(new BigDecimal(100)).doubleValue();
  213. peeidt.setYearjfpl(temp);
  214. //功率一致性系数
  215. peeidt.setDayglyzxxs(pepid4.getRglyzxxs());
  216. peeidt.setMonthglyzxxs(pepid4.getYglyzxxs());
  217. peeidt.setYearglyzxxs(pepid4.getNglyzxxs());
  218. }
  219. return peeidt;
  220. }
  221. private void orderObject(List<ProEconEquipmentInfoDayTop> topls, Map<String, Map<String, ProEconEquipmentInfoDayTop>> ordermap, List<String> filedls) {
  222. //遍历循环排序,将序号赋值给rank,再通过风机编号转为,MAP
  223. for (String str : filedls) {
  224. List<ProEconEquipmentInfoDayTop> ls = new ArrayList<>();
  225. Map<String, ProEconEquipmentInfoDayTop> map;
  226. switch (str) {
  227. case "dayfs":
  228. ls = topls.stream()
  229. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getDayfs).reversed()).collect(Collectors.toList());
  230. break;
  231. case "monthfs":
  232. ls = topls.stream()
  233. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getMonthfs).reversed()).collect(Collectors.toList());
  234. break;
  235. case "yearfs":
  236. ls = topls.stream()
  237. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getYearfs).reversed()).collect(Collectors.toList());
  238. break;
  239. case "dayxnssdl":
  240. ls = topls.stream()
  241. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getDayxnssdl)).collect(Collectors.toList());
  242. break;
  243. case "monthxnssdl":
  244. ls = topls.stream()
  245. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getMonthxnssdl)).collect(Collectors.toList());
  246. break;
  247. case "yearxnssdl":
  248. ls = topls.stream()
  249. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getYearxnssdl)).collect(Collectors.toList());
  250. break;
  251. case "daylyxs":
  252. ls = topls.stream()
  253. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getDaylyxs).reversed()).collect(Collectors.toList());
  254. break;
  255. case "monthlyxs":
  256. ls = topls.stream()
  257. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getMonthlyxs).reversed()).collect(Collectors.toList());
  258. break;
  259. case "yearlyxs":
  260. ls = topls.stream()
  261. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getYearlyxs).reversed()).collect(Collectors.toList());
  262. break;
  263. case "daynhyd":
  264. ls = topls.stream()
  265. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getDaynhyd)).collect(Collectors.toList());
  266. break;
  267. case "monthnhyd":
  268. ls = topls.stream()
  269. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getMonthnhyd)).collect(Collectors.toList());
  270. break;
  271. case "yearnhyd":
  272. ls = topls.stream()
  273. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getYearnhyd)).collect(Collectors.toList());
  274. break;
  275. case "daysbklyl":
  276. ls = topls.stream()
  277. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getDaysbklyl).reversed()).collect(Collectors.toList());
  278. break;
  279. case "monthsbklyl":
  280. ls = topls.stream()
  281. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getMonthsbklyl).reversed()).collect(Collectors.toList());
  282. break;
  283. case "yearsbklyl":
  284. ls = topls.stream()
  285. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getYearsbklyl).reversed()).collect(Collectors.toList());
  286. break;
  287. case "daydxkyxs":
  288. ls = topls.stream()
  289. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getDaydxkyxs).reversed()).collect(Collectors.toList());
  290. break;
  291. case "monthdxkyxs":
  292. ls = topls.stream()
  293. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getMonthdxkyxs).reversed()).collect(Collectors.toList());
  294. break;
  295. case "yeardxkyxs":
  296. ls = topls.stream()
  297. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getYeardxkyxs).reversed()).collect(Collectors.toList());
  298. break;
  299. case "dayyxfss":
  300. ls = topls.stream()
  301. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getDayyxfss).reversed()).collect(Collectors.toList());
  302. break;
  303. case "monthyxfss":
  304. ls = topls.stream()
  305. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getMonthyxfss).reversed()).collect(Collectors.toList());
  306. break;
  307. case "yearyxfss":
  308. ls = topls.stream()
  309. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getYearyxfss).reversed()).collect(Collectors.toList());
  310. break;
  311. case "dayxfqr":
  312. ls = topls.stream()
  313. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getDayxfqr)).collect(Collectors.toList());
  314. break;
  315. case "monthxfqr":
  316. ls = topls.stream()
  317. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getMonthxfqr)).collect(Collectors.toList());
  318. break;
  319. case "yearxfqr":
  320. ls = topls.stream()
  321. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getYearxfqr)).collect(Collectors.toList());
  322. break;
  323. case "dayjfpl":
  324. ls = topls.stream()
  325. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getDayjfpl)).collect(Collectors.toList());
  326. break;
  327. case "monthjfpl":
  328. ls = topls.stream()
  329. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getMonthjfpl)).collect(Collectors.toList());
  330. break;
  331. case "yearjfpl":
  332. ls = topls.stream()
  333. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getYearjfpl)).collect(Collectors.toList());
  334. break;
  335. case "dayglyzxxs":
  336. ls = topls.stream()
  337. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getDayglyzxxs)).collect(Collectors.toList());
  338. break;
  339. case "monthglyzxxs":
  340. ls = topls.stream()
  341. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getMonthglyzxxs)).collect(Collectors.toList());
  342. break;
  343. case "yearglyzxxs":
  344. ls = topls.stream()
  345. .sorted(Comparator.comparing(ProEconEquipmentInfoDayTop::getYearglyzxxs)).collect(Collectors.toList());
  346. break;
  347. default:
  348. }
  349. if(str.contains("day")) {
  350. Map<String, ProEconEquipmentInfoDayTop> result = new HashMap<>();
  351. for (int i = 0; i < ls.size(); i++) {
  352. ProEconEquipmentInfoDayTop po = ls.get(i);
  353. po.setDayRank(i + 1);
  354. result.putIfAbsent(po.getWindturbineId(), po);
  355. }
  356. map = result;
  357. }else if(str.contains("month")){
  358. Map<String, ProEconEquipmentInfoDayTop> result = new HashMap<>();
  359. for (int i = 0; i < ls.size(); i++) {
  360. ProEconEquipmentInfoDayTop po = ls.get(i);
  361. po.setMonthRank(i + 1);
  362. result.putIfAbsent(po.getWindturbineId(), po);
  363. }
  364. map = result;
  365. }else{
  366. Map<String, ProEconEquipmentInfoDayTop> result = new HashMap<>();
  367. for (int i = 0; i < ls.size(); i++) {
  368. ProEconEquipmentInfoDayTop po = ls.get(i);
  369. po.setYearRank(i + 1);
  370. result.putIfAbsent(po.getWindturbineId(), po);
  371. }
  372. map = result;
  373. }
  374. ordermap.put(str, map);
  375. }
  376. }
  377. private void calLevels(ProEconEquipmentInfoDayTop top, Integer size, Map<String, Map<String, ProEconEquipmentInfoDayTop>> ordermap, String type) {
  378. double m = 10;
  379. double d = m / (double) size;
  380. double temp = 0;
  381. //切入风速
  382. double xfqrValue = 0;
  383. //性能损失电量
  384. double xnssdlValue = 0;
  385. //拟合优度
  386. double nhydValue = 0;
  387. //功率一致性系数
  388. double glyzxxsValue = 0;
  389. //利用小时
  390. double lyxsValue = 0;
  391. //设备可利用率
  392. double sbklylValue = 0;
  393. //等效可利用系数
  394. double dxkyxsValue = 0;
  395. //有效风时数
  396. double yxfssValue = 0;
  397. //风速
  398. double fsValue = 0;
  399. //静风频率
  400. double jfplValue = 0;
  401. //切入风速
  402. if (ordermap.containsKey(type + "xfqr")) {
  403. Map<String, ProEconEquipmentInfoDayTop> map = ordermap.get(type + "xfqr");
  404. if (map.containsKey(top.getWindturbineId())) {
  405. ProEconEquipmentInfoDayTop rtop = map.get(top.getWindturbineId());
  406. double value = 0.0;
  407. switch (type) {
  408. case "day":
  409. value = top.getDayxfqr();
  410. break;
  411. case "month":
  412. value = top.getMonthxfqr();
  413. break;
  414. case "year":
  415. value = top.getYearxfqr();
  416. break;
  417. }
  418. if (value >= 5) {
  419. xfqrValue = 0;
  420. } else if (value <= 3.5) {
  421. xfqrValue = m;
  422. } else {
  423. switch (type) {
  424. case "day":
  425. temp = d * (size - rtop.getDayRank());
  426. break;
  427. case "month":
  428. temp = d * (size - rtop.getMonthRank());
  429. break;
  430. case "year":
  431. temp = d * (size - rtop.getYearRank());
  432. break;
  433. }
  434. xfqrValue = StringUtils.round(temp, 0);
  435. }
  436. }
  437. }
  438. //性能损失电量
  439. if (ordermap.containsKey(type + "xnssdl")) {
  440. Map<String, ProEconEquipmentInfoDayTop> map = ordermap.get(type + "xnssdl");
  441. if (map.containsKey(top.getWindturbineId())) {
  442. ProEconEquipmentInfoDayTop rtop = map.get(top.getWindturbineId());
  443. double value = 0.0;
  444. switch (type) {
  445. case "day":
  446. value = top.getDayxnssdl();
  447. break;
  448. case "month":
  449. value = top.getMonthxnssdl();
  450. break;
  451. case "year":
  452. value = top.getYearxnssdl();
  453. break;
  454. }
  455. if (value >= top.getDayfdl()) {
  456. xnssdlValue = 0;
  457. } else if (value <= 0) {
  458. xnssdlValue = m;
  459. } else {
  460. switch (type) {
  461. case "day":
  462. temp = d * (size - rtop.getDayRank());
  463. break;
  464. case "month":
  465. temp = d * (size - rtop.getMonthRank());
  466. break;
  467. case "year":
  468. temp = d * (size - rtop.getYearRank());
  469. break;
  470. }
  471. xnssdlValue = StringUtils.round(temp, 0);
  472. }
  473. }
  474. }
  475. //拟合优度
  476. if (ordermap.containsKey(type + "nhyd")) {
  477. Map<String, ProEconEquipmentInfoDayTop> map = ordermap.get(type + "nhyd");
  478. if (map.containsKey(top.getWindturbineId())) {
  479. ProEconEquipmentInfoDayTop rtop = map.get(top.getWindturbineId());
  480. double value = 0.0;
  481. switch (type) {
  482. case "day":
  483. value = top.getDaynhyd();
  484. break;
  485. case "month":
  486. value = top.getMonthnhyd();
  487. break;
  488. case "year":
  489. value = top.getYearnhyd();
  490. break;
  491. }
  492. //拟合优度
  493. if (value >= 0.5) {
  494. nhydValue = 0;
  495. } else if (value <= 0.15) {
  496. nhydValue = m;
  497. } else {
  498. switch (type) {
  499. case "day":
  500. temp = d * (size - rtop.getDayRank());
  501. break;
  502. case "month":
  503. temp = d * (size - rtop.getMonthRank());
  504. break;
  505. case "year":
  506. temp = d * (size - rtop.getYearRank());
  507. break;
  508. }
  509. nhydValue = StringUtils.round(temp, 0);
  510. }
  511. }
  512. }
  513. //功率一致性系数
  514. if (ordermap.containsKey(type + "glyzxxs")) {
  515. Map<String, ProEconEquipmentInfoDayTop> map = ordermap.get(type + "glyzxxs");
  516. if (map.containsKey(top.getWindturbineId())) {
  517. ProEconEquipmentInfoDayTop rtop = map.get(top.getWindturbineId());
  518. double value = 0.0;
  519. switch (type) {
  520. case "day":
  521. value = top.getDayglyzxxs();
  522. break;
  523. case "month":
  524. value = top.getMonthglyzxxs();
  525. break;
  526. case "year":
  527. value = top.getYearglyzxxs();
  528. break;
  529. }
  530. if (value >= 50) {
  531. glyzxxsValue = 0;
  532. } else if (value <= 15) {
  533. glyzxxsValue = m;
  534. } else {
  535. switch (type) {
  536. case "day":
  537. temp = d * (size - rtop.getDayRank());
  538. break;
  539. case "month":
  540. temp = d * (size - rtop.getMonthRank());
  541. break;
  542. case "year":
  543. temp = d * (size - rtop.getYearRank());
  544. break;
  545. }
  546. glyzxxsValue = StringUtils.round(temp, 0);
  547. }
  548. }
  549. }
  550. //利用小时
  551. if (ordermap.containsKey(type + "lyxs")) {
  552. Map<String, ProEconEquipmentInfoDayTop> map = ordermap.get(type + "lyxs");
  553. if (map.containsKey(top.getWindturbineId())) {
  554. ProEconEquipmentInfoDayTop rtop = map.get(top.getWindturbineId());
  555. double value = 0.0;
  556. switch (type) {
  557. case "day":
  558. value = top.getDaylyxs();
  559. break;
  560. case "month":
  561. value = top.getMonthlyxs();
  562. break;
  563. case "year":
  564. value = top.getYearlyxs();
  565. break;
  566. }
  567. if (value <= 0) {
  568. lyxsValue = 0;
  569. } else {
  570. switch (type) {
  571. case "day":
  572. temp = d * (size - rtop.getDayRank());
  573. break;
  574. case "month":
  575. temp = d * (size - rtop.getMonthRank());
  576. break;
  577. case "year":
  578. temp = d * (size - rtop.getYearRank());
  579. break;
  580. }
  581. lyxsValue = StringUtils.round(temp, 0);
  582. }
  583. }
  584. }
  585. //设备可利用率
  586. if (ordermap.containsKey(type + "sbklyl")) {
  587. Map<String, ProEconEquipmentInfoDayTop> map = ordermap.get(type + "sbklyl");
  588. if (map.containsKey(top.getWindturbineId())) {
  589. ProEconEquipmentInfoDayTop rtop = map.get(top.getWindturbineId());
  590. double value = 0.0;
  591. switch (type) {
  592. case "day":
  593. value = top.getDaysbklyl();
  594. break;
  595. case "month":
  596. value = top.getMonthsbklyl();
  597. break;
  598. case "year":
  599. value = top.getYearsbklyl();
  600. break;
  601. }
  602. if (value < 90) {
  603. sbklylValue = 0;
  604. } else if (value >= 99.8) {
  605. sbklylValue = m;
  606. } else {
  607. switch (type) {
  608. case "day":
  609. temp = d * (size - rtop.getDayRank());
  610. break;
  611. case "month":
  612. temp = d * (size - rtop.getMonthRank());
  613. break;
  614. case "year":
  615. temp = d * (size - rtop.getYearRank());
  616. break;
  617. }
  618. sbklylValue = StringUtils.round(temp, 0);
  619. }
  620. }
  621. }
  622. //等效可用系数
  623. if (ordermap.containsKey(type + "dxkyxs")) {
  624. Map<String, ProEconEquipmentInfoDayTop> map = ordermap.get(type + "dxkyxs");
  625. if (map.containsKey(top.getWindturbineId())) {
  626. ProEconEquipmentInfoDayTop rtop = map.get(top.getWindturbineId());
  627. double value = 0.0;
  628. switch (type) {
  629. case "day":
  630. value = top.getDaydxkyxs();
  631. break;
  632. case "month":
  633. value = top.getMonthdxkyxs();
  634. break;
  635. case "year":
  636. value = top.getYeardxkyxs();
  637. break;
  638. }
  639. if (value < 90) {
  640. dxkyxsValue = 0;
  641. } else if (value >= 99.8) {
  642. dxkyxsValue = m;
  643. } else {
  644. switch (type) {
  645. case "day":
  646. temp = d * (size - rtop.getDayRank());
  647. break;
  648. case "month":
  649. temp = d * (size - rtop.getMonthRank());
  650. break;
  651. case "year":
  652. temp = d * (size - rtop.getYearRank());
  653. break;
  654. }
  655. dxkyxsValue = StringUtils.round(temp, 0);
  656. }
  657. }
  658. }
  659. //有效风时数
  660. if (ordermap.containsKey(type + "yxfss")) {
  661. Map<String, ProEconEquipmentInfoDayTop> map = ordermap.get(type + "yxfss");
  662. if (map.containsKey(top.getWindturbineId())) {
  663. ProEconEquipmentInfoDayTop rtop = map.get(top.getWindturbineId());
  664. double value = 0.0;
  665. switch (type) {
  666. case "day":
  667. value = top.getDayyxfss();
  668. break;
  669. case "month":
  670. value = top.getMonthyxfss();
  671. break;
  672. case "year":
  673. value = top.getYearyxfss();
  674. break;
  675. }
  676. if (value <= 0) {
  677. yxfssValue = 0;
  678. } else {
  679. if (type.equals("day")) {
  680. temp = d * (size - rtop.getDayRank());
  681. } else if (type.equals("month")) {
  682. temp = d * (size - rtop.getMonthRank());
  683. } else {
  684. temp = d * (size - rtop.getYearRank());
  685. }
  686. yxfssValue = StringUtils.round(temp, 0);
  687. }
  688. }
  689. }
  690. //平均风速
  691. if (ordermap.containsKey(type + "fs")) {
  692. Map<String, ProEconEquipmentInfoDayTop> map = ordermap.get(type + "fs");
  693. if (map.containsKey(top.getWindturbineId())) {
  694. ProEconEquipmentInfoDayTop rtop = map.get(top.getWindturbineId());
  695. double value = 0.0;
  696. switch (type) {
  697. case "day":
  698. value = top.getDayfs();
  699. break;
  700. case "month":
  701. value = top.getMonthfs();
  702. break;
  703. case "year":
  704. value = top.getYearfs();
  705. break;
  706. }
  707. if (value <= 0) {
  708. fsValue = 0;
  709. } else {
  710. switch (type) {
  711. case "day":
  712. temp = d * (size - rtop.getDayRank());
  713. break;
  714. case "month":
  715. temp = d * (size - rtop.getMonthRank());
  716. break;
  717. case "year":
  718. temp = d * (size - rtop.getYearRank());
  719. break;
  720. }
  721. fsValue = StringUtils.round(temp, 0);
  722. }
  723. }
  724. }
  725. //静风频率
  726. if (ordermap.containsKey(type + "jfpl")) {
  727. Map<String, ProEconEquipmentInfoDayTop> map = ordermap.get(type + "jfpl");
  728. if (map.containsKey(top.getWindturbineId())) {
  729. ProEconEquipmentInfoDayTop rtop = map.get(top.getWindturbineId());
  730. double value = 0.0;
  731. switch (type) {
  732. case "day":
  733. value = top.getDayjfpl();
  734. break;
  735. case "month":
  736. value = top.getMonthjfpl();
  737. break;
  738. case "year":
  739. value = top.getYearjfpl();
  740. break;
  741. }
  742. if (value <= 0) {
  743. jfplValue = 0;
  744. } else {
  745. switch (type) {
  746. case "day":
  747. temp = d * (size - rtop.getDayRank());
  748. break;
  749. case "month":
  750. temp = d * (size - rtop.getMonthRank());
  751. break;
  752. case "year":
  753. temp = d * (size - rtop.getYearRank());
  754. break;
  755. }
  756. jfplValue = StringUtils.round(temp, 0);
  757. }
  758. }
  759. }
  760. Double total = xfqrValue + xnssdlValue + nhydValue + glyzxxsValue + lyxsValue + sbklylValue + dxkyxsValue + yxfssValue + fsValue + jfplValue;
  761. if (total >= 95) {
  762. switch (type) {
  763. case "day":
  764. top.setDayLevel("AAA");
  765. top.setDayScore(total);
  766. break;
  767. case "month":
  768. top.setMonthLevel("AAA");
  769. top.setMonthScore(total);
  770. break;
  771. case "year":
  772. top.setYearLevel("AAA");
  773. top.setYearScore(total);
  774. break;
  775. }
  776. } else if (total >= 85) {
  777. switch (type) {
  778. case "day":
  779. top.setDayLevel("AA");
  780. top.setDayScore(total);
  781. break;
  782. case "month":
  783. top.setMonthLevel("AA");
  784. top.setMonthScore(total);
  785. break;
  786. case "year":
  787. top.setYearLevel("AA");
  788. top.setYearScore(total);
  789. break;
  790. }
  791. } else if (total >= 80) {
  792. switch (type) {
  793. case "day":
  794. top.setDayLevel("A");
  795. top.setDayScore(total);
  796. break;
  797. case "month":
  798. top.setMonthLevel("A");
  799. top.setMonthScore(total);
  800. break;
  801. case "year":
  802. top.setYearLevel("A");
  803. top.setYearScore(total);
  804. break;
  805. }
  806. } else if (total >= 75) {
  807. switch (type) {
  808. case "day":
  809. top.setDayLevel("BBB");
  810. top.setDayScore(total);
  811. break;
  812. case "month":
  813. top.setMonthLevel("BBB");
  814. top.setMonthScore(total);
  815. break;
  816. case "year":
  817. top.setYearLevel("BBB");
  818. top.setYearScore(total);
  819. break;
  820. }
  821. } else if (total >= 65) {
  822. switch (type) {
  823. case "day":
  824. top.setDayLevel("BB");
  825. top.setDayScore(total);
  826. break;
  827. case "month":
  828. top.setMonthLevel("BB");
  829. top.setMonthScore(total);
  830. break;
  831. case "year":
  832. top.setYearLevel("BB");
  833. top.setYearScore(total);
  834. break;
  835. }
  836. } else if (total >= 60) {
  837. switch (type) {
  838. case "day":
  839. top.setDayLevel("B");
  840. top.setDayScore(total);
  841. break;
  842. case "month":
  843. top.setMonthLevel("B");
  844. top.setMonthScore(total);
  845. break;
  846. case "year":
  847. top.setYearLevel("B");
  848. top.setYearScore(total);
  849. break;
  850. }
  851. } else if (total >= 40) {
  852. switch (type) {
  853. case "day":
  854. top.setDayLevel("C");
  855. top.setDayScore(total);
  856. break;
  857. case "month":
  858. top.setMonthLevel("C");
  859. top.setMonthScore(total);
  860. break;
  861. case "year":
  862. top.setYearLevel("C");
  863. top.setYearScore(total);
  864. break;
  865. }
  866. } else {
  867. switch (type) {
  868. case "day":
  869. top.setDayLevel("C-");
  870. top.setDayScore(total);
  871. break;
  872. case "month":
  873. top.setMonthLevel("C-");
  874. top.setMonthScore(total);
  875. break;
  876. case "year":
  877. top.setYearLevel("C-");
  878. top.setYearScore(total);
  879. break;
  880. }
  881. }
  882. }
  883. private List<String> initialFiled() {
  884. List<String> filedls = new ArrayList<>();
  885. filedls.add("dayfs");
  886. filedls.add("monthfs");
  887. filedls.add("yearfs");
  888. filedls.add("dayxnssdl");
  889. filedls.add("monthxnssdl");
  890. filedls.add("yearxnssdl");
  891. filedls.add("daylyxs");
  892. filedls.add("monthlyxs");
  893. filedls.add("yearlyxs");
  894. filedls.add("daynhyd");
  895. filedls.add("monthnhyd");
  896. filedls.add("yearnhyd");
  897. filedls.add("daysbklyl");
  898. filedls.add("monthsbklyl");
  899. filedls.add("yearsbklyl");
  900. filedls.add("daydxkyxs");
  901. filedls.add("monthdxkyxs");
  902. filedls.add("yeardxkyxs");
  903. filedls.add("dayyxfss");
  904. filedls.add("monthyxfss");
  905. filedls.add("yearyxfss");
  906. filedls.add("dayxfqr");
  907. filedls.add("monthxfqr");
  908. filedls.add("yearxfqr");
  909. filedls.add("dayjfpl");
  910. filedls.add("monthjfpl");
  911. filedls.add("yearjfpl");
  912. filedls.add("dayglyzxxs");
  913. filedls.add("monthglyzxxs");
  914. filedls.add("yearglyzxxs");
  915. return filedls;
  916. }
  917. }