LeanModelStatistics.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. package org.jeecg.modules.fpgJob;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.jeecg.modules.fpgJob.entity.FpgLeanModel;
  5. import org.jeecg.modules.fpgJob.service.IFpgLeanModelService;
  6. import org.jeecg.modules.gatherData.entity.FpgGatherData;
  7. import org.jeecg.modules.gatherData.entity.FpgStatiscsModelData;
  8. import org.jeecg.modules.gatherData.entity.FpgStatiscsModelMongodb;
  9. import org.jeecg.modules.gatherData.service.IFpgGatherDataService;
  10. import org.jeecg.modules.peaksAndValleysTimeConfig.entity.PeaksAndValleysTimeConfig;
  11. import org.jeecg.modules.peaksAndValleysTimeConfig.service.IPeaksAndValleysTimeConfigService;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.data.mongodb.core.MongoTemplate;
  14. import org.springframework.data.mongodb.core.query.Criteria;
  15. import org.springframework.data.mongodb.core.query.Query;
  16. import org.springframework.data.mongodb.core.query.Update;
  17. import org.springframework.data.mongodb.core.query.UpdateDefinition;
  18. import org.springframework.data.redis.core.RedisTemplate;
  19. import org.springframework.scheduling.annotation.EnableAsync;
  20. import org.springframework.scheduling.annotation.Scheduled;
  21. import org.springframework.stereotype.Component;
  22. import java.math.BigDecimal;
  23. import java.math.RoundingMode;
  24. import java.text.SimpleDateFormat;
  25. import java.time.*;
  26. import java.time.format.DateTimeFormatter;
  27. import java.util.*;
  28. import java.util.concurrent.atomic.AtomicReference;
  29. @Slf4j
  30. @EnableAsync
  31. @Component
  32. //@EnableScheduling
  33. public class LeanModelStatistics {
  34. @Autowired
  35. IFpgLeanModelService fpgLeanModelService;
  36. @Autowired
  37. IFpgGatherDataService fpgGatherDataService;
  38. @Autowired
  39. private IPeaksAndValleysTimeConfigService peaksAndValleysTimeConfigService;
  40. @Autowired
  41. MongoTemplate mongoTemplate;
  42. @Autowired
  43. RedisTemplate redisTemplate;
  44. // 每日3点执行 测试期间1ms一次
  45. @Scheduled(cron = "0 0 03 * * *")
  46. // @Scheduled(fixedDelay = 1000)
  47. // public void t2(){
  48. // changeProportion("1000");
  49. // } // 1ms
  50. public void changeProportion(){
  51. log.info("变更占比");
  52. // 峰平谷精益模型配置获取
  53. LambdaQueryWrapper<FpgLeanModel> leanmodelQuery = new LambdaQueryWrapper<FpgLeanModel>().eq(FpgLeanModel::getStatus, "1");
  54. List<FpgLeanModel> fpgLeanModellist = fpgLeanModelService.list(leanmodelQuery);
  55. LocalDate today = LocalDate.now(); // 获取今天的日期
  56. LocalDate yesterday = today.minusDays(1); // 减去一天,得到昨天的日期
  57. /* Criteria criteria = new Criteria();
  58. criteria.orOperator(Criteria.where("status").is(0),
  59. Criteria.where("status").is(1));*/
  60. // 处理数据业务逻辑
  61. fpgLeanModellist.stream().filter(fpgLeanModeInfo -> fpgLeanModeInfo.getProportion() != null && fpgLeanModeInfo.getProportion() == 1).forEach(fpgLeanModeInfo -> {
  62. Query query = new Query();
  63. query.addCriteria(Criteria.where("proportion").is(1)).addCriteria(Criteria.where("dates").is(String.valueOf(yesterday)));
  64. List<FpgStatiscsModelMongodb> fpgStatiscsModelMongoList = mongoTemplate.find(query, FpgStatiscsModelMongodb.class, "leanmodel_" + fpgLeanModeInfo.getLeanModelCode());
  65. BigDecimal zb = new BigDecimal("100");
  66. fpgStatiscsModelMongoList.forEach(fpgStatiscsModelMongoInfo -> { // 循环处理采集数据处理
  67. BigDecimal proportion = fpgStatiscsModelMongoInfo.getPower();
  68. BigDecimal topsProportion = fpgStatiscsModelMongoInfo.getTopsPower();
  69. BigDecimal peaksProportion = fpgStatiscsModelMongoInfo.getPeaksPower();
  70. BigDecimal flatProportion = fpgStatiscsModelMongoInfo.getFlatPower();
  71. BigDecimal valleysProportion = fpgStatiscsModelMongoInfo.getValleysPower();
  72. // 核算占比
  73. UpdateDefinition update = new Update();
  74. ((Update) update).set("proportion", 2);
  75. if(topsProportion.compareTo(new BigDecimal("0.00")) > 0) { // 尖
  76. ((Update) update).set("topsProportion", topsProportion.divide(proportion, 2, RoundingMode.HALF_UP).multiply(zb));
  77. }
  78. if(peaksProportion.compareTo(new BigDecimal("0.00")) > 0) { // 峰
  79. ((Update) update).set("peaksProportion", peaksProportion.divide(proportion, 2, RoundingMode.HALF_UP).multiply(zb));
  80. }
  81. if(flatProportion.compareTo(new BigDecimal("0.00")) > 0) { // 平
  82. ((Update) update).set("flatProportion", flatProportion.divide(proportion, 2, RoundingMode.HALF_UP).multiply(zb));
  83. }
  84. if(valleysProportion.compareTo(new BigDecimal("0.00")) > 0) { // 谷
  85. ((Update) update).set("valleysProportion", valleysProportion.divide(proportion, 2, RoundingMode.HALF_UP).multiply(zb));
  86. }
  87. // 保存
  88. mongoTemplate.updateFirst(query, update, FpgStatiscsModelMongodb.class, "leanmodel_" + fpgLeanModeInfo.getLeanModelCode());
  89. });
  90. });
  91. }
  92. @Scheduled(fixedDelay = 1000)
  93. public void t1(){
  94. leanModel("1000");
  95. } // 1ms
  96. // 精益模型统计数据
  97. public void leanModel(String freq){
  98. // 峰平谷精益模型配置获取
  99. LambdaQueryWrapper<FpgLeanModel> leanmodelQuery = new LambdaQueryWrapper<FpgLeanModel>().eq(FpgLeanModel::getStatus, "1");
  100. List<FpgLeanModel> fpgLeanModellist = fpgLeanModelService.list(leanmodelQuery);
  101. log.info("峰平谷模型");
  102. // 获取当前时间
  103. Date curentDate = new Date(new Date().getTime() + 8 * 60 * 60 * 1000);
  104. // 尖峰平谷时段配置
  105. List<PeaksAndValleysTimeConfig> peaksAndValleysTimeConfiglist = peaksAndValleysTimeConfigService.list();
  106. //遍历设备集合
  107. fpgLeanModellist.forEach(fpgLeanModeInfo -> {
  108. LambdaQueryWrapper<FpgGatherData> fpgGatherQuery = new LambdaQueryWrapper<FpgGatherData>().eq(FpgGatherData::getFpgModelState, "0");
  109. List<FpgGatherData> fpgGatherList = fpgGatherDataService.list(fpgGatherQuery);
  110. // 处理数据业务逻辑
  111. fpgGatherList.forEach(fpgGatherData -> { // 循环处理采集数据处理
  112. try {
  113. // 变更记录状态
  114. fpgGatherData.setFpgModelState("1");
  115. fpgGatherDataService.updateById(fpgGatherData);
  116. String finalDatestr = "";
  117. // 统计单位
  118. if("minute". equals(fpgLeanModeInfo.getTotalUnit())){ // 分钟
  119. finalDatestr = new SimpleDateFormat("HH:mm").format(fpgGatherData.getCreateTime());
  120. } else if("hour". equals(fpgLeanModeInfo.getTotalUnit())){ // 小时
  121. finalDatestr = new SimpleDateFormat("HH:00").format(fpgGatherData.getCreateTime());
  122. } else if("day". equals(fpgLeanModeInfo.getTotalUnit())){ //
  123. finalDatestr = new SimpleDateFormat("yyyy-MM-dd").format(fpgGatherData.getCreateTime());
  124. } else if("week". equals(fpgLeanModeInfo.getTotalUnit())){ //
  125. Calendar calendar = Calendar.getInstance();
  126. finalDatestr = String.valueOf(calendar.get(Calendar.WEEK_OF_MONTH));
  127. } else if("month". equals(fpgLeanModeInfo.getTotalUnit())){ //
  128. finalDatestr = new SimpleDateFormat("yyyy-MM").format(fpgGatherData.getCreateTime());
  129. }
  130. String dayDate = new SimpleDateFormat("yyyy-MM-dd").format(fpgGatherData.getCreateTime());
  131. String classs = "";
  132. // 采集时间
  133. Instant instant = fpgGatherData.getCreateTime().toInstant();
  134. LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
  135. // 班次处理
  136. if (fpgLeanModeInfo.getClassUnit() != null && fpgLeanModeInfo.getClassUnit() == 1) { // 开启了班次统计
  137. if (containsCreateTime(localDateTime, dayDate + " 00:00:00", dayDate + " 07:59:59")) { // 夜班
  138. classs = "night";
  139. } else if (containsCreateTime(localDateTime, dayDate + " 08:00:00", dayDate + " 15:59:59")) { // 白班
  140. classs = "white";
  141. } else if (containsCreateTime(localDateTime, dayDate + " 16:00:00", dayDate + " 23:59:59")) { // 中班
  142. classs = "center";
  143. }
  144. }
  145. // 定义尖峰平谷
  146. AtomicReference<String> jfpgStr = new AtomicReference<>("");
  147. // 判断尖峰平谷时段
  148. peaksAndValleysTimeConfiglist.forEach(peaksAndValleysTimeConfig -> {
  149. if (containsCreateTime(localDateTime, dayDate + " " + peaksAndValleysTimeConfig.getStartTime(), dayDate + " " + peaksAndValleysTimeConfig.getEndTime())) {
  150. jfpgStr.set(peaksAndValleysTimeConfig.getType());
  151. return;
  152. }
  153. });
  154. // 重组对象
  155. FpgStatiscsModelData fpgStatiscsModelData = new FpgStatiscsModelData(fpgGatherData, fpgLeanModeInfo, finalDatestr, dayDate, classs, curentDate, curentDate);
  156. Query query = new Query();
  157. query.addCriteria(Criteria.where("deviceRegionId").is(fpgGatherData.getDeviceRegionId())).addCriteria(Criteria.where("deviceInformationId").is(fpgGatherData.getDeviceInformationId())).addCriteria(Criteria.where("devicePointId").is(fpgGatherData.getDevicePointId())).addCriteria(Criteria.where("dates").is(dayDate)).addCriteria(Criteria.where("datestr").is(finalDatestr));
  158. if(!classs.isEmpty()){ // 增加班次条件
  159. query.addCriteria(Criteria.where("classs").is(classs));
  160. }
  161. FpgStatiscsModelMongodb FpgStatiscsModelMongo = mongoTemplate.findOne(query, FpgStatiscsModelMongodb.class, "leanmodel_" + fpgLeanModeInfo.getLeanModelCode());
  162. if(FpgStatiscsModelMongo != null){ // 不为空处理
  163. // 基础数据变更不受条件影响
  164. UpdateDefinition update = new Update();
  165. ((Update) update).set("updateTime", curentDate);
  166. // 功率
  167. BigDecimal activePower = new BigDecimal(String.valueOf(fpgGatherData.getActivePower()));
  168. BigDecimal runTime = new BigDecimal("1");
  169. BigDecimal oldPower = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getPower()));
  170. BigDecimal oldingTime = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getIngTime()));
  171. // 总运行时间处理
  172. if(fpgLeanModeInfo.getRunTime() != null && fpgLeanModeInfo.getRunTime() == 1) { // 运行时长统计
  173. ((Update) update).set("ingTime", oldingTime.add(runTime));
  174. }
  175. // 总功率处理
  176. ((Update) update).set("power", oldPower.add(activePower));
  177. // 尖峰平谷判定
  178. if("tops".equals(jfpgStr.get())){ // 尖
  179. // 功率处理
  180. BigDecimal oldtopsPower = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getTopsPower()));
  181. ((Update) update).set("topsPower", oldtopsPower.add(activePower));
  182. // 运行时常处理
  183. if(fpgLeanModeInfo.getRunTime() != null && fpgLeanModeInfo.getRunTime() == 1){ // 运行时长统计
  184. BigDecimal oldtopsIngTime = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getTopsIngTime()));
  185. ((Update) update).set("topsIngTime", oldtopsIngTime.add(runTime));
  186. }
  187. // 金额处理
  188. if(fpgLeanModeInfo.getTopsPrice() != null && fpgLeanModeInfo.getTopsPrice().compareTo(new BigDecimal("0.00")) > 0) {
  189. // 总金额
  190. BigDecimal totalAmount = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getAmount()));
  191. ((Update) update).set("amount", activePower.multiply(fpgLeanModeInfo.getTopsPrice()).add(totalAmount));
  192. ((Update) update).set("topsAmount", oldtopsPower.add(activePower).multiply(fpgLeanModeInfo.getTopsPrice()));
  193. }
  194. } else if("peaks".equals(jfpgStr.get())){ // 峰
  195. // 功率处理
  196. BigDecimal oldpeaksPower = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getPeaksPower()));
  197. ((Update) update).set("peaksPower", oldpeaksPower.add(activePower));
  198. // 运行时常处理
  199. if(fpgLeanModeInfo.getRunTime() != null && fpgLeanModeInfo.getRunTime() == 1){ // 运行时长统计
  200. BigDecimal oldpeaksIngTime = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getPeaksIngTime()));
  201. ((Update) update).set("peaksIngTime", oldpeaksIngTime.add(runTime));
  202. }
  203. // 金额处理
  204. if(fpgLeanModeInfo.getPeaksPrice() != null && fpgLeanModeInfo.getPeaksPrice().compareTo(new BigDecimal("0.00")) > 0) {
  205. // 总金额
  206. BigDecimal totalAmount = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getAmount()));
  207. ((Update) update).set("amount", activePower.multiply(fpgLeanModeInfo.getPeaksPrice()).add(totalAmount));
  208. ((Update) update).set("topsAmount", oldpeaksPower.add(activePower).multiply(fpgLeanModeInfo.getPeaksPrice()));
  209. }
  210. } else if("flat".equals(jfpgStr.get())){ // 平
  211. // 功率处理
  212. BigDecimal oldflatPower = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getFlatPower()));
  213. ((Update) update).set("flatPower", oldflatPower.add(activePower));
  214. // 运行时常处理
  215. if(fpgLeanModeInfo.getRunTime() != null && fpgLeanModeInfo.getRunTime() == 1){
  216. BigDecimal oldflatIngTime = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getTopsIngTime()));
  217. ((Update) update).set("topsIngTime", oldflatIngTime.add(runTime));
  218. }
  219. // 金额处理
  220. if(fpgLeanModeInfo.getFlatPrice() != null && fpgLeanModeInfo.getFlatPrice().compareTo(new BigDecimal("0.00")) > 0) {
  221. // 总金额
  222. BigDecimal totalAmount = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getAmount()));
  223. ((Update) update).set("amount", activePower.multiply(fpgLeanModeInfo.getFlatPrice()).add(totalAmount));
  224. ((Update) update).set("flatAmount", oldflatPower.add(activePower).multiply(fpgLeanModeInfo.getFlatPrice()));
  225. }
  226. } else if("valleys".equals(jfpgStr.get())){ // 谷
  227. // 功率处理
  228. BigDecimal oldvalleysPower = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getValleysPower()));
  229. ((Update) update).set("valleysPower", oldvalleysPower.add(activePower));
  230. // 运行时常处理
  231. if(fpgLeanModeInfo.getRunTime() != null && fpgLeanModeInfo.getRunTime() == 1){
  232. BigDecimal oldvalleysIngTime = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getValleysIngTime()));
  233. ((Update) update).set("valleysIngTime", oldvalleysIngTime.add(runTime));
  234. }
  235. // 金额处理
  236. if(fpgLeanModeInfo.getValleysPrice() != null && fpgLeanModeInfo.getValleysPrice().compareTo(new BigDecimal("0.00")) > 0) {
  237. // 总金额
  238. BigDecimal totalAmount = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getAmount()));
  239. ((Update) update).set("amount", activePower.multiply(fpgLeanModeInfo.getValleysPrice()).add(totalAmount));
  240. ((Update) update).set("valleysAmount", oldvalleysPower.add(activePower).multiply(fpgLeanModeInfo.getValleysPrice()));
  241. }
  242. }
  243. mongoTemplate.updateFirst(query, update, FpgStatiscsModelMongodb.class, "leanmodel_" + fpgLeanModeInfo.getLeanModelCode());
  244. } else { // 为空直接插入
  245. // 将点位数据存入mongo中
  246. mongoTemplate.insert(fpgStatiscsModelData, "leanmodel_" + fpgLeanModeInfo.getLeanModelCode());
  247. }
  248. }catch (Exception e) {
  249. log.error(e.getMessage());
  250. }
  251. });
  252. });
  253. }
  254. /**
  255. * 判断创建时间是否在开始时间和结束时间范围内
  256. * @param createTime
  257. * @param startTime
  258. * @param endTime
  259. * @return
  260. */
  261. public static boolean containsCreateTime(LocalDateTime createTime, String startTime, String endTime) {
  262. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  263. LocalDateTime start_time = LocalDateTime.parse(startTime, formatter);
  264. LocalDateTime end_time = LocalDateTime.parse(endTime, formatter);
  265. return createTime!= null && (createTime.isAfter(start_time) || createTime.equals(start_time)) &&
  266. (createTime.isBefore(end_time) || createTime.equals(end_time));
  267. }
  268. }