PowerCurveFittingByTimeService.java 80 KB

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