EquipmentInfo5Service.java 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109
  1. package com.gyee.generation.service;//package com.gyee.generation.service;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.gyee.common.contant.ContantXk;
  4. import com.gyee.common.model.PointData;
  5. import com.gyee.generation.init.CacheContext;
  6. import com.gyee.generation.model.auto.*;
  7. import com.gyee.generation.service.auto.*;
  8. import com.gyee.generation.util.DateUtils;
  9. import com.gyee.generation.util.StringUtils;
  10. import com.gyee.generation.util.realtimesource.IEdosUtil;
  11. import com.gyee.generation.util.statisticcs.Initial;
  12. import org.springframework.stereotype.Service;
  13. import javax.annotation.Resource;
  14. import java.math.BigDecimal;
  15. import java.math.RoundingMode;
  16. import java.util.*;
  17. import java.util.stream.Collectors;
  18. @Service
  19. public class EquipmentInfo5Service {
  20. // private static final Logger logger = LoggerFactory.getLogger(EquipmentInfo5Service.class);
  21. @Resource
  22. private IEdosUtil edosUtil;
  23. @Resource
  24. private IProEconShutdownEvent2Service proEconShutdownEvent2Service;
  25. //状态转换率
  26. @Resource
  27. private IProEconEquipmentInfoDay5Service proEconEquipmentInfoDay5Service;
  28. @Resource
  29. private IProEconStateTranRatesSubService proEconStateTranRatesSubService;
  30. @Resource
  31. private IProEconStateTranRatesSub2Service proEconStateTranRatesSub2Service;
  32. @Resource
  33. private IProEconFaultLiminatedefectsService proEconFaultLiminatedefectsService;
  34. @Resource
  35. private IProEconShutdownEventService proEconShutdownEventService;
  36. /**
  37. * 复位及时率
  38. */
  39. public void resetRate(Date currentDate) {
  40. //调度时间是第二天,currentDate 是第一天
  41. Date endDate = DateUtils.addDays(currentDate, 1);
  42. List<ProEconShutdownEvent2> shutdownevents = proEconShutdownEvent2Service.list().stream().filter(i ->
  43. i.getWinpowerstationId().contains("FDC")
  44. && (i.getStopTime().compareTo(currentDate) == 0 || i.getStopTime().after(currentDate))
  45. && (i.getStopTime().compareTo(endDate) == 0 || i.getStopTime().before(endDate))
  46. && !i.getStopTypeId().equals("wh")
  47. ).collect(Collectors.toList());
  48. Map<String, ProEconEquipmentInfoDay5> rates = new HashMap<>();
  49. for (ProBasicEquipment wt : CacheContext.wtls) {
  50. ProEconEquipmentInfoDay5 rate = new ProEconEquipmentInfoDay5();
  51. rate.setRecordDate(currentDate);
  52. rate.setWindpowerstationId(wt.getWindpowerstationId());
  53. rate.setProjectId(wt.getProjectId());
  54. rate.setLineId(wt.getLineId());
  55. rate.setWindturbineId(wt.getId());
  56. Initial.initial(rate);
  57. rates.put(wt.getId(), rate);
  58. }
  59. for (ProEconShutdownEvent2 item : shutdownevents) {
  60. if (rates.containsKey(item.getWindturbineId())) {
  61. if (item.getStopHours() <= 1) {
  62. double temp = rates.get(item.getWindturbineId()).getTimerate20();
  63. temp = temp + 1;
  64. rates.get(item.getWindturbineId()).setTimerate20(temp);
  65. if (item.getStopHours() <= 0.08) {
  66. temp = rates.get(item.getWindturbineId()).getTimerate16();
  67. temp = temp + 1;
  68. rates.get(item.getWindturbineId()).setTimerate16(temp);
  69. temp = rates.get(item.getWindturbineId()).getTimerate17();
  70. temp = temp + 1;
  71. rates.get(item.getWindturbineId()).setTimerate17(temp);
  72. temp = rates.get(item.getWindturbineId()).getTimerate18();
  73. temp = temp + 1;
  74. rates.get(item.getWindturbineId()).setTimerate18(temp);
  75. temp = rates.get(item.getWindturbineId()).getTimerate19();
  76. temp = temp + 1;
  77. rates.get(item.getWindturbineId()).setTimerate19(temp);
  78. item.setResetRate("5");
  79. } else if (item.getStopHours() <= 0.17) {
  80. temp = rates.get(item.getWindturbineId()).getTimerate17();
  81. temp = temp + 1;
  82. rates.get(item.getWindturbineId()).setTimerate17(temp);
  83. temp = rates.get(item.getWindturbineId()).getTimerate18();
  84. temp = temp + 1;
  85. rates.get(item.getWindturbineId()).setTimerate18(temp);
  86. temp = rates.get(item.getWindturbineId()).getTimerate19();
  87. temp = temp + 1;
  88. rates.get(item.getWindturbineId()).setTimerate19(temp);
  89. item.setResetRate("10");
  90. } else if (item.getStopHours() <= 0.25) {
  91. temp = rates.get(item.getWindturbineId()).getTimerate18();
  92. temp = temp + 1;
  93. rates.get(item.getWindturbineId()).setTimerate18(temp);
  94. temp = rates.get(item.getWindturbineId()).getTimerate19();
  95. temp = temp + 1;
  96. rates.get(item.getWindturbineId()).setTimerate19(temp);
  97. item.setResetRate("15");
  98. } else if (item.getStopHours() <= 0.33) {
  99. temp = rates.get(item.getWindturbineId()).getTimerate19();
  100. temp = temp + 1;
  101. rates.get(item.getWindturbineId()).setTimerate19(temp);
  102. item.setResetRate("20");
  103. } else if (item.getResetRate() == null) {
  104. item.setResetRate("99");
  105. } else {
  106. item.setResetRate(null);
  107. }
  108. }
  109. }
  110. for (ProEconEquipmentInfoDay5 day : rates.values()) {
  111. Optional<ProEconEquipmentInfoDay5> dayInfoo = proEconEquipmentInfoDay5Service.list().stream().filter(i -> i.getWindturbineId().equals(day.getWindturbineId())
  112. && i.getRecordDate().compareTo(currentDate) == 0
  113. ).findFirst();
  114. ProEconEquipmentInfoDay5 dayInfo ;
  115. if (dayInfoo.isPresent()) {
  116. dayInfo = dayInfoo.get();
  117. buildresetRate(dayInfo, day);
  118. QueryWrapper<ProEconEquipmentInfoDay5> wrapper = new QueryWrapper<>();
  119. wrapper.eq("id", dayInfo.getId());
  120. proEconEquipmentInfoDay5Service.remove(wrapper);
  121. }else
  122. {
  123. dayInfo = new ProEconEquipmentInfoDay5();
  124. buildresetRate(dayInfo, day);
  125. }
  126. proEconEquipmentInfoDay5Service.save(dayInfo);
  127. }
  128. }
  129. }
  130. public void buildresetRate(ProEconEquipmentInfoDay5 dayInfo, ProEconEquipmentInfoDay5 day) {
  131. dayInfo.setRecordDate(day.getRecordDate());
  132. dayInfo.setWindpowerstationId(day.getWindpowerstationId());
  133. dayInfo.setProjectId(day.getProjectId());
  134. dayInfo.setLineId(day.getLineId());
  135. dayInfo.setWindturbineId(day.getWindturbineId());
  136. dayInfo.setTimerate16(day.getTimerate16());
  137. dayInfo.setTimerate17(day.getTimerate17());
  138. dayInfo.setTimerate18(day.getTimerate18());
  139. dayInfo.setTimerate19(day.getTimerate19());
  140. dayInfo.setTimerate20(day.getTimerate20());
  141. }
  142. /**
  143. * 状态转换及时率
  144. */
  145. Double interval = 0.33; //20分钟
  146. Map<Double, Double> stateDescription1 = new HashMap<>();
  147. Map<Double, Double> stateDescription2 = new HashMap<>();
  148. Double interval1 = 0.0;
  149. Double interval2 = 0.0;
  150. Double interval3 = 0.0;
  151. public void stateRate(Date currentDate) throws Exception {
  152. if (stateDescription1.size() == 0) {
  153. stateDescription1.put(3.0, 6.0);
  154. stateDescription1.put(3.5, 0.0);
  155. stateDescription1.put(4.0, 0.0);
  156. }
  157. if (stateDescription2.size() == 0) {
  158. stateDescription2.put(3.0, 6.0);
  159. stateDescription2.put(3.5, 2.0);
  160. stateDescription2.put(4.0, 2.0);
  161. }
  162. //调度时间是第二天,currentDate 是第一天
  163. Date beginDate = DateUtils.truncate(currentDate);
  164. Date endDate = DateUtils.addDays(currentDate, 1);
  165. Map<String, ProEconEquipmentInfoDay5> rates = new HashMap<>();
  166. Map<String, List<ProEconStateTranRatesSub>> ratesubs1 = new HashMap<>();
  167. Map<String, List<ProEconStateTranRatesSub2>> ratesubs2 = new HashMap<>();
  168. for (ProBasicEquipment wt : CacheContext.wtls) {
  169. ProEconEquipmentInfoDay5 rate = new ProEconEquipmentInfoDay5();
  170. rate.setRecordDate(currentDate);
  171. rate.setWindpowerstationId(wt.getWindpowerstationId());
  172. rate.setProjectId(wt.getProjectId());
  173. rate.setLineId(wt.getLineId());
  174. rate.setWindturbineId(wt.getId());
  175. Initial.initial(rate);
  176. rates.put(wt.getId(), rate);
  177. List<PointData> speedDataList = null;
  178. List<PointData> statusDataList = null;
  179. if (CacheContext.wtpAimap.containsKey(wt.getId())) {
  180. Map<String, ProBasicEquipmentPoint> wtpmap = CacheContext.wtpAimap.get(wt.getId());
  181. if (wtpmap.containsKey(ContantXk.CJ_SSFS)) {
  182. ProBasicEquipmentPoint point = wtpmap.get(ContantXk.CJ_SSFS);
  183. speedDataList = edosUtil.getHistoryDatasSnap(point.getNemCode(), beginDate.getTime() / 1000, endDate.getTime() / 1000);
  184. }
  185. if (wtpmap.containsKey(ContantXk.MXZT)) {
  186. ProBasicEquipmentPoint point = wtpmap.get(ContantXk.MXZT);
  187. statusDataList = edosUtil.getHistoryDatasSnap(point.getNemCode(), beginDate.getTime() / 1000, endDate.getTime() / 1000);
  188. }
  189. }
  190. //List<PointData> powerDataList = getHistoryDatasSnap(powerpointDictionary[id].ID, beginDate, endDate);
  191. List<ProEconStateTranRatesSub> subs = new ArrayList<>();
  192. ProEconStateTranRatesSub sub = new ProEconStateTranRatesSub();
  193. if (speedDataList != null && statusDataList != null && statusDataList.size() == speedDataList.size()) {
  194. for (int i = 0; i < speedDataList.size(); i++) {
  195. if (speedDataList.get(i).getPointValueInDouble() <= 3.0) {
  196. sub = buildStateRate(currentDate, wt.getId(), speedDataList, statusDataList, subs, sub, i, 3.0);
  197. } else if (speedDataList.get(i).getPointValueInDouble() > 3 && speedDataList.get(i).getPointValueInDouble() <= 4) {
  198. sub = buildStateRate(currentDate, wt.getId(), speedDataList, statusDataList, subs, sub, i, 3.5);
  199. } else {
  200. sub = buildStateRate(currentDate, wt.getId(), speedDataList, statusDataList, subs, sub, i, 4.0);
  201. }
  202. }
  203. if (com.gyee.generation.util.StringUtils.empty(sub.getStatusEnd())) {
  204. long time = speedDataList.get(speedDataList.size() - 1).getPointTime();
  205. sub.setStatusEnd(new Date(time));
  206. sub.setStatusHours(DateUtils.hoursDiff1(sub.getStatusBegin(), sub.getStatusEnd()));
  207. } else if (com.gyee.generation.util.StringUtils.notEmp(sub.getStatusBegin2()) && com.gyee.generation.util.StringUtils.empty(sub.getStatusEnd2())) {
  208. long time = speedDataList.get(speedDataList.size() - 1).getPointTime();
  209. sub.setStatusEnd2(new Date(time));
  210. sub.setStatusHours2(DateUtils.hoursDiff1(sub.getStatusBegin2(), sub.getStatusEnd2()));
  211. }
  212. long time = speedDataList.get(speedDataList.size() - 1).getPointTime();
  213. sub.setEndTime(new Date(time));
  214. sub.setDurationHours(DateUtils.hoursDiff1(sub.getStartTime(), sub.getEndTime()));
  215. subs.add(sub);
  216. ratesubs1.put(wt.getId(), subs);
  217. //========================================================================================================================================
  218. //========================================================================================================================================
  219. List<ProEconStateTranRatesSub2> subs2 = new ArrayList<>();
  220. ProEconStateTranRatesSub2 sub2 = new ProEconStateTranRatesSub2();
  221. List<Date> intervaltimebegin = new ArrayList<>();
  222. List<Date> intervaltimeend = new ArrayList<>();
  223. for (int i = 0; i < subs.size(); i++) {
  224. interval1 = 0.0;
  225. interval2 = 0.0;
  226. interval3 = 0.0;
  227. if (sub2.getSpeed() == null) {
  228. buildStatetransitionratesSub2(subs, sub2, i);
  229. } else//非第一次
  230. {
  231. if (subs.get(i).getDurationHours() > interval) //当前时间间隔满足条件
  232. {
  233. /* 加处理代码 */
  234. double tempspeed;
  235. if (interval1 >= interval2 && interval1 >= interval3) {
  236. tempspeed = 3.0;
  237. } else if (interval2 >= interval1 && interval2 >= interval3) {
  238. tempspeed = 3.5;
  239. } else {
  240. tempspeed = 4.0;
  241. }
  242. if (Objects.equals(subs.get(i).getSpeed(), tempspeed)) {
  243. sub2.setEndTime(subs.get(i).getEndTime());
  244. sub2.setDurationHours(sub2.getDurationHours() + subs.get(i).getDurationHours());
  245. /* 加处理代码 */
  246. } else {
  247. setStateTranRatesSub2(sub2, intervaltimebegin, intervaltimeend);
  248. interval1 = 0.0;
  249. interval2 = 0.0;
  250. interval3 = 0.0;
  251. intervaltimebegin = new ArrayList<>();
  252. intervaltimeend = new ArrayList<>();
  253. //newMethod(subs, interval1, interval2, interval3, i, lastspeed, intervaltimebegin, intervaltimeend);
  254. subs2.add(sub2);
  255. sub2 = new ProEconStateTranRatesSub2();
  256. buildStatetransitionratesSub2(subs, sub2, i);
  257. }
  258. } else //当前时间间隔不满足条件
  259. {
  260. if (subs.get(i).getSpeed() == 3.0) {
  261. interval1 = interval1 + subs.get(i).getDurationHours();
  262. } else if (subs.get(i).getSpeed() == 3.5) {
  263. interval2 = interval2 + subs.get(i).getDurationHours();
  264. } else {
  265. interval3 = interval3 + subs.get(i).getDurationHours();
  266. }
  267. if (interval1 > 0 && interval2 > 0 && interval3 > 0) {
  268. if (subs.get(i).getSpeed() == 3.0) {
  269. interval1 = interval1 - subs.get(i).getDurationHours();
  270. } else if (subs.get(i).getSpeed() == 3.5) {
  271. interval2 = interval2 - subs.get(i).getDurationHours();
  272. } else {
  273. interval3 = interval3 - subs.get(i).getDurationHours();
  274. }
  275. setStateTranRatesSub2(sub2, intervaltimebegin, intervaltimeend);
  276. interval1 = 0.0;
  277. interval2 = 0.0;
  278. interval3 = 0.0;
  279. intervaltimebegin = new ArrayList<>();
  280. intervaltimeend = new ArrayList<>();
  281. //newMethod(subs, interval1, interval2, interval3, i, lastspeed, intervaltimebegin, intervaltimeend);
  282. subs2.add(sub2);
  283. sub2 = new ProEconStateTranRatesSub2();
  284. buildStatetransitionratesSub2(subs, sub2, i);
  285. } else {
  286. if (subs.get(i).getSpeed() == 3.0) {
  287. interval1 = interval1 - subs.get(i).getDurationHours();
  288. } else if (subs.get(i).getSpeed() == 3.5) {
  289. interval2 = interval2 - subs.get(i).getDurationHours();
  290. } else {
  291. interval3 = interval3 - subs.get(i).getDurationHours();
  292. }
  293. sub2.setEndTime(subs.get(i).getEndTime());
  294. sub2.setDurationHours(sub2.getDurationHours() + subs.get(i).getDurationHours());
  295. }
  296. }
  297. }
  298. //-----------------------------------------------------------------------------------------------------------------
  299. newMethod(subs, i, intervaltimebegin, intervaltimeend);
  300. //------------------------------------------------------------------------------------------------------------------
  301. }
  302. if (interval1 >= interval2 && interval1 >= interval3) {
  303. sub2.setSpeed(3.0);
  304. if (intervaltimebegin.get(4) != null) {
  305. sub2.setStatusCode2(4);
  306. sub2.setStatusBegin2(intervaltimebegin.get(4));
  307. sub2.setStatusEnd2(intervaltimeend.get(4));
  308. sub2.setStatusHours2(DateUtils.hoursDiff2(sub2.getStatusEnd2(), sub2.getStatusBegin2()));
  309. }
  310. } else if (interval2 >= interval1 && interval2 >= interval3) {
  311. sub2.setSpeed(3.5);
  312. newMethod(sub2, intervaltimebegin, intervaltimeend);
  313. } else {
  314. sub2.setSpeed(4.0);
  315. newMethod(sub2, intervaltimebegin, intervaltimeend);
  316. }
  317. subs2.add(sub2);
  318. ratesubs2.put(wt.getId(), subs2);
  319. //============================================================================================================================================================================
  320. //============================================================================================================================================================================
  321. for (ProEconStateTranRatesSub2 proEconStateTranRatesSub2 : subs2) {
  322. if (proEconStateTranRatesSub2.getSpeed() == 3) {
  323. if (proEconStateTranRatesSub2.getDurationHours() > 0.5) {
  324. if (proEconStateTranRatesSub2.getStatusCode() == 0 || proEconStateTranRatesSub2.getStatusCode() == 1) {
  325. //if (subs2.get(i).getStatusCode() == 4 && subs2.get(i).getStatusCode() == 2)
  326. //{
  327. if (proEconStateTranRatesSub2.getStatusHours() < 0.25)//5分钟
  328. {
  329. proEconStateTranRatesSub2.setResetRate(0.25);
  330. double temp = rate.getTimerate1();
  331. temp = temp + 1;
  332. rate.setTimerate1(temp);
  333. temp = rate.getTimerate2();
  334. temp = temp + 1;
  335. rate.setTimerate2(temp);
  336. temp = rate.getTimerate3();
  337. temp = temp + 1;
  338. rate.setTimerate3(temp);
  339. temp = rate.getTimerate4();
  340. temp = temp + 1;
  341. rate.setTimerate4(temp);
  342. } else if (proEconStateTranRatesSub2.getStatusHours() < 0.33)//10分钟
  343. {
  344. proEconStateTranRatesSub2.setResetRate(0.33);
  345. double temp = rate.getTimerate2();
  346. temp = temp + 1;
  347. rate.setTimerate2(temp);
  348. temp = rate.getTimerate3();
  349. temp = temp + 1;
  350. rate.setTimerate3(temp);
  351. temp = rate.getTimerate4();
  352. temp = temp + 1;
  353. rate.setTimerate4(temp);
  354. } else if (proEconStateTranRatesSub2.getStatusHours() < 0.42)//15分钟
  355. {
  356. proEconStateTranRatesSub2.setResetRate(0.42);
  357. double temp = rate.getTimerate3();
  358. temp = temp + 1;
  359. rate.setTimerate3(temp);
  360. temp = rate.getTimerate4();
  361. temp = temp + 1;
  362. rate.setTimerate4(temp);
  363. } else if (proEconStateTranRatesSub2.getStatusHours() < 0.5)//20分钟
  364. {
  365. proEconStateTranRatesSub2.setResetRate(0.5);
  366. double temp = rate.getTimerate4();
  367. temp = temp + 1;
  368. rate.setTimerate4(temp);
  369. }
  370. //}
  371. double temp = rate.getTimerate13();
  372. temp = temp + 1;
  373. rate.setTimerate13(temp);
  374. }
  375. if (proEconStateTranRatesSub2.getStatusCode() == 4) {
  376. if (proEconStateTranRatesSub2.getStatusHours() < 0.25)//5分钟
  377. {
  378. proEconStateTranRatesSub2.setResetRate(0.25);
  379. double temp = rate.getTimerate5();
  380. temp = temp + 1;
  381. rate.setTimerate5(temp);
  382. temp = rate.getTimerate6();
  383. temp = temp + 1;
  384. rate.setTimerate6(temp);
  385. temp = rate.getTimerate7();
  386. temp = temp + 1;
  387. rate.setTimerate7(temp);
  388. temp = rate.getTimerate8();
  389. temp = temp + 1;
  390. rate.setTimerate8(temp);
  391. } else if (proEconStateTranRatesSub2.getStatusHours() < 0.33)//10分钟
  392. {
  393. proEconStateTranRatesSub2.setResetRate(0.33);
  394. double temp = rate.getTimerate6();
  395. temp = temp + 1;
  396. rate.setTimerate6(temp);
  397. temp = rate.getTimerate7();
  398. temp = temp + 1;
  399. rate.setTimerate7(temp);
  400. temp = rate.getTimerate8();
  401. temp = temp + 1;
  402. rate.setTimerate8(temp);
  403. } else if (proEconStateTranRatesSub2.getStatusHours() < 0.42)//15分钟
  404. {
  405. proEconStateTranRatesSub2.setResetRate(0.42);
  406. double temp = rate.getTimerate7();
  407. temp = temp + 1;
  408. rate.setTimerate7(temp);
  409. temp = rate.getTimerate8();
  410. temp = temp + 1;
  411. rate.setTimerate8(temp);
  412. } else if (proEconStateTranRatesSub2.getStatusHours() < 0.5)//20分钟
  413. {
  414. proEconStateTranRatesSub2.setResetRate(0.5);
  415. double temp = rate.getTimerate8();
  416. temp = temp + 1;
  417. rate.setTimerate8(temp);
  418. }
  419. //}
  420. double temp = rate.getTimerate14();
  421. temp = temp + 1;
  422. rate.setTimerate14(temp);
  423. }
  424. }
  425. } else if (proEconStateTranRatesSub2.getSpeed() == 3.5) {
  426. if (proEconStateTranRatesSub2.getDurationHours() > 0.5) {
  427. if (proEconStateTranRatesSub2.getStatusCode() == 0 || proEconStateTranRatesSub2.getStatusCode() == 1) {
  428. //if (subs2.get(i).getStatusCode() == 4 && subs2.get(i).getStatusCode() == 2)
  429. //{
  430. if (proEconStateTranRatesSub2.getStatusHours() < 0.25)//5分钟
  431. {
  432. proEconStateTranRatesSub2.setResetRate(0.25);
  433. double temp = rate.getTimerate1();
  434. temp = temp + 1;
  435. rate.setTimerate1(temp);
  436. temp = rate.getTimerate2();
  437. temp = temp + 1;
  438. rate.setTimerate2(temp);
  439. temp = rate.getTimerate3();
  440. temp = temp + 1;
  441. rate.setTimerate3(temp);
  442. temp = rate.getTimerate4();
  443. temp = temp + 1;
  444. rate.setTimerate4(temp);
  445. } else if (proEconStateTranRatesSub2.getStatusHours() < 0.33)//10分钟
  446. {
  447. proEconStateTranRatesSub2.setResetRate(0.3);
  448. double temp = rate.getTimerate2();
  449. temp = temp + 1;
  450. rate.setTimerate2(temp);
  451. temp = rate.getTimerate3();
  452. temp = temp + 1;
  453. rate.setTimerate3(temp);
  454. temp = rate.getTimerate4();
  455. temp = temp + 1;
  456. rate.setTimerate4(temp);
  457. } else if (proEconStateTranRatesSub2.getStatusHours() < 0.42)//15分钟
  458. {
  459. proEconStateTranRatesSub2.setResetRate(0.42);
  460. double temp = rate.getTimerate3();
  461. temp = temp + 1;
  462. rate.setTimerate3(temp);
  463. temp = rate.getTimerate4();
  464. temp = temp + 1;
  465. rate.setTimerate4(temp);
  466. } else if (proEconStateTranRatesSub2.getStatusHours() < 0.5)//20分钟
  467. {
  468. proEconStateTranRatesSub2.setResetRate(0.5);
  469. double temp = rate.getTimerate4();
  470. temp = temp + 1;
  471. rate.setTimerate4(temp);
  472. }
  473. //}
  474. double temp = rate.getTimerate13();
  475. temp = temp + 1;
  476. rate.setTimerate13(temp);
  477. }
  478. if (proEconStateTranRatesSub2.getStatusCode() == 4) {
  479. //if (subs2.get(i).getStatusCode() == 0 || subs2.get(i).getStatusCode() == 1)
  480. //{
  481. if (proEconStateTranRatesSub2.getStatusHours() < 0.25)//5分钟
  482. {
  483. proEconStateTranRatesSub2.setResetRate(0.25);
  484. double temp = rate.getTimerate5();
  485. temp = temp + 1;
  486. rate.setTimerate5(temp);
  487. temp = rate.getTimerate6();
  488. temp = temp + 1;
  489. rate.setTimerate6(temp);
  490. temp = rate.getTimerate7();
  491. temp = temp + 1;
  492. rate.setTimerate7(temp);
  493. temp = rate.getTimerate8();
  494. temp = temp + 1;
  495. rate.setTimerate8(temp);
  496. } else if (proEconStateTranRatesSub2.getStatusHours() < 0.33)//10分钟
  497. {
  498. proEconStateTranRatesSub2.setResetRate(0.33);
  499. double temp = rate.getTimerate6();
  500. temp = temp + 1;
  501. rate.setTimerate6(temp);
  502. temp = rate.getTimerate7();
  503. temp = temp + 1;
  504. rate.setTimerate7(temp);
  505. temp = rate.getTimerate8();
  506. temp = temp + 1;
  507. rate.setTimerate8(temp);
  508. } else if (proEconStateTranRatesSub2.getStatusHours() < 0.42)//15分钟
  509. {
  510. proEconStateTranRatesSub2.setResetRate(0.42);
  511. double temp = rate.getTimerate7();
  512. temp = temp + 1;
  513. rate.setTimerate7(temp);
  514. temp = rate.getTimerate8();
  515. temp = temp + 1;
  516. rate.setTimerate8(temp);
  517. } else if (proEconStateTranRatesSub2.getStatusHours() < 0.5)//20分钟
  518. {
  519. proEconStateTranRatesSub2.setResetRate(0.5);
  520. double temp = rate.getTimerate8();
  521. temp = temp + 1;
  522. rate.setTimerate8(temp);
  523. }
  524. //}
  525. double temp = rate.getTimerate14();
  526. temp = temp + 1;
  527. rate.setTimerate14(temp);
  528. }
  529. }
  530. } else if (proEconStateTranRatesSub2.getSpeed() == 4) {
  531. if (proEconStateTranRatesSub2.getDurationHours() > 0.5) {
  532. if (proEconStateTranRatesSub2.getStatusCode() == 0) {
  533. if (proEconStateTranRatesSub2.getStatusCode() == 1) {
  534. if (proEconStateTranRatesSub2.getStatusHours() < 0.25)//5分钟
  535. {
  536. proEconStateTranRatesSub2.setResetRate(0.25);
  537. double temp = rate.getTimerate9();
  538. temp = temp + 1;
  539. rate.setTimerate9(temp);
  540. temp = rate.getTimerate10();
  541. temp = temp + 1;
  542. rate.setTimerate10(temp);
  543. temp = rate.getTimerate11();
  544. temp = temp + 1;
  545. rate.setTimerate11(temp);
  546. temp = rate.getTimerate12();
  547. temp = temp + 1;
  548. rate.setTimerate12(temp);
  549. } else if (proEconStateTranRatesSub2.getStatusHours() < 0.33)//10分钟
  550. {
  551. proEconStateTranRatesSub2.setResetRate(0.33);
  552. double temp = rate.getTimerate10();
  553. temp = temp + 1;
  554. rate.setTimerate10(temp);
  555. temp = rate.getTimerate11();
  556. temp = temp + 1;
  557. rate.setTimerate11(temp);
  558. temp = rate.getTimerate12();
  559. temp = temp + 1;
  560. rate.setTimerate12(temp);
  561. } else if (proEconStateTranRatesSub2.getStatusHours() < 0.42)//15分钟
  562. {
  563. proEconStateTranRatesSub2.setResetRate(0.42);
  564. double temp = rate.getTimerate11();
  565. temp = temp + 1;
  566. rate.setTimerate11(temp);
  567. temp = rate.getTimerate12();
  568. temp = temp + 1;
  569. rate.setTimerate12(temp);
  570. } else if (proEconStateTranRatesSub2.getStatusHours() < 0.5)//20分钟
  571. {
  572. proEconStateTranRatesSub2.setResetRate(0.5);
  573. double temp = rate.getTimerate12();
  574. temp = temp + 1;
  575. rate.setTimerate12(temp);
  576. }
  577. double temp = rate.getTimerate15();
  578. temp = temp + 1;
  579. rate.setTimerate15(temp);
  580. }
  581. }
  582. }
  583. }
  584. //}
  585. }
  586. }
  587. }
  588. List<Integer> items1 = proEconStateTranRatesSubService.list().stream().filter(i -> i.getRecordDate().compareTo(currentDate) == 0).map(ProEconStateTranRatesSub::getId).collect(Collectors.toList());
  589. List<Integer> items2 = proEconStateTranRatesSub2Service.list().stream().filter(i -> i.getRecordDate().compareTo(currentDate) == 0).map(ProEconStateTranRatesSub2::getId).collect(Collectors.toList());
  590. if (!items1.isEmpty()) {
  591. proEconStateTranRatesSubService.removeByIds(items1);
  592. }
  593. if (!items2.isEmpty()) {
  594. proEconStateTranRatesSub2Service.removeByIds(items2);
  595. }
  596. for (String key : rates.keySet()) {
  597. ProEconEquipmentInfoDay5 rate = rates.get(key);
  598. if (ratesubs1.containsKey(key) && ratesubs2.containsKey(key)) {
  599. for (ProEconStateTranRatesSub item : ratesubs1.get(key)) {
  600. proEconStateTranRatesSubService.save(item);
  601. }
  602. for (ProEconStateTranRatesSub2 item : ratesubs2.get(key)) {
  603. proEconStateTranRatesSub2Service.save(item);
  604. }
  605. Optional<ProEconEquipmentInfoDay5> dayInfoo = proEconEquipmentInfoDay5Service.list().stream()
  606. .filter(i -> i.getWindturbineId().equals(key)
  607. && i.getRecordDate().compareTo(currentDate) == 0
  608. ).findFirst();
  609. ProEconEquipmentInfoDay5 dayInfo;
  610. if (dayInfoo.isPresent()) {
  611. dayInfo = dayInfoo.get();
  612. buildresetRateByState(dayInfo, rate);
  613. QueryWrapper<ProEconEquipmentInfoDay5> wrapper = new QueryWrapper<>();
  614. wrapper.eq("id", dayInfo.getId());
  615. proEconEquipmentInfoDay5Service.remove(wrapper);
  616. }else
  617. {
  618. dayInfo = new ProEconEquipmentInfoDay5();
  619. buildresetRateByState(dayInfo, rate);
  620. }
  621. proEconEquipmentInfoDay5Service.save(dayInfo);
  622. }
  623. }
  624. }
  625. private void setStateTranRatesSub2(ProEconStateTranRatesSub2 sub2, List<Date> intervaltimebegin, List<Date> intervaltimeend) {
  626. if (interval1 >= interval2 && interval1 >= interval3) {
  627. sub2.setSpeed(3.0);
  628. if (intervaltimebegin.get(4) != null) {
  629. sub2.setStatusCode2(4);
  630. sub2.setStatusBegin2(intervaltimebegin.get(4));
  631. sub2.setStatusEnd2(intervaltimeend.get(4));
  632. sub2.setStatusHours2(DateUtils.hoursDiff2(sub2.getStatusEnd2(), sub2.getStatusBegin2()));
  633. }
  634. } else if (interval2 >= interval1 && interval2 >= interval3) {
  635. sub2.setSpeed(3.5);
  636. newMethod(sub2, intervaltimebegin, intervaltimeend);
  637. } else {
  638. sub2.setSpeed(4.0);
  639. newMethod(sub2, intervaltimebegin, intervaltimeend);
  640. }
  641. }
  642. private static void newMethod(ProEconStateTranRatesSub2 sub2, List<Date> intervaltimebegin, List<Date> intervaltimeend) {
  643. if (intervaltimebegin.get(0) != null) {
  644. if (intervaltimebegin.get(1) != null) {
  645. if (intervaltimebegin.get(0).before(intervaltimebegin.get(1))) {
  646. sub2.setStatusCode(0);
  647. sub2.setStatusBegin2(intervaltimebegin.get(0));
  648. sub2.setStatusEnd2(intervaltimeend.get(0));
  649. } else {
  650. sub2.setStatusCode(1);
  651. sub2.setStatusBegin2(intervaltimebegin.get(1));
  652. sub2.setStatusEnd2(intervaltimeend.get(1));
  653. }
  654. } else {
  655. sub2.setStatusCode(0);
  656. sub2.setStatusBegin2(intervaltimebegin.get(0));
  657. sub2.setStatusEnd2(intervaltimeend.get(0));
  658. }
  659. sub2.setStatusHours2(DateUtils.hoursDiff2(sub2.getStatusEnd2(), sub2.getStatusBegin2()));
  660. } else if (intervaltimebegin.get(1) != null) {
  661. sub2.setStatusCode(1);
  662. sub2.setStatusBegin2(intervaltimebegin.get(1));
  663. sub2.setStatusEnd2(intervaltimeend.get(1));
  664. sub2.setStatusHours2(DateUtils.hoursDiff2(sub2.getStatusEnd2(), sub2.getStatusBegin2()));
  665. }
  666. }
  667. private void newMethod(List<ProEconStateTranRatesSub> subs, Integer i, List<Date> intervaltimebegin, List<Date> intervaltimeend) {
  668. if (subs.get(i).getSpeed() == 3.0) {
  669. interval1 += subs.get(i).getDurationHours();
  670. } else if (subs.get(i).getSpeed() == 3.5) {
  671. interval2 += subs.get(i).getDurationHours();
  672. } else {
  673. interval3 += subs.get(i).getDurationHours();
  674. }
  675. if (subs.get(i).getStatusCode() != null && subs.get(i).getStatusCode() < 5) {
  676. Integer key = subs.get(i).getStatusCode();
  677. if (intervaltimebegin.get(key) == null) {
  678. intervaltimebegin.set(key, subs.get(i).getStatusBegin2());
  679. intervaltimeend.set(key, subs.get(i).getStatusEnd2());
  680. }
  681. }
  682. if (subs.get(i).getStatusCode() != null && subs.get(i).getStatusCode() < 5) {
  683. Integer key = subs.get(i).getStatusCode();
  684. if (intervaltimebegin.get(key) == null) {
  685. intervaltimebegin.set(key, subs.get(i).getStatusBegin());
  686. intervaltimeend.set(key, subs.get(i).getStatusEnd());
  687. }
  688. }
  689. }
  690. public void buildresetRateByState(ProEconEquipmentInfoDay5 dayInfo, ProEconEquipmentInfoDay5 day) {
  691. dayInfo.setRecordDate(day.getRecordDate());
  692. dayInfo.setWindpowerstationId(day.getWindpowerstationId());
  693. dayInfo.setProjectId(day.getProjectId());
  694. dayInfo.setWindturbineId(day.getWindturbineId());
  695. dayInfo.setLineId(day.getLineId());
  696. dayInfo.setTimerate1(day.getTimerate1());
  697. dayInfo.setTimerate2(day.getTimerate2());
  698. dayInfo.setTimerate3(day.getTimerate3());
  699. dayInfo.setTimerate4(day.getTimerate4());
  700. dayInfo.setTimerate5(day.getTimerate5());
  701. dayInfo.setTimerate6(day.getTimerate6());
  702. dayInfo.setTimerate7(day.getTimerate7());
  703. dayInfo.setTimerate8(day.getTimerate8());
  704. dayInfo.setTimerate9(day.getTimerate9());
  705. dayInfo.setTimerate10(day.getTimerate10());
  706. dayInfo.setTimerate11(day.getTimerate11());
  707. dayInfo.setTimerate12(day.getTimerate12());
  708. dayInfo.setTimerate13(day.getTimerate13());
  709. dayInfo.setTimerate14(day.getTimerate14());
  710. dayInfo.setTimerate15(day.getTimerate15());
  711. }
  712. private static void buildStatetransitionratesSub2(List<ProEconStateTranRatesSub> subs, ProEconStateTranRatesSub2 sub2, Integer i) {
  713. sub2.setWindpwoerId(subs.get(i).getWindpwoerId());
  714. sub2.setProjectId(subs.get(i).getProjectId());
  715. sub2.setLineId(subs.get(i).getLineId());
  716. sub2.setWindturbineId(subs.get(i).getWindturbineId());
  717. sub2.setRecordDate(subs.get(i).getRecordDate());
  718. sub2.setStartTime(subs.get(i).getStartTime());
  719. sub2.setEndTime(subs.get(i).getEndTime());
  720. sub2.setDurationHours(subs.get(i).getDurationHours());
  721. sub2.setSpeed(subs.get(i).getSpeed());
  722. sub2.setMaxSpeed(subs.get(i).getMaxSpeed());
  723. sub2.setMinSpeed(subs.get(i).getMinSpeed());
  724. sub2.setStatusCode(subs.get(i).getStatusCode());
  725. sub2.setStatusHours(subs.get(i).getStatusHours());
  726. sub2.setStatusBegin(subs.get(i).getStatusBegin());
  727. sub2.setStatusEnd(subs.get(i).getStatusEnd());
  728. sub2.setStatusCode2(subs.get(i).getStatusCode2());
  729. sub2.setStatusHours2(subs.get(i).getStatusHours2());
  730. sub2.setStatusBegin2(subs.get(i).getStatusBegin2());
  731. sub2.setStatusEnd2(subs.get(i).getStatusEnd2());
  732. }
  733. private ProEconStateTranRatesSub buildStateRate(Date currentDate, String id, List<PointData> speedDataList, List<PointData> statusDataList, List<ProEconStateTranRatesSub> subs, ProEconStateTranRatesSub sub, Integer i, Double speed) {
  734. if (sub.getStartTime() == null) {
  735. //初始化
  736. buildSTATETRANSITIONRATESSUB(currentDate, id, speedDataList, statusDataList, sub, i, speed);
  737. } else {
  738. if (sub.getEndTime() == null) {
  739. //判定是几米风速 3 、 3.5 、 4
  740. if (Objects.equals(sub.getSpeed(), speed)) {
  741. //stateDescription.Add(3, 4);
  742. //stateDescription.Add(3.5m, 0);
  743. //stateDescription.Add(4, 0);
  744. if (sub.getStatusCode() != statusDataList.get(i).getPointValueInDouble() && sub.getStatusCode() == null &&
  745. (statusDataList.get(i).getPointValueInDouble() == stateDescription1.get(speed) ||
  746. statusDataList.get(i).getPointValueInDouble() == stateDescription2.get(speed))) {
  747. sub.setStatusCode(Integer.valueOf(String.valueOf(statusDataList.get(i).getPointValueInDouble())));
  748. sub.setStatusBegin2(new Date(speedDataList.get(i).getPointTime()));
  749. sub.setStatusEnd(new Date(speedDataList.get(i).getPointTime()));
  750. sub.setStatusHours(DateUtils.hoursDiff1(sub.getStatusEnd(), sub.getStatusBegin()));
  751. } else if (sub.getStatusCode() != null && sub.getStatusCode() != statusDataList.get(i).getPointValueInDouble()) {
  752. sub.setStatusEnd2(new Date(speedDataList.get(i).getPointTime()));
  753. sub.setStatusHours2(DateUtils.hoursDiff1(sub.getStatusEnd2(), sub.getStatusBegin2()));
  754. }
  755. } else {
  756. if (sub.getStatusEnd() == null) {
  757. sub.setStatusEnd(new Date(speedDataList.get(i).getPointTime()));
  758. sub.setStatusHours(DateUtils.hoursDiff1(sub.getStatusEnd(), sub.getStatusBegin()));
  759. } else if (sub.getStatusBegin2() != null && sub.getStatusEnd2() == null) {
  760. sub.setStatusEnd2(new Date(speedDataList.get(i).getPointTime()));
  761. sub.setStatusHours2(DateUtils.hoursDiff1(sub.getStatusEnd2(), sub.getStatusBegin2()));
  762. }
  763. sub.setEndTime(new Date(speedDataList.get(i).getPointTime()));
  764. sub.setDurationHours(DateUtils.hoursDiff1(sub.getEndTime(), sub.getStartTime()));
  765. ProEconStateTranRatesSub finalSub = sub;
  766. DoubleSummaryStatistics summaryStatistics = speedDataList.stream().filter(x -> new Date(x.getPointTime()).after(finalSub.getStartTime())
  767. && new Date(x.getPointTime()).before(finalSub.getEndTime())
  768. ).mapToDouble(PointData::getPointValueInDouble).summaryStatistics();
  769. //最大最小风速
  770. double max = summaryStatistics.getMax();
  771. double min = summaryStatistics.getMin();
  772. sub.setMaxSpeed(max);
  773. sub.setMinSpeed(min);
  774. subs.add(sub);
  775. sub = new ProEconStateTranRatesSub();
  776. buildSTATETRANSITIONRATESSUB(currentDate, id, speedDataList, statusDataList, sub, i, speed);
  777. }
  778. }
  779. }
  780. return sub;
  781. }
  782. private void buildSTATETRANSITIONRATESSUB(Date currentDate, String id, List<PointData> speedDataList, List<PointData> statusDataList, ProEconStateTranRatesSub sub, Integer i, Double speed) {
  783. sub.setStartTime(new Date(speedDataList.get(i).getPointTime()));
  784. sub.setWindpwoerId(CacheContext.wtmap.get(id).getWindpowerstationId());
  785. sub.setProjectId(CacheContext.wtmap.get(id).getProjectId());
  786. sub.setLineId(CacheContext.wtmap.get(id).getLineId());
  787. sub.setWindturbineId(id);
  788. sub.setRecordDate(currentDate);
  789. Double temp = statusDataList.get(i).getPointValueInDouble();
  790. sub.setStatusCode(Integer.valueOf(String.valueOf(temp)));
  791. sub.setStatusBegin(new Date(speedDataList.get(i).getPointTime()));
  792. sub.setSpeed(speed);
  793. }
  794. //故障消缺及时率
  795. public void failRate(Date cuttentDate) {
  796. Map<Date, Map<String, ProEconFaultLiminatedefects>> dtDictionary = new HashMap<>();
  797. Calendar c = Calendar.getInstance();
  798. c.setTime(cuttentDate);
  799. //Date now = Date.Now.Date.AddMonths(-1); //上月
  800. Date now = DateUtils.truncate(c.getTime()); //本月
  801. c.setTime(now);
  802. c.set(Calendar.DAY_OF_MONTH, 1);
  803. Date begin = c.getTime();
  804. c.add(Calendar.MONTH, 1);
  805. c.add(Calendar.DAY_OF_MONTH, -1);
  806. Date end = c.getTime();
  807. List<Integer> deleteitems = proEconFaultLiminatedefectsService.list().stream().filter(i ->
  808. (i.getDateTime().compareTo(begin) == 0 || i.getDateTime().after(begin))
  809. && (i.getDateTime().compareTo(end) == 0 || i.getDateTime().before(end))
  810. ).map(ProEconFaultLiminatedefects::getId).collect(Collectors.toList());
  811. if (!deleteitems.isEmpty()) {
  812. proEconFaultLiminatedefectsService.removeByIds(deleteitems);
  813. }
  814. List<ProEconShutdownEvent> st2 = proEconShutdownEventService.list().stream()
  815. .filter(i ->
  816. (i.getStopTime().compareTo(begin) == 0 || i.getStopTime().after(begin))
  817. && (i.getStopTime().compareTo(end) == 0 || i.getStopTime().before(end))
  818. ).collect(Collectors.toList());
  819. for (ProEconShutdownEvent item : st2) {
  820. Date dt = item.getStopTime();
  821. Map<String, ProEconFaultLiminatedefects> fdDictionary;
  822. if (dtDictionary.containsKey(dt)) {
  823. fdDictionary = dtDictionary.get(dt);
  824. } else {
  825. fdDictionary = new HashMap<>();
  826. dtDictionary.put(dt, fdDictionary);
  827. }
  828. ProEconFaultLiminatedefects fs;
  829. if (fdDictionary.containsKey(item.getWindturbineId())) {
  830. fs = fdDictionary.get(item.getWindturbineId());
  831. double temp = fs.getFaultCount();
  832. temp = temp + 1;
  833. fs.setFaultCount(temp);
  834. } else {
  835. fs = new ProEconFaultLiminatedefects();
  836. fs.setWindturbineId(item.getWindturbineId());
  837. if (CacheContext.wtmap.containsKey(item.getWindturbineId())) {
  838. ProBasicEquipment wt = CacheContext.wtmap.get(item.getWindturbineId());
  839. fs.setWindpowerstationId(wt.getWindpowerstationId());
  840. fs.setProjectId(wt.getProjectId());
  841. fs.setLineId(wt.getLineId());
  842. }
  843. fs.setDateTime(dt);
  844. double temp = fs.getFaultCount();
  845. temp = temp + 1;
  846. fs.setFaultCount(temp);
  847. fs.setClassifyId("-1");
  848. if (!StringUtils.notEmp(fs.getRightCount())) {
  849. fs.setRightCount(0.0);
  850. }
  851. fdDictionary.put(item.getWindturbineId(), fs);
  852. }
  853. if (item.getStopHours() < 24) {
  854. double temp = fs.getRightCount();
  855. temp = temp + 1;
  856. fs.setRightCount(temp);
  857. }
  858. if (fs.getFaultCount() != 0) {
  859. double temp = BigDecimal.valueOf(fs.getRightCount()).divide(BigDecimal.valueOf(fs.getFaultCount()), 2, RoundingMode.HALF_EVEN).multiply(new BigDecimal(100)).doubleValue();
  860. fs.setRate(temp);
  861. }
  862. }
  863. for (Map<String, ProEconFaultLiminatedefects> items : dtDictionary.values()) {
  864. for (ProEconFaultLiminatedefects item : items.values()) {
  865. proEconFaultLiminatedefectsService.save(item);
  866. }
  867. }
  868. }
  869. }