LeanModelStatistics.java 63 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868
  1. package org.jeecg.modules.fpgJob;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.jeecg.common.util.DateUtils;
  6. import org.jeecg.common.util.oConvertUtils;
  7. import org.jeecg.modules.device.entity.DeviceInformation;
  8. import org.jeecg.modules.device.service.IDeviceInformationService;
  9. import org.jeecg.modules.devicePoint.service.IDevicePointService;
  10. import org.jeecg.modules.fpgJob.entity.FpgLeanModel;
  11. import org.jeecg.modules.fpgJob.service.IFpgLeanModelService;
  12. import org.jeecg.modules.gatherData.entity.*;
  13. import org.jeecg.modules.gatherData.service.IFpgGatherDataService;
  14. import org.jeecg.modules.peaksAndValleysTimeConfig.entity.PeaksAndValleysTimeConfig;
  15. import org.jeecg.modules.peaksAndValleysTimeConfig.entity.SystemVariable;
  16. import org.jeecg.modules.peaksAndValleysTimeConfig.service.IPeaksAndValleysTimeConfigService;
  17. import org.jeecg.modules.peaksAndValleysTimeConfig.service.ISystemVariableService;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.data.domain.Sort;
  20. import org.springframework.data.mongodb.core.MongoTemplate;
  21. import org.springframework.data.mongodb.core.query.Criteria;
  22. import org.springframework.data.mongodb.core.query.Query;
  23. import org.springframework.data.mongodb.core.query.Update;
  24. import org.springframework.data.mongodb.core.query.UpdateDefinition;
  25. import org.springframework.scheduling.annotation.EnableAsync;
  26. import org.springframework.scheduling.annotation.EnableScheduling;
  27. import org.springframework.scheduling.annotation.Scheduled;
  28. import org.springframework.stereotype.Component;
  29. import java.math.BigDecimal;
  30. import java.math.RoundingMode;
  31. import java.text.DecimalFormat;
  32. import java.text.SimpleDateFormat;
  33. import java.time.*;
  34. import java.time.format.DateTimeFormatter;
  35. import java.util.*;
  36. import java.util.concurrent.atomic.AtomicReference;
  37. import java.util.stream.Collectors;
  38. @Slf4j
  39. @EnableAsync
  40. @Component
  41. @EnableScheduling
  42. public class LeanModelStatistics {
  43. @Autowired
  44. IFpgLeanModelService fpgLeanModelService;
  45. @Autowired
  46. IFpgGatherDataService fpgGatherDataService;
  47. @Autowired
  48. IDevicePointService devicePointService;
  49. @Autowired
  50. IDeviceInformationService deviceInformationService;
  51. @Autowired
  52. private IPeaksAndValleysTimeConfigService peaksAndValleysTimeConfigService;
  53. @Autowired
  54. private ISystemVariableService systemVariableService;
  55. @Autowired
  56. MongoTemplate mongoTemplate;
  57. /**
  58. * 精益模型统计数据
  59. * 执行完后,间隔1秒继续执行
  60. */
  61. @Scheduled(cron = "0 */1 * * * ?")
  62. // @Scheduled(cron = "*/30 * * * * ?")
  63. public void t1(){
  64. leanModel();
  65. }
  66. /**
  67. * 变更占比
  68. * 0 0 03 * * * 每日3点执行 测试期间1ms一次
  69. */
  70. @Scheduled(cron = "0 0 03 * * ?")
  71. // @Scheduled(fixedDelay = 1000)
  72. public void t2(){
  73. changeProportion();
  74. }
  75. /**
  76. * 设备启停统计数据
  77. */
  78. @Scheduled(cron = "0 */1 * * * ?")
  79. // @Scheduled(cron = "*/30 * * * * ?")
  80. public void t3(){
  81. deviceStatistics();
  82. }
  83. public void changeProportion(){
  84. log.info("变更占比");
  85. // 峰平谷精益模型配置获取
  86. LambdaQueryWrapper<FpgLeanModel> leanmodelQuery = new LambdaQueryWrapper<FpgLeanModel>().eq(FpgLeanModel::getStatus, "1");
  87. List<FpgLeanModel> fpgLeanModellist = fpgLeanModelService.list(leanmodelQuery);
  88. LocalDate yesterday = LocalDate.now().minusDays(1); // 获取今天的日期 减去一天,得到昨天的日期
  89. // 处理数据业务逻辑
  90. fpgLeanModellist.forEach(fpgLeanModeInfo -> {
  91. Query query = new Query();
  92. query.addCriteria(Criteria.where("proportion").is(1))
  93. .addCriteria(Criteria.where("dates").is(yesterday.toString()));
  94. List<FpgStatiscsModelMongodb> fpgStatiscsModelMongoList = mongoTemplate.find(query, FpgStatiscsModelMongodb.class, "leanmodel_" + fpgLeanModeInfo.getLeanModelCode());
  95. BigDecimal zb = new BigDecimal("100");
  96. fpgStatiscsModelMongoList.forEach(fpgStatiscsModelMongoInfo -> { // 循环处理采集数据处理
  97. BigDecimal proportion = fpgStatiscsModelMongoInfo.getPower();
  98. BigDecimal topsProportion = fpgStatiscsModelMongoInfo.getTopsPower() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongoInfo.getTopsPower();
  99. BigDecimal peaksProportion = fpgStatiscsModelMongoInfo.getPeaksPower() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongoInfo.getPeaksPower();
  100. BigDecimal flatProportion = fpgStatiscsModelMongoInfo.getFlatPower() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongoInfo.getPeaksPower();
  101. BigDecimal valleysProportion = fpgStatiscsModelMongoInfo.getValleysPower() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongoInfo.getPeaksPower();
  102. // 核算占比
  103. UpdateDefinition update = new Update();
  104. ((Update) update).set("proportion", 2);
  105. if(topsProportion.compareTo(new BigDecimal("0.00")) > 0) { // 尖
  106. ((Update) update).set("topsProportion", topsProportion.divide(proportion, 4, RoundingMode.HALF_UP).multiply(zb));
  107. }
  108. if(peaksProportion.compareTo(new BigDecimal("0.00")) > 0) { // 峰
  109. ((Update) update).set("peaksProportion", peaksProportion.divide(proportion, 4, RoundingMode.HALF_UP).multiply(zb));
  110. }
  111. if(flatProportion.compareTo(new BigDecimal("0.00")) > 0) { // 平
  112. ((Update) update).set("flatProportion", flatProportion.divide(proportion, 4, RoundingMode.HALF_UP).multiply(zb));
  113. }
  114. if(valleysProportion.compareTo(new BigDecimal("0.00")) > 0) { // 谷
  115. ((Update) update).set("valleysProportion", valleysProportion.divide(proportion, 4, RoundingMode.HALF_UP).multiply(zb));
  116. }
  117. // 保存
  118. mongoTemplate.updateFirst(query, update, FpgStatiscsModelMongodb.class, "leanmodel_" + fpgLeanModeInfo.getLeanModelCode());
  119. });
  120. });
  121. }
  122. // 设备启停统计数据
  123. public void deviceStatistics() {
  124. log.info("设备日常统计");
  125. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  126. // 获取当前时间
  127. LocalDateTime newTime = LocalDateTime.now().plusHours(8);
  128. Date curentDate = Date.from(newTime.atZone(ZoneId.systemDefault()).toInstant());
  129. // 峰平谷设备列表
  130. LambdaQueryWrapper<DeviceInformation> objectLambdaQueryWrapper = new LambdaQueryWrapper<>();
  131. List<DeviceInformation> deviceInformationllist = deviceInformationService.list(objectLambdaQueryWrapper);
  132. // 尖峰平谷时段配置
  133. List<PeaksAndValleysTimeConfig> peaksAndValleysTimeConfiglist = peaksAndValleysTimeConfigService.list();
  134. BigDecimal zb = new BigDecimal("100");
  135. //遍历设备集合
  136. deviceInformationllist.forEach(deviceInformationlinfo -> {
  137. // 查询设备对应数据
  138. LambdaQueryWrapper<FpgGatherData> fpgGatherQuery = new LambdaQueryWrapper<FpgGatherData>().isNull(FpgGatherData::getFpgTotalUpdatetime).eq(FpgGatherData::getDeviceInformationId, deviceInformationlinfo.getId()).isNotNull(FpgGatherData::getRunCurrent).isNotNull(FpgGatherData::getActivePower).orderByAsc(FpgGatherData::getCreateTime).last("limit 1000");
  139. List<FpgGatherData> fpgGatherList = fpgGatherDataService.list(fpgGatherQuery);
  140. // 系统变量查询
  141. QueryWrapper<SystemVariable> queryWrapper = new QueryWrapper<>();
  142. queryWrapper.eq("variable_address", "sys_run_current_limit");
  143. queryWrapper.eq("status", 0);
  144. SystemVariable systemVariable = systemVariableService.getOne(queryWrapper);
  145. LambdaQueryWrapper<FpgGatherData> dataLambdaQueryWrapper = new LambdaQueryWrapper<>();
  146. dataLambdaQueryWrapper.eq(FpgGatherData::getDeviceInformationId,deviceInformationlinfo.getId());
  147. dataLambdaQueryWrapper.orderByDesc(FpgGatherData::getCreateTime).last("LIMIT 1");
  148. List<FpgGatherData> list = fpgGatherDataService.list(dataLambdaQueryWrapper);
  149. if (!list.isEmpty()) {
  150. FpgGatherData latestRecord = list.get(0);
  151. // 使用 latestRecord
  152. DeviceInformation deviceInformation = deviceInformationService.getOne(
  153. new LambdaQueryWrapper<DeviceInformation>()
  154. .eq(DeviceInformation::getId, latestRecord.getDeviceInformationId())
  155. );
  156. // 比较大小
  157. int result = compareStringWithBigDecimal(systemVariable.getDefaultValue(), latestRecord.getRunCurrent());
  158. if (result > 0) {
  159. deviceInformation.setStatus("1");
  160. } else if (result < 0) {
  161. deviceInformation.setStatus("0");
  162. }
  163. // 只有在 systemVariable 不为空时才进行更新操作
  164. deviceInformationService.updateById(deviceInformation);
  165. }
  166. // 处理数据业务逻辑
  167. fpgGatherList.forEach(fpgGatherData -> { // 循环处理采集数据处理
  168. try {
  169. fpgGatherData.setFpgTotalUpdatetime(new Date());
  170. // 采集时间
  171. Instant instant = fpgGatherData.getCreateTime().toInstant();
  172. LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
  173. // 上报日期
  174. String dayDate = new SimpleDateFormat("yyyy-MM-dd").format(fpgGatherData.getCreateTime());
  175. String classs = "";
  176. // 班次处理
  177. if (containsCreateTime(localDateTime, dayDate + " 00:00:00", dayDate + " 07:59:59")) { // 夜班
  178. classs = "night";
  179. } else if (containsCreateTime(localDateTime, dayDate + " 08:00:00", dayDate + " 15:59:59")) { // 白班
  180. classs = "white";
  181. } else if (containsCreateTime(localDateTime, dayDate + " 16:00:00", dayDate + " 23:59:59")) { // 中班
  182. classs = "center";
  183. }
  184. // 定义尖峰平谷
  185. AtomicReference<String> jfpgStr = new AtomicReference<>("");
  186. // 判断尖峰平谷时段
  187. peaksAndValleysTimeConfiglist.forEach(peaksAndValleysTimeConfig -> {
  188. if (containsCreateTime(localDateTime, dayDate + " " + peaksAndValleysTimeConfig.getStartTime(), dayDate + " " + peaksAndValleysTimeConfig.getEndTime())) {
  189. jfpgStr.set(peaksAndValleysTimeConfig.getType());
  190. }
  191. });
  192. // 功率
  193. BigDecimal runPower = fpgGatherData.getActivePower().compareTo(new BigDecimal("0.00")) > 0 ? fpgGatherData.getActivePower().divide(new BigDecimal(12), 8, RoundingMode.HALF_UP) : new BigDecimal("0.00");
  194. // 占比
  195. BigDecimal proportion = new BigDecimal("0.00");
  196. // 运行时常
  197. BigDecimal runTime = new BigDecimal("300");
  198. // 电流
  199. BigDecimal selectricCurrent = fpgGatherData.getRunCurrent();
  200. // 设备启停统计 start
  201. String startStopMonKey = "total_startstop";
  202. DeviceStatiscsModelData startStopStatiscsData = new DeviceStatiscsModelData(fpgGatherData, startStopMonKey, dayDate, classs, curentDate, curentDate);
  203. // 组合mongodb条件
  204. Query queryStartStop = new Query()
  205. .addCriteria(Criteria.where("deviceRegionId").is(fpgGatherData.getDeviceRegionId()))
  206. .addCriteria(Criteria.where("deviceInformationId").is(fpgGatherData.getDeviceInformationId()))
  207. .with(Sort.by(Sort.Order.desc("deviceStartTime"))).limit(1);
  208. // 查找设备运行记录
  209. DeviceStatiscsModelMongodb startStopMongo = mongoTemplate.findOne(queryStartStop, DeviceStatiscsModelMongodb.class, startStopMonKey);
  210. if(startStopMongo != null){ // 存在该设备记录
  211. Date deviceStopTimeEnd = DateUtils.addHours(fpgGatherData.getCreateTime(), 0);
  212. if (fpgGatherData.getRunCurrent().compareTo(new BigDecimal(systemVariable.getDefaultValue())) < 0 && "1".equals(startStopMongo.getDeviceStopTimeBank())) {
  213. // 设备正常运行的 直接停止更新启停时间
  214. Date startDate = dateFormat.parse(startStopMongo.getDeviceStartTime());
  215. // 将 Date 转换为 Instant
  216. Instant oldInstant = startDate.toInstant();
  217. Instant newInstant = fpgGatherData.getCreateTime().toInstant();
  218. // 计算时间差
  219. Duration duration = Duration.between(oldInstant, newInstant);
  220. // 获取时间差的秒数
  221. long diffInSeconds = duration.getSeconds();
  222. BigDecimal timeDifference = new BigDecimal(diffInSeconds);
  223. UpdateDefinition updateStartStop = new Update()
  224. .set("updateTime", curentDate).set("deviceStopTime", DateUtils.date2Str(deviceStopTimeEnd, DateUtils.datetimeFormat.get()))
  225. .set("deviceStopTimeBank", "2").set("ingTime", timeDifference);
  226. Query modifyStartStop = new Query()
  227. .addCriteria(Criteria.where("deviceRegionId").is(fpgGatherData.getDeviceRegionId()))
  228. .addCriteria(Criteria.where("deviceInformationId").is(fpgGatherData.getDeviceInformationId()))
  229. .addCriteria(Criteria.where("_id").is(startStopMongo.get_id()));
  230. mongoTemplate.findAndModify(modifyStartStop, updateStartStop, DeviceStatiscsModelMongodb.class, startStopMonKey);
  231. } else if(fpgGatherData.getRunCurrent().compareTo(new BigDecimal(systemVariable.getDefaultValue())) > 0 && "1".equals(startStopMongo.getDeviceStopTimeBank())){
  232. // 设备运行累加运行记录
  233. BigDecimal oldPower = startStopMongo.getPower() == null ? new BigDecimal("0.00") : startStopMongo.getPower();
  234. BigDecimal oldSelectricCurrent = startStopMongo.getSelectricCurrent() == null ? new BigDecimal("0.00") : startStopMongo.getSelectricCurrent();
  235. // 更新启动运行数据
  236. Date deviceStopTime = DateUtils.addHours(fpgGatherData.getCreateTime(), 0);
  237. Date startDate = dateFormat.parse(startStopMongo.getDeviceStartTime());
  238. // 将Date转换为Instant
  239. Instant oldInstant = startDate.toInstant();
  240. Instant newInstant = fpgGatherData.getCreateTime().toInstant();
  241. // 计算时间差
  242. Duration duration = Duration.between(oldInstant, newInstant);
  243. // 获取时间差的秒数
  244. long diffInSeconds = duration.getSeconds();
  245. BigDecimal timeDifference = new BigDecimal(diffInSeconds);
  246. UpdateDefinition updateStartStop = new Update()
  247. .set("power", oldPower.add(runPower))
  248. .set("selectricCurrent", oldSelectricCurrent.add(selectricCurrent))
  249. .set("ingTime", timeDifference)
  250. .set("deviceStopTime", DateUtils.date2Str(deviceStopTime, DateUtils.datetimeFormat.get()))
  251. .set("updateTime", curentDate);
  252. Query modifyStartStop = new Query()
  253. .addCriteria(Criteria.where("deviceRegionId").is(fpgGatherData.getDeviceRegionId()))
  254. .addCriteria(Criteria.where("deviceInformationId").is(fpgGatherData.getDeviceInformationId()))
  255. .addCriteria(Criteria.where("_id").is(startStopMongo.get_id()));
  256. mongoTemplate.findAndModify(modifyStartStop, updateStartStop, DeviceStatiscsModelMongodb.class, startStopMonKey);
  257. mongoTemplate.updateFirst(modifyStartStop, updateStartStop, FpgStatiscsModelMongodb.class, startStopMonKey);
  258. } else if(fpgGatherData.getRunCurrent().compareTo(new BigDecimal(systemVariable.getDefaultValue())) > 0 && "2".equals(startStopMongo.getDeviceStopTimeBank())){
  259. // 上一个设备停止,重新记录启停记录
  260. startStopStatiscsData.setPower(runPower);
  261. startStopStatiscsData.setIngTime(runTime);
  262. startStopStatiscsData.setSelectricCurrent(selectricCurrent);
  263. mongoTemplate.insert(startStopStatiscsData, startStopMonKey);
  264. }
  265. } else { // 直接插入
  266. if(fpgGatherData.getRunCurrent().compareTo(new BigDecimal(systemVariable.getDefaultValue())) > 0){ // 运行中计入启停记录
  267. startStopStatiscsData.setPower(runPower);
  268. startStopStatiscsData.setIngTime(runTime);
  269. startStopStatiscsData.setSelectricCurrent(selectricCurrent);
  270. mongoTemplate.insert(startStopStatiscsData, startStopMonKey);
  271. }
  272. }
  273. // 设备启停统计 end
  274. // 设备停止运行不统计
  275. if (fpgGatherData.getRunCurrent().compareTo(new BigDecimal(systemVariable.getDefaultValue())) < 0) { // 设备停止运行
  276. // 执行完成数据 标记已处理
  277. fpgGatherData.setId(fpgGatherData.getId());
  278. fpgGatherDataService.updateById(fpgGatherData);
  279. return;
  280. }
  281. // 日统计尖峰平谷数据(功率+占比+电流+运行时长) start
  282. String dayPowerproportioncurrentRunMonKey = "total_day_powerproportioncurrent";
  283. DeviceStatiscsModelData dayPowerproportioncurrentRunData = new DeviceStatiscsModelData(fpgGatherData, dayPowerproportioncurrentRunMonKey, dayDate, classs, curentDate, curentDate);
  284. // 组合mongodb条件
  285. Query queryDayPowerproportioncurrentRun = new Query()
  286. .addCriteria(Criteria.where("deviceRegionId").is(fpgGatherData.getDeviceRegionId())).addCriteria(Criteria.where("deviceInformationId").is(fpgGatherData.getDeviceInformationId())).addCriteria(Criteria.where("dates").is(dayDate));
  287. DeviceStatiscsModelMongodb dayPowerproportioncurrentMongo = mongoTemplate.findOne(queryDayPowerproportioncurrentRun, DeviceStatiscsModelMongodb.class, dayPowerproportioncurrentRunMonKey);
  288. if(dayPowerproportioncurrentMongo != null){ // 不为空更新
  289. // 历史数据
  290. BigDecimal runNewPower = dayPowerproportioncurrentMongo.getPower() == null ? new BigDecimal("0.00") : dayPowerproportioncurrentMongo.getPower().add(runPower);
  291. BigDecimal oldRunTime = dayPowerproportioncurrentMongo.getIngTime() == null ? new BigDecimal("0.00") : dayPowerproportioncurrentMongo.getIngTime();
  292. BigDecimal oldSelectricCurrent = dayPowerproportioncurrentMongo.getSelectricCurrent() == null ? new BigDecimal("0.00") : dayPowerproportioncurrentMongo.getSelectricCurrent();
  293. // 更新运行数据
  294. UpdateDefinition update = new Update();
  295. ((Update) update).set("power", runNewPower);
  296. ((Update) update).set("selectricCurrent", oldSelectricCurrent.add(selectricCurrent));
  297. ((Update) update).set("ingTime", oldRunTime.add(runTime));
  298. ((Update) update).set("updateTime", curentDate);
  299. // 占比
  300. BigDecimal topsProportion = dayPowerproportioncurrentMongo.getTopsPower().compareTo(new BigDecimal("0.00")) > 0 ? dayPowerproportioncurrentMongo.getTopsPower().divide(runNewPower, 4, RoundingMode.HALF_UP).multiply(zb) : proportion;
  301. // 其他三个重新核算
  302. BigDecimal flatProportion = dayPowerproportioncurrentMongo.getFlatPower().compareTo(new BigDecimal("0.00")) > 0 ? dayPowerproportioncurrentMongo.getFlatPower().divide(runNewPower, 4, RoundingMode.HALF_UP).multiply(zb) : proportion;
  303. BigDecimal peaksProportion = dayPowerproportioncurrentMongo.getPeaksPower().compareTo(new BigDecimal("0.00")) > 0 ? dayPowerproportioncurrentMongo.getPeaksPower().divide(runNewPower, 4, RoundingMode.HALF_UP).multiply(zb) : proportion;
  304. BigDecimal valleysProportion = dayPowerproportioncurrentMongo.getValleysPower().compareTo(new BigDecimal("0.00")) > 0 ? dayPowerproportioncurrentMongo.getValleysPower().divide(runNewPower, 4, RoundingMode.HALF_UP).multiply(zb) : proportion;
  305. // 尖峰平谷判定
  306. if("tops".equals(jfpgStr.get())){ // 尖
  307. // 功率处理
  308. BigDecimal oldtopsPower = dayPowerproportioncurrentMongo.getTopsPower() == null ? new BigDecimal("0.00") : dayPowerproportioncurrentMongo.getTopsPower();
  309. BigDecimal topsPower = oldtopsPower.add(runPower);
  310. ((Update) update).set("topsPower", topsPower);
  311. // 运行时常处理
  312. BigDecimal oldtopsIngTime = dayPowerproportioncurrentMongo.getTopsIngTime() == null ? new BigDecimal("0.00") : dayPowerproportioncurrentMongo.getTopsIngTime();
  313. ((Update) update).set("topsIngTime", oldtopsIngTime.add(runTime));
  314. // 占比
  315. topsProportion = topsPower.compareTo(new BigDecimal("0.00")) > 0 ? topsPower.divide(runNewPower, 4, RoundingMode.HALF_UP).multiply(zb) : topsProportion;
  316. } else if("peaks".equals(jfpgStr.get())){ // 峰
  317. // 功率处理
  318. BigDecimal oldpeaksPower = dayPowerproportioncurrentMongo.getPeaksPower() == null ? new BigDecimal("0.00") : dayPowerproportioncurrentMongo.getPeaksPower();
  319. BigDecimal peaksPower = oldpeaksPower.add(runPower);
  320. ((Update) update).set("peaksPower", peaksPower);
  321. // 运行时常处理
  322. BigDecimal oldpeaksIngTime = dayPowerproportioncurrentMongo.getPeaksIngTime() == null ? new BigDecimal("0.00") : dayPowerproportioncurrentMongo.getPeaksIngTime();
  323. ((Update) update).set("peaksIngTime", oldpeaksIngTime.add(runTime));
  324. // 占比
  325. peaksProportion = peaksPower.compareTo(new BigDecimal("0.00")) > 0 ? peaksPower.divide(runNewPower, 4, RoundingMode.HALF_UP).multiply(zb) : peaksProportion;
  326. } else if("flat".equals(jfpgStr.get())){ // 平
  327. // 功率处理
  328. BigDecimal oldflatPower = dayPowerproportioncurrentMongo.getFlatPower() == null ? new BigDecimal("0.00") : dayPowerproportioncurrentMongo.getFlatPower();
  329. BigDecimal flatPower = oldflatPower.add(runPower);
  330. ((Update) update).set("flatPower", flatPower);
  331. // 运行时常处理
  332. BigDecimal oldflatIngTime = dayPowerproportioncurrentMongo.getFlatIngTime() == null ? new BigDecimal("0.00") : dayPowerproportioncurrentMongo.getFlatIngTime();
  333. ((Update) update).set("flatIngTime", oldflatIngTime.add(runTime));
  334. // 占比
  335. flatProportion = flatPower.compareTo(new BigDecimal("0.00")) > 0 ? flatPower.divide(runNewPower, 4, RoundingMode.HALF_UP).multiply(zb) : flatProportion;
  336. } else if("valleys".equals(jfpgStr.get())){ // 谷
  337. // 功率处理
  338. BigDecimal oldvalleysPower = dayPowerproportioncurrentMongo.getValleysPower() == null ? new BigDecimal("0.00") : dayPowerproportioncurrentMongo.getValleysPower();
  339. BigDecimal valleysPower = oldvalleysPower.add(runPower);
  340. ((Update) update).set("valleysPower", oldvalleysPower.add(runPower));
  341. // 运行时常处理
  342. BigDecimal oldvalleysIngTime = dayPowerproportioncurrentMongo.getValleysIngTime() == null ? new BigDecimal("0.00") : dayPowerproportioncurrentMongo.getValleysIngTime();
  343. ((Update) update).set("valleysIngTime", oldvalleysIngTime.add(runTime));
  344. // 占比
  345. valleysProportion = valleysPower.compareTo(new BigDecimal("0.00")) > 0 ? valleysPower.divide(runNewPower, 4, RoundingMode.HALF_UP).multiply(zb) : valleysProportion;
  346. }
  347. // 占比
  348. ((Update) update).set("topsProportion", topsProportion);
  349. ((Update) update).set("peaksProportion", peaksProportion);
  350. ((Update) update).set("flatProportion", flatProportion);
  351. ((Update) update).set("valleysProportion", valleysProportion);
  352. mongoTemplate.updateFirst(queryDayPowerproportioncurrentRun, update, DeviceStatiscsModelMongodb.class, dayPowerproportioncurrentRunMonKey);
  353. } else { // 为空直接插入
  354. // 尖峰平谷判定
  355. if("tops".equals(jfpgStr.get())){ // 尖
  356. // 功率处理
  357. dayPowerproportioncurrentRunData.setTopsPower(runPower);
  358. dayPowerproportioncurrentRunData.setTopsIngTime(runTime);
  359. } else if("peaks".equals(jfpgStr.get())){ // 峰
  360. // 功率处理
  361. dayPowerproportioncurrentRunData.setPeaksPower(runPower);
  362. dayPowerproportioncurrentRunData.setPeaksIngTime(runTime);
  363. } else if("flat".equals(jfpgStr.get())){ // 平
  364. // 功率处理
  365. dayPowerproportioncurrentRunData.setFlatPower(runPower);
  366. dayPowerproportioncurrentRunData.setFlatIngTime(runTime);
  367. } else if("valleys".equals(jfpgStr.get())){ // 谷
  368. dayPowerproportioncurrentRunData.setValleysPower(runPower);
  369. dayPowerproportioncurrentRunData.setValleysIngTime(runTime);
  370. }
  371. dayPowerproportioncurrentRunData.setPower(runPower);
  372. dayPowerproportioncurrentRunData.setIngTime(runTime);
  373. mongoTemplate.insert(dayPowerproportioncurrentRunData, dayPowerproportioncurrentRunMonKey);
  374. }
  375. // 日统计尖峰平谷数据(功率+占比+电流+运行时长) end
  376. // 执行完成数据 标记已处理
  377. fpgGatherData.setId(fpgGatherData.getId());
  378. fpgGatherDataService.updateById(fpgGatherData);
  379. } catch (Exception e) {
  380. log.error(e.getMessage());
  381. }
  382. });
  383. });
  384. }
  385. //精益模型统计数据
  386. public void leanModel(){
  387. log.info("峰平谷模型");
  388. // 峰平谷精益模型配置获取
  389. LambdaQueryWrapper<FpgLeanModel> leanmodelQuery = new LambdaQueryWrapper<FpgLeanModel>().eq(FpgLeanModel::getStatus, "1");
  390. List<FpgLeanModel> fpgLeanModellist = fpgLeanModelService.list(leanmodelQuery);
  391. // 获取当前时间
  392. LocalDateTime newTime = LocalDateTime.now().plusHours(8);
  393. // 尖峰平谷时段配置
  394. List<PeaksAndValleysTimeConfig> peaksAndValleysTimeConfiglist = peaksAndValleysTimeConfigService.list();
  395. // 存储fpgGather数据id集合
  396. List<FpgGatherData> fpgGatherUpdateList= new ArrayList<>();
  397. // 系统变量查询
  398. QueryWrapper<SystemVariable> queryWrapper = new QueryWrapper<>();
  399. queryWrapper.eq("variable_address", "sys_run_current_limit");
  400. queryWrapper.eq("status", 0);
  401. SystemVariable systemVariable = systemVariableService.getOne(queryWrapper);
  402. // 遍历设备集合
  403. fpgLeanModellist.forEach(fpgLeanModeInfo -> {
  404. LambdaQueryWrapper<FpgGatherData> fpgGatherQuery = new LambdaQueryWrapper<FpgGatherData>().isNull(FpgGatherData::getFpgModelUpdatetime).isNotNull(FpgGatherData::getRunCurrent).isNotNull(FpgGatherData::getActivePower).orderByAsc(FpgGatherData::getCreateTime);
  405. // 检测是否配置设备特殊条件
  406. if(oConvertUtils.isNotEmpty(fpgLeanModeInfo.getDeviceInformationIds()) && oConvertUtils.isNotEmpty(fpgLeanModeInfo.getDeviceInformationIds())){
  407. fpgGatherQuery.in(FpgGatherData::getDeviceInformationId, Arrays.asList(fpgLeanModeInfo.getDeviceInformationIds().split(",")));
  408. }
  409. fpgGatherQuery.orderByAsc(FpgGatherData::getCreateTime).last("limit 1000");
  410. List<FpgGatherData> fpgGatherList = fpgGatherDataService.list(fpgGatherQuery);
  411. // 处理数据业务逻辑
  412. fpgGatherList.forEach(fpgGatherData -> { // 循环处理采集数据处理
  413. fpgGatherData.setFpgModelUpdatetime(new Date());
  414. // -数情况直接退出
  415. if (fpgGatherData.getActivePower().compareTo(BigDecimal.ZERO) < 0) {
  416. fpgGatherUpdateList.add(fpgGatherData);
  417. return;
  418. }
  419. try {
  420. String finalDatestr = "";
  421. // 统计单位
  422. if("minute".equals(fpgLeanModeInfo.getTotalUnit())){ // 分钟
  423. finalDatestr = new SimpleDateFormat("HH:mm").format(fpgGatherData.getCreateTime());
  424. } else if("hour".equals(fpgLeanModeInfo.getTotalUnit())){ // 小时
  425. finalDatestr = new SimpleDateFormat("HH:00").format(fpgGatherData.getCreateTime());
  426. } else if("day".equals(fpgLeanModeInfo.getTotalUnit())){ //
  427. finalDatestr = new SimpleDateFormat("yyyy-MM-dd").format(fpgGatherData.getCreateTime());
  428. }else if("week".equals(fpgLeanModeInfo.getTotalUnit())){ //
  429. Calendar calendar = Calendar.getInstance();
  430. finalDatestr = String.valueOf(calendar.get(Calendar.WEEK_OF_MONTH));
  431. } else if("month".equals(fpgLeanModeInfo.getTotalUnit())){ //
  432. finalDatestr = new SimpleDateFormat("yyyy-MM").format(fpgGatherData.getCreateTime());
  433. } else if("real_time". equals(fpgLeanModeInfo.getTotalUnit())){ // 实时
  434. fpgLeanModeInfo.setProportion(2);
  435. fpgLeanModeInfo.setElectricCurrent(2);
  436. fpgLeanModeInfo.setRunTime(2);
  437. finalDatestr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(fpgGatherData.getCreateTime());
  438. }
  439. String dayDate = new SimpleDateFormat("yyyy-MM-dd").format(fpgGatherData.getCreateTime());
  440. String classs = "";
  441. // 采集时间
  442. Instant instant = fpgGatherData.getCreateTime().toInstant();
  443. LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
  444. // 班次处理
  445. if (fpgLeanModeInfo.getClassUnit() != null && fpgLeanModeInfo.getClassUnit() == 1) { // 开启了班次统计
  446. if (containsCreateTime(localDateTime, dayDate + " 00:00:00", dayDate + " 07:59:59")) { // 夜班
  447. classs = "night";
  448. } else if (containsCreateTime(localDateTime, dayDate + " 08:00:00", dayDate + " 15:59:59")) { // 白班
  449. classs = "white";
  450. } else if (containsCreateTime(localDateTime, dayDate + " 16:00:00", dayDate + " 23:59:59")) { // 中班
  451. classs = "center";
  452. }
  453. }
  454. Date curentDate = Date.from(newTime.atZone(ZoneId.systemDefault()).toInstant());
  455. // 重组对象
  456. FpgStatiscsModelData fpgStatiscsModelData = new FpgStatiscsModelData(fpgGatherData, fpgLeanModeInfo, finalDatestr, dayDate, classs, curentDate, curentDate);
  457. // 实时统计直接插入
  458. if("real_time". equals(fpgLeanModeInfo.getTotalUnit())){
  459. fpgStatiscsModelData.setSelectricCurrent(fpgGatherData.getRunCurrent());
  460. fpgStatiscsModelData.setPower(fpgGatherData.getActivePower());
  461. fpgStatiscsModelData.setIngTime(new BigDecimal("300"));
  462. mongoTemplate.insert(fpgStatiscsModelData, "leanmodel_" + fpgLeanModeInfo.getLeanModelCode());
  463. fpgGatherUpdateList.add(fpgGatherData);
  464. return;
  465. }
  466. // 设备停止运行不统计
  467. if (fpgGatherData.getRunCurrent().compareTo(new BigDecimal(systemVariable.getDefaultValue())) < 0) { // 设备停止运行
  468. fpgGatherUpdateList.add(fpgGatherData);
  469. return;
  470. }
  471. // 定义尖峰平谷
  472. AtomicReference<String> jfpgStr = new AtomicReference<>("");
  473. // 判断尖峰平谷时段
  474. peaksAndValleysTimeConfiglist.forEach(peaksAndValleysTimeConfig -> {
  475. if (containsCreateTime(localDateTime, dayDate + " " + peaksAndValleysTimeConfig.getStartTime(), dayDate + " " + peaksAndValleysTimeConfig.getEndTime())) {
  476. jfpgStr.set(peaksAndValleysTimeConfig.getType());
  477. }
  478. });
  479. // 组合mongodb条件
  480. Query query = new Query();
  481. query.addCriteria(Criteria.where("devicePointId").is(fpgGatherData.getDevicePointId()))
  482. .addCriteria(Criteria.where("dates").is(dayDate))
  483. .addCriteria(Criteria.where("datestr").is(finalDatestr));
  484. if(fpgGatherData.getDeviceRegionId() != null && !fpgGatherData.getDeviceRegionId().isEmpty()){ // 区域特殊处理
  485. query.addCriteria(Criteria.where("deviceRegionId").is(fpgGatherData.getDeviceRegionId()));
  486. }
  487. if(fpgGatherData.getDeviceInformationId() != null && !fpgGatherData.getDeviceInformationId().isEmpty()){ // 设备特殊处理
  488. query.addCriteria(Criteria.where("deviceInformationId").is(fpgGatherData.getDeviceInformationId()));
  489. }
  490. if(!classs.isEmpty()){ // 增加班次条件
  491. query.addCriteria(Criteria.where("classs").is(classs));
  492. }
  493. String leanModelCode = fpgLeanModeInfo.getLeanModelCode();
  494. String collectionName;
  495. // 判断 leanModelCode 是否包含 "_report"
  496. if (leanModelCode.endsWith("_report")) {
  497. collectionName = leanModelCode;
  498. } else {
  499. collectionName = "leanmodel_" + leanModelCode;
  500. }
  501. FpgStatiscsModelMongodb fpgStatiscsModelMongo = mongoTemplate.findOne(query, FpgStatiscsModelMongodb.class, collectionName);
  502. // 功率
  503. BigDecimal activePower = fpgGatherData.getActivePower().compareTo(new BigDecimal("0.00")) > 0 ? fpgGatherData.getActivePower().divide(new BigDecimal("12"), 8, RoundingMode.HALF_UP) : new BigDecimal("0.00");
  504. // 电流
  505. BigDecimal selectricCurrent = fpgGatherData.getRunCurrent() == null ? new BigDecimal("0.00") : fpgGatherData.getRunCurrent();
  506. // 运行时常
  507. BigDecimal runTime = new BigDecimal("300");
  508. if(fpgStatiscsModelMongo != null){ // 不为空处理
  509. // 基础数据变更不受条件影响
  510. UpdateDefinition update = new Update();
  511. ((Update) update).set("updateTime", curentDate);
  512. // 功率 5 分钟上报一次 除以 12
  513. activePower = fpgGatherData.getActivePower() == null ? new BigDecimal("0.00") : activePower;
  514. BigDecimal oldPower = fpgStatiscsModelMongo.getPower() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getPower();
  515. BigDecimal oldingTime = fpgStatiscsModelMongo.getIngTime() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getIngTime();
  516. BigDecimal oldSelectricCurrent = fpgStatiscsModelMongo.getSelectricCurrent() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getSelectricCurrent();
  517. // 总运行时间处理
  518. if(fpgLeanModeInfo.getRunTime() != null && fpgLeanModeInfo.getRunTime() == 1) { // 运行时长统计
  519. (( Update) update).set("ingTime", oldingTime.add(runTime));
  520. }
  521. // 电流处理
  522. if(fpgLeanModeInfo.getElectricCurrent() != null && fpgLeanModeInfo.getElectricCurrent() == 1){
  523. if("tops".equals(jfpgStr.get())) { // 尖
  524. BigDecimal oldtopsSelectricCurrent = fpgStatiscsModelMongo.getTopsSelectricCurrent() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getTopsSelectricCurrent();
  525. ((Update) update).set("topSelectricCurrent", oldtopsSelectricCurrent.add(selectricCurrent));
  526. } else if("peaks".equals(jfpgStr.get())){ // 峰
  527. BigDecimal oldpeaksSelectricCurrent = fpgStatiscsModelMongo.getPeaksSelectricCurrent() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getPeaksSelectricCurrent();
  528. ((Update) update).set("peaksSelectricCurrent", oldpeaksSelectricCurrent.add(selectricCurrent));
  529. } else if("flat".equals(jfpgStr.get())) { // 平
  530. BigDecimal oldtflatSelectricCurrent = fpgStatiscsModelMongo.getFlatSelectricCurrent() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getFlatSelectricCurrent();
  531. ((Update) update).set("flatSelectricCurrent", oldtflatSelectricCurrent.add(selectricCurrent));
  532. } else if("valleys".equals(jfpgStr.get())) { // 谷
  533. BigDecimal oldvalleysSelectricCurrent = fpgStatiscsModelMongo.getValleysSelectricCurrent() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getValleysSelectricCurrent();
  534. ((Update) update).set("valleysSelectricCurrent", oldvalleysSelectricCurrent.add(selectricCurrent));
  535. }
  536. }
  537. BigDecimal zb = new BigDecimal("100");
  538. // 总功率处理
  539. ((Update) update).set("power", oldPower.add(activePower));
  540. //总电流处理
  541. ((Update) update).set("selectricCurrent", oldSelectricCurrent.add(selectricCurrent));
  542. // 尖峰平谷判定
  543. if("tops".equals(jfpgStr.get())){ // 尖
  544. // 功率处理
  545. BigDecimal oldtopsPower = fpgStatiscsModelMongo.getTopsPower() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getTopsPower();
  546. BigDecimal oldPeaksPower = fpgStatiscsModelMongo.getPeaksPower() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getPeaksPower();
  547. BigDecimal oldFlatPower = fpgStatiscsModelMongo.getFlatPower() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getFlatPower();
  548. BigDecimal oldValleysPower = fpgStatiscsModelMongo.getValleysPower() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getValleysPower();
  549. ((Update) update).set("topsPower", oldtopsPower.add(activePower));
  550. // 运行时常处理
  551. if(fpgLeanModeInfo.getRunTime() != null && fpgLeanModeInfo.getRunTime() == 1){ // 运行时长统计
  552. BigDecimal oldtopsIngTime = fpgStatiscsModelMongo.getTopsIngTime() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getTopsIngTime();
  553. BigDecimal newTopsIngTime = oldtopsIngTime.add(runTime).stripTrailingZeros();
  554. DecimalFormat df = new DecimalFormat("0.##################");
  555. String topFormatted = df.format(newTopsIngTime);
  556. ((Update) update).set("topsIngTime", new BigDecimal(topFormatted));
  557. }
  558. // 金额处理
  559. if(fpgLeanModeInfo.getTopsPrice() != null && fpgLeanModeInfo.getTopsPrice().compareTo(new BigDecimal("0.00")) > 0) {
  560. // 总金额
  561. BigDecimal totalAmount = fpgStatiscsModelMongo.getAmount() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getAmount();
  562. ((Update) update).set("amount", activePower.multiply(fpgLeanModeInfo.getTopsPrice()).add(totalAmount));
  563. ((Update) update).set("topsAmount", oldtopsPower.add(activePower).multiply(fpgLeanModeInfo.getTopsPrice()));
  564. }
  565. if(fpgLeanModeInfo.getProportion() !=null && fpgLeanModeInfo.getProportion() == 1){ //占比统计
  566. ((Update) update).set("topsProportion", oldtopsPower.add(activePower).divide(fpgStatiscsModelMongo.getPower().add(activePower), 2, RoundingMode.HALF_UP).multiply(zb));
  567. if(fpgStatiscsModelMongo.getPeaksPower().compareTo(new BigDecimal("0.00")) > 0) {
  568. ((Update) update).set("peaksProportion", oldPeaksPower.divide(fpgStatiscsModelMongo.getPower().add(activePower), 2, RoundingMode.HALF_UP).multiply(zb));
  569. }
  570. if(fpgStatiscsModelMongo.getFlatPower().compareTo(new BigDecimal("0.00")) > 0) {
  571. ((Update) update).set("flatProportion", oldFlatPower.divide(fpgStatiscsModelMongo.getPower().add(activePower), 2, RoundingMode.HALF_UP).multiply(zb));
  572. }
  573. if(fpgStatiscsModelMongo.getValleysPower().compareTo(new BigDecimal("0.00")) > 0) {
  574. ((Update) update).set("valleysProportion", oldValleysPower.divide(fpgStatiscsModelMongo.getPower().add(activePower), 2, RoundingMode.HALF_UP).multiply(zb));
  575. }
  576. }
  577. } else if("peaks".equals(jfpgStr.get())){ // 峰
  578. // 功率处理
  579. BigDecimal oldpeaksPower = fpgStatiscsModelMongo.getPeaksPower() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getPeaksPower();
  580. BigDecimal oldtopsPower = fpgStatiscsModelMongo.getTopsPower() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getTopsPower();
  581. BigDecimal oldFlatPower = fpgStatiscsModelMongo.getFlatPower() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getFlatPower();
  582. BigDecimal oldValleysPower = fpgStatiscsModelMongo.getValleysPower() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getValleysPower();
  583. ((Update) update).set("peaksPower", oldpeaksPower.add(activePower));
  584. // 运行时常处理
  585. if(fpgLeanModeInfo.getRunTime() != null && fpgLeanModeInfo.getRunTime() == 1){ // 运行时长统计
  586. BigDecimal oldpeaksIngTime = fpgStatiscsModelMongo.getPeaksIngTime() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getPeaksIngTime();
  587. BigDecimal newPeaksIngTime = oldpeaksIngTime.add(runTime).stripTrailingZeros();
  588. DecimalFormat df = new DecimalFormat("0.##################");
  589. String peaksFormatted = df.format(newPeaksIngTime);
  590. ((Update) update).set("peaksIngTime", new BigDecimal(peaksFormatted));
  591. }
  592. // 金额处理
  593. if(fpgLeanModeInfo.getPeaksPrice() != null && fpgLeanModeInfo.getPeaksPrice().compareTo(new BigDecimal("0.00")) > 0) {
  594. // 总金额
  595. BigDecimal totalAmount = fpgStatiscsModelMongo.getAmount() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getAmount();
  596. ((Update) update).set("amount", activePower.multiply(fpgLeanModeInfo.getPeaksPrice()).add(totalAmount));
  597. ((Update) update).set("peaksAmount", oldpeaksPower.add(activePower).multiply(fpgLeanModeInfo.getPeaksPrice()));
  598. }
  599. if(fpgLeanModeInfo.getProportion() !=null && fpgLeanModeInfo.getProportion() == 1){ //占比统计
  600. ((Update) update).set("peaksProportion", oldpeaksPower.add(activePower).divide(fpgStatiscsModelMongo.getPower().add(activePower), 2, RoundingMode.HALF_UP).multiply(zb));
  601. if(fpgStatiscsModelMongo.getTopsPower().compareTo(new BigDecimal("0.00")) > 0) {
  602. ((Update) update).set("topsProportion", oldtopsPower.divide(fpgStatiscsModelMongo.getPower().add(activePower), 2, RoundingMode.HALF_UP).multiply(zb));
  603. }
  604. if(fpgStatiscsModelMongo.getFlatPower().compareTo(new BigDecimal("0.00")) > 0) {
  605. ((Update) update).set("flatProportion", oldFlatPower.divide(fpgStatiscsModelMongo.getPower().add(activePower), 2, RoundingMode.HALF_UP).multiply(zb));
  606. }
  607. if(fpgStatiscsModelMongo.getValleysPower().compareTo(new BigDecimal("0.00")) > 0) {
  608. ((Update) update).set("valleysProportion", oldValleysPower.divide(fpgStatiscsModelMongo.getPower().add(activePower), 2, RoundingMode.HALF_UP).multiply(zb));
  609. }
  610. }
  611. } else if("flat".equals(jfpgStr.get())){ // 平
  612. // 功率处理
  613. BigDecimal oldflatPower = fpgStatiscsModelMongo.getFlatPower() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getFlatPower();
  614. BigDecimal oldpeaksPower = fpgStatiscsModelMongo.getPeaksPower() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getPeaksPower();
  615. BigDecimal oldtopsPower = fpgStatiscsModelMongo.getTopsPower() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getTopsPower();
  616. BigDecimal oldValleysPower = fpgStatiscsModelMongo.getValleysPower() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getValleysPower();
  617. ((Update) update).set("flatPower", oldflatPower.add(activePower));
  618. // 运行时常处理
  619. if(fpgLeanModeInfo.getRunTime() != null && fpgLeanModeInfo.getRunTime() == 1){
  620. BigDecimal oldflatIngTime = fpgStatiscsModelMongo.getFlatIngTime() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getFlatIngTime();
  621. BigDecimal newFlatIngTime = oldflatIngTime.add(runTime).stripTrailingZeros();
  622. DecimalFormat df = new DecimalFormat("0.##################");
  623. String formatted = df.format(newFlatIngTime);
  624. ((Update) update).set("flatIngTime", new BigDecimal(formatted));
  625. }
  626. // 金额处理
  627. if(fpgLeanModeInfo.getFlatPrice() != null && fpgLeanModeInfo.getFlatPrice().compareTo(new BigDecimal("0.00")) > 0) {
  628. // 总金额
  629. BigDecimal totalAmount = fpgStatiscsModelMongo.getAmount() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getAmount();
  630. ((Update) update).set("amount", activePower.multiply(fpgLeanModeInfo.getFlatPrice()).add(totalAmount));
  631. ((Update) update).set("flatAmount", oldflatPower.add(activePower).multiply(fpgLeanModeInfo.getFlatPrice()));
  632. }
  633. if(fpgLeanModeInfo.getProportion() !=null && fpgLeanModeInfo.getProportion() == 1){ //占比统计
  634. ((Update) update).set("flatProportion", oldflatPower.add(activePower).divide(fpgStatiscsModelMongo.getPower().add(activePower), 2, RoundingMode.HALF_UP).multiply(zb));
  635. if(fpgStatiscsModelMongo.getTopsPower().compareTo(new BigDecimal("0.00")) > 0) {
  636. ((Update) update).set("topsProportion", oldtopsPower.divide(fpgStatiscsModelMongo.getPower().add(activePower), 2, RoundingMode.HALF_UP).multiply(zb));
  637. }
  638. if(fpgStatiscsModelMongo.getPeaksPower().compareTo(new BigDecimal("0.00")) > 0) {
  639. ((Update) update).set("peaksProportion", oldpeaksPower.divide(fpgStatiscsModelMongo.getPower().add(activePower), 2, RoundingMode.HALF_UP).multiply(zb));
  640. }
  641. if(fpgStatiscsModelMongo.getValleysPower().compareTo(new BigDecimal("0.00")) > 0) {
  642. ((Update) update).set("valleysProportion", oldValleysPower.divide(fpgStatiscsModelMongo.getPower().add(activePower), 2, RoundingMode.HALF_UP).multiply(zb));
  643. }
  644. }
  645. } else if("valleys".equals(jfpgStr.get())){ // 谷
  646. // 功率处理
  647. BigDecimal oldvalleysPower = fpgStatiscsModelMongo.getValleysPower() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getValleysPower();
  648. BigDecimal oldflatPower = fpgStatiscsModelMongo.getFlatPower() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getFlatPower();
  649. BigDecimal oldpeaksPower = fpgStatiscsModelMongo.getPeaksPower() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getPeaksPower();
  650. BigDecimal oldtopsPower = fpgStatiscsModelMongo.getTopsPower() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getTopsPower();
  651. ((Update) update).set("valleysPower", oldvalleysPower.add(activePower));
  652. // 运行时常处理
  653. if(fpgLeanModeInfo.getRunTime() != null && fpgLeanModeInfo.getRunTime() == 1){
  654. BigDecimal oldvalleysIngTime = fpgStatiscsModelMongo.getValleysIngTime() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getValleysIngTime();
  655. BigDecimal newValleysIngTime = oldvalleysIngTime.add(runTime).stripTrailingZeros();
  656. DecimalFormat df = new DecimalFormat("0.##################");
  657. String valleysFormatted = df.format(newValleysIngTime);
  658. ((Update) update).set("valleysIngTime", new BigDecimal(valleysFormatted));
  659. }
  660. // 金额处理
  661. if(fpgLeanModeInfo.getValleysPrice() != null && fpgLeanModeInfo.getValleysPrice().compareTo(new BigDecimal("0.00")) > 0) {
  662. // 总金额
  663. BigDecimal totalAmount = fpgStatiscsModelMongo.getAmount() == null ? new BigDecimal("0.00") : fpgStatiscsModelMongo.getAmount();
  664. ((Update) update).set("amount", activePower.multiply(fpgLeanModeInfo.getValleysPrice()).add(totalAmount));
  665. ((Update) update).set("valleysAmount", oldvalleysPower.add(activePower).multiply(fpgLeanModeInfo.getValleysPrice()));
  666. }
  667. if(fpgLeanModeInfo.getProportion() !=null && fpgLeanModeInfo.getProportion() == 1){ //占比统计
  668. ((Update) update).set("valleysProportion", oldvalleysPower.add(activePower).divide(fpgStatiscsModelMongo.getPower().add(activePower), 2, RoundingMode.HALF_UP).multiply(zb));
  669. if(fpgStatiscsModelMongo.getTopsPower().compareTo(new BigDecimal("0.00")) > 0) {
  670. ((Update) update).set("topsProportion", oldtopsPower.divide(fpgStatiscsModelMongo.getPower().add(activePower), 2, RoundingMode.HALF_UP).multiply(zb));
  671. }
  672. if(fpgStatiscsModelMongo.getPeaksPower().compareTo(new BigDecimal("0.00")) > 0) {
  673. ((Update) update).set("peaksProportion", oldpeaksPower.divide(fpgStatiscsModelMongo.getPower().add(activePower), 2, RoundingMode.HALF_UP).multiply(zb));
  674. }
  675. if(fpgStatiscsModelMongo.getFlatPower().compareTo(new BigDecimal("0.00")) > 0) {
  676. ((Update) update).set("flatProportion", oldflatPower.divide(fpgStatiscsModelMongo.getPower().add(activePower), 2, RoundingMode.HALF_UP).multiply(zb));
  677. }
  678. }
  679. }
  680. fpgGatherUpdateList.add(fpgGatherData);
  681. query.addCriteria(Criteria.where("_id").is(fpgStatiscsModelMongo.get_id()));
  682. mongoTemplate.updateFirst(query, update, FpgStatiscsModelMongodb.class, collectionName);
  683. } else { // 为空直接插入
  684. fpgGatherUpdateList.add(fpgGatherData);
  685. fpgStatiscsModelData.setPower(activePower); // 总功率处理
  686. fpgStatiscsModelData.setSelectricCurrent(selectricCurrent); // 总电流处理
  687. if(fpgLeanModeInfo.getRunTime() != null && fpgLeanModeInfo.getRunTime() == 1) { // 运行时长统计
  688. fpgStatiscsModelData.setIngTime(runTime); // 运行时常
  689. }
  690. // 电流处理
  691. if(fpgLeanModeInfo.getElectricCurrent() != null && fpgLeanModeInfo.getElectricCurrent() == 1){
  692. if("tops".equals(jfpgStr.get())) { // 尖
  693. fpgStatiscsModelData.setTopSelectricCurrent(selectricCurrent);
  694. } else if("peaks".equals(jfpgStr.get())){ // 峰
  695. fpgStatiscsModelData.setPeaksSelectricCurrent(selectricCurrent);
  696. } else if("flat".equals(jfpgStr.get())) { // 平
  697. fpgStatiscsModelData.setFlatSelectricCurrent(selectricCurrent);
  698. } else if("valleys".equals(jfpgStr.get())) { // 谷
  699. fpgStatiscsModelData.setValleysSelectricCurrent(selectricCurrent);
  700. }
  701. }
  702. // 尖峰平谷判定
  703. if("tops".equals(jfpgStr.get())){ // 尖
  704. fpgStatiscsModelData.setTopsPower(activePower);
  705. fpgStatiscsModelData.setTopsProportion(new BigDecimal("100"));// 功率
  706. // 运行时常处理
  707. if(fpgLeanModeInfo.getRunTime() != null && fpgLeanModeInfo.getRunTime() == 1){ // 运行时长统计
  708. fpgStatiscsModelData.setTopsPower(runTime);
  709. }
  710. // 金额处理
  711. if(fpgLeanModeInfo.getTopsPrice() != null && fpgLeanModeInfo.getTopsPrice().compareTo(new BigDecimal("0.00")) > 0) {
  712. BigDecimal amount = activePower.multiply(fpgLeanModeInfo.getTopsPrice()); // 金额处理
  713. fpgStatiscsModelData.setAmount(amount);
  714. fpgStatiscsModelData.setTopsAmount(amount);
  715. }
  716. } else if("peaks".equals(jfpgStr.get())){ // 峰
  717. // 功率处理
  718. fpgStatiscsModelData.setPeaksPower(activePower); // 功率
  719. fpgStatiscsModelData.setPeaksProportion(new BigDecimal("100"));
  720. // 运行时常处理
  721. if(fpgLeanModeInfo.getRunTime() != null && fpgLeanModeInfo.getRunTime() == 1){ // 运行时长统计
  722. fpgStatiscsModelData.setPeaksIngTime(runTime);
  723. }
  724. // 金额处理
  725. if(fpgLeanModeInfo.getPeaksPrice() != null && fpgLeanModeInfo.getPeaksPrice().compareTo(new BigDecimal("0.00")) > 0) {
  726. BigDecimal amount = activePower.multiply(fpgLeanModeInfo.getPeaksPrice()); // 金额处理
  727. fpgStatiscsModelData.setAmount(amount);
  728. fpgStatiscsModelData.setPeaksAmount(amount);
  729. }
  730. } else if("flat".equals(jfpgStr.get())){ // 平
  731. // 功率处理
  732. fpgStatiscsModelData.setFlatPower(activePower); // 功率
  733. fpgStatiscsModelData.setFlatProportion(new BigDecimal("100"));
  734. // 运行时常处理
  735. if(fpgLeanModeInfo.getRunTime() != null && fpgLeanModeInfo.getRunTime() == 1){ // 运行时长统计
  736. fpgStatiscsModelData.setFlatIngTime(runTime);
  737. }
  738. // 金额处理
  739. if(fpgLeanModeInfo.getFlatPrice() != null && fpgLeanModeInfo.getFlatPrice().compareTo(new BigDecimal("0.00")) > 0) {
  740. BigDecimal amount = activePower.multiply(fpgLeanModeInfo.getFlatPrice()); // 金额处理
  741. fpgStatiscsModelData.setAmount(amount);
  742. fpgStatiscsModelData.setFlatAmount(amount);
  743. }
  744. } else if("valleys".equals(jfpgStr.get())){ // 谷
  745. // 功率处理
  746. fpgStatiscsModelData.setValleysPower(activePower); // 功率
  747. fpgStatiscsModelData.setValleysProportion(new BigDecimal("100"));
  748. // 运行时常处理
  749. if(fpgLeanModeInfo.getRunTime() != null && fpgLeanModeInfo.getRunTime() == 1){ // 运行时长统计
  750. fpgStatiscsModelData.setValleysIngTime(runTime);
  751. }
  752. // 金额处理
  753. if(fpgLeanModeInfo.getValleysPrice() != null && fpgLeanModeInfo.getValleysPrice().compareTo(new BigDecimal("0.00")) > 0) {
  754. BigDecimal amount = activePower.multiply(fpgLeanModeInfo.getValleysPrice()); // 金额处理
  755. fpgStatiscsModelData.setAmount(amount);
  756. fpgStatiscsModelData.setValleysAmount(amount);
  757. }
  758. }
  759. // 将点位数据存入mongo中
  760. mongoTemplate.insert(fpgStatiscsModelData, collectionName);
  761. }
  762. }catch (Exception e) {
  763. log.error(e.getMessage());
  764. }
  765. });
  766. });
  767. // 数据处理完成标记已完成信息,以免重复处理
  768. fpgGatherDataService.updateBatchById(fpgGatherUpdateList);
  769. }
  770. /**
  771. * 判断创建时间是否在开始时间和结束时间范围内
  772. * @param createTime
  773. * @param startTime
  774. * @param endTime
  775. * @return
  776. */
  777. public static boolean containsCreateTime(LocalDateTime createTime, String startTime, String endTime) {
  778. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  779. // 将字符串转换为 LocalDateTime
  780. LocalDateTime start_time = LocalDateTime.parse(startTime, formatter);
  781. LocalDateTime end_time = LocalDateTime.parse(endTime, formatter);
  782. // 判断是否跨天
  783. boolean isCrossDay = end_time.isBefore(start_time);
  784. // 根据 createTime 调整 start_time 和 end_time
  785. if (isCrossDay) {
  786. // 如果 createTime 在 startTime 后且在 endTime 前,且跨天,endTime 应该加一天
  787. if (createTime.isAfter(start_time) && createTime.isAfter(end_time)) {
  788. end_time = end_time.plusDays(1); // 加一天到第二天
  789. }
  790. // 如果 createTime 在 startTime 之前且在 endTime 后,startTime 应该减去一天
  791. if (createTime.isBefore(start_time) && createTime.isBefore(end_time)) {
  792. start_time = start_time.minusDays(1); // 减一天
  793. }
  794. }
  795. // 检查 createTime 是否在调整后的区间内
  796. return createTime != null && (createTime.isAfter(start_time) || createTime.equals(start_time)) &&
  797. (createTime.isBefore(end_time) || createTime.equals(end_time));
  798. }
  799. public static int compareStringWithBigDecimal(String str, BigDecimal bd) {
  800. // 将 String 转换为 BigDecimal
  801. BigDecimal strAsBigDecimal = new BigDecimal(str);
  802. // 使用 BigDecimal 的 compareTo 方法比较
  803. return strAsBigDecimal.compareTo(bd);
  804. }
  805. }