123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281 |
- package org.jeecg.modules.fpgJob;
- import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
- import lombok.extern.slf4j.Slf4j;
- import org.jeecg.modules.fpgJob.entity.FpgLeanModel;
- import org.jeecg.modules.fpgJob.service.IFpgLeanModelService;
- import org.jeecg.modules.gatherData.entity.FpgGatherData;
- import org.jeecg.modules.gatherData.entity.FpgStatiscsModelData;
- import org.jeecg.modules.gatherData.entity.FpgStatiscsModelMongodb;
- import org.jeecg.modules.gatherData.service.IFpgGatherDataService;
- import org.jeecg.modules.peaksAndValleysTimeConfig.entity.PeaksAndValleysTimeConfig;
- import org.jeecg.modules.peaksAndValleysTimeConfig.service.IPeaksAndValleysTimeConfigService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.data.mongodb.core.MongoTemplate;
- import org.springframework.data.mongodb.core.query.Criteria;
- import org.springframework.data.mongodb.core.query.Query;
- import org.springframework.data.mongodb.core.query.Update;
- import org.springframework.data.mongodb.core.query.UpdateDefinition;
- import org.springframework.data.redis.core.RedisTemplate;
- import org.springframework.scheduling.annotation.EnableAsync;
- import org.springframework.scheduling.annotation.Scheduled;
- import org.springframework.stereotype.Component;
- import java.math.BigDecimal;
- import java.math.RoundingMode;
- import java.text.SimpleDateFormat;
- import java.time.*;
- import java.time.format.DateTimeFormatter;
- import java.util.*;
- import java.util.concurrent.atomic.AtomicReference;
- @Slf4j
- @EnableAsync
- @Component
- //@EnableScheduling
- public class LeanModelStatistics {
- @Autowired
- IFpgLeanModelService fpgLeanModelService;
- @Autowired
- IFpgGatherDataService fpgGatherDataService;
- @Autowired
- private IPeaksAndValleysTimeConfigService peaksAndValleysTimeConfigService;
- @Autowired
- MongoTemplate mongoTemplate;
- @Autowired
- RedisTemplate redisTemplate;
- // 每日3点执行 测试期间1ms一次
- @Scheduled(cron = "0 0 03 * * *")
- // @Scheduled(fixedDelay = 1000)
- // public void t2(){
- // changeProportion("1000");
- // } // 1ms
- public void changeProportion(){
- log.info("变更占比");
- // 峰平谷精益模型配置获取
- LambdaQueryWrapper<FpgLeanModel> leanmodelQuery = new LambdaQueryWrapper<FpgLeanModel>().eq(FpgLeanModel::getStatus, "1");
- List<FpgLeanModel> fpgLeanModellist = fpgLeanModelService.list(leanmodelQuery);
- LocalDate today = LocalDate.now(); // 获取今天的日期
- LocalDate yesterday = today.minusDays(1); // 减去一天,得到昨天的日期
- /* Criteria criteria = new Criteria();
- criteria.orOperator(Criteria.where("status").is(0),
- Criteria.where("status").is(1));*/
- // 处理数据业务逻辑
- fpgLeanModellist.stream().filter(fpgLeanModeInfo -> fpgLeanModeInfo.getProportion() != null && fpgLeanModeInfo.getProportion() == 1).forEach(fpgLeanModeInfo -> {
- Query query = new Query();
- query.addCriteria(Criteria.where("proportion").is(1)).addCriteria(Criteria.where("dates").is(String.valueOf(yesterday)));
- List<FpgStatiscsModelMongodb> fpgStatiscsModelMongoList = mongoTemplate.find(query, FpgStatiscsModelMongodb.class, "leanmodel_" + fpgLeanModeInfo.getLeanModelCode());
- BigDecimal zb = new BigDecimal("100");
- fpgStatiscsModelMongoList.forEach(fpgStatiscsModelMongoInfo -> { // 循环处理采集数据处理
- BigDecimal proportion = fpgStatiscsModelMongoInfo.getPower();
- BigDecimal topsProportion = fpgStatiscsModelMongoInfo.getTopsPower();
- BigDecimal peaksProportion = fpgStatiscsModelMongoInfo.getPeaksPower();
- BigDecimal flatProportion = fpgStatiscsModelMongoInfo.getFlatPower();
- BigDecimal valleysProportion = fpgStatiscsModelMongoInfo.getValleysPower();
- // 核算占比
- UpdateDefinition update = new Update();
- ((Update) update).set("proportion", 2);
- if(topsProportion.compareTo(new BigDecimal("0.00")) > 0) { // 尖
- ((Update) update).set("topsProportion", topsProportion.divide(proportion, 2, RoundingMode.HALF_UP).multiply(zb));
- }
- if(peaksProportion.compareTo(new BigDecimal("0.00")) > 0) { // 峰
- ((Update) update).set("peaksProportion", peaksProportion.divide(proportion, 2, RoundingMode.HALF_UP).multiply(zb));
- }
- if(flatProportion.compareTo(new BigDecimal("0.00")) > 0) { // 平
- ((Update) update).set("flatProportion", flatProportion.divide(proportion, 2, RoundingMode.HALF_UP).multiply(zb));
- }
- if(valleysProportion.compareTo(new BigDecimal("0.00")) > 0) { // 谷
- ((Update) update).set("valleysProportion", valleysProportion.divide(proportion, 2, RoundingMode.HALF_UP).multiply(zb));
- }
- // 保存
- mongoTemplate.updateFirst(query, update, FpgStatiscsModelMongodb.class, "leanmodel_" + fpgLeanModeInfo.getLeanModelCode());
- });
- });
- }
- @Scheduled(fixedDelay = 1000)
- public void t1(){
- leanModel("1000");
- } // 1ms
- // 精益模型统计数据
- public void leanModel(String freq){
- // 峰平谷精益模型配置获取
- LambdaQueryWrapper<FpgLeanModel> leanmodelQuery = new LambdaQueryWrapper<FpgLeanModel>().eq(FpgLeanModel::getStatus, "1");
- List<FpgLeanModel> fpgLeanModellist = fpgLeanModelService.list(leanmodelQuery);
- log.info("峰平谷模型");
- // 获取当前时间
- Date curentDate = new Date(new Date().getTime() + 8 * 60 * 60 * 1000);
- // 尖峰平谷时段配置
- List<PeaksAndValleysTimeConfig> peaksAndValleysTimeConfiglist = peaksAndValleysTimeConfigService.list();
- //遍历设备集合
- fpgLeanModellist.forEach(fpgLeanModeInfo -> {
- LambdaQueryWrapper<FpgGatherData> fpgGatherQuery = new LambdaQueryWrapper<FpgGatherData>().eq(FpgGatherData::getFpgModelState, "0");
- List<FpgGatherData> fpgGatherList = fpgGatherDataService.list(fpgGatherQuery);
- // 处理数据业务逻辑
- fpgGatherList.forEach(fpgGatherData -> { // 循环处理采集数据处理
- try {
- // 变更记录状态
- fpgGatherData.setFpgModelState("1");
- fpgGatherDataService.updateById(fpgGatherData);
- String finalDatestr = "";
- // 统计单位
- if("minute". equals(fpgLeanModeInfo.getTotalUnit())){ // 分钟
- finalDatestr = new SimpleDateFormat("HH:mm").format(fpgGatherData.getCreateTime());
- } else if("hour". equals(fpgLeanModeInfo.getTotalUnit())){ // 小时
- finalDatestr = new SimpleDateFormat("HH:00").format(fpgGatherData.getCreateTime());
- } else if("day". equals(fpgLeanModeInfo.getTotalUnit())){ //
- finalDatestr = new SimpleDateFormat("yyyy-MM-dd").format(fpgGatherData.getCreateTime());
- } else if("week". equals(fpgLeanModeInfo.getTotalUnit())){ //
- Calendar calendar = Calendar.getInstance();
- finalDatestr = String.valueOf(calendar.get(Calendar.WEEK_OF_MONTH));
- } else if("month". equals(fpgLeanModeInfo.getTotalUnit())){ //
- finalDatestr = new SimpleDateFormat("yyyy-MM").format(fpgGatherData.getCreateTime());
- }
- String dayDate = new SimpleDateFormat("yyyy-MM-dd").format(fpgGatherData.getCreateTime());
- String classs = "";
- // 采集时间
- Instant instant = fpgGatherData.getCreateTime().toInstant();
- LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
- // 班次处理
- if (fpgLeanModeInfo.getClassUnit() != null && fpgLeanModeInfo.getClassUnit() == 1) { // 开启了班次统计
- if (containsCreateTime(localDateTime, dayDate + " 00:00:00", dayDate + " 07:59:59")) { // 夜班
- classs = "night";
- } else if (containsCreateTime(localDateTime, dayDate + " 08:00:00", dayDate + " 15:59:59")) { // 白班
- classs = "white";
- } else if (containsCreateTime(localDateTime, dayDate + " 16:00:00", dayDate + " 23:59:59")) { // 中班
- classs = "center";
- }
- }
- // 定义尖峰平谷
- AtomicReference<String> jfpgStr = new AtomicReference<>("");
- // 判断尖峰平谷时段
- peaksAndValleysTimeConfiglist.forEach(peaksAndValleysTimeConfig -> {
- if (containsCreateTime(localDateTime, dayDate + " " + peaksAndValleysTimeConfig.getStartTime(), dayDate + " " + peaksAndValleysTimeConfig.getEndTime())) {
- jfpgStr.set(peaksAndValleysTimeConfig.getType());
- return;
- }
- });
- // 重组对象
- FpgStatiscsModelData fpgStatiscsModelData = new FpgStatiscsModelData(fpgGatherData, fpgLeanModeInfo, finalDatestr, dayDate, classs, curentDate, curentDate);
- Query query = new Query();
- 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));
- if(!classs.isEmpty()){ // 增加班次条件
- query.addCriteria(Criteria.where("classs").is(classs));
- }
- FpgStatiscsModelMongodb FpgStatiscsModelMongo = mongoTemplate.findOne(query, FpgStatiscsModelMongodb.class, "leanmodel_" + fpgLeanModeInfo.getLeanModelCode());
- if(FpgStatiscsModelMongo != null){ // 不为空处理
- // 基础数据变更不受条件影响
- UpdateDefinition update = new Update();
- ((Update) update).set("updateTime", curentDate);
- // 功率
- BigDecimal activePower = new BigDecimal(String.valueOf(fpgGatherData.getActivePower()));
- BigDecimal runTime = new BigDecimal("1");
- BigDecimal oldPower = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getPower()));
- BigDecimal oldingTime = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getIngTime()));
- // 总运行时间处理
- if(fpgLeanModeInfo.getRunTime() != null && fpgLeanModeInfo.getRunTime() == 1) { // 运行时长统计
- ((Update) update).set("ingTime", oldingTime.add(runTime));
- }
- // 总功率处理
- ((Update) update).set("power", oldPower.add(activePower));
- // 尖峰平谷判定
- if("tops".equals(jfpgStr.get())){ // 尖
- // 功率处理
- BigDecimal oldtopsPower = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getTopsPower()));
- ((Update) update).set("topsPower", oldtopsPower.add(activePower));
- // 运行时常处理
- if(fpgLeanModeInfo.getRunTime() != null && fpgLeanModeInfo.getRunTime() == 1){ // 运行时长统计
- BigDecimal oldtopsIngTime = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getTopsIngTime()));
- ((Update) update).set("topsIngTime", oldtopsIngTime.add(runTime));
- }
- // 金额处理
- if(fpgLeanModeInfo.getTopsPrice() != null && fpgLeanModeInfo.getTopsPrice().compareTo(new BigDecimal("0.00")) > 0) {
- // 总金额
- BigDecimal totalAmount = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getAmount()));
- ((Update) update).set("amount", activePower.multiply(fpgLeanModeInfo.getTopsPrice()).add(totalAmount));
- ((Update) update).set("topsAmount", oldtopsPower.add(activePower).multiply(fpgLeanModeInfo.getTopsPrice()));
- }
- } else if("peaks".equals(jfpgStr.get())){ // 峰
- // 功率处理
- BigDecimal oldpeaksPower = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getPeaksPower()));
- ((Update) update).set("peaksPower", oldpeaksPower.add(activePower));
- // 运行时常处理
- if(fpgLeanModeInfo.getRunTime() != null && fpgLeanModeInfo.getRunTime() == 1){ // 运行时长统计
- BigDecimal oldpeaksIngTime = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getPeaksIngTime()));
- ((Update) update).set("peaksIngTime", oldpeaksIngTime.add(runTime));
- }
- // 金额处理
- if(fpgLeanModeInfo.getPeaksPrice() != null && fpgLeanModeInfo.getPeaksPrice().compareTo(new BigDecimal("0.00")) > 0) {
- // 总金额
- BigDecimal totalAmount = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getAmount()));
- ((Update) update).set("amount", activePower.multiply(fpgLeanModeInfo.getPeaksPrice()).add(totalAmount));
- ((Update) update).set("topsAmount", oldpeaksPower.add(activePower).multiply(fpgLeanModeInfo.getPeaksPrice()));
- }
- } else if("flat".equals(jfpgStr.get())){ // 平
- // 功率处理
- BigDecimal oldflatPower = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getFlatPower()));
- ((Update) update).set("flatPower", oldflatPower.add(activePower));
- // 运行时常处理
- if(fpgLeanModeInfo.getRunTime() != null && fpgLeanModeInfo.getRunTime() == 1){
- BigDecimal oldflatIngTime = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getTopsIngTime()));
- ((Update) update).set("topsIngTime", oldflatIngTime.add(runTime));
- }
- // 金额处理
- if(fpgLeanModeInfo.getFlatPrice() != null && fpgLeanModeInfo.getFlatPrice().compareTo(new BigDecimal("0.00")) > 0) {
- // 总金额
- BigDecimal totalAmount = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getAmount()));
- ((Update) update).set("amount", activePower.multiply(fpgLeanModeInfo.getFlatPrice()).add(totalAmount));
- ((Update) update).set("flatAmount", oldflatPower.add(activePower).multiply(fpgLeanModeInfo.getFlatPrice()));
- }
- } else if("valleys".equals(jfpgStr.get())){ // 谷
- // 功率处理
- BigDecimal oldvalleysPower = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getValleysPower()));
- ((Update) update).set("valleysPower", oldvalleysPower.add(activePower));
- // 运行时常处理
- if(fpgLeanModeInfo.getRunTime() != null && fpgLeanModeInfo.getRunTime() == 1){
- BigDecimal oldvalleysIngTime = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getValleysIngTime()));
- ((Update) update).set("valleysIngTime", oldvalleysIngTime.add(runTime));
- }
- // 金额处理
- if(fpgLeanModeInfo.getValleysPrice() != null && fpgLeanModeInfo.getValleysPrice().compareTo(new BigDecimal("0.00")) > 0) {
- // 总金额
- BigDecimal totalAmount = new BigDecimal(String.valueOf(FpgStatiscsModelMongo.getAmount()));
- ((Update) update).set("amount", activePower.multiply(fpgLeanModeInfo.getValleysPrice()).add(totalAmount));
- ((Update) update).set("valleysAmount", oldvalleysPower.add(activePower).multiply(fpgLeanModeInfo.getValleysPrice()));
- }
- }
- mongoTemplate.updateFirst(query, update, FpgStatiscsModelMongodb.class, "leanmodel_" + fpgLeanModeInfo.getLeanModelCode());
- } else { // 为空直接插入
- // 将点位数据存入mongo中
- mongoTemplate.insert(fpgStatiscsModelData, "leanmodel_" + fpgLeanModeInfo.getLeanModelCode());
- }
- }catch (Exception e) {
- log.error(e.getMessage());
- }
- });
- });
- }
- /**
- * 判断创建时间是否在开始时间和结束时间范围内
- * @param createTime
- * @param startTime
- * @param endTime
- * @return
- */
- public static boolean containsCreateTime(LocalDateTime createTime, String startTime, String endTime) {
- DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
- LocalDateTime start_time = LocalDateTime.parse(startTime, formatter);
- LocalDateTime end_time = LocalDateTime.parse(endTime, formatter);
- return createTime!= null && (createTime.isAfter(start_time) || createTime.equals(start_time)) &&
- (createTime.isBefore(end_time) || createTime.equals(end_time));
- }
- }
|