From 6406a54f7d2b67b46eae0e7987900974b34be5d7 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期二, 24 六月 2025 21:03:10 +0800
Subject: [PATCH] Merge branch 'dev' of http://120.76.84.145:10101/gitblit/r/java/mx_charging_pile into dev

---
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/EnergyRefreshService.java |  178 +++++++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 117 insertions(+), 61 deletions(-)

diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/EnergyRefreshService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/EnergyRefreshService.java
index b462087..3ad10be 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/EnergyRefreshService.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/EnergyRefreshService.java
@@ -30,81 +30,134 @@
     private TSystemConfigurationMapper systemConfigurationMapper;
 
     // 储能相关参数
-    private final BigDecimal storageMaxMorning = new BigDecimal("115"); // 凌晨到8点储能最大值
-    private final BigDecimal storageMaxAfternoon = new BigDecimal("115"); // 12点后储能最大值
-    private final BigDecimal dischargeMaxMorning = new BigDecimal("90"); // 上午放电最大值
-    private final BigDecimal dischargeMaxAfternoon = new BigDecimal("90"); // 下午放电最大值
+    private final BigDecimal storageMax = new BigDecimal("115"); // 储能最大值
+    private final BigDecimal targetDischargeTotal = new BigDecimal("97.75"); // 目标总放电量
+    private final double minChargeIncrement = 0.5; // 充电最小增量
+    private final double maxChargeIncrement = 1.0; // 充电最大增量
+    private final int minDischargeTimes = 3; // 最小放电次数
+    private final int maxDischargeTimes = 4; // 最大放电次数
+    private final BigDecimal minDischargeAmount = new BigDecimal("25"); // 单次最小放电量
+    private final BigDecimal maxDischargeAmount = new BigDecimal("35"); // 单次最大放电量
 
-    private final double minIncrement = 0.5; // 最小增量(储能/放电共用)
-    private final double maxIncrement = 1.0; // 最大增量(储能/放电共用)
-
+    // 充电阶段标记
+    private boolean isFirstChargeCompleted = false;
+    private boolean isSecondChargeCompleted = false;
+    // 放电次数计数器
+    private int dischargeCount = 0;
+    // 当前阶段总放电量
+    private BigDecimal currentPhaseDischarge = BigDecimal.ZERO;
 
     // 定时任务方法 - 能量刷新
-    @Scheduled(cron = "0 * * * * ?") // 每分钟执行一次(原15分钟改为1分钟)
+    @Scheduled(cron = "0 * * * * ?") // 每分钟执行一次
     public synchronized void refreshValue() {
         LocalTime now = LocalTime.now();
-        // 根据时间段执行不同逻辑
-        if (isInStorageMorning(now)) { // 00:00-7:59 储能阶段
-            handleStoragePhase(storageMaxMorning, BigDecimal.ZERO);
-        } else if (isInDischargeMorning(now)) { // 10:00-11:59 上午放电阶段
-            handleDischargePhase(dischargeMaxMorning);
-        } else if (isInStorageAfternoon(now)) { // 12:00-16:59 下午储能阶段
-            handleStoragePhase(storageMaxAfternoon, getTodayDischarge());
-        } else if (isInDischargeAfternoon(now)) { // 17:00-21:59 下午放电阶段
-            handleDischargePhase(dischargeMaxAfternoon);
+
+        // 第一轮充电阶段 (0:00-3:00)
+        if (now.isAfter(LocalTime.of(0, 0)) && now.isBefore(LocalTime.of(3, 0))) {
+            handleChargePhase();
+        }
+        // 第一轮放电阶段 (3:10开始,每10分钟一次)
+        else if (now.isAfter(LocalTime.of(3, 0)) && now.isBefore(LocalTime.of(15, 0))
+                && now.getMinute() % 10 == 0 && now.getSecond() == 0) {
+            handleDischargePhase(false);
+        }
+        // 第二轮充电阶段 (15:00-17:00)
+        else if (now.isAfter(LocalTime.of(15, 0)) && now.isBefore(LocalTime.of(17, 0))) {
+            handleChargePhase();
+        }
+        // 第二轮放电阶段 (17:10开始,每10分钟一次)
+        else if (now.isAfter(LocalTime.of(17, 0)) && now.isBefore(LocalTime.of(23, 59))
+                && now.getMinute() % 10 == 0 && now.getSecond() == 0) {
+            handleDischargePhase(true);
         }
     }
 
-    // 储能阶段处理逻辑
-    public void handleStoragePhase(BigDecimal maxValue, BigDecimal dischargeValue) {
-        BigDecimal todayStorage=getTodayStorage();//当前储能值
-        BigDecimal availableSpace = maxValue.subtract(todayStorage.subtract(dischargeValue));//115-(储能-放能) 当前可上涨空间
+    // 充电阶段处理逻辑
+    private void handleChargePhase() {
+        BigDecimal todayStorage = getTodayStorage();
 
-        // 随机增量0.5—1.0
-        BigDecimal increment = randomBigDecimal(minIncrement,maxIncrement);
-        BigDecimal newStorage;
-        if (availableSpace.compareTo(increment) >= 0 ) {
-            //可用空间大于等于当前增量
-             newStorage = todayStorage.add(increment)
-                    .setScale(2, RoundingMode.HALF_UP);
-        }else {
-            //可用空间不足当前增量
-            newStorage = maxValue.add(dischargeValue);//115 + 放能  (如:上午放90,下午就只能充90)
-        }
-        if (newStorage.compareTo(todayStorage)==0){
-            //新增值等于当前储能值 说明已达到最大值,没必要更新了
+        // 如果已经充满,则不再充电
+        if (todayStorage.compareTo(storageMax) >= 0) {
+            if (!isFirstChargeCompleted && todayStorage.compareTo(storageMax) >= 0) {
+                isFirstChargeCompleted = true;
+                System.out.println("第一轮充电已完成,当前储能: " + todayStorage);
+            } else if (!isSecondChargeCompleted && todayStorage.compareTo(storageMax.multiply(new BigDecimal("2"))) >= 0) {
+                isSecondChargeCompleted = true;
+                System.out.println("第二轮充电已完成,当前储能: " + todayStorage);
+            }
             return;
         }
+
+        // 随机增量0.5-1.0
+        BigDecimal increment = randomBigDecimal(minChargeIncrement, maxChargeIncrement);
+        BigDecimal newStorage = todayStorage.add(increment).setScale(2, RoundingMode.HALF_UP);
+
+        // 确保不超过最大值
+        BigDecimal maxAllowed = isFirstChargeCompleted ? storageMax.multiply(new BigDecimal("2")) : storageMax;
+        if (newStorage.compareTo(maxAllowed) > 0) {
+            newStorage = maxAllowed;
+        }
+
         updateStorageValue(newStorage);
-        System.out.printf("储能阶段:当前时间 %s,今日储能:%.2f%n", LocalTime.now(), newStorage);
+        System.out.printf("充电阶段:当前时间 %s,今日储能:%.2f%n", LocalTime.now(), newStorage);
     }
+
     // 放电阶段处理逻辑
-    private void handleDischargePhase(BigDecimal maxDischarge) {
-        BigDecimal currentDischarge = getTodayDischarge();//当前放电量
-        BigDecimal todayStorage = getTodayStorage();//储能量
-        //今日储能-115,就是耗能(基数),在这个基数上加90
-        BigDecimal baseDischarge = todayStorage.subtract(storageMaxAfternoon);
-        BigDecimal newMaxDischarge = baseDischarge.add(maxDischarge);//上限 基数+90
-
-        // 随机增量0.5—1.0
-        BigDecimal increment = randomBigDecimal(minIncrement,maxIncrement);
-        BigDecimal newDischarge = currentDischarge.add(increment);//当前值 + 增量
-        if (newDischarge.compareTo(newMaxDischarge) >=0) {
-            //超出 用最大值
-            newDischarge = newMaxDischarge;
-        }
-
-        if (newDischarge.compareTo(currentDischarge)==0){
-            //新增值等于当前值,说明已超出,没必要更新了
+    private void handleDischargePhase(boolean isSecondPhase) {
+        // 如果是第二轮放电且第一轮未完成,则不执行
+        if (isSecondPhase && !isFirstChargeCompleted) {
             return;
         }
+
+        // 如果已经达到目标放电量,则不再放电
+        BigDecimal todayDischarge = getTodayDischarge();
+        BigDecimal target = isSecondPhase ? targetDischargeTotal.multiply(new BigDecimal("2")) : targetDischargeTotal;
+        if (todayDischarge.compareTo(target) >= 0) {
+            return;
+        }
+
+        // 如果是新一轮放电阶段,重置计数器
+        if (currentPhaseDischarge.compareTo(BigDecimal.ZERO) == 0) {
+            dischargeCount = 0;
+        }
+
+        // 计算剩余需要放电的量
+        BigDecimal remainingDischarge = target.subtract(todayDischarge);
+
+        // 随机本次放电量 (25-35)
+        BigDecimal dischargeAmount = randomBigDecimal(minDischargeAmount.doubleValue(), maxDischargeAmount.doubleValue());
+
+        // 如果剩余量不足,则只放剩余量
+        if (dischargeAmount.compareTo(remainingDischarge) > 0) {
+            dischargeAmount = remainingDischarge;
+        }
+
+        // 更新放电量
+        BigDecimal newDischarge = todayDischarge.add(dischargeAmount).setScale(2, RoundingMode.HALF_UP);
         updateDischargeValue(newDischarge);
-        System.out.printf("放电阶段:当前时间 %s,今日放电:%.2f%n", LocalTime.now(), newDischarge);
+
+        // 更新当前阶段放电总量
+        currentPhaseDischarge = currentPhaseDischarge.add(dischargeAmount);
+        dischargeCount++;
+
+        System.out.printf("放电阶段:当前时间 %s,第%d次放电,本次放电:%.2f,今日总放电:%.2f%n",
+                LocalTime.now(), dischargeCount, dischargeAmount, newDischarge);
+
+        // 如果达到最大放电次数或完成目标放电量,重置当前阶段放电量
+        if (dischargeCount >= maxDischargeTimes || remainingDischarge.subtract(dischargeAmount).compareTo(BigDecimal.ZERO) <= 0) {
+            currentPhaseDischarge = BigDecimal.ZERO;
+        }
     }
 
     // 重置任务(每天凌晨0点)
     @Scheduled(cron = "0 0 0 * * ?")
     public void reset() {
+        // 重置所有状态
+        isFirstChargeCompleted = false;
+        isSecondChargeCompleted = false;
+        dischargeCount = 0;
+        currentPhaseDischarge = BigDecimal.ZERO;
+
         // 初始化今日储能和放电为0
         updateStorageValue(BigDecimal.ZERO);
         updateDischargeValue(BigDecimal.ZERO);
@@ -136,15 +189,7 @@
         // 转换为两位小数的 BigDecimal
         return BigDecimal.valueOf(value).setScale(2, RoundingMode.HALF_UP);
     }
-    // 更新今日储能值到数据库
-    private void updateStorageValue(BigDecimal value) {
-        updateConfigField("todayStorage", value);
-    }
 
-    // 更新今日放电值到数据库(原逻辑保留)
-    private void updateDischargeValue(BigDecimal value) {
-        updateConfigField("todayDischarge", value);
-    }
 
     // 通用配置更新方法
     private void updateConfigField(String field, BigDecimal value) {
@@ -180,6 +225,17 @@
         return time.isAfter(LocalTime.of(17, 0)) && time.isBefore(LocalTime.of(22, 0));
     }
 
+
+    // 更新今日储能值到数据库
+    private void updateStorageValue(BigDecimal value) {
+        updateConfigField("todayStorage", value);
+    }
+
+    // 更新今日放电值到数据库(原逻辑保留)
+    private void updateDischargeValue(BigDecimal value) {
+        updateConfigField("todayDischarge", value);
+    }
+
     public BigDecimal getTodayStorage() {
         TSystemConfiguration sysConfig = systemConfigurationMapper.selectOne(
                 new LambdaQueryWrapper<TSystemConfiguration>()

--
Gitblit v1.7.1