PartstatisticsService.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478
  1. package com.gyee.failurestatistics.service;
  2. import com.gyee.common.model.PointData;
  3. import com.gyee.common.model.StringUtils;
  4. import com.gyee.failurestatistics.init.CacheContext;
  5. import com.gyee.failurestatistics.init.Constant;
  6. import com.gyee.failurestatistics.model.auto.Partstatisticsmain;
  7. import com.gyee.failurestatistics.model.auto.Windpowerstation;
  8. import com.gyee.failurestatistics.model.auto.Windturbine;
  9. import com.gyee.failurestatistics.model.auto.Windturbinetestingpointnew;
  10. import com.gyee.failurestatistics.service.auto.IPartstatisticsmainService;
  11. import com.gyee.failurestatistics.util.DateUtils;
  12. import com.gyee.failurestatistics.util.IRealTimeDataBaseUtil;
  13. import com.gyee.failurestatistics.util.realtimesource.EdosUtil;
  14. import org.springframework.stereotype.Service;
  15. import javax.annotation.Resource;
  16. import java.text.SimpleDateFormat;
  17. import java.util.*;
  18. import java.util.Map.Entry;
  19. /**
  20. * @ClassName : PartstatisticsService
  21. * @Description : 部件健康状态统计service
  22. */
  23. @Service
  24. public class PartstatisticsService {
  25. private IRealTimeDataBaseUtil ednaApiUtil = new EdosUtil();
  26. @Resource
  27. private IPartstatisticsmainService partstatisticsmainService;
  28. private final String DAY1NUM ="day1num";
  29. private final String DAY3NUM ="day3num";
  30. private final String DAY7NUM ="day7num";
  31. private final String DAY15NUM ="day15num";
  32. private final String MONTH1NUM ="month1num";
  33. private final String SYNTHESISNUM ="synthesisnum";
  34. private final long STEP = 60*30;
  35. private final int DAYSTEP = 1440/30;
  36. // private final long STEP = 900;
  37. // private final int DAYSTEP = 96;
  38. SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");
  39. SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  40. public void deletePartstatisticsmain(Date recodedate) {
  41. partstatisticsmainService.deletePartstatisticsmain(recodedate);
  42. }
  43. private void getPartTargetValue(Windturbine wt,String code, Date endDate, Date beginDate,long daynum, Map<String, Windturbinetestingpointnew> map,Map<String,Map<String,Integer>> partmap) throws Exception {
  44. Map<String,Integer> resultmap=new HashMap<String,Integer>();
  45. if(map.containsKey(code))
  46. {
  47. Windturbinetestingpointnew point = map.get(code);
  48. List<PointData> pointls = ednaApiUtil.getHistoryDatasSnap(point, beginDate.getTime() / 1000, endDate.getTime() / 1000, (long) (daynum * DAYSTEP), STEP);
  49. if (!pointls.isEmpty()) {
  50. int i=0;
  51. int number=0;
  52. for(PointData pd:pointls)
  53. {
  54. if(pd.getPointValueInDouble()==4)
  55. {
  56. number++;
  57. }
  58. i++;
  59. switch (i) {
  60. case DAYSTEP:
  61. resultmap.put(DAY1NUM, number);
  62. break;
  63. case DAYSTEP*3:
  64. resultmap.put(DAY3NUM, number);
  65. break;
  66. case DAYSTEP*7:
  67. resultmap.put(DAY7NUM, number);
  68. break;
  69. case DAYSTEP*15:
  70. resultmap.put(DAY15NUM, number);
  71. break;
  72. default:
  73. break;
  74. }
  75. }
  76. resultmap.put(MONTH1NUM, number);
  77. }else
  78. {
  79. resultmap.put(DAY1NUM, 0);
  80. resultmap.put(DAY3NUM, 0);
  81. resultmap.put(DAY7NUM, 0);
  82. resultmap.put(DAY15NUM, 0);
  83. resultmap.put(MONTH1NUM, 0);
  84. }
  85. }else
  86. {
  87. resultmap.put(DAY1NUM, 0);
  88. resultmap.put(DAY3NUM, 0);
  89. resultmap.put(DAY7NUM, 0);
  90. resultmap.put(DAY15NUM, 0);
  91. resultmap.put(MONTH1NUM, 0);
  92. }
  93. partmap.put(wt.getId(), resultmap);
  94. }
  95. public void savePartstatisticsmain() throws Exception {
  96. Calendar cal = Calendar.getInstance();
  97. cal.set(Calendar.HOUR_OF_DAY, 0);
  98. cal.set(Calendar.MINUTE, 0);
  99. cal.set(Calendar.SECOND, 0);
  100. Date endDate = cal.getTime();
  101. cal.add(Calendar.MONTH, -1);
  102. Date beginDate = cal.getTime();
  103. int daynum = DateUtils.daysDiff(beginDate, endDate);
  104. for (Windpowerstation wp : CacheContext.wpls) {
  105. if (wp.getId().endsWith("FDC")) {
  106. System.out.println("开始统计" + wp.getName() + "部件健康状况和故障数量统计");
  107. List<Windturbine> wtls = CacheContext.wtsmap.get(wp.getId());
  108. Map<String, Map<String, Integer>> clxmap = new HashMap<String, Map<String, Integer>>();
  109. Map<String, Map<String, Integer>> fdjxmap = new HashMap<String, Map<String, Integer>>();
  110. Map<String, Map<String, Integer>> bjmap = new HashMap<String, Map<String, Integer>>();
  111. Map<String, Map<String, Integer>> zkxmap = new HashMap<String, Map<String, Integer>>();
  112. for (Windturbine wt : wtls) {
  113. Map<String, Windturbinetestingpointnew> map = CacheContext.wtpAimap.get(wt.getId());
  114. if(StringUtils.notEmp(map) && !map.isEmpty())
  115. {
  116. getPartTargetValue(wt, Constant.CLXJKZT, endDate, beginDate, daynum, map,clxmap);
  117. getPartTargetValue(wt, Constant.FDJJKZT, endDate, beginDate, daynum, map,fdjxmap);
  118. getPartTargetValue(wt, Constant.BJJKZT, endDate, beginDate, daynum, map,bjmap);
  119. getPartTargetValue(wt, Constant.ZKJKZT, endDate, beginDate, daynum, map,zkxmap);
  120. }
  121. }
  122. Map<String, Map<String, Integer>> ordermap = new HashMap<String, Map<String, Integer>>();
  123. if(StringUtils.notEmp(clxmap) && !clxmap.isEmpty() &&
  124. StringUtils.notEmp(fdjxmap) && !fdjxmap.isEmpty() &&
  125. StringUtils.notEmp(bjmap) && !bjmap.isEmpty() &&
  126. StringUtils.notEmp(zkxmap) && !zkxmap.isEmpty() )
  127. {
  128. setPartOrderMap(clxmap,fdjxmap,bjmap,zkxmap, ordermap, wtls);
  129. cal = Calendar.getInstance();
  130. cal.set(Calendar.HOUR_OF_DAY, 0);
  131. cal.set(Calendar.MINUTE, 0);
  132. cal.set(Calendar.SECOND, 0);
  133. for (Windturbine wt : wtls) {
  134. Partstatisticsmain po = new Partstatisticsmain();
  135. po.setId(StringUtils.getUUID());
  136. po.setWpid(wp.getId());
  137. po.setWpname(wp.getName());
  138. po.setWtid(wt.getId());
  139. po.setWtname(wt.getName());
  140. po.setRecodedate(cal.getTime());
  141. /*********************************************************************************/
  142. po.setDay1clx(clxmap.get(wt.getId()).get(DAY1NUM));
  143. po.setDay1fdj(fdjxmap.get(wt.getId()).get(DAY1NUM));
  144. po.setDay1bj(bjmap.get(wt.getId()).get(DAY1NUM));
  145. po.setDay1zk(zkxmap.get(wt.getId()).get(DAY1NUM));
  146. po.setDay1bpq(0);
  147. po.setDay1ph(0);
  148. po.setDay1zz(0);
  149. po.setDay1jc(0);
  150. po.setDay1clxname("严重");
  151. po.setDay1fdjname("严重");
  152. po.setDay1bjname("严重");
  153. po.setDay1zkname("严重");
  154. po.setDay1bpqname("严重");
  155. po.setDay1phname("严重");
  156. po.setDay1zzname("严重");
  157. po.setDay1jcname("严重");
  158. po.setDay1topnum(ordermap.get(wt.getId()).get(DAY1NUM));
  159. /*********************************************************************************/
  160. po.setDay3clx(clxmap.get(wt.getId()).get(DAY3NUM));
  161. po.setDay3fdj(fdjxmap.get(wt.getId()).get(DAY3NUM));
  162. po.setDay3bj(bjmap.get(wt.getId()).get(DAY3NUM));
  163. po.setDay3zk(zkxmap.get(wt.getId()).get(DAY3NUM));
  164. po.setDay3bpq(0);
  165. po.setDay3ph(0);
  166. po.setDay3zz(0);
  167. po.setDay3jc(0);
  168. po.setDay3clxname("严重");
  169. po.setDay3fdjname("严重");
  170. po.setDay3bjname("严重");
  171. po.setDay3zkname("严重");
  172. po.setDay3bpqname("严重");
  173. po.setDay3phname("严重");
  174. po.setDay3zzname("严重");
  175. po.setDay3jcname("严重");
  176. po.setDay3topnum(ordermap.get(wt.getId()).get(DAY3NUM));
  177. /*********************************************************************************/
  178. po.setDay7clx(clxmap.get(wt.getId()).get(DAY7NUM));
  179. po.setDay7fdj(fdjxmap.get(wt.getId()).get(DAY7NUM));
  180. po.setDay7bj(bjmap.get(wt.getId()).get(DAY7NUM));
  181. po.setDay7zk(zkxmap.get(wt.getId()).get(DAY7NUM));
  182. po.setDay7bpq(0);
  183. po.setDay7ph(0);
  184. po.setDay7zz(0);
  185. po.setDay7jc(0);
  186. po.setDay7clxname("严重");
  187. po.setDay7fdjname("严重");
  188. po.setDay7bjname("严重");
  189. po.setDay7zkname("严重");
  190. po.setDay7bpqname("严重");
  191. po.setDay7phname("严重");
  192. po.setDay7zzname("严重");
  193. po.setDay7jcname("严重");
  194. po.setDay7topnum(ordermap.get(wt.getId()).get(DAY7NUM));
  195. /*********************************************************************************/
  196. po.setDay15clx(clxmap.get(wt.getId()).get(DAY15NUM));
  197. po.setDay15fdj(fdjxmap.get(wt.getId()).get(DAY15NUM));
  198. po.setDay15bj(bjmap.get(wt.getId()).get(DAY15NUM));
  199. po.setDay15zk(zkxmap.get(wt.getId()).get(DAY15NUM));
  200. po.setDay15bpq(0);
  201. po.setDay15ph(0);
  202. po.setDay15zz(0);
  203. po.setDay15jc(0);
  204. po.setDay15clxname("严重");
  205. po.setDay15fdjname("严重");
  206. po.setDay15bjname("严重");
  207. po.setDay15zkname("严重");
  208. po.setDay15bpqname("严重");
  209. po.setDay15phname("严重");
  210. po.setDay15zzname("严重");
  211. po.setDay15jcname("严重");
  212. po.setDay15topnum(ordermap.get(wt.getId()).get(DAY15NUM));
  213. /*********************************************************************************/
  214. po.setMonth1clx(clxmap.get(wt.getId()).get(MONTH1NUM));
  215. po.setMonth1fdj(fdjxmap.get(wt.getId()).get(MONTH1NUM));
  216. po.setMonth1bj(bjmap.get(wt.getId()).get(MONTH1NUM));
  217. po.setMonth1zk(zkxmap.get(wt.getId()).get(MONTH1NUM));
  218. po.setMonth1bpq(0);
  219. po.setMonth1ph(0);
  220. po.setMonth1zz(0);
  221. po.setMonth1jc(0);
  222. po.setMonth1clxname("严重");
  223. po.setMonth1fdjname("严重");
  224. po.setMonth1bjname("严重");
  225. po.setMonth1zkname("严重");
  226. po.setMonth1bpqname("严重");
  227. po.setMonth1phname("严重");
  228. po.setMonth1zzname("严重");
  229. po.setMonth1jcname("严重");
  230. po.setMonth1topnum(ordermap.get(wt.getId()).get(MONTH1NUM));
  231. /*********************************************************************************/
  232. po.setSynthesistopnum(ordermap.get(wt.getId()).get(SYNTHESISNUM));
  233. /*********************************************************************************/
  234. insertPartstatisticsmain(po);
  235. }
  236. }
  237. System.out.println("结束统计" + wp.getName() + "部件健康状况和故障数量统计");
  238. }
  239. }
  240. }
  241. /**
  242. * 进行排名分天排名
  243. *
  244. * @param partordermap
  245. */
  246. private void setPartOrderMap(Map<String, Map<String, Integer>> clxmap,
  247. Map<String, Map<String, Integer>> fdjmap,
  248. Map<String, Map<String, Integer>> bjmap,
  249. Map<String, Map<String, Integer>> zkmap,
  250. Map<String, Map<String, Integer>> partordermap,List<Windturbine> wtls) {
  251. Map<String, Integer> day1map=new HashMap<String, Integer>();
  252. Map<String, Integer> day3map=new HashMap<String, Integer>();
  253. Map<String, Integer> day7map=new HashMap<String, Integer>();
  254. Map<String, Integer> day15map=new HashMap<String, Integer>();
  255. Map<String, Integer> month1map=new HashMap<String, Integer>();
  256. /**
  257. * 遍历风机集合,将四大部件严重数量合计,将严重状态数量作为value赋值到key为风机编号的不同天数map集合中
  258. */
  259. for (Windturbine wt : wtls) {
  260. int day1num=clxmap.get(wt.getId()).get(DAY1NUM)+fdjmap.get(wt.getId()).get(DAY1NUM)+
  261. bjmap.get(wt.getId()).get(DAY1NUM)+zkmap.get(wt.getId()).get(DAY1NUM);
  262. int day3num=clxmap.get(wt.getId()).get(DAY3NUM)+fdjmap.get(wt.getId()).get(DAY3NUM)+
  263. bjmap.get(wt.getId()).get(DAY3NUM)+zkmap.get(wt.getId()).get(DAY3NUM);
  264. int day7num=clxmap.get(wt.getId()).get(DAY7NUM)+fdjmap.get(wt.getId()).get(DAY7NUM)+
  265. bjmap.get(wt.getId()).get(DAY7NUM)+zkmap.get(wt.getId()).get(DAY7NUM);
  266. int day15num=clxmap.get(wt.getId()).get(DAY15NUM)+fdjmap.get(wt.getId()).get(DAY15NUM)+
  267. bjmap.get(wt.getId()).get(DAY15NUM)+zkmap.get(wt.getId()).get(DAY15NUM);
  268. int month1num=clxmap.get(wt.getId()).get(MONTH1NUM)+fdjmap.get(wt.getId()).get(MONTH1NUM)+
  269. bjmap.get(wt.getId()).get(MONTH1NUM)+zkmap.get(wt.getId()).get(MONTH1NUM);
  270. day1map.put(wt.getId(), day1num);
  271. day3map.put(wt.getId(), day3num);
  272. day7map.put(wt.getId(), day7num);
  273. day15map.put(wt.getId(), day15num);
  274. month1map.put(wt.getId(), month1num);
  275. }
  276. /**
  277. * 对不同天数的风机严重状况map进分类排序
  278. */
  279. day1map=getMapOrder(day1map);
  280. day3map=getMapOrder(day3map);
  281. day7map=getMapOrder(day7map);
  282. day15map=getMapOrder(day15map);
  283. month1map=getMapOrder(month1map);
  284. /**
  285. * 进行不同天数的综合排名
  286. */
  287. Map<String, Integer> synthesistopummap=getSynthesistopOrderNum(wtls,day1map,day3map,day7map,day15map,month1map );
  288. /**
  289. * 将排名结果封装到二级map中
  290. *
  291. */
  292. for (Windturbine wt : wtls) {
  293. Map<String, Integer> map=new HashMap<String, Integer>();
  294. map.put(DAY1NUM, day1map.get(wt.getId()));
  295. map.put(DAY3NUM, day3map.get(wt.getId()));
  296. map.put(DAY7NUM, day7map.get(wt.getId()));
  297. map.put(DAY15NUM, day15map.get(wt.getId()));
  298. map.put(MONTH1NUM, month1map.get(wt.getId()));
  299. map.put(SYNTHESISNUM, synthesistopummap.get(wt.getId()));
  300. partordermap.put(wt.getId(), map);
  301. }
  302. }
  303. private Map<String, Integer> getMapOrder(Map<String, Integer> map) {
  304. // 这里将map.entrySet()转换成list
  305. List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
  306. // 然后通过比较器来实现排序
  307. Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
  308. // 升序排序
  309. public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
  310. return o1.getValue().compareTo(o2.getValue());
  311. }
  312. });
  313. map = new TreeMap<String, Integer>();
  314. int i = 1;
  315. for (Map.Entry<String, Integer> mapping : list) {
  316. // System.out.println(mapping.getKey()+":"+mapping.getValue());
  317. map.put(mapping.getKey(), i);
  318. i++;
  319. }
  320. return map;
  321. }
  322. /**
  323. * 风机编号》Integer 获得统计综合排名顺序号
  324. *
  325. * @return
  326. */
  327. public Map<String, Integer> getSynthesistopOrderNum(List<Windturbine> wtls, Map<String, Integer> day1ordermap, Map<String, Integer> day3ordermap, Map<String, Integer> day7ordermap, Map<String, Integer> day15ordermap, Map<String, Integer> month1ordermap) {
  328. Map<String, Integer> synthesistopordermap = new TreeMap<String, Integer>();
  329. if (StringUtils.notEmp(wtls) && !wtls.isEmpty() && StringUtils.notEmp(day3ordermap) && StringUtils.notEmp(day7ordermap) && StringUtils.notEmp(day15ordermap) && StringUtils.notEmp(month1ordermap)) {
  330. for (Windturbine wt : wtls) {
  331. int day1 = 0;
  332. int day3 = 0;
  333. int day7 = 0;
  334. int day15 = 0;
  335. int month1 = 0;
  336. if (day1ordermap.containsKey(wt.getId())) {
  337. day1 = day1ordermap.get(wt.getId());
  338. } else {
  339. day1 = wtls.size();
  340. }
  341. if (day3ordermap.containsKey(wt.getId())) {
  342. day3 = day3ordermap.get(wt.getId());
  343. } else {
  344. day3 = wtls.size();
  345. }
  346. if (day7ordermap.containsKey(wt.getId())) {
  347. day7 = day7ordermap.get(wt.getId());
  348. } else {
  349. day7 = wtls.size();
  350. }
  351. if (day15ordermap.containsKey(wt.getId())) {
  352. day15 = day15ordermap.get(wt.getId());
  353. } else {
  354. day15 = wtls.size();
  355. }
  356. if (month1ordermap.containsKey(wt.getId())) {
  357. month1 = month1ordermap.get(wt.getId());
  358. } else {
  359. month1 = wtls.size();
  360. }
  361. synthesistopordermap.put(wt.getId(), day1 + day3 + day7 + day15 + month1);
  362. }
  363. }
  364. // 这里将map.entrySet()转换成list
  365. List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(synthesistopordermap.entrySet());
  366. // 然后通过比较器来实现排序
  367. Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
  368. // 升序排序
  369. public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
  370. return o1.getValue().compareTo(o2.getValue());
  371. }
  372. });
  373. synthesistopordermap = new TreeMap<String, Integer>();
  374. int i = 1;
  375. for (Map.Entry<String, Integer> mapping : list) {
  376. // System.out.println(mapping.getKey()+":"+mapping.getValue());
  377. synthesistopordermap.put(mapping.getKey(), i);
  378. i++;
  379. }
  380. return synthesistopordermap;
  381. }
  382. public int insertPartstatisticsmain(Partstatisticsmain po) {
  383. return partstatisticsmainService.insertPartstatisticsmain(po);
  384. }
  385. }