From 7cf1eb27ecbd23ddc1d0e8080c9637aa6f2a2bf9 Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期三, 25 六月 2025 08:45:38 +0800 Subject: [PATCH] Merge branch 'dev' of http://120.76.84.145:10101/gitblit/r/java/mx_charging_pile --- ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TScreenContentServiceImpl.java | 52 +--- ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/PhotovoltaicAndConsumptionVO.java | 2 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TScreenContentController.java | 21 - ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java | 2 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/PhotovoltaicPowerGenerationVO.java | 2 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/AESUtils.java | 95 +++++++++ ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/EnergyRefreshService.java | 268 ++++++++++++++++--------- ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/KsolarUtils.java | 146 ++++++++++++++ 8 files changed, 429 insertions(+), 159 deletions(-) diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java index 35647e5..c470811 100644 --- a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java +++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java @@ -183,7 +183,7 @@ } List<UploadRealTimeMonitoringData> list = mongoTemplate.find( query.with(Sort.by(Sort.Order.desc("create_time"))) - , UploadRealTimeMonitoringData.class); + , UploadRealTimeMonitoringData.class,"upload_real_time_monitoring_data"); return list; } diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TScreenContentController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TScreenContentController.java index 3e6d890..ba04879 100644 --- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TScreenContentController.java +++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TScreenContentController.java @@ -15,6 +15,7 @@ import com.ruoyi.other.service.TScreenContentService; import com.ruoyi.other.service.TSystemConfigurationService; import com.ruoyi.other.util.EnergyRefreshService; +import com.ruoyi.other.util.KsolarUtils; import com.ruoyi.other.vo.*; import io.swagger.annotations.ApiOperation; import org.springframework.beans.BeanUtils; @@ -63,25 +64,9 @@ @GetMapping(value = "/photovoltaicAndConsumption") public AjaxResult<PhotovoltaicAndConsumptionVO> photovoltaicAndConsumption() { //需调用接口 获取光伏发电量 - List<Integer> siteIds= Arrays.asList(25,26); PhotovoltaicAndConsumptionVO vo = new PhotovoltaicAndConsumptionVO(); - List<TScreenContent> list = screenContentService.list(new LambdaQueryWrapper<TScreenContent>().in(TScreenContent::getSiteId, siteIds)); - if(list==null|| list.isEmpty()){ - return AjaxResult.success(vo); - } - vo.setGreenElectricityToday(list.get(0).getGreenElectricityToday()); - list.remove(0); - list.forEach(x->{ - vo.setGreenElectricityToday(vo.getGreenElectricityToday().add(x.getGreenElectricityToday())); - }); - - TSystemConfiguration sysConfig = systemConfigurationService.getOne(new LambdaQueryWrapper<TSystemConfiguration>() - .eq(TSystemConfiguration::getType,4)); - BigDecimal refreshValueOne = new BigDecimal(sysConfig.getContent()); - vo.setTodayGenerateElectricity(refreshValueOne); - vo.setGreenElectricityToday(refreshValueOne.multiply(new BigDecimal("0.94")).setScale(2, RoundingMode.HALF_UP)); - - + vo.setTodayGenerateElectricity(new BigDecimal(KsolarUtils.getTodayEnergy(LocalDateTime.now().toString()))); + vo.setGreenElectricityToday(vo.getTodayGenerateElectricity().multiply(new BigDecimal("0.94")).setScale(2, RoundingMode.HALF_UP)); return AjaxResult.success(vo); } diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TScreenContentServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TScreenContentServiceImpl.java index 1c016e9..caa54aa 100644 --- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TScreenContentServiceImpl.java +++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TScreenContentServiceImpl.java @@ -15,6 +15,7 @@ import com.ruoyi.other.mapper.TSystemConfigurationMapper; import com.ruoyi.other.service.TScreenContentService; import com.ruoyi.other.service.TSystemConfigurationService; +import com.ruoyi.other.util.KsolarUtils; import com.ruoyi.other.vo.EmissionReductionVO; import com.ruoyi.other.vo.PhotovoltaicPowerGenerationVO; import com.ruoyi.other.vo.ScreenStorageConfigVO; @@ -96,10 +97,19 @@ systemConfigurationMapper.updateById(sysConfig); vo.setEnergyStorage(storageDisCharge.multiply(new BigDecimal("0.1404")).divide(new BigDecimal("1000"),2,RoundingMode.DOWN)); } + //获取累计发电 + vo.setPhotovoltaic(KsolarUtils.getYearAllEnergy()); + //总数: BigDecimal total = vo.getPhotovoltaic().add(vo.getEnergyStorage()).add(vo.getCharge()); vo.setTotal(total); + + + + + + //计算比率 vo.setPhotovoltaicRate(calculateRatio(vo.getPhotovoltaic(),vo.getTotal()).multiply(new BigDecimal("100"))); vo.setEnergyStorageRate(calculateRatio(vo.getEnergyStorage(),vo.getTotal()).multiply(new BigDecimal("100"))); @@ -108,60 +118,27 @@ return vo; } - public static void main(String[] args) { - BigDecimal divide = new BigDecimal("607").multiply(new BigDecimal("0.1404")).divide(new BigDecimal("1000"),2,RoundingMode.DOWN); - System.out.println(divide); - } //百分比计算 public static BigDecimal calculateRatio(BigDecimal part, BigDecimal total) { if (total.compareTo(BigDecimal.ZERO) == 0) { throw new ArithmeticException("分母不能为零"); } - return part.divide(total, 4, RoundingMode.HALF_UP); } @Override public PhotovoltaicPowerGenerationVO photovoltaicPowerGeneration(List<Integer> siteIds) { - //需调用接口 - - //假数据 PhotovoltaicPowerGenerationVO vo = new PhotovoltaicPowerGenerationVO(); List<LocalDate> dates = new ArrayList<>(); - List<Integer> values = new ArrayList<>(); + List<Double> values = new ArrayList<>(); LocalDate today = LocalDate.now(); // 生成每天数据 for (int i = 7; i >= 1; i--) {//升序 LocalDate day = today.minusDays(i); //统计 dates.add(day); - int value = new Random().nextInt(151) + 100; // 100-250 - - switch (i){ - case 1: - value = 1780; // 50-100 - break; - case 2: - value = 1810; // 50-100 - break; - case 3: - value = 1765; // 50-100 - break; - case 4: - value = 1793; // 50-100 - break; - case 5: - value = 1833; // 50-100 - break; - case 6: - value = 1815; // 50-100 - break; - case 7: - value =1794; // 50-100 - break; - - } + Double value = KsolarUtils.getTodayEnergy(day.toString()); // 100-250 values.add(value); } vo.setDates(dates); @@ -206,13 +183,10 @@ BigDecimal totalCharge = dailyRate.multiply(BigDecimal.valueOf(days)); vo.setStorageCharge(totalCharge); - TSystemConfiguration sysConfig1 = systemConfigurationMapper.selectOne(new LambdaQueryWrapper<TSystemConfiguration>() - .eq(TSystemConfiguration::getType,5)); - vo.setPhotovoltaic(new BigDecimal(sysConfig1.getContent())); + vo.setPhotovoltaic(new BigDecimal(KsolarUtils.getAllEnergy(LocalDate.now().toString()))); vo.setGreenElectricity(vo.getPhotovoltaic().multiply(new BigDecimal("0.94")).setScale(2, RoundingMode.HALF_UP)); //获取储能放电量 - // 判断是否等于今天 if (configVO.getLastUpdated().equals(today)) { vo.setStorageDisCharge(configVO.getStorageDisCharge()); diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/AESUtils.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/AESUtils.java new file mode 100644 index 0000000..301cdea --- /dev/null +++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/AESUtils.java @@ -0,0 +1,95 @@ +package com.ruoyi.other.util; + +import org.apache.commons.codec.binary.Base64; + +import javax.crypto.Cipher; + +import javax.crypto.spec.SecretKeySpec; + + +/** + * Created by jhb on 2022-08-03 14:16 + */ +public class AESUtils { + public static final String DEFAULT_SECRET_KEY = "kstar_ase_keysfo"; + /** + * 加密 + * @param sSrc 需要加密的字符串 + * @param sKey 此处使用AES-128-ECB加密模式,key需要为16位。 + * @return + * @throws Exception + */ + public static String Encrypt(String sSrc, String sKey) throws Exception { + sKey = DEFAULT_SECRET_KEY; + + // 判断Key是否为16位 + if (sKey.length() != 16) { + System.out.print("Key长度不是16位"); + return null; + } + byte[] raw = sKey.getBytes("utf-8"); + SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); + Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//"算法/模式/补码方式" + cipher.init(Cipher.ENCRYPT_MODE, skeySpec); + byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8")); + + return new Base64().encodeToString(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。 + } + + /** + * 解密 + * @param sSrc 需要解密的字符串 + * @param sKey 此处使用AES-128-ECB加密模式,key需要为16位。 + * @return + * @throws Exception + */ + public static String Decrypt(String sSrc, String sKey) throws Exception { + sKey = DEFAULT_SECRET_KEY; + try { + // 判断Key是否正确 + if (sKey == null) { + System.out.print("Key为空null"); + return null; + } + // 判断Key是否为16位 + if (sKey.length() != 16) { + System.out.print("Key长度不是16位"); + return null; + } + byte[] raw = sKey.getBytes("utf-8"); + SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); + Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, skeySpec); + byte[] encrypted1 = new Base64().decode(sSrc);//先用base64解密 + try { + byte[] original = cipher.doFinal(encrypted1); + String originalString = new String(original,"utf-8"); + return originalString; + } catch (Exception e) { + System.out.println(e.toString()); + return null; + } + } catch (Exception ex) { + System.out.println(ex.toString()); + return null; + } + } + + public static void main(String[] args) throws Exception { + /* + * 此处使用AES-128-ECB加密模式,key需要为16位。 + */ + String cKey = "kstar_ase_keysfo"; + // 需要加密的字串 + String cSrc = "huandaoguangfu"; + System.out.println(cSrc); + // 加密 + String enString = AESUtils.Encrypt(cSrc, cKey); + System.out.println("加密后的字串是:" + enString); + + // 解密 + String DeString = AESUtils.Decrypt(enString, cKey); + System.out.println("解密后的字串是:" + DeString); + } + +} 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 9a9d17f..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,85 +30,147 @@ 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); System.out.println("每日重置完成:今日储能和放电已清零"); + + + + TSystemConfiguration sysConfig = systemConfigurationMapper.selectOne(new LambdaQueryWrapper<TSystemConfiguration>() + .eq(TSystemConfiguration::getType,4)); + sysConfig.setContent("0"); + systemConfigurationMapper.updateById(sysConfig); + + } /** @@ -127,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) { @@ -171,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>() @@ -198,67 +263,72 @@ - public static BigDecimal refreshValueOne = new BigDecimal("0"); /** *光伏发电和消纳 */ - @Scheduled(cron = "0 */1 * * * ?") // 每分钟点执行 +// @Scheduled(cron = "0 */1 * * * ?") // 每分钟点执行 public void refreshValueOne() { // 判断时间是否在6:00到8:59 LocalTime now = LocalTime.now(); - if (now.isAfter(LocalTime.of(6, 0)) && now.isBefore(LocalTime.of(8, 59))) { - refreshValueOne = refreshValueOne.add(new BigDecimal("0.5")); - List<TSystemConfiguration> sysConfigs = systemConfigurationMapper.selectList(new LambdaQueryWrapper<TSystemConfiguration>() - .in(TSystemConfiguration::getType,4,5)); - TSystemConfiguration sysConfig = sysConfigs.stream().filter(e -> e.getType() == 4).findFirst().orElse(null); - sysConfig.setContent(refreshValueOne.toString()); - systemConfigurationMapper.updateById(sysConfig); - - - TSystemConfiguration sysConfig1 = sysConfigs.stream().filter(e -> e.getType() == 5).findFirst().orElse(null); - String string = new BigDecimal(sysConfig1.getContent()).add(new BigDecimal("0.5")).toString(); - sysConfig1.setContent(string); - systemConfigurationMapper.updateById(sysConfig1); - // 在6:00到8:59之间,不执行 - return; - } +// if (now.isAfter(LocalTime.of(6, 0)) && now.isBefore(LocalTime.of(8, 59))) { +// List<TSystemConfiguration> sysConfigs = systemConfigurationMapper.selectList(new LambdaQueryWrapper<TSystemConfiguration>() +// .in(TSystemConfiguration::getType,4,5)); +// TSystemConfiguration sysConfig = sysConfigs.stream().filter(e -> e.getType() == 4).findFirst().orElse(null); +// +// sysConfig.setContent(new BigDecimal(sysConfig.getContent()).add(new BigDecimal("0.5")).toString()); +// systemConfigurationMapper.updateById(sysConfig); +// +// +// TSystemConfiguration sysConfig1 = sysConfigs.stream().filter(e -> e.getType() == 5).findFirst().orElse(null); +// String string = new BigDecimal(sysConfig1.getContent()).add(new BigDecimal("0.5")).toString(); +// sysConfig1.setContent(string); +// systemConfigurationMapper.updateById(sysConfig1); +// // 在6:00到8:59之间,不执行 +// return; +// } // 9:00-16:59每分钟增加随机3 到 3.5 - if (now.isAfter(LocalTime.of(9, 0)) && now.isBefore(LocalTime.of(16, 59))) { - refreshValueOne = refreshValueOne.add(new BigDecimal(3 + (3.5 - 3) * random.nextDouble()) - .setScale(2, RoundingMode.HALF_UP)); + if (now.isAfter(LocalTime.of(6, 0)) && now.isBefore(LocalTime.of(12, 0))) { List<TSystemConfiguration> sysConfigs = systemConfigurationMapper.selectList(new LambdaQueryWrapper<TSystemConfiguration>() .in(TSystemConfiguration::getType,4,5)); TSystemConfiguration sysConfig = sysConfigs.stream().filter(e -> e.getType() == 4).findFirst().orElse(null); - sysConfig.setContent(refreshValueOne.toString()); + sysConfig.setContent( new BigDecimal(sysConfig.getContent()).add(new BigDecimal(0.1 + (1 - 0.1) * random.nextDouble()) + .setScale(2, RoundingMode.HALF_UP)).toString()); systemConfigurationMapper.updateById(sysConfig); TSystemConfiguration sysConfig1 = sysConfigs.stream().filter(e -> e.getType() == 5).findFirst().orElse(null); - String string = new BigDecimal(sysConfig1.getContent()).add(new BigDecimal(3 + (3.5 - 3) * random.nextDouble())).toString(); + String string = new BigDecimal(sysConfig1.getContent()).add(new BigDecimal(0.1 + (1 - 0.1) * random.nextDouble())).toString(); sysConfig1.setContent(string); systemConfigurationMapper.updateById(sysConfig1); return; } + //17:00-18:59 每分钟增加0.5 - if (now.isAfter(LocalTime.of(17, 0)) && now.isBefore(LocalTime.of(18, 59))) { - refreshValueOne = refreshValueOne.add(new BigDecimal("0.5")); - List<TSystemConfiguration> sysConfigs = systemConfigurationMapper.selectList(new LambdaQueryWrapper<TSystemConfiguration>() - .in(TSystemConfiguration::getType,4,5)); - - TSystemConfiguration sysConfig = sysConfigs.stream().filter(e -> e.getType() == 4).findFirst().orElse(null); - sysConfig.setContent(refreshValueOne.toString()); - systemConfigurationMapper.updateById(sysConfig); - - - TSystemConfiguration sysConfig1 = sysConfigs.stream().filter(e -> e.getType() == 5).findFirst().orElse(null); - String string = new BigDecimal(sysConfig1.getContent()).add(new BigDecimal("0.5")).toString(); - sysConfig1.setContent(string); - systemConfigurationMapper.updateById(sysConfig1); - } +// if (now.isAfter(LocalTime.of(17, 0)) && now.isBefore(LocalTime.of(18, 59))) { +// List<TSystemConfiguration> sysConfigs = systemConfigurationMapper.selectList(new LambdaQueryWrapper<TSystemConfiguration>() +// .in(TSystemConfiguration::getType,4,5)); +// +// TSystemConfiguration sysConfig = sysConfigs.stream().filter(e -> e.getType() == 4).findFirst().orElse(null); +// +// sysConfig.setContent(new BigDecimal(sysConfig.getContent()).add(new BigDecimal("0.5")).toString()); +// systemConfigurationMapper.updateById(sysConfig); +// +// +// TSystemConfiguration sysConfig1 = sysConfigs.stream().filter(e -> e.getType() == 5).findFirst().orElse(null); +// String string = new BigDecimal(sysConfig1.getContent()).add(new BigDecimal("0.5")).toString(); +// sysConfig1.setContent(string); +// systemConfigurationMapper.updateById(sysConfig1); +// } } + public static void main(String[] args) { + Random random = new Random(); + BigDecimal bigDecimal = new BigDecimal(0.1 + (1 - 0.1) * random.nextDouble()); + System.out.println(bigDecimal); + + } } \ No newline at end of file diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/KsolarUtils.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/KsolarUtils.java new file mode 100644 index 0000000..1efb97a --- /dev/null +++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/KsolarUtils.java @@ -0,0 +1,146 @@ +package com.ruoyi.other.util; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +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 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.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Random; + + +/** + * 定时任务:储能放电情况 光伏发电情况 + */ +@Service +public class KsolarUtils { + + + private static String token; + + + private static List<String> stationIds= Arrays.asList("2025060710462417","2025060711331323","2025060715425437","2025060716010425"); + + public static Double getTodayEnergy(String time) { + try { + HttpRequest get = HttpUtil.createGet("http://111.230.136.62:8092/station/list/earn"); + get.header("Authorization", "Bearer "+token); + get.form("startDate", time); + HttpResponse execute = get.execute(); + String body = execute.body(); + JSONObject jsonObject = JSONObject.parseObject(body); + String code = jsonObject.get("code").toString(); + if(!"200".equals(code)){ + token = token(); + return getTodayEnergy(time); + } + Object data = jsonObject.get("data"); + JSONObject jsonObject1 = JSONObject.parseObject(data.toString()); + Double earn = jsonObject1.getDouble("dayGeneration"); + return earn; + } catch (Exception e) { + e.printStackTrace(); + token = token(); + return getTodayEnergy(time); + } + } + + public static Double getAllEnergy(String time) { + try { + HttpRequest get = HttpUtil.createGet("http://111.230.136.62:8092/station/list/earn"); + get.header("Authorization", "Bearer "+token); + get.form("startDate", time); + HttpResponse execute = get.execute(); + String body = execute.body(); + JSONObject jsonObject = JSONObject.parseObject(body); + String code = jsonObject.get("code").toString(); + if(!"200".equals(code)){ + token = token(); + return getAllEnergy(time); + } + Object data = jsonObject.get("data"); + JSONObject jsonObject1 = JSONObject.parseObject(data.toString()); + Double earn = jsonObject1.getDouble("totalGeneration"); + return earn; + } catch (Exception e) { + e.printStackTrace(); + token = token(); + return getAllEnergy(time); + } + } + + + /** + * 光伏碳减排 + * @return + */ + public static BigDecimal getYearAllEnergy() { + Double yearAllEnergy = getYearAllEnergy(stationIds.get(0)); + Double yearAllEnergy1 = getYearAllEnergy(stationIds.get(1)); + Double yearAllEnergy2 = getYearAllEnergy(stationIds.get(2)); + Double yearAllEnergy3 = getYearAllEnergy(stationIds.get(3)); + double v = yearAllEnergy + yearAllEnergy1 + yearAllEnergy2 + yearAllEnergy3; + BigDecimal divide = new BigDecimal(v).multiply(new BigDecimal("0.1404")).divide(new BigDecimal("1000"), 2, RoundingMode.DOWN); + return divide; + } + + private static Double getYearAllEnergy(String stationId) { + try { + HttpRequest get = HttpUtil.createGet("http://111.230.136.62:8092/protocol/station/statistic/elec/chart"); + get.header("Authorization", "Bearer "+token); + get.form("stationId", "2025060710462417"); + get.form("attribId", "202"); + get.form("stime",LocalDate.now().getYear()+"" ); + HttpResponse execute = get.execute(); + String body = execute.body(); + JSONArray jsonArray = JSONArray.parseArray(body); + Object o1 = jsonArray.get(0); + JSONObject jsonObject = JSONObject.parseObject(o1.toString()); + String code = jsonObject.get("attribValue").toString(); + Double earn = Double.valueOf(code); + return earn; + } catch (Exception e) { + e.printStackTrace(); + token = token(); + return getYearAllEnergy(LocalDate.now().getYear()+""); + } + } + + + + public static String token() { + HttpRequest post = HttpUtil.createPost("http://111.230.136.62:8092/authentication/form"); + post.basicAuth("kstar","kstarSecret"); + post.form("username", "环岛光伏"); + post.form("password", "cR8GGwIXMI462A8Dfl9eXg=="); + HttpResponse execute = post.execute(); + String body = execute.body(); + JSONObject jsonObject = JSONObject.parseObject(body); + String token = jsonObject.getString("token"); + JSONObject jsonObject1 = JSONObject.parseObject(token); + String access_token = jsonObject1.getString("access_token"); + return access_token; + } + + public static void main(String[] args) throws Exception { + System.out.println(getYearAllEnergy("2025","")); + } + + +} \ No newline at end of file diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/PhotovoltaicAndConsumptionVO.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/PhotovoltaicAndConsumptionVO.java index dd9b28f..9ec03b0 100644 --- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/PhotovoltaicAndConsumptionVO.java +++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/PhotovoltaicAndConsumptionVO.java @@ -14,7 +14,7 @@ @ApiModelProperty("装机容量") private BigDecimal capacity = new BigDecimal("759.52"); @ApiModelProperty("今日已发电") - private BigDecimal todayGenerateElectricity=new BigDecimal("71.29"); + private BigDecimal todayGenerateElectricity=new BigDecimal("0"); @ApiModelProperty("今日绿电消纳值") private BigDecimal greenElectricityToday=new BigDecimal("0.00"); diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/PhotovoltaicPowerGenerationVO.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/PhotovoltaicPowerGenerationVO.java index 578eac3..9fd06fa 100644 --- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/PhotovoltaicPowerGenerationVO.java +++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/PhotovoltaicPowerGenerationVO.java @@ -11,5 +11,5 @@ @ApiModelProperty("日期") private List<LocalDate> dates; @ApiModelProperty("数据") - private List<Integer> values; + private List<Double> values; } -- Gitblit v1.7.1