| | |
| | | package com.ruoyi.other.util; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.ruoyi.other.api.domain.TSystemConfiguration; |
| | | import com.ruoyi.other.mapper.TSystemConfigurationMapper; |
| | | import com.ruoyi.other.vo.ScreenStorageConfigVO; |
| | | import lombok.Getter; |
| | | import lombok.Setter; |
| | | import lombok.Value; |
| | | import org.springframework.scheduling.annotation.Scheduled; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.time.LocalTime; |
| | |
| | | @Service |
| | | public class EnergyRefreshService { |
| | | private final Random random = new Random(); |
| | | private BigDecimal currentValue; |
| | | |
| | | @Resource |
| | | private TSystemConfigurationMapper systemConfigurationMapper; |
| | | |
| | | private final BigDecimal targetLow = new BigDecimal("85"); |
| | | |
| | | private final BigDecimal targetHigh = new BigDecimal("87"); |
| | | |
| | | |
| | | |
| | | private final int maxIncrement = 10; |
| | | |
| | | private boolean isRunning = true; // 控制任务是否继续执行 |
| | | |
| | | public EnergyRefreshService() { |
| | | this.currentValue = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP); |
| | | } |
| | | private boolean isRunning = true; // 控制任务是否继续执行 |
| | | |
| | | // 定时任务方法 |
| | | @Scheduled(cron = "0 */15 * * * ?")//15分钟执行一次 |
| | | public synchronized void refreshValue() { |
| | | // 检查当前时间是否在允许的时间段内 |
| | | LocalTime now = LocalTime.now(); |
| | | boolean isInMorning = now.isAfter(LocalTime.of(10, 0)) && now.isBefore(LocalTime.of(12, 0)); |
| | | boolean isInAfternoon = now.isAfter(LocalTime.of(15, 0)) && now.isBefore(LocalTime.of(21, 0)); |
| | | |
| | | if (!isInMorning && !isInAfternoon) { |
| | | return; |
| | | } |
| | | |
| | | |
| | | //获取当前值 |
| | | BigDecimal currentValue = getCurrentValue(); |
| | | // 检查是否已停止或达到目标范围 |
| | | if (!isRunning || isWithinTargetRange(currentValue)) { |
| | | isRunning = false; |
| | | return; |
| | | } |
| | | |
| | | // 检查当前时间是否在允许的时间段内 |
| | | LocalTime now = LocalTime.now(); |
| | | boolean isInMorning = now.isAfter(LocalTime.of(10, 0)) && now.isBefore(LocalTime.of(12, 0)); |
| | | boolean isInAfternoon = now.isAfter(LocalTime.of(15, 0)) && now.isBefore(LocalTime.of(21, 0)); |
| | | |
| | | if (!isInMorning && !isInAfternoon) { |
| | | return; |
| | | } |
| | | |
| | | |
| | | // 生成随机增量并更新值 |
| | | int increment = random.nextInt(maxIncrement + 1); |
| | | currentValue = currentValue.add(BigDecimal.valueOf(increment)) |
| | | .setScale(2, RoundingMode.HALF_UP); |
| | | |
| | | //更新值 |
| | | updateCurrentValue(currentValue); |
| | | System.out.printf("定时刷新:当前时间 %s,当前值:%.2f%n", now, currentValue); |
| | | } |
| | | |
| | | private boolean isWithinTargetRange(BigDecimal value) { |
| | | return value.compareTo(targetLow) >= 0 && value.compareTo(targetHigh) <= 0; |
| | | } |
| | | |
| | | // 提供获取当前值的方法 |
| | | |
| | | /** |
| | | * 获取当前值 |
| | | */ |
| | | public BigDecimal getCurrentValue() { |
| | | return currentValue; |
| | | //获取系统建设日期和累计储能放电量 |
| | | TSystemConfiguration sysConfig = systemConfigurationMapper.selectOne(new LambdaQueryWrapper<TSystemConfiguration>() |
| | | .eq(TSystemConfiguration::getType,3)); |
| | | //解析 |
| | | ScreenStorageConfigVO configVO = JSON.parseObject(sysConfig.getContent(), ScreenStorageConfigVO.class); |
| | | return configVO.getCurrentValue(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 更新当前值 |
| | | */ |
| | | private void updateCurrentValue(BigDecimal currentValue) { |
| | | //获取系统建设日期和累计储能放电量 |
| | | TSystemConfiguration sysConfig = systemConfigurationMapper.selectOne(new LambdaQueryWrapper<TSystemConfiguration>() |
| | | .eq(TSystemConfiguration::getType,3)); |
| | | //解析 |
| | | ScreenStorageConfigVO configVO = JSON.parseObject(sysConfig.getContent(), ScreenStorageConfigVO.class); |
| | | //更新 |
| | | configVO.setCurrentValue(currentValue); |
| | | String json = JSON.toJSONString(configVO); |
| | | sysConfig.setContent(json); |
| | | systemConfigurationMapper.updateById(sysConfig); |
| | | } |
| | | |
| | | |
| | | |
| | | // 重置任务 |
| | | @Scheduled(cron = "0 0 0 * * ?") // 每天凌晨0点执行 |
| | | public void reset() { |
| | | this.currentValue = BigDecimal.ZERO; |
| | | BigDecimal currentValue = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP); |
| | | updateCurrentValue(currentValue); |
| | | //更新 |
| | | this.isRunning = true; |
| | | } |
| | | |