liujie
2 天以前 988bbb6fe92380ba992a146ed94df2d8973a4edb
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/EnergyRefreshService.java
@@ -14,96 +14,37 @@
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.List;
import java.util.Random;
/**
 * 定时任务:储能放电情况 光伏发电情况
 */
@Service
public class EnergyRefreshService {
    private final Random random = new Random();
    @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; // 控制任务是否继续执行
    // 定时任务方法
    @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;
        }
        // 生成随机增量并更新值
        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() {
        //获取系统建设日期和累计储能放电量
        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点执行
    // 记录截至昨天的总量(每天凌晨0点)
    @Scheduled(cron = "0 0 0 * * ?")
    public void reset() {
        BigDecimal currentValue = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
        updateCurrentValue(currentValue);
        //更新
        this.isRunning = true;
        String electricity = KsolarUtils.getElectricity();
        TSystemConfiguration sysConfig = systemConfigurationMapper.selectOne(new LambdaQueryWrapper<TSystemConfiguration>()
                .eq(TSystemConfiguration::getType,5));
        sysConfig.setContent(electricity.split("_")[0]);
        systemConfigurationMapper.updateById(sysConfig);
        TSystemConfiguration sysConfig1 = systemConfigurationMapper.selectOne(new LambdaQueryWrapper<TSystemConfiguration>()
                .eq(TSystemConfiguration::getType,4));
        sysConfig1.setContent(electricity.split("_")[1]);
        systemConfigurationMapper.updateById(sysConfig1);
    }