PowerCurveFittingByTimeService.java 80 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740
  1. package com.gyee.generation.service;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.gyee.common.contant.ContantXk;
  5. import com.gyee.common.model.PointData;
  6. import com.gyee.generation.init.CacheContext;
  7. import com.gyee.generation.model.auto.*;
  8. import com.gyee.generation.model.vo.*;
  9. import com.gyee.generation.service.auto.*;
  10. import com.gyee.generation.util.DateUtils;
  11. import com.gyee.generation.util.StringUtils;
  12. import com.gyee.generation.util.realtimesource.IEdosUtil;
  13. import com.gyee.generation.util.realtimesource.math.LineUtil;
  14. import com.gyee.generation.util.redis.RedisService;
  15. import org.slf4j.Logger;
  16. import org.slf4j.LoggerFactory;
  17. import org.springframework.beans.factory.annotation.Value;
  18. import org.springframework.stereotype.Service;
  19. import javax.annotation.Resource;
  20. import java.util.*;
  21. import java.util.stream.Collectors;
  22. @Service
  23. public class PowerCurveFittingByTimeService {
  24. private static final Logger logger = LoggerFactory.getLogger(PowerCurveFittingByTimeService.class);
  25. @Resource
  26. private IEdosUtil edosUtil;
  27. @Value("${curvefitting.dimension}")
  28. private Integer dimension;
  29. @Value("${curvefitting.scale}")
  30. private Double scale;
  31. @Value("${initialcode}")
  32. private String initialcode;
  33. public Map<String, Double> windturbineCapacity;
  34. @Resource
  35. private RedisService redisService;
  36. @Resource
  37. private IProEconWtCurveFittingMonthService proEconWtCurveFittingMonthService;
  38. @Resource
  39. private IProEconWtCurveFittingYearService proEconWtCurveFittingYearService;
  40. @Resource
  41. private IProEconWtCurveFittingService proEconWtCurveFittingService;
  42. @Resource
  43. private IProEconCurveFittingMainService proEconCurveFittingMainService;
  44. @Resource
  45. private IProEconCurveFittingSubService proEconCurveFittingSubService;
  46. @Resource
  47. private IProEconCurveFittMonthMainService proEconCurveFittMonthMainService;
  48. @Resource
  49. private IProEconCurveFittMonthSubService proEconCurveFittMonthSubService;
  50. @Resource
  51. private IProEconWtPowerCurveFittingService proEconWtPowerCurveFittingService;
  52. @Resource
  53. private IProEconCurveFittYearSubService proEconCurveFittYearSubService;
  54. @Resource
  55. private IProEconCurveFittYearMainService proEconCurveFittYearMainService;
  56. public void cureFittingDay(Date recordDate) throws Exception {
  57. //日期变为昨天
  58. Date end = DateUtils.addDays(DateUtils.truncate(recordDate), -1);
  59. Calendar c = Calendar.getInstance();
  60. c.setTime(end);
  61. Date begin = DateUtils.addDays(end, -6);
  62. proEconWtCurveFittingService.deleteProEconWtCurveFittingFByDay(DateUtils.truncate(recordDate));
  63. proEconCurveFittingMainService.deleteProEconCurveFittingMainFByDay(DateUtils.truncate(recordDate));
  64. proEconCurveFittingSubService.deleteProEconCurveFittingSubFByDay(DateUtils.truncate(recordDate));
  65. Map<String, CureFittingVo> windMap = new HashMap<>();
  66. //初始化风机装机容量
  67. if (windturbineCapacity == null) {
  68. windturbineCapacity = new HashMap<>();
  69. Map<String, ProEconEquipmentmodel> modelMap = CacheContext.modelMap;
  70. for (ProBasicEquipment windturbine : CacheContext.wtls) {
  71. if (modelMap.containsKey(windturbine.getModelId())) {
  72. windturbineCapacity.put(windturbine.getId(), modelMap.get(windturbine.getModelId()).getPowerProduction());
  73. }
  74. }
  75. }
  76. for (ProBasicEquipment wt : CacheContext.wtls) {
  77. String windturbineId = wt.getId();
  78. if(wt.getWindpowerstationId().contains(WpType.GDC.id))
  79. {
  80. continue;
  81. }
  82. Map<String, ProBasicEquipmentPoint> windturbinetestingpointnewMap = CacheContext.wtpAimap.get(wt.getId());
  83. //设备有功功率
  84. String pointIdGL = null;
  85. //设备明细状态
  86. String pointIdZT = null;
  87. String pointIdFS = null;
  88. if (windturbinetestingpointnewMap.containsKey(ContantXk.CJ_SSFS)) {
  89. pointIdFS = windturbinetestingpointnewMap.get(ContantXk.CJ_SSFS).getNemCode();
  90. }
  91. if (windturbinetestingpointnewMap.containsKey(ContantXk.CJ_SSGL)) {
  92. pointIdGL = windturbinetestingpointnewMap.get(ContantXk.CJ_SSGL).getNemCode();
  93. }
  94. if (windturbinetestingpointnewMap.containsKey(ContantXk.MXZT)) {
  95. pointIdZT = windturbinetestingpointnewMap.get(ContantXk.MXZT).getNemCode();
  96. }
  97. CureFittingVo item = new CureFittingVo();
  98. item.setPointIdFS(pointIdFS);
  99. item.setPointIdZT(pointIdZT);
  100. item.setPointIdGL(pointIdGL);
  101. //获取标杆风机编号
  102. if (CacheContext.wtstandardmap.containsKey(wt.getId())) {
  103. item.setStandardId(CacheContext.wtstandardmap.get(wt.getId()));
  104. } else {
  105. item.setStandardId(wt.getId());
  106. }
  107. windMap.put(windturbineId, item);
  108. }
  109. for (String key : windMap.keySet()) {
  110. //初始化集合
  111. windMap.get(key).setYsjglPoints(new ArrayList<>());
  112. windMap.get(key).setYzyglPoints(new ArrayList<>());
  113. windMap.get(key).setRsjglPoints(new ArrayList<>());
  114. windMap.get(key).setRzyglPoints(new ArrayList<>());
  115. windMap.get(key).setNsjglPoints(new ArrayList<>());
  116. windMap.get(key).setNzyglPoints(new ArrayList<>());
  117. if (windMap.get(key).getPointIdGL() == null || windMap.get(key).getPointIdFS() == null || windMap.get(key).getPointIdZT() == null) {
  118. logger.info(key);
  119. continue;
  120. }
  121. //拟合日功率曲线
  122. curveFittingBuilder(begin, end, dimension, scale, windMap.get(key).getPointIdGL(), windMap.get(key).getPointIdFS(), windMap.get(key).getPointIdZT(), windMap.get(key).getRsjglPoints(), windMap.get(key).getRzyglPoints(), key);
  123. List<PointVo> vos = windMap.get(key).getRsjglPoints().stream().filter(it -> it.getX() >= 0 && it.getX() <= 25).sorted(Comparator.comparing(PointVo::getX)).collect(Collectors.toList());
  124. windMap.get(key).setRsjglPoints(vos);
  125. vos = windMap.get(key).getRzyglPoints().stream().filter(it -> it.getX() >= 0 && it.getX() <= 25).sorted(Comparator.comparing(PointVo::getX)).collect(Collectors.toList());
  126. windMap.get(key).setRzyglPoints(vos);
  127. }
  128. List<ProEconCurveFittingMain> mainls=new ArrayList<>();
  129. for (String key : windMap.keySet()) {
  130. Double modelpower = 1500.0;
  131. if (windturbineCapacity.containsKey(key)) {
  132. modelpower = windturbineCapacity.get(key);
  133. }
  134. //日的昨天
  135. List<PointVo> dayLastMonthPoints = new ArrayList<>();
  136. //日的去年同期
  137. List<PointVo> dayLastYearPoints = new ArrayList<>();
  138. //日标准功率
  139. List<PointVo> dayStandardPoints = new ArrayList<>();
  140. //保证功率
  141. List<PointVo> bzglpowerPoints = new ArrayList<>();
  142. if (CacheContext.wtstandardmap.containsKey(key)) {
  143. String standardId = CacheContext.wtstandardmap.get(key);
  144. if (StringUtils.notEmp(standardId)) {
  145. if (windMap.containsKey(key)) {
  146. dayStandardPoints = windMap.get(standardId).getRsjglPoints();
  147. }
  148. }
  149. }
  150. //*********************************************日曲线偏差上个日和上一年记录**********************************************************/
  151. Date d1 = DateUtils.addDays(recordDate, -1);
  152. Date d2 = DateUtils.addYears(recordDate, -1);
  153. QueryWrapper<ProEconWtCurveFitting> queryWrapper = new QueryWrapper<>();
  154. queryWrapper.eq("record_date",d1).eq("windturbine_id",key);
  155. List<ProEconWtCurveFitting> wcfls = proEconWtCurveFittingService.list(queryWrapper)
  156. .stream()
  157. // .filter(i -> i.getWindturbineId().equals(key) &&
  158. // i.getRecordDate().compareTo(d1) == 0)
  159. .sorted(Comparator.comparing(ProEconWtCurveFitting::getSpeed)).collect(Collectors.toList());
  160. dayBuildPoints(wcfls, dayLastMonthPoints);
  161. QueryWrapper<ProEconWtCurveFitting> queryWrapper2 = new QueryWrapper<>();
  162. queryWrapper2.eq("record_date",d2).eq("windturbine_id",key);
  163. wcfls = proEconWtCurveFittingService.list(queryWrapper2).stream()
  164. // .filter(i -> i.getWindturbineId().equals(key) &&
  165. // i.getRecordDate().compareTo(d2) == 0)
  166. .sorted(Comparator.comparing(ProEconWtCurveFitting::getSpeed)).collect(Collectors.toList());
  167. //与轶总的原始代码对比不一致,临时修改测试
  168. dayBuildPoints(wcfls, dayLastMonthPoints);
  169. //*********************************************日曲线偏差上个月和上一年记录**********************************************************/
  170. if (CacheContext.wtmap.containsKey(key)) {
  171. String modelid = CacheContext.wtmap.get(key).getModelId();
  172. if (StringUtils.notEmp(modelid)) {
  173. //获取模型功率曲线
  174. if (CacheContext.theoreticalPowerMap.containsKey(modelid)) {
  175. for (Double speed : CacheContext.theoreticalPowerMap.get(modelid).keySet()) {
  176. PointVo point = new PointVo();
  177. point.setX(speed);
  178. point.setY(CacheContext.theoreticalPowerMap.get(modelid).get(speed).getEnsurePower());
  179. bzglpowerPoints.add(point);
  180. }
  181. }
  182. }
  183. }
  184. //*********************************************当日曲线偏差记录**********************************************************/
  185. QueryWrapper<ProEconCurveFittingMain> queryWrapper3 = new QueryWrapper<>();
  186. queryWrapper3.eq("record_date",recordDate).eq("windturbine_id",key);
  187. Optional<ProEconCurveFittingMain> cfmdayo = proEconCurveFittingMainService.list(queryWrapper3).stream()
  188. // .filter(i -> i.getWindturbineId().equals(key)
  189. // && i.getRecordDate().compareTo(recordDate) == 0)
  190. .findFirst();
  191. ProEconCurveFittingMain cfmday;
  192. if (cfmdayo.isPresent()) {
  193. cfmday = cfmdayo.get();
  194. QueryWrapper<ProEconCurveFittingMain> wrapper = new QueryWrapper<>();
  195. wrapper.eq("id", cfmday.getId());
  196. proEconCurveFittingMainService.remove(wrapper);
  197. }
  198. cfmday = new ProEconCurveFittingMain();
  199. cfmday.setWindturbineId(key);
  200. cfmday.setRecordDate(DateUtils.truncate(recordDate));
  201. //日---实际/最优
  202. cfmday.setDeviationRate1(pcl(windMap.get(key).getRsjglPoints(), windMap.get(key).getRzyglPoints(), modelpower));
  203. //日---实际/保证
  204. cfmday.setDeviationRate2(pcl(windMap.get(key).getRsjglPoints(), bzglpowerPoints, modelpower));
  205. //日---最优/保证
  206. cfmday.setDeviationRate3(pcl(windMap.get(key).getRzyglPoints(), bzglpowerPoints, modelpower));
  207. //日---实际/上日实际
  208. cfmday.setMonthDeviationRate(pcl(windMap.get(key).getRsjglPoints(), dayLastMonthPoints, modelpower));
  209. //日---实际/同期实际
  210. cfmday.setYearDeviationRate(pcl(windMap.get(key).getRsjglPoints(), dayLastYearPoints, modelpower));
  211. //日---实际/标杆实际
  212. cfmday.setStandardDeviationRate(pcl(windMap.get(key).getRsjglPoints(), dayStandardPoints, modelpower));
  213. mainls.add(cfmday);
  214. //proEconCurveFittingMainService.save(cfmday);
  215. //*********************************************当日曲线偏差记录**********************************************************/
  216. List<ProEconCurveFittingSub> subls=new ArrayList<>();
  217. subls.add(pLCBuild(key, recordDate, windMap, modelpower, 3, bzglpowerPoints, dayLastMonthPoints, dayLastYearPoints, dayStandardPoints));
  218. subls.add(pLCBuild(key, recordDate, windMap, modelpower, 4, bzglpowerPoints, dayLastMonthPoints, dayLastYearPoints, dayStandardPoints));
  219. subls.add(pLCBuild(key, recordDate, windMap, modelpower, 5, bzglpowerPoints, dayLastMonthPoints, dayLastYearPoints, dayStandardPoints));
  220. subls.add(pLCBuild(key, recordDate, windMap, modelpower, 6, bzglpowerPoints, dayLastMonthPoints, dayLastYearPoints, dayStandardPoints));
  221. subls.add(pLCBuild(key, recordDate, windMap, modelpower, 7, bzglpowerPoints, dayLastMonthPoints, dayLastYearPoints, dayStandardPoints));
  222. subls.add(pLCBuild(key, recordDate, windMap, modelpower, 8, bzglpowerPoints, dayLastMonthPoints, dayLastYearPoints, dayStandardPoints));
  223. subls.add(pLCBuild(key, recordDate, windMap, modelpower, 9, bzglpowerPoints, dayLastMonthPoints, dayLastYearPoints, dayStandardPoints));
  224. subls.add(pLCBuild(key, recordDate, windMap, modelpower, 10, bzglpowerPoints, dayLastMonthPoints, dayLastYearPoints, dayStandardPoints));
  225. subls.add(pLCBuild(key, recordDate, windMap, modelpower, 11, bzglpowerPoints, dayLastMonthPoints, dayLastYearPoints, dayStandardPoints));
  226. subls.add(pLCBuild(key, recordDate, windMap, modelpower, 12, bzglpowerPoints, dayLastMonthPoints, dayLastYearPoints, dayStandardPoints));
  227. subls.add(pLCBuild(key, recordDate, windMap, modelpower, 13, bzglpowerPoints, dayLastMonthPoints, dayLastYearPoints, dayStandardPoints));
  228. proEconCurveFittingSubService.saveBatch(subls);
  229. insertPoints(recordDate, windMap.get(key).getRsjglPoints(), windMap.get(key).getRzyglPoints(), key);
  230. logger.info(key);
  231. //
  232. // logger.info(String.format("{1}:更新sqlserver数据库记录数:{0}", z, new Date()));
  233. }
  234. proEconCurveFittingMainService.saveBatch(mainls);
  235. }
  236. public void cureFittingMonth(Date recordDate,String type) throws Exception {
  237. //日期变为昨天
  238. Date end = DateUtils.addDays(DateUtils.truncate(recordDate), -1);
  239. Calendar c = Calendar.getInstance();
  240. c.setTime(recordDate);
  241. int day_year = c.get(Calendar.YEAR);
  242. int day_month = c.get(Calendar.MONTH) + 1;
  243. proEconWtCurveFittingMonthService.deleteProEconWtCurveFittingFByMonth(String.valueOf(day_year),String.valueOf(day_month));
  244. proEconCurveFittMonthMainService.deleteProEconCurveFittMonthMainFByMonth(String.valueOf(day_year),String.valueOf(day_month));
  245. proEconCurveFittMonthSubService.deleteProEconCurveFittMonthSubFByMonth(String.valueOf(day_year),String.valueOf(day_month));
  246. c.set(Calendar.DAY_OF_MONTH, 1);
  247. Date begin = c.getTime();
  248. //上个月
  249. c.setTime(DateUtils.addMonths(begin, -1));
  250. int month_year = c.get(Calendar.YEAR);
  251. int month_month = c.get(Calendar.MONTH) + 1;
  252. //去年同期
  253. c.setTime(DateUtils.addYears(begin, -1));
  254. int year_year = c.get(Calendar.YEAR);
  255. int year_month = c.get(Calendar.MONTH) + 1;
  256. Map<String, CureFittingVo> windMap = new HashMap<>();
  257. if (windturbineCapacity == null) {
  258. windturbineCapacity = new HashMap<>();
  259. Map<String, ProEconEquipmentmodel> modelMap = CacheContext.modelMap;
  260. for (ProBasicEquipment windturbine : CacheContext.wtls) {
  261. if (modelMap.containsKey(windturbine.getModelId())) {
  262. windturbineCapacity.put(windturbine.getId(), modelMap.get(windturbine.getModelId()).getPowerProduction());
  263. }
  264. }
  265. }
  266. for (ProBasicEquipment wt : CacheContext.wtls) {
  267. String windturbineId = wt.getId();
  268. if(wt.getWindpowerstationId().contains(WpType.GDC.id))
  269. {
  270. continue;
  271. }
  272. Map<String, ProBasicEquipmentPoint> windturbinetestingpointnewMap = CacheContext.wtpAimap.get(wt.getId());
  273. //设备有功功率
  274. String pointIdGL = windturbinetestingpointnewMap.get(ContantXk.CJ_SSGL).getNemCode();
  275. //设备明细状态
  276. String pointIdZT = windturbinetestingpointnewMap.get(ContantXk.MXZT).getNemCode();
  277. String pointIdFS;
  278. if (wt.getWindpowerstationId().contains(WpType.GDC.id)) { //测风塔70米风速
  279. if (windturbinetestingpointnewMap.containsKey(ContantXk.FCCFTFS70)) {
  280. ProBasicEquipmentPoint point = windturbinetestingpointnewMap.get(ContantXk.FCCFTFS70);
  281. if (StringUtils.notEmp(point.getNemCode()) && !point.getNemCode().equals(initialcode)) {
  282. pointIdFS = windturbinetestingpointnewMap.get(ContantXk.FCCFTFS70).getNemCode();
  283. } else {
  284. pointIdFS = windturbinetestingpointnewMap.get(ContantXk.CJ_SSFS).getNemCode();
  285. }
  286. } else {
  287. pointIdFS = windturbinetestingpointnewMap.get(ContantXk.CJ_SSFS).getNemCode();
  288. }
  289. } else { //设备风速
  290. pointIdFS = windturbinetestingpointnewMap.get(ContantXk.CJ_SSFS).getNemCode();
  291. }
  292. CureFittingVo item = new CureFittingVo();
  293. item.setPointIdFS(pointIdFS);
  294. item.setPointIdZT(pointIdZT);
  295. item.setPointIdGL(pointIdGL);
  296. //获取标杆风机编号
  297. if (CacheContext.wtstandardmap.containsKey(wt.getId())) {
  298. item.setStandardId(CacheContext.wtstandardmap.get(wt.getId()));
  299. } else {
  300. item.setStandardId(wt.getId());
  301. }
  302. windMap.put(windturbineId, item);
  303. }
  304. for (String key : windMap.keySet()) {
  305. //初始化集合
  306. windMap.get(key).setYsjglPoints(new ArrayList<>());
  307. windMap.get(key).setYzyglPoints(new ArrayList<>());
  308. windMap.get(key).setRsjglPoints(new ArrayList<>());
  309. windMap.get(key).setRzyglPoints(new ArrayList<>());
  310. windMap.get(key).setNsjglPoints(new ArrayList<>());
  311. windMap.get(key).setNzyglPoints(new ArrayList<>());
  312. if (windMap.get(key).getPointIdGL() == null || windMap.get(key).getPointIdFS() == null || windMap.get(key).getPointIdZT() == null) {
  313. logger.info(key);
  314. continue;
  315. }
  316. //拟合月功率曲线
  317. curveFittingBuilder(begin, end, dimension, scale, windMap.get(key).getPointIdGL(), windMap.get(key).getPointIdFS(), windMap.get(key).getPointIdZT(), windMap.get(key).getYsjglPoints(), windMap.get(key).getYzyglPoints(), key);
  318. List<PointVo> vos = windMap.get(key).getYsjglPoints().stream().filter(it -> it.getX() >= 0 && it.getX() <= 25).sorted(Comparator.comparing(PointVo::getX)).collect(Collectors.toList());
  319. windMap.get(key).setYsjglPoints(vos);
  320. vos = windMap.get(key).getYzyglPoints().stream().filter(it -> it.getX() >= 0 && it.getX() <= 25).sorted(Comparator.comparing(PointVo::getX)).collect(Collectors.toList());
  321. windMap.get(key).setYzyglPoints(vos);
  322. }
  323. List<ProEconCurveFittMonthMain> mainls=new ArrayList<>();
  324. for (String key : windMap.keySet()) {
  325. Double modelpower = 1500.0;
  326. if (windturbineCapacity.containsKey(key)) {
  327. modelpower = windturbineCapacity.get(key);
  328. }
  329. //月的上月
  330. List<PointVo> monthLastMonthPoints = new ArrayList<>();
  331. //月的去年同期
  332. List<PointVo> monthLastYearPoints = new ArrayList<>();
  333. //月标准功率
  334. List<PointVo> monthStandardPoints = new ArrayList<>();
  335. //保证功率
  336. List<PointVo> bzglpowerPoints = new ArrayList<>();
  337. if (CacheContext.wtstandardmap.containsKey(key)) {
  338. String standardId = CacheContext.wtstandardmap.get(key);
  339. if (StringUtils.notEmp(standardId)) {
  340. if (windMap.containsKey(key)) {
  341. monthStandardPoints = windMap.get(standardId).getYsjglPoints();
  342. }
  343. }
  344. }
  345. String stringyear = String.valueOf(day_year);
  346. String stringmonth = String.valueOf(day_month);
  347. String stringyear2 = String.valueOf(month_year);
  348. String stringmonth2 = String.valueOf(month_month);
  349. String stringyear3 = String.valueOf(year_year);
  350. String stringmonth3 = String.valueOf(year_month);
  351. //*********************************************月曲线偏差上个月和上一年记录**********************************************************/
  352. QueryWrapper<ProEconWtCurveFittingMonth> queryWrapper = new QueryWrapper<>();
  353. queryWrapper.eq("year",stringyear2).eq("month",stringmonth2).eq("windturbine_id",key);
  354. List<ProEconWtCurveFittingMonth> wcfmls = proEconWtCurveFittingMonthService.list(queryWrapper).stream()
  355. // .filter(i -> i.getWindturbineId().equals(key) &&
  356. // i.getYear().equals(stringyear2) && i.getMonth().equals(stringmonth2))
  357. .sorted(Comparator.comparing(ProEconWtCurveFittingMonth::getSpeed)).collect(Collectors.toList());
  358. monthBuildPoints(wcfmls, monthLastMonthPoints);
  359. QueryWrapper<ProEconWtCurveFittingMonth> queryWrapper2 = new QueryWrapper<>();
  360. queryWrapper2.eq("year",stringyear3).eq("month",stringmonth3).eq("windturbine_id",key);
  361. wcfmls = proEconWtCurveFittingMonthService.list(queryWrapper2).stream()
  362. // .filter(i -> i.getWindturbineId().equals(key) &&
  363. // i.getYear().equals(stringyear3) && i.getMonth().equals(stringmonth3))
  364. .sorted(Comparator.comparing(ProEconWtCurveFittingMonth::getSpeed)).collect(Collectors.toList());
  365. monthBuildPoints(wcfmls, monthLastYearPoints);
  366. //*********************************************月曲线偏差上个月和上一年记录**********************************************************/
  367. if (CacheContext.wtmap.containsKey(key)) {
  368. String modelid = CacheContext.wtmap.get(key).getModelId();
  369. if (StringUtils.notEmp(modelid)) {
  370. //获取模型功率曲线
  371. if (CacheContext.theoreticalPowerMap.containsKey(modelid)) {
  372. for (Double speed : CacheContext.theoreticalPowerMap.get(modelid).keySet()) {
  373. PointVo point = new PointVo();
  374. point.setX(speed);
  375. point.setY(CacheContext.theoreticalPowerMap.get(modelid).get(speed).getEnsurePower());
  376. bzglpowerPoints.add(point);
  377. }
  378. }
  379. }
  380. }
  381. //*********************************************年曲线偏差记录**********************************************************/
  382. //*********************************************当月曲线偏差记录**********************************************************/
  383. QueryWrapper<ProEconCurveFittMonthMain> queryWrapper3 = new QueryWrapper<>();
  384. queryWrapper3.eq("year",stringyear).eq("month",stringmonth).eq("windturbine_id",key);
  385. Optional<ProEconCurveFittMonthMain> cfmmontho = proEconCurveFittMonthMainService.list(queryWrapper3).stream()
  386. // .filter(i -> i.getWindturbineId().equals(key)
  387. // && i.getYear().equals(stringyear) && i.getMonth().equals(stringmonth))
  388. .findFirst();
  389. ProEconCurveFittMonthMain cfmmonth;
  390. if (cfmmontho.isPresent()) {
  391. cfmmonth = cfmmontho.get();
  392. QueryWrapper<ProEconCurveFittMonthMain> wrapper = new QueryWrapper<>();
  393. wrapper.eq("id", cfmmonth.getId());
  394. proEconCurveFittMonthMainService.remove(wrapper);
  395. }
  396. cfmmonth = new ProEconCurveFittMonthMain();
  397. cfmmonth.setWindturbineId(key);
  398. cfmmonth.setYear(String.valueOf(day_year));
  399. cfmmonth.setMonth(String.valueOf(day_month));
  400. //月---实际/最优
  401. cfmmonth.setDeviationRate1(pcl(windMap.get(key).getYsjglPoints(), windMap.get(key).getYzyglPoints(), modelpower));
  402. //月---实际/保证
  403. cfmmonth.setDeviationRate2(pcl(windMap.get(key).getYsjglPoints(), bzglpowerPoints, modelpower));
  404. //月---最优/保证
  405. cfmmonth.setDeviationRate3(pcl(windMap.get(key).getYzyglPoints(), bzglpowerPoints, modelpower));
  406. //月---实际/上月实际
  407. cfmmonth.setMonthDeviationRate(pcl(windMap.get(key).getYsjglPoints(), monthLastMonthPoints, modelpower));
  408. //月---实际/同期实际
  409. cfmmonth.setYearDeviationRate(pcl(windMap.get(key).getYsjglPoints(), monthLastYearPoints, modelpower));
  410. //月---实际/标杆实际
  411. cfmmonth.setStandardDeviationRate(pcl(windMap.get(key).getYsjglPoints(), monthStandardPoints, modelpower));
  412. mainls.add(cfmmonth);
  413. // proEconCurveFittMonthMainService.save(cfmmonth);
  414. //*********************************************当月曲线偏差记录**********************************************************/
  415. List<ProEconCurveFittMonthSub> subls=new ArrayList<>();
  416. subls.add(pLCBuild(key, stringyear, stringmonth, windMap, modelpower, 3, bzglpowerPoints, monthLastMonthPoints, monthLastYearPoints, monthStandardPoints));
  417. subls.add(pLCBuild(key, stringyear, stringmonth, windMap, modelpower, 4, bzglpowerPoints, monthLastMonthPoints, monthLastYearPoints, monthStandardPoints));
  418. subls.add(pLCBuild(key, stringyear, stringmonth, windMap, modelpower, 5, bzglpowerPoints, monthLastMonthPoints, monthLastYearPoints, monthStandardPoints));
  419. subls.add(pLCBuild(key, stringyear, stringmonth, windMap, modelpower, 6, bzglpowerPoints, monthLastMonthPoints, monthLastYearPoints, monthStandardPoints));
  420. subls.add(pLCBuild(key, stringyear, stringmonth, windMap, modelpower, 7, bzglpowerPoints, monthLastMonthPoints, monthLastYearPoints, monthStandardPoints));
  421. subls.add(pLCBuild(key, stringyear, stringmonth, windMap, modelpower, 8, bzglpowerPoints, monthLastMonthPoints, monthLastYearPoints, monthStandardPoints));
  422. subls.add(pLCBuild(key, stringyear, stringmonth, windMap, modelpower, 9, bzglpowerPoints, monthLastMonthPoints, monthLastYearPoints, monthStandardPoints));
  423. subls.add(pLCBuild(key, stringyear, stringmonth, windMap, modelpower, 10, bzglpowerPoints, monthLastMonthPoints, monthLastYearPoints, monthStandardPoints));
  424. subls.add(pLCBuild(key, stringyear, stringmonth, windMap, modelpower, 11, bzglpowerPoints, monthLastMonthPoints, monthLastYearPoints, monthStandardPoints));
  425. subls.add(pLCBuild(key, stringyear, stringmonth, windMap, modelpower, 12, bzglpowerPoints, monthLastMonthPoints, monthLastYearPoints, monthStandardPoints));
  426. subls.add(pLCBuild(key, stringyear, stringmonth, windMap, modelpower, 13, bzglpowerPoints, monthLastMonthPoints, monthLastYearPoints, monthStandardPoints));
  427. proEconCurveFittMonthSubService.saveBatch(subls);
  428. insertPoints(stringyear, stringmonth, windMap.get(key).getYsjglPoints(), windMap.get(key).getYzyglPoints(), key);
  429. if(type.equals("1"))
  430. {
  431. insertPoints2( windMap.get(key).getYsjglPoints(), windMap.get(key).getYzyglPoints(), key);
  432. }
  433. logger.info(key);
  434. //
  435. // logger.info(String.format("{1}:更新sqlserver数据库记录数:{0}", z, new Date()));
  436. }
  437. proEconCurveFittMonthMainService.saveBatch(mainls);
  438. }
  439. public void cureFittingYear(Date recordDate) throws Exception {
  440. //日期变为昨天
  441. Date end = DateUtils.addDays(DateUtils.truncate(recordDate), -1);
  442. Calendar c = Calendar.getInstance();
  443. c.setTime(recordDate);
  444. int day_year = c.get(Calendar.YEAR);
  445. proEconWtCurveFittingYearService.deleteProEconWtCurveFittingFByYear(String.valueOf(day_year));
  446. proEconCurveFittYearMainService.deleteProEconCurveFittYearMainFByYear(String.valueOf(day_year));
  447. proEconCurveFittYearSubService.deleteProEconCurveFittYearSubFByYear(String.valueOf(day_year));
  448. c.set(Calendar.DAY_OF_MONTH, 1);
  449. c.set(Calendar.MONTH, 0);
  450. Date begin = c.getTime();
  451. //去年同期
  452. c.setTime(DateUtils.addYears(begin, -1));
  453. int year_year = c.get(Calendar.YEAR);
  454. Map<String, CureFittingVo> windMap = new HashMap<>();
  455. if (windturbineCapacity == null) {
  456. windturbineCapacity = new HashMap<>();
  457. Map<String, ProEconEquipmentmodel> modelMap = CacheContext.modelMap;
  458. for (ProBasicEquipment windturbine : CacheContext.wtls) {
  459. if (modelMap.containsKey(windturbine.getModelId())) {
  460. windturbineCapacity.put(windturbine.getId(), modelMap.get(windturbine.getModelId()).getPowerProduction());
  461. }
  462. }
  463. }
  464. for (ProBasicEquipment wt : CacheContext.wtls) {
  465. String windturbineId = wt.getId();
  466. if(wt.getWindpowerstationId().contains(WpType.GDC.id))
  467. {
  468. continue;
  469. }
  470. Map<String, ProBasicEquipmentPoint> windturbinetestingpointnewMap = CacheContext.wtpAimap.get(wt.getId());
  471. //设备有功功率
  472. String pointIdGL = windturbinetestingpointnewMap.get(ContantXk.CJ_SSGL).getNemCode();
  473. //设备明细状态
  474. String pointIdZT = windturbinetestingpointnewMap.get(ContantXk.MXZT).getNemCode();
  475. String pointIdFS;
  476. if (wt.getWindpowerstationId().contains(WpType.GDC.id)) { //测风塔70米风速
  477. if (windturbinetestingpointnewMap.containsKey(ContantXk.FCCFTFS70)) {
  478. ProBasicEquipmentPoint point = windturbinetestingpointnewMap.get(ContantXk.FCCFTFS70);
  479. if (StringUtils.notEmp(point.getNemCode()) && !point.getNemCode().equals(initialcode)) {
  480. pointIdFS = windturbinetestingpointnewMap.get(ContantXk.FCCFTFS70).getNemCode();
  481. } else {
  482. pointIdFS = windturbinetestingpointnewMap.get(ContantXk.CJ_SSFS).getNemCode();
  483. }
  484. } else {
  485. pointIdFS = windturbinetestingpointnewMap.get(ContantXk.CJ_SSFS).getNemCode();
  486. }
  487. } else { //设备风速
  488. pointIdFS = windturbinetestingpointnewMap.get(ContantXk.CJ_SSFS).getNemCode();
  489. }
  490. CureFittingVo item = new CureFittingVo();
  491. item.setPointIdFS(pointIdFS);
  492. item.setPointIdZT(pointIdZT);
  493. item.setPointIdGL(pointIdGL);
  494. //获取标杆风机编号
  495. if (CacheContext.wtstandardmap.containsKey(wt.getId())) {
  496. item.setStandardId(CacheContext.wtstandardmap.get(wt.getId()));
  497. } else {
  498. item.setStandardId(wt.getId());
  499. }
  500. windMap.put(windturbineId, item);
  501. }
  502. for (String key : windMap.keySet()) {
  503. //初始化集合
  504. windMap.get(key).setYsjglPoints(new ArrayList<>());
  505. windMap.get(key).setYzyglPoints(new ArrayList<>());
  506. windMap.get(key).setRsjglPoints(new ArrayList<>());
  507. windMap.get(key).setRzyglPoints(new ArrayList<>());
  508. windMap.get(key).setNsjglPoints(new ArrayList<>());
  509. windMap.get(key).setNzyglPoints(new ArrayList<>());
  510. // if (windMap.get(key).getPointIdGL() == null || windMap.get(key).getPointIdFS() == null || windMap.get(key).getPointIdZT() == null) {
  511. // logger.info(key);
  512. // continue;
  513. // }
  514. //拟合年功率曲线
  515. // curveFittingBuilder(begin, end, dimension, scale, windMap.get(key).getPointIdGL(), windMap.get(key).getPointIdFS(), windMap.get(key).getPointIdZT(), windMap.get(key).getNsjglPoints(), windMap.get(key).getNzyglPoints(), key);
  516. QueryWrapper<ProEconWtPowerCurveFitting> queryWrapper = new QueryWrapper<>();
  517. queryWrapper.eq("windturbine_id",key);
  518. List<ProEconWtPowerCurveFitting> wtpowerls= proEconWtPowerCurveFittingService.list(queryWrapper)
  519. .stream()
  520. // .filter(i->i.getWindturbineId().equals(key))
  521. .sorted(Comparator.comparing(ProEconWtPowerCurveFitting::getSpeed)).collect(Collectors.toList());
  522. List<PointVo> zyglls=new ArrayList<>();
  523. List<PointVo> sjglls=new ArrayList<>();
  524. if(!wtpowerls.isEmpty())
  525. {
  526. for(ProEconWtPowerCurveFitting wtp:wtpowerls)
  527. {
  528. PointVo zyvo=new PointVo();
  529. zyvo.setX(wtp.getSpeed());
  530. zyvo.setY(wtp.getOptimalPower());
  531. zyglls.add(zyvo);
  532. PointVo sjvo=new PointVo();
  533. sjvo.setX(wtp.getSpeed());
  534. sjvo.setY(wtp.getActualPower());
  535. sjglls.add(sjvo);
  536. }
  537. }
  538. // List<PointVo> vos = windMap.get(key).getNsjglPoints().stream().filter(it -> it.getX() >= 0 && it.getX() <= 25).sorted(Comparator.comparing(PointVo::getX)).collect(Collectors.toList());
  539. // windMap.get(key).setNsjglPoints(vos);
  540. // vos = windMap.get(key).getNzyglPoints().stream().filter(it -> it.getX() >= 0 && it.getX() <= 25).sorted(Comparator.comparing(PointVo::getX)).collect(Collectors.toList());
  541. // windMap.get(key).setNzyglPoints(vos);
  542. windMap.get(key).setNsjglPoints(sjglls);
  543. windMap.get(key).setNzyglPoints(zyglls);
  544. }
  545. List<ProEconCurveFittYearMain> mainls=new ArrayList<>();
  546. for (String key : windMap.keySet()) {
  547. Double modelpower = 1500.0;
  548. if (windturbineCapacity.containsKey(key)) {
  549. modelpower = windturbineCapacity.get(key);
  550. }
  551. //年的上月
  552. List<PointVo> yearLastMonthPoints = new ArrayList<>();
  553. //年的去年同期
  554. List<PointVo> yearLastYearPoints;
  555. //年标准功率
  556. List<PointVo> yearStandardPoints = new ArrayList<>();
  557. //日的昨天
  558. //保证功率
  559. List<PointVo> bzglpowerPoints = new ArrayList<>();
  560. if (CacheContext.wtstandardmap.containsKey(key)) {
  561. String standardId = CacheContext.wtstandardmap.get(key);
  562. if (StringUtils.notEmp(standardId)) {
  563. if (windMap.containsKey(key)) {
  564. yearStandardPoints = windMap.get(standardId).getNsjglPoints();
  565. }
  566. }
  567. }
  568. String stringyear = String.valueOf(day_year);
  569. String stringyear3 = String.valueOf(year_year);
  570. // /*********************************************年曲线偏差上个月和上一年记录**********************************************************/
  571. QueryWrapper<ProEconWtCurveFittingYear> queryWrapper = new QueryWrapper<>();
  572. queryWrapper.eq("year",stringyear3).eq("windturbine_id",key);
  573. List<ProEconWtCurveFittingYear> wcfyls = proEconWtCurveFittingYearService.list(queryWrapper).stream()
  574. // .filter(i -> i.getWindturbineId().equals(key) &&
  575. // i.getYear().equals(stringyear3))
  576. .sorted(Comparator.comparing(ProEconWtCurveFittingYear::getSpeed)).collect(Collectors.toList());
  577. //与轶总的原始代码对比不一致,新增代码修改测试
  578. yearBuildPoints(wcfyls, yearLastMonthPoints);
  579. yearLastYearPoints = yearLastMonthPoints;
  580. //*********************************************年曲线偏差上个月和上一年记录**********************************************************/
  581. if (CacheContext.wtmap.containsKey(key)) {
  582. String modelid = CacheContext.wtmap.get(key).getModelId();
  583. if (StringUtils.notEmp(modelid)) {
  584. //获取模型功率曲线
  585. if (CacheContext.theoreticalPowerMap.containsKey(modelid)) {
  586. for (Double speed : CacheContext.theoreticalPowerMap.get(modelid).keySet()) {
  587. PointVo point = new PointVo();
  588. point.setX(speed);
  589. point.setY(CacheContext.theoreticalPowerMap.get(modelid).get(speed).getEnsurePower());
  590. bzglpowerPoints.add(point);
  591. }
  592. }
  593. }
  594. }
  595. //*********************************************年曲线偏差记录**********************************************************/
  596. //*********************************************当年曲线偏差记录**********************************************************/
  597. QueryWrapper<ProEconCurveFittYearMain> queryWrapper2 = new QueryWrapper<>();
  598. queryWrapper2.eq("year",stringyear).eq("windturbine_id",key);
  599. Optional<ProEconCurveFittYearMain> cfmyearo = proEconCurveFittYearMainService.list(queryWrapper2)
  600. .stream()
  601. // .filter(i -> i.getWindturbineId().equals(key)
  602. // && i.getYear().equals(stringyear))
  603. .findFirst();
  604. ProEconCurveFittYearMain cfmyear;
  605. if (cfmyearo.isPresent()) {
  606. cfmyear = cfmyearo.get();
  607. QueryWrapper<ProEconCurveFittMonthMain> wrapper = new QueryWrapper<>();
  608. wrapper.eq("id", cfmyear.getId());
  609. proEconCurveFittMonthMainService.remove(wrapper);
  610. }
  611. cfmyear = new ProEconCurveFittYearMain();
  612. cfmyear.setWindturbineId(key);
  613. cfmyear.setYear(String.valueOf(day_year));
  614. //年---实际/最优
  615. cfmyear.setDeviationRate1(pcl(windMap.get(key).getNsjglPoints(), windMap.get(key).getNzyglPoints(), modelpower));
  616. //年---实际/保证
  617. cfmyear.setDeviationRate2(pcl(windMap.get(key).getNsjglPoints(), bzglpowerPoints, modelpower));
  618. //年---最优/保证
  619. cfmyear.setDeviationRate3(pcl(windMap.get(key).getNzyglPoints(), bzglpowerPoints, modelpower));
  620. //年---实际/上月实际
  621. cfmyear.setMonthDeviationRate(pcl(windMap.get(key).getNsjglPoints(), yearLastMonthPoints, modelpower));
  622. //年---实际/同期实际
  623. cfmyear.setYearDeviationRate(pcl(windMap.get(key).getNsjglPoints(), yearLastYearPoints, modelpower));
  624. //年---实际/标杆实际
  625. cfmyear.setStandardDeviationRate(pcl(windMap.get(key).getNsjglPoints(), yearStandardPoints, modelpower));
  626. mainls.add(cfmyear);
  627. // proEconCurveFittYearMainService.save(cfmyear);
  628. //*********************************************当年曲线偏差记录**********************************************************/
  629. List<ProEconCurveFittYearSub> subls=new ArrayList<>();
  630. subls.add(pLCBuild(key, stringyear, windMap, modelpower, 3, bzglpowerPoints, yearLastMonthPoints, yearLastYearPoints, yearStandardPoints));
  631. subls.add(pLCBuild(key, stringyear, windMap, modelpower, 4, bzglpowerPoints, yearLastMonthPoints, yearLastYearPoints, yearStandardPoints));
  632. subls.add(pLCBuild(key, stringyear, windMap, modelpower, 5, bzglpowerPoints, yearLastMonthPoints, yearLastYearPoints, yearStandardPoints));
  633. subls.add(pLCBuild(key, stringyear, windMap, modelpower, 6, bzglpowerPoints, yearLastMonthPoints, yearLastYearPoints, yearStandardPoints));
  634. subls.add(pLCBuild(key, stringyear, windMap, modelpower, 7, bzglpowerPoints, yearLastMonthPoints, yearLastYearPoints, yearStandardPoints));
  635. subls.add(pLCBuild(key, stringyear, windMap, modelpower, 8, bzglpowerPoints, yearLastMonthPoints, yearLastYearPoints, yearStandardPoints));
  636. subls.add(pLCBuild(key, stringyear, windMap, modelpower, 9, bzglpowerPoints, yearLastMonthPoints, yearLastYearPoints, yearStandardPoints));
  637. subls.add(pLCBuild(key, stringyear, windMap, modelpower, 10, bzglpowerPoints, yearLastMonthPoints, yearLastYearPoints, yearStandardPoints));
  638. subls.add(pLCBuild(key, stringyear, windMap, modelpower, 11, bzglpowerPoints, yearLastMonthPoints, yearLastYearPoints, yearStandardPoints));
  639. subls.add(pLCBuild(key, stringyear, windMap, modelpower, 12, bzglpowerPoints, yearLastMonthPoints, yearLastYearPoints, yearStandardPoints));
  640. subls.add(pLCBuild(key, stringyear, windMap, modelpower, 13, bzglpowerPoints, yearLastMonthPoints, yearLastYearPoints, yearStandardPoints));
  641. proEconCurveFittYearSubService.saveBatch(subls);
  642. insertPoints(stringyear, windMap.get(key).getNsjglPoints(), windMap.get(key).getNzyglPoints(), key);
  643. logger.info(key);
  644. //
  645. // logger.info(String.format("{1}:更新sqlserver数据库记录数:{0}", z, new Date()));
  646. }
  647. proEconCurveFittYearMainService.saveBatch(mainls);
  648. }
  649. public ProEconCurveFittingSub pLCBuild(String key, Date current, Map<String, CureFittingVo> windMap, Double modelpower, double speed,
  650. List<PointVo> bzglpowerPoints, List<PointVo> lastMonthPoints, List<PointVo> lastYearPoints, List<PointVo> lastStandardPoints
  651. ) {
  652. // String speedStr = String.valueOf(speed);
  653. //*********************************************当日曲线偏差子表记录**********************************************************/
  654. QueryWrapper<ProEconCurveFittingSub> queryWrapper2 = new QueryWrapper<>();
  655. queryWrapper2.eq("record_date",current).eq("speed",speed).eq("windturbine_id",key);
  656. Optional<ProEconCurveFittingSub> cfmso = proEconCurveFittingSubService.list(queryWrapper2)
  657. .stream()
  658. // .filter(i -> i.getWindturbineId().equals(key)
  659. // && i.getRecordDate().compareTo(current) == 0 && i.getSpeed().equals(speedStr))
  660. .findFirst();
  661. ProEconCurveFittingSub cfms;
  662. if (cfmso.isPresent()) {
  663. cfms = cfmso.get();
  664. QueryWrapper<ProEconCurveFittingSub> wrapper = new QueryWrapper<>();
  665. wrapper.eq("id", cfms.getId());
  666. proEconCurveFittingSubService.remove(wrapper);
  667. }
  668. cfms = new ProEconCurveFittingSub();
  669. cfms.setWindturbineId(key);
  670. cfms.setSpeed(speed);
  671. cfms.setRecordDate(DateUtils.truncate(current));
  672. cfms.setDeviationRate1(pcl2(windMap.get(key).getRsjglPoints(), windMap.get(key).getRzyglPoints(), modelpower, speed));
  673. //日---实际/保证
  674. cfms.setDeviationRate2(pcl2(windMap.get(key).getRsjglPoints(), bzglpowerPoints, modelpower, speed));
  675. //日---最优/保证
  676. cfms.setDeviationRate3(pcl2(windMap.get(key).getRzyglPoints(), bzglpowerPoints, modelpower, speed));
  677. //日---实际/上日实际
  678. cfms.setMonthDeviationRate(pcl2(windMap.get(key).getRsjglPoints(), lastMonthPoints, modelpower, speed));
  679. //日---实际/同期实际
  680. cfms.setYearDeviationRate(pcl2(windMap.get(key).getRsjglPoints(), lastYearPoints, modelpower, speed));
  681. //日---实际/标杆实际
  682. cfms.setStandardDeviationRate(pcl2(windMap.get(key).getRsjglPoints(), lastStandardPoints, modelpower, speed));
  683. return cfms;
  684. //proEconCurveFittingSubService.save(cfms);
  685. //*********************************************当日曲线偏差子表记录**********************************************************/
  686. }
  687. public ProEconCurveFittMonthSub pLCBuild(String key, String stringyear, String stringmonth, Map<String, CureFittingVo> windMap, Double modelpower, double speed,
  688. List<PointVo> bzglpowerPoints, List<PointVo> lastMonthPoints, List<PointVo> lastYearPoints, List<PointVo> lastStandardPoints
  689. ) {
  690. // String speedStr = String.valueOf(speed);
  691. //*********************************************当月曲线偏差子表记录**********************************************************/
  692. QueryWrapper<ProEconCurveFittMonthSub> queryWrapper2 = new QueryWrapper<>();
  693. queryWrapper2.eq("year",stringyear).eq("month",stringmonth).eq("speed",speed).eq("windturbine_id",key);
  694. Optional<ProEconCurveFittMonthSub> cfmsmontho = proEconCurveFittMonthSubService.list(queryWrapper2).stream()
  695. // .filter(i -> i.getWindturbineId().equals(key)
  696. // && i.getYear().equals(stringyear) && i.getMonth().equals(stringmonth) && i.getSpeed().equals(speedStr))
  697. .findFirst();
  698. ProEconCurveFittMonthSub cfmsmonth;
  699. if (cfmsmontho.isPresent()) {
  700. cfmsmonth = cfmsmontho.get();
  701. QueryWrapper<ProEconCurveFittMonthSub> wrapper = new QueryWrapper<>();
  702. wrapper.eq("id", cfmsmonth.getId());
  703. proEconCurveFittMonthSubService.remove(wrapper);
  704. }
  705. cfmsmonth = new ProEconCurveFittMonthSub();
  706. cfmsmonth.setWindturbineId(key);
  707. cfmsmonth.setYear(stringyear);
  708. cfmsmonth.setMonth(stringmonth);
  709. cfmsmonth.setSpeed(speed);
  710. //月---实际/最优
  711. cfmsmonth.setDeviationRate1(pcl2(windMap.get(key).getYsjglPoints(), windMap.get(key).getYzyglPoints(), modelpower, speed));
  712. //月---实际/保证
  713. cfmsmonth.setDeviationRate2(pcl2(windMap.get(key).getYsjglPoints(), bzglpowerPoints, modelpower, speed));
  714. //月---最优/保证
  715. cfmsmonth.setDeviationRate3(pcl2(windMap.get(key).getYzyglPoints(), bzglpowerPoints, modelpower, speed));
  716. //月---实际/上月实际
  717. cfmsmonth.setMonthDeviationRate(pcl2(windMap.get(key).getYsjglPoints(), lastMonthPoints, modelpower, speed));
  718. //月---实际/同期实际
  719. cfmsmonth.setYearDeviationRate(pcl2(windMap.get(key).getYsjglPoints(), lastYearPoints, modelpower, speed));
  720. //月---实际/标杆实际
  721. cfmsmonth.setStandardDeviationRate(pcl2(windMap.get(key).getYsjglPoints(), lastStandardPoints, modelpower, speed));
  722. // proEconCurveFittMonthSubService.save(cfmsmonth);
  723. return cfmsmonth;
  724. //*********************************************当月曲线偏差子表记录**********************************************************/
  725. }
  726. public ProEconCurveFittYearSub pLCBuild(String key, String stringyear, Map<String, CureFittingVo> windMap, Double modelpower, double speed,
  727. List<PointVo> bzglpowerPoints, List<PointVo> lastMonthPoints, List<PointVo> lastYearPoints, List<PointVo> lastStandardPoints
  728. ) {
  729. // String speedStr = String.valueOf(speed);
  730. //*********************************************当年曲线偏差子表记录**********************************************************/
  731. QueryWrapper<ProEconCurveFittYearSub> queryWrapper = new QueryWrapper<>();
  732. queryWrapper.eq("year",stringyear).eq("speed",speed).eq("windturbine_id",key);
  733. Optional<ProEconCurveFittYearSub> cfmsyearo = proEconCurveFittYearSubService.list(queryWrapper).stream()
  734. // .filter(i -> i.getWindturbineId().equals(key)
  735. // && i.getYear().equals(stringyear) && i.getSpeed().equals(speedStr))
  736. .findFirst();
  737. ProEconCurveFittYearSub cfmsyear;
  738. if (cfmsyearo.isPresent()) {
  739. cfmsyear = cfmsyearo.get();
  740. QueryWrapper<ProEconCurveFittYearSub> wrapper = new QueryWrapper<>();
  741. wrapper.eq("id", cfmsyear.getId());
  742. proEconCurveFittYearSubService.remove(wrapper);
  743. }
  744. cfmsyear = new ProEconCurveFittYearSub();
  745. cfmsyear.setWindturbineId(key);
  746. cfmsyear.setYear(stringyear);
  747. cfmsyear.setSpeed(speed);
  748. // proEconCurveFittYearSubService.save(cfmsyear);
  749. //年---实际/最优
  750. cfmsyear.setDeviationRate1(pcl2(windMap.get(key).getNsjglPoints(), windMap.get(key).getNzyglPoints(), modelpower, speed));
  751. //年---实际/保证
  752. cfmsyear.setDeviationRate2(pcl2(windMap.get(key).getNsjglPoints(), bzglpowerPoints, modelpower, speed));
  753. //年---最优/保证
  754. cfmsyear.setDeviationRate3(pcl2(windMap.get(key).getNzyglPoints(), bzglpowerPoints, modelpower, speed));
  755. //年---实际/上月实际
  756. cfmsyear.setMonthDeviationRate(pcl2(windMap.get(key).getNsjglPoints(), lastMonthPoints, modelpower, speed));
  757. //年---实际/同期实际
  758. cfmsyear.setYearDeviationRate(pcl2(windMap.get(key).getNsjglPoints(), lastYearPoints, modelpower, speed));
  759. //年---实际/标杆实际
  760. cfmsyear.setStandardDeviationRate(pcl2(windMap.get(key).getNsjglPoints(), lastStandardPoints, modelpower, speed));
  761. // proEconCurveFittYearSubService.save(cfmsyear);
  762. return cfmsyear;
  763. //*********************************************当年曲线偏差子表记录**********************************************************/
  764. }
  765. private void insertPoints(Date current, List<PointVo> sjglls, List<PointVo> zyglls, String windturbineId) {
  766. //*********************************************当日曲线偏差记录**********************************************************/
  767. // List<Long> wtcfidls = proEconWtCurveFittingService.list().stream().filter(i -> i.getWindturbineId().equals(windturbineId) &&
  768. // i.getRecordDate().compareTo(current) == 0).map(ProEconWtCurveFitting::getId).collect(Collectors.toList());
  769. //
  770. //
  771. // for (int i = 0; i < wtcfidls.size(); i++) {
  772. // proEconWtCurveFittingService.removeByIds(wtcfidls);
  773. // }
  774. List<ProEconWtCurveFitting> wtcfls=new ArrayList<>();
  775. if (sjglls.size() == zyglls.size()) {
  776. for (int i = 0; i < sjglls.size(); i++) {
  777. ProEconWtCurveFitting item = new ProEconWtCurveFitting();
  778. item.setWindturbineId(windturbineId);
  779. if (CacheContext.wtmap.containsKey(windturbineId)) {
  780. ProBasicEquipment wt = CacheContext.wtmap.get(windturbineId);
  781. if (wt.getWindpowerstationId().contains(WpType.GDC.id)) {
  782. continue;
  783. // item.SPEED = Double.Truncate(pointsF2[i].X);
  784. } else {
  785. // boolean l = String.valueOf(sjglls.get(i).getX()).contains(".");
  786. // if (l) {
  787. // continue;
  788. // }
  789. item.setSpeed(sjglls.get(i).getX());
  790. }
  791. item.setActualPower(sjglls.get(i).getY());
  792. item.setOptimalPower(zyglls.get(i).getY());
  793. item.setRecordDate(DateUtils.truncate(current));
  794. wtcfls.add(item);
  795. //proEconWtCurveFittingService.save(item);
  796. }
  797. }
  798. } else {
  799. logger.warn(String.format("下标不一致的风机编号:{0},实际功率:{1},最有功率:{2}", windturbineId, sjglls.size(), zyglls.size()));
  800. for (int i = 0; i < sjglls.size(); i++) {
  801. ProEconWtCurveFitting item = new ProEconWtCurveFitting();
  802. item.setWindturbineId(windturbineId);
  803. if (CacheContext.wtmap.containsKey(windturbineId)) {
  804. ProBasicEquipment wt = CacheContext.wtmap.get(windturbineId);
  805. if (wt.getWindpowerstationId().contains(WpType.GDC.id)) {
  806. continue;
  807. //item.SPEED = Double.Truncate(pointsF2[i].X);
  808. } else {
  809. boolean l = String.valueOf(sjglls.get(i).getX()).contains(".");
  810. if (l) {
  811. continue;
  812. }
  813. item.setSpeed(sjglls.get(i).getX());
  814. }
  815. int finalI = i;
  816. OptionalDouble op = zyglls.stream().filter(x -> Objects.equals(x.getX(), sjglls.get(finalI).getX())).mapToDouble(PointVo::getY).findFirst();
  817. if (op.isPresent()) {
  818. item.setOptimalPower(op.getAsDouble());
  819. } else {
  820. item.setOptimalPower(0.0);
  821. }
  822. item.setActualPower(sjglls.get(i).getY());
  823. item.setRecordDate(current);
  824. wtcfls.add(item);
  825. //proEconWtCurveFittingService.save(item);
  826. }
  827. }
  828. //*********************************************当日曲线偏差记录**********************************************************/
  829. }
  830. proEconWtCurveFittingService.saveBatch(wtcfls);
  831. String s = JSONObject.toJSONString(wtcfls);
  832. redisService.set(CurveType.dayCurve.id+"_"+windturbineId, s);
  833. }
  834. private void insertPoints(String year, String month, List<PointVo> sjglls, List<PointVo> zyglls, String windturbineId) {
  835. //*********************************************当月曲线偏差记录**********************************************************/
  836. // List<Long> wtcfmmonthidls = proEconWtCurveFittingMonthService.list().stream().filter(i -> i.getWindturbineId().equals(windturbineId) &&
  837. // i.getYear().equals(year) && i.getMonth().equals(month)).map(ProEconWtCurveFittingMonth::getId).collect(Collectors.toList());
  838. //
  839. //
  840. // for (int i = 0; i < wtcfmmonthidls.size(); i++) {
  841. // proEconWtCurveFittingMonthService.removeByIds(wtcfmmonthidls);
  842. // }
  843. List<ProEconWtCurveFittingMonth> wtcfls=new ArrayList<>();
  844. if (sjglls.size() == zyglls.size()) {
  845. for (int i = 0; i < sjglls.size(); i++) {
  846. ProEconWtCurveFittingMonth item = new ProEconWtCurveFittingMonth();
  847. item.setWindturbineId(windturbineId);
  848. if (CacheContext.wtmap.containsKey(windturbineId)) {
  849. ProBasicEquipment wt = CacheContext.wtmap.get(windturbineId);
  850. if (wt.getWindpowerstationId().contains(WpType.GDC.id)) {
  851. continue;
  852. // item.SPEED = Double.Truncate(pointsF1[i].X);
  853. } else {
  854. item.setSpeed(sjglls.get(i).getX());
  855. }
  856. item.setActualPower(sjglls.get(i).getY());
  857. item.setOptimalPower(zyglls.get(i).getY());
  858. item.setYear(String.valueOf(year));
  859. item.setMonth(String.valueOf(month));
  860. wtcfls.add(item);
  861. // proEconWtCurveFittingMonthService.save(item);
  862. }
  863. }
  864. } else {
  865. logger.warn(String.format("下标不一致的风机编号:{0},实际功率:{1},最有功率:{2}", windturbineId, sjglls.size(), zyglls.size()));
  866. for (int i = 0; i < sjglls.size(); i++) {
  867. ProEconWtCurveFittingMonth item = new ProEconWtCurveFittingMonth();
  868. item.setWindturbineId(windturbineId);
  869. if (CacheContext.wtmap.containsKey(windturbineId)) {
  870. ProBasicEquipment wt = CacheContext.wtmap.get(windturbineId);
  871. if (wt.getWindpowerstationId().contains(WpType.GDC.id)) {
  872. continue;
  873. //item.SPEED = Double.Truncate(pointsF1[i].X);
  874. } else {
  875. item.setSpeed(sjglls.get(i).getX());
  876. }
  877. item.setActualPower(sjglls.get(i).getY());
  878. int finalI = i;
  879. OptionalDouble op = zyglls.stream().filter(x -> Objects.equals(x.getX(), sjglls.get(finalI).getX())).mapToDouble(PointVo::getY).findFirst();
  880. if (op.isPresent()) {
  881. item.setOptimalPower(op.getAsDouble());
  882. } else {
  883. item.setOptimalPower(0.0);
  884. }
  885. item.setYear(String.valueOf(year));
  886. item.setMonth(String.valueOf(month));
  887. wtcfls.add(item);
  888. //proEconWtCurveFittingMonthService.save(item);
  889. }
  890. }
  891. }
  892. //*********************************************当月曲线偏差记录**********************************************************/
  893. proEconWtCurveFittingMonthService.saveBatch(wtcfls);
  894. String s = JSONObject.toJSONString(wtcfls);
  895. redisService.set(CurveType.monthCurve.id+"_"+windturbineId, s);
  896. }
  897. private void insertPoints(String year, List<PointVo> sjglls, List<PointVo> zyglls, String windturbineId) {
  898. //*********************************************当年曲线偏差记录**********************************************************/
  899. // List<Long> wtcfmyearidls = proEconWtCurveFittingYearService.list().stream().filter(i -> i.getWindturbineId().equals(windturbineId) &&
  900. // i.getYear().equals(year)).map(ProEconWtCurveFittingYear::getId).collect(Collectors.toList());
  901. //
  902. // for (int i = 0; i < wtcfmyearidls.size(); i++) {
  903. // proEconWtCurveFittingYearService.removeByIds(wtcfmyearidls);
  904. // }
  905. List<ProEconWtCurveFittingYear> wtcfls=new ArrayList<>();
  906. if (sjglls.size() == zyglls.size()) {
  907. for (int i = 0; i < sjglls.size(); i++) {
  908. ProEconWtCurveFittingYear item = new ProEconWtCurveFittingYear();
  909. item.setWindturbineId(windturbineId);
  910. if (CacheContext.wtmap.containsKey(windturbineId)) {
  911. ProBasicEquipment wt = CacheContext.wtmap.get(windturbineId);
  912. if (wt.getWindpowerstationId().contains(WpType.GDC.id)) {
  913. continue;
  914. // item.SPEED = Double.Truncate(pointsF1[i].X);
  915. } else {
  916. item.setSpeed(sjglls.get(i).getX());
  917. }
  918. item.setActualPower(sjglls.get(i).getY());
  919. item.setOptimalPower(zyglls.get(i).getY());
  920. item.setYear(String.valueOf(year));
  921. wtcfls.add(item);
  922. // proEconWtCurveFittingYearService.save(item);
  923. }
  924. }
  925. } else {
  926. logger.warn(String.format("下标不一致的风机编号:{0},实际功率:{1},最有功率:{2}", windturbineId, sjglls.size(), zyglls.size()));
  927. for (int i = 0; i < sjglls.size(); i++) {
  928. ProEconWtCurveFittingYear item = new ProEconWtCurveFittingYear();
  929. item.setWindturbineId(windturbineId);
  930. if (CacheContext.wtmap.containsKey(windturbineId)) {
  931. ProBasicEquipment wt = CacheContext.wtmap.get(windturbineId);
  932. if (wt.getWindpowerstationId().contains(WpType.GDC.id)) {
  933. continue;
  934. //item.SPEED = Double.Truncate(pointsF1[i].X);
  935. } else {
  936. item.setSpeed(sjglls.get(i).getX());
  937. }
  938. item.setActualPower(sjglls.get(i).getY());
  939. int finalI = i;
  940. OptionalDouble op = zyglls.stream().filter(x -> Objects.equals(x.getX(), sjglls.get(finalI).getX())).mapToDouble(PointVo::getY).findFirst();
  941. if (op.isPresent()) {
  942. item.setOptimalPower(op.getAsDouble());
  943. } else {
  944. item.setOptimalPower(0.0);
  945. }
  946. item.setYear(String.valueOf(year));
  947. wtcfls.add(item);
  948. //proEconWtCurveFittingYearService.save(item);
  949. }
  950. }
  951. }
  952. //*********************************************当年曲线偏差记录**********************************************************/
  953. proEconWtCurveFittingYearService.saveBatch(wtcfls);
  954. String s = JSONObject.toJSONString(wtcfls);
  955. redisService.set(CurveType.yearCurve.id+"_"+windturbineId, s);
  956. }
  957. private void insertPoints2(List<PointVo> monthSjglls, List<PointVo> monthZyglls, String windturbineId) {
  958. // List<Integer> wtpcfidls = proEconWtPowerCurveFittingService.list()
  959. // .stream().filter(i -> i.getWindturbineId().equals(windturbineId))
  960. // .map(ProEconWtPowerCurveFitting::getId).collect(Collectors.toList());
  961. //
  962. //
  963. // for (int i = 0; i < wtpcfidls.size(); i++) {
  964. // proEconWtPowerCurveFittingService.removeByIds(wtpcfidls);
  965. // }
  966. proEconWtPowerCurveFittingService.deleteProEconWtPowerCurveFitting();
  967. List<ProEconWtPowerCurveFitting> wtcfls=new ArrayList<>();
  968. if (monthSjglls.size() == monthZyglls.size()) {
  969. for (int i = 0; i < monthSjglls.size(); i++) {
  970. ProEconWtPowerCurveFitting item = new ProEconWtPowerCurveFitting();
  971. item.setWindturbineId(windturbineId);
  972. if (CacheContext.wtmap.containsKey(windturbineId)) {
  973. ProBasicEquipment wt = CacheContext.wtmap.get(windturbineId);
  974. if (wt.getWindpowerstationId().contains(WpType.GDC.id)) {
  975. continue;
  976. // item.SPEED = Double.Truncate(pointsF1[i].X);
  977. } else {
  978. boolean l = String.valueOf(monthSjglls.get(i).getX()).contains(".");
  979. if (l) {
  980. continue;
  981. }
  982. item.setSpeed(monthSjglls.get(i).getX());
  983. }
  984. item.setActualPower(monthSjglls.get(i).getY());
  985. item.setOptimalPower(monthZyglls.get(i).getY());
  986. wtcfls.add(item);
  987. //proEconWtPowerCurveFittingService.save(item);
  988. }
  989. }
  990. } else {
  991. logger.warn(String.format("下标不一致的风机编号:{0},实际功率:{1},最有功率:{2}", windturbineId, monthSjglls.size(), monthZyglls.size()));
  992. for (int i = 0; i < monthSjglls.size(); i++) {
  993. ProEconWtPowerCurveFitting item = new ProEconWtPowerCurveFitting();
  994. item.setWindturbineId(windturbineId);
  995. if (CacheContext.wtmap.containsKey(windturbineId)) {
  996. ProBasicEquipment wt = CacheContext.wtmap.get(windturbineId);
  997. if (wt.getWindpowerstationId().contains(WpType.GDC.id)) {
  998. continue;
  999. //item.SPEED = Double.Truncate(pointsF1[i].X);
  1000. } else {
  1001. boolean l = String.valueOf(monthSjglls.get(i).getX()).contains(".");
  1002. if (l) {
  1003. continue;
  1004. }
  1005. item.setSpeed(monthSjglls.get(i).getX());
  1006. }
  1007. item.setActualPower(monthSjglls.get(i).getY());
  1008. int finalI = i;
  1009. OptionalDouble op = monthZyglls.stream().filter(x -> Objects.equals(x.getX(), monthSjglls.get(finalI).getX())).mapToDouble(PointVo::getY).findFirst();
  1010. if (op.isPresent()) {
  1011. item.setOptimalPower(op.getAsDouble());
  1012. } else {
  1013. item.setOptimalPower(0.0);
  1014. }
  1015. wtcfls.add(item);
  1016. //proEconWtPowerCurveFittingService.save(item);
  1017. }
  1018. }
  1019. }
  1020. proEconWtPowerCurveFittingService.saveBatch(wtcfls);
  1021. }
  1022. private void yearBuildPoints(List<ProEconWtCurveFittingYear> data, List<PointVo> points) {
  1023. if (data != null) {
  1024. for (ProEconWtCurveFittingYear datum : data) {
  1025. PointVo point = new PointVo();
  1026. point.setX(datum.getSpeed());
  1027. point.setY(datum.getActualPower());
  1028. points.add(point);
  1029. }
  1030. }
  1031. }
  1032. private void monthBuildPoints(List<ProEconWtCurveFittingMonth> data, List<PointVo> points) {
  1033. if (data != null) {
  1034. for (ProEconWtCurveFittingMonth datum : data) {
  1035. PointVo point = new PointVo();
  1036. point.setX(datum.getSpeed());
  1037. point.setY(datum.getActualPower());
  1038. points.add(point);
  1039. }
  1040. }
  1041. }
  1042. private void dayBuildPoints(List<ProEconWtCurveFitting> data, List<PointVo> points) {
  1043. if (data != null) {
  1044. for (ProEconWtCurveFitting datum : data) {
  1045. PointVo point = new PointVo();
  1046. point.setX(datum.getSpeed());
  1047. point.setY(datum.getActualPower());
  1048. points.add(point);
  1049. }
  1050. }
  1051. }
  1052. //曲线偏差率
  1053. private double pcl(List<PointVo> points1, List<PointVo> points2, Double modelpower) {
  1054. double result = -0;
  1055. double pc = 0;
  1056. if (points1 != null && points1.size() != 0 && points2 != null && points2.size() != 0) {
  1057. double count = 0;
  1058. double sum = 0;
  1059. double max = modelpower;
  1060. for (PointVo point : points1) {
  1061. List<PointVo> item = points2.stream().filter(it -> Objects.equals(it.getX(), point.getX())).collect(Collectors.toList());
  1062. if (item.size() > 0) {
  1063. sum += Math.pow((point.getY() - item.get(0).getY()), 2);
  1064. count++;
  1065. pc += point.getY() - item.get(0).getY();
  1066. }
  1067. }
  1068. sum = Math.sqrt(sum);
  1069. count = Math.sqrt(count);
  1070. max = max * count;
  1071. if (max != 0) {
  1072. result = sum / max * 100;
  1073. }
  1074. if (pc < 0) {
  1075. result = 0 - result;
  1076. }
  1077. }
  1078. return result;
  1079. }
  1080. //曲线偏差率2
  1081. private double pcl2(List<PointVo> points1, List<PointVo> points2, Double modelpower, double speed) {
  1082. double minSpeed = speed;
  1083. double maxSpeed = minSpeed + 1;
  1084. double result = -0;
  1085. double pc = 0;
  1086. if (points1 != null && points1.size() != 0 && points2 != null && points2.size() != 0) {
  1087. double count = 0;
  1088. double sum = 0;
  1089. double max = modelpower;
  1090. for (PointVo point : points1) {
  1091. List<PointVo> item = points2.stream().filter(it -> Objects.equals(it.getX(), point.getX())).collect(Collectors.toList());
  1092. if (item.size() > 0 && item.get(0).getX() >= minSpeed && item.get(0).getX() < maxSpeed) {
  1093. sum += Math.pow((point.getY() - item.get(0).getY()), 2);
  1094. count++;
  1095. pc += point.getY() - item.get(0).getY();
  1096. }
  1097. }
  1098. sum = Math.sqrt(sum);
  1099. count = Math.sqrt(count);
  1100. max = max * count;
  1101. if (max != 0) {
  1102. result = sum / max * 100;
  1103. }
  1104. if (pc < 0) {
  1105. result = 0 - result;
  1106. }
  1107. }
  1108. return result;
  1109. }
  1110. //todo-sl 添加数据筛选
  1111. private boolean filterData(PointData gl, PointData fs, PointData zt, double maxPower,double maxSpeed, String windturbineId) throws Exception {
  1112. if (StringUtils.notEmp(gl)) {
  1113. //判定功率是否超过最大值
  1114. if (gl.getPointValueInDouble() > maxPower) {
  1115. return false;
  1116. }
  1117. }
  1118. if (StringUtils.notEmp(fs)) {
  1119. //判定功率是否超过最大值
  1120. if (fs.getPointValueInDouble() > maxSpeed) {
  1121. return false;
  1122. }
  1123. }
  1124. //判定状态不为运行的进行过滤
  1125. if (zt.getPointValueInDouble() != 2) {
  1126. return false;
  1127. }
  1128. // //设置时间为10分钟前,10钟前有停机事件数据进行过滤
  1129. // Calendar c = Calendar.getInstance();
  1130. // c.setTimeInMillis(zt.getPointTime());
  1131. // Date end = c.getTime();
  1132. // c.add(Calendar.MINUTE, -10);
  1133. // Date bedin = c.getTime();
  1134. // List<PointData> points = edosUtil.getHistoryDatasSnap(zt.getEdnaId(), bedin.getTime() / 1000, end.getTime() / 1000);
  1135. // if (!points.isEmpty()) {
  1136. // for (PointData p : points) {
  1137. // if (p.getPointValueInDouble() == 4) {
  1138. //
  1139. // return false;
  1140. // }
  1141. //
  1142. // }
  1143. //
  1144. // }
  1145. //
  1146. // //设置时间为10分钟后,运行后10分钟数据进行过滤
  1147. //
  1148. // points = edosUtil.getHistoryDatasSnap(zt.getEdnaId(), bedin.getTime() / 1000, end.getTime() / 1000);
  1149. // if (!points.isEmpty()) {
  1150. // for (PointData p : points) {
  1151. // if (p.getPointValueInDouble() != 2) {
  1152. // return false;
  1153. //
  1154. // }
  1155. //
  1156. // }
  1157. //
  1158. // }
  1159. //
  1160. //
  1161. // Map<String, Map<String, ProBasicEquipmentPoint>> wtpAimap = CacheContext.wtpAimap;
  1162. // Map<String, ProBasicEquipmentPoint> wtpointmap = wtpAimap.get(windturbineId);
  1163. //
  1164. //
  1165. // List<PointVo> bzPointls=new ArrayList<>();
  1166. // List<PointVo> sjPointls=new ArrayList<>();
  1167. //
  1168. // double modelpower=0.0;
  1169. // if (CacheContext.wtmap.containsKey(windturbineId)) {
  1170. // String modelid = CacheContext.wtmap.get(windturbineId).getModelId();
  1171. // if (StringUtils.notEmp(modelid)) {
  1172. // //获取保证功率曲线中的风速和功率
  1173. // if (CacheContext.theoreticalPowerMap.containsKey(modelid)) {
  1174. // Map<Double,ProBasicModelPowerRd> theoreticalMap= CacheContext.theoreticalPowerMap.get(modelid);
  1175. //
  1176. // PointVo point = new PointVo();
  1177. // double speed=StringUtils.round(fs.getPointValueInDouble(),2);
  1178. // point.setX(speed);
  1179. // point.setY(theoreticalMap.get(speed).getEnsurePower());
  1180. // modelpower=point.getY();
  1181. // bzPointls.add(point);
  1182. // }
  1183. // }
  1184. // }
  1185. //
  1186. // PointVo point = new PointVo();
  1187. // double speed=StringUtils.round(fs.getPointValueInDouble(),2);
  1188. // double power=StringUtils.round(gl.getPointValueInDouble(),2);
  1189. // point.setX(speed);
  1190. // point.setY(power);
  1191. // sjPointls.add(point);
  1192. //
  1193. // //与保证功率进行对比,偏差大于25%的进行过滤
  1194. // double value= pcl2( sjPointls, bzPointls, modelpower, speed);
  1195. //
  1196. // if (value > Math.abs(0.25)) {
  1197. // return false;
  1198. // }
  1199. //
  1200. // List<String> pointid = new ArrayList<>();
  1201. // //欠发状态大于2过滤掉
  1202. // pointid.add(wtpointmap.get(ContantXk.LSQFZT).getNemCode());
  1203. // List<PointData> values = edosUtil.getHistMatrix(pointid, gl.getPointTime() / 1000);
  1204. // if (null != values && values.size() > 0) {
  1205. // double qfzt = values.get(0).getPointValueInDouble();
  1206. //
  1207. // return !(qfzt > 2);
  1208. // }
  1209. return true;
  1210. }
  1211. //功率曲线拟合
  1212. private void curveFittingBuilder(Date begin, Date end, int dimension, double scale, String pointIdGL, String pointIdFS, String pointIdZT, List<PointVo> sjglPoints, List<PointVo> zyglPoints, String windturbineId) throws Exception {
  1213. double maxPower = windturbineCapacity.get(windturbineId) * 1.3;
  1214. double maxSpeed = 25;
  1215. List<PointfVo> sjglnhpoints = new ArrayList<>();
  1216. Map<Double, PointfVo> zyglnhpoints = new HashMap<>();
  1217. if (end.after(begin)) {
  1218. if (StringUtils.notEmp(pointIdGL) && StringUtils.notEmp(pointIdFS)) {
  1219. List<PointData> glpointstemp = edosUtil.getHistoryDatasSnap(pointIdGL, begin.getTime() / 1000, end.getTime() / 1000);
  1220. List<PointData> fspointstemp = edosUtil.getHistoryDatasSnap(pointIdFS, begin.getTime() / 1000, end.getTime() / 1000);
  1221. List<PointData> ztpointstemp = edosUtil.getHistoryDatasSnap(pointIdZT, begin.getTime() / 1000, end.getTime() / 1000);
  1222. List<PointData> glpoints = new ArrayList<>();
  1223. List<PointData> fspoints = new ArrayList<>();
  1224. List<PointData> ztpoints = new ArrayList<>();
  1225. if (!glpointstemp.isEmpty() && !fspointstemp.isEmpty() && !ztpointstemp.isEmpty() && glpointstemp.size() == fspointstemp.size() && fspointstemp.size() == ztpointstemp.size()) {
  1226. for (int i = 0; i < glpointstemp.size(); i++) {
  1227. if (filterData(glpointstemp.get(i), fspointstemp.get(i), ztpointstemp.get(i), maxPower,maxSpeed, windturbineId)) {
  1228. glpoints.add(glpointstemp.get(i));
  1229. fspoints.add(fspointstemp.get(i));
  1230. ztpoints.add(ztpointstemp.get(i));
  1231. }
  1232. }
  1233. }
  1234. if (glpoints.size() != fspoints.size() || glpoints.size() != ztpoints.size()) {
  1235. for (int i = 0; i < fspoints.size(); i++) {
  1236. double x = fspoints.get(i).getPointValueInDouble();
  1237. double y = -1;
  1238. double z = -1;
  1239. int finalI1 = i;
  1240. List<PointData> yArray = glpoints.stream().filter(it -> it.getPointTime().compareTo(fspoints.get(finalI1).getPointTime()) == 0).collect(Collectors.toList());
  1241. if (yArray.size() > 0) {
  1242. y = yArray.get(0).getPointValueInDouble();
  1243. }
  1244. int finalI = i;
  1245. yArray = ztpoints.stream().filter(it -> it.getPointTime().compareTo(fspoints.get(finalI).getPointTime()) == 0).collect(Collectors.toList());
  1246. if (yArray.size() > 0) {
  1247. z = yArray.get(0).getPointValueInDouble();
  1248. }
  1249. Double x1 = StringUtils.round(x, 2);
  1250. Double y1 = y;
  1251. boolean b = true;
  1252. if (CacheContext.wtmap.containsKey(windturbineId)) {
  1253. ProBasicEquipment wt = CacheContext.wtmap.get(windturbineId);
  1254. if (wt.getWindpowerstationId().contains(WpType.GDC.id)) {
  1255. b = (x >= 0 && y > 0);
  1256. } else {
  1257. if (z == 2) {
  1258. b = (x >= 0 && x <= 30 && y >= 0 && y <= maxPower);
  1259. if (b) {
  1260. if (x > 3 && y <= 0) {
  1261. b = false;
  1262. }
  1263. if (x <= 3 && y > 0) {
  1264. b = false;
  1265. }
  1266. }
  1267. } else {
  1268. b = false;
  1269. }
  1270. }
  1271. }
  1272. if (b) {
  1273. sjglnhpoints.add(new PointfVo(x1, y1));
  1274. if (zyglnhpoints.containsKey(x1)) {
  1275. if (zyglnhpoints.get(x1).getY() < y1) {
  1276. zyglnhpoints.put(x1, new PointfVo(x1, y1));
  1277. }
  1278. } else {
  1279. zyglnhpoints.put(x1, new PointfVo(x1, y1));
  1280. }
  1281. }
  1282. }
  1283. } else {
  1284. for (int i = 0; i < fspoints.size(); i++) {
  1285. double x = fspoints.get(i).getPointValueInDouble();
  1286. double y = glpoints.get(i).getPointValueInDouble();
  1287. double z = ztpoints.get(i).getPointValueInDouble();
  1288. Double x1 = StringUtils.round(x, 2);
  1289. Double y1 = y;
  1290. boolean b = true;
  1291. if (CacheContext.wtmap.containsKey(windturbineId)) {
  1292. ProBasicEquipment wt = CacheContext.wtmap.get(windturbineId);
  1293. if (wt.getWindpowerstationId().contains(WpType.GDC.id)) {
  1294. b = (x >= 0 && y > 0);
  1295. } else {
  1296. if (z == 2) {
  1297. b = (x >= 0 && x <= 30 && y >= 0 && y <= maxPower);
  1298. if (b) {
  1299. if (x > 3 && y <= 0) {
  1300. b = false;
  1301. }
  1302. if (x <= 3 && y > 0) {
  1303. b = false;
  1304. }
  1305. }
  1306. } else {
  1307. b = false;
  1308. }
  1309. }
  1310. }
  1311. if (b) {
  1312. sjglnhpoints.add(new PointfVo(x1, y1));
  1313. if (zyglnhpoints.containsKey(x1)) {
  1314. if (zyglnhpoints.get(x1).getY() < y1) {
  1315. zyglnhpoints.put(x1, new PointfVo(x1, y1));
  1316. }
  1317. } else {
  1318. zyglnhpoints.put(x1, new PointfVo(x1, y1));
  1319. }
  1320. }
  1321. }
  1322. }
  1323. sjglnhpoints.add(new PointfVo(0.0, 0.0));
  1324. sjglnhpoints = sjglnhpoints.stream().filter(it -> it.getX() >= 3).sorted(Comparator.comparing(PointfVo::getX)).collect(Collectors.toList());
  1325. // if (sjglnhpoints.stream().min(Comparator.comparing(PointfVo::getX)).isPresent()) {
  1326. // double Xmax = sjglnhpoints.stream().max(Comparator.comparing(PointfVo::getX)).get().getX();
  1327. // double Ymax = sjglnhpoints.stream().max(Comparator.comparing(PointfVo::getX)).get().getY();
  1328. // System.out.println("");
  1329. // }
  1330. List<PointVo> temp = LineUtil.buildLine(sjglnhpoints.stream().mapToDouble(PointfVo::getX).toArray(), sjglnhpoints.stream().mapToDouble(PointfVo::getY).toArray(), sjglnhpoints.size(), dimension, scale);
  1331. sjglPoints.addAll(temp);
  1332. if (sjglPoints.size() != 0) {
  1333. buildMyPoints(sjglPoints, scale);
  1334. }
  1335. if (!zyglnhpoints.containsKey(0.0))
  1336. zyglnhpoints.put(0.0, new PointfVo(0.0, 0.0));
  1337. List<PointfVo> zygltemp = zyglnhpoints.values().stream().filter(it -> it.getX() >= 3).sorted(Comparator.comparing(PointfVo::getX)).collect(Collectors.toList());
  1338. if (zygltemp.size() != 0) {
  1339. temp = LineUtil.buildLine(zygltemp.stream().mapToDouble(PointfVo::getX).toArray(), zygltemp.stream().mapToDouble(PointfVo::getY).toArray(), zygltemp.size(), dimension, scale);
  1340. }
  1341. zyglPoints.addAll(temp);
  1342. if (zyglPoints.size() != 0) {
  1343. buildMyPoints(zyglPoints, scale);
  1344. }
  1345. }
  1346. }
  1347. }
  1348. private static void buildMyPoints(List<PointVo> sjglPoints, double scale) {
  1349. int coefficient = 1;
  1350. int dec = 0;
  1351. int smax = 25;
  1352. if (scale == 0.01) {
  1353. coefficient = 100;
  1354. dec = 2;
  1355. }
  1356. if (scale == 0.1) {
  1357. coefficient = 10;
  1358. dec = 1;
  1359. }
  1360. smax *= coefficient;
  1361. double min = 0.0;
  1362. double max = 0.0;
  1363. double maxval = 0.0;
  1364. if (sjglPoints.stream().min(Comparator.comparing(PointVo::getX)).isPresent()) {
  1365. min = sjglPoints.stream().min(Comparator.comparing(PointVo::getX)).get().getX() * coefficient;
  1366. }
  1367. if (sjglPoints.stream().max(Comparator.comparing(PointVo::getX)).isPresent()) {
  1368. max = sjglPoints.stream().max(Comparator.comparing(PointVo::getX)).get().getX() * coefficient;
  1369. }
  1370. if (sjglPoints.stream().max(Comparator.comparing(PointVo::getY)).isPresent()) {
  1371. maxval = sjglPoints.stream().max(Comparator.comparing(PointVo::getY)).get().getY();
  1372. }
  1373. for (double i = 0; i < min; i += 1) {
  1374. PointVo point = new PointVo();
  1375. point.setX(StringUtils.round(i / coefficient, dec));
  1376. point.setY(0.0);
  1377. sjglPoints.add(point);
  1378. }
  1379. for (double i = smax; i > max; i -= 1) {
  1380. PointVo point = new PointVo();
  1381. point.setX(StringUtils.round(i / coefficient, dec));
  1382. point.setY(maxval);
  1383. sjglPoints.add(point);
  1384. }
  1385. }
  1386. }