PartstatisticsService.java 20 KB

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