ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/produce/ChargingMessageListener.java
@@ -223,6 +223,8 @@ JSONObject jsonObject = new JSONObject(); jsonObject.put("StartChargeSeq",chargingOrder2.getCode()); jsonObject.put("ConnectorID",chargingGun2.getFullNumber()); LocalDateTime startTime = chargingOrder2.getStartTime(); //状态(0=未知,1=等待中/已插枪,2=启动中,3=充电中,4=停止中,5=已结束) int tempStatus = 0; switch (chargingOrder2.getStatus()){ @@ -232,7 +234,18 @@ case 2: tempStatus=1; jsonObject.put("StartChargeSeqStat",tempStatus); LocalDateTime startTime = chargingOrder2.getStartTime(); if (startTime!=null){ jsonObject.put("StartTime",startTime.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); }else{ LocalDateTime now = LocalDateTime.now(); // 转化为yyyy-MM-dd HH:mm:ss格式字符串 jsonObject.put("StartTime",now.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); } chuanYiChongSuperviseUtil.notificationStationStatus(new Operator(), jsonObject); break; case 3: tempStatus=2; jsonObject.put("StartChargeSeqStat",tempStatus); if (startTime!=null){ jsonObject.put("StartTime",startTime.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); }else{ @@ -243,7 +256,17 @@ chuanYiChongSuperviseUtil.notificationStationStatus(new Operator(), jsonObject); break; case 4: tempStatus=3; jsonObject.put("StartChargeSeqStat",tempStatus); if (startTime!=null){ jsonObject.put("StartTime",startTime.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); }else{ LocalDateTime now = LocalDateTime.now(); // 转化为yyyy-MM-dd HH:mm:ss格式字符串 jsonObject.put("StartTime",now.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); } chuanYiChongSuperviseUtil.notificationStationStatus(new Operator(), jsonObject); break; case 5: jsonObject.put("StartChargeSeqStat",4); int temp = 0; ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/GovernmentCloudTask.java
@@ -81,6 +81,7 @@ import com.ruoyi.other.api.vo.GovernmentCloudOtherVO; import com.ruoyi.system.api.feignClient.JianGuanSystemClient; import com.ruoyi.system.api.vo.GovernmentCloudSystemVO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ * @date 2023/7/11 8:39 */ @Component @Slf4j public class GovernmentCloudTask { @@ -274,50 +276,68 @@ @Resource private JianGuanSystemClient jianGuanSystemClient; // 每天早上9点执行的定时任务 @Scheduled(cron = "0 0 9 * * ?") // 每两小时执行一次的定时任务 // @Scheduled(cron = "0 0 0/2 * * ?") public void taskMonth() { log.info("市政云传数据"); // account服务 GovernmentCloudAccountVO data = jianGuanAccountClient.listAll().getData(); if (data != null) { List<TAppCoupon> appCoupons = data.getAppCoupons(); if (!appCoupons.isEmpty()) { log.info("用户优惠券"+appCoupons); appCouponService.saveBatch(appCoupons); } List<TAppUser> appUsers = data.getAppUsers(); if (!appUsers.isEmpty()) { log.info("用户"+appUsers); appUserService.saveBatch(appUsers); } List<TAppUserAddress> appUserAddresses = data.getAppUserAddresses(); if (!appUserAddresses.isEmpty()) { log.info("用户地址"+appUserAddresses); appUserAddressService.saveBatch(appUserAddresses); } List<TAppUserCar> appUserCars = data.getAppUserCars(); if (!appUserCars.isEmpty()) { log.info("用户车辆"+appUserCars); appUserCarService.saveBatch(appUserCars); } List<TAppUserIntegralChange> appUserIntegralChanges = data.getAppUserIntegralChanges(); if (!appUserIntegralChanges.isEmpty()) { log.info("用户积分变动"+appUserIntegralChanges); appUserIntegralChangeService.saveBatch(appUserIntegralChanges); } List<TAppUserSign> appUserSigns = data.getAppUserSigns(); if (!appUserSigns.isEmpty()) { log.info("用户签到"+appUserSigns); appUserSignService.saveBatch(appUserSigns); } List<TAppUserTag> appUserTags = data.getAppUserTags(); if (!appUserTags.isEmpty()) { log.info("用户标签"+appUserTags); appUserTagService.saveBatch(appUserTags); } List<TAppUserVipDetail> appUserVipDetails = data.getAppUserVipDetails(); if (!appUserVipDetails.isEmpty()) { log.info("用户会员明细"+appUserVipDetails); appUserVipDetailService.saveBatch(appUserVipDetails); } List<TInviteUser> inviteUsers = data.getInviteUsers(); if (!inviteUsers.isEmpty()) { log.info("邀请用户"+inviteUsers); inviteUserService.saveBatch(inviteUsers); } List<TInvoiceInformation> invoiceInformations = data.getInvoiceInformations(); if (!invoiceInformations.isEmpty()) { log.info("开票"+invoiceInformations); tInvoiceInformationService.saveBatch(invoiceInformations); } } @@ -326,54 +346,80 @@ if (data1 != null) { List<Partner> partners = data1.getPartners(); if (!partners.isEmpty()) { log.info("合作商"+partners); partnerService.saveBatch(partners); } List<Site> sites = data1.getSites(); if (!sites.isEmpty()) { log.info("站点"+sites); siteService.saveBatch(sites); } List<TAccountingStrategy> accountingStrategies = data1.getAccountingStrategies(); if (!accountingStrategies.isEmpty()) { log.info("策略"+accountingStrategies); accountingStrategyService.saveBatch(accountingStrategies); } List<TAccountingStrategyDetail> accountingStrategyDetails = data1.getAccountingStrategyDetails(); if (!accountingStrategyDetails.isEmpty()) { log.info("策略明细"+accountingStrategyDetails); accountingStrategyDetailService.saveBatch(accountingStrategyDetails); } List<TApplyChargingPile> applyChargingPiles = data1.getApplyChargingPiles(); if (!applyChargingPiles.isEmpty()) { log.info("申请充电桩"+applyChargingPiles); applyChargingPileService.saveBatch(applyChargingPiles); } List<TCarport> carports = data1.getCarports(); if (!carports.isEmpty()) { log.info("停车场"+carports); carportService.saveBatch(carports); } List<TChargingGun> chargingGuns = data1.getChargingGuns(); if (!chargingGuns.isEmpty()) { log.info("充电枪"+chargingGuns); chargingGunService.saveBatch(chargingGuns); } List<TChargingPile> chargingPiles = data1.getChargingPiles(); if (!chargingPiles.isEmpty()) { log.info("充电桩"+chargingPiles); chargingPileService.saveBatch(chargingPiles); } List<TChargingPileNotification> chargingPileNotifications = data1.getChargingPileNotifications(); if (!chargingPileNotifications.isEmpty()) { log.info("通知"+chargingPileNotifications); chargingPileNotificationService.saveBatch(chargingPileNotifications); } List<TFaultMessage> faultMessages = data1.getFaultMessages(); if (!faultMessages.isEmpty()) { log.info("故障"+faultMessages); faultMessageService.saveBatch(faultMessages); } List<TMonitoringEquipment> monitoringEquipments = data1.getMonitoringEquipments(); if (!monitoringEquipments.isEmpty()) { log.info("监控设备"+monitoringEquipments); monitoringEquipmentService.saveBatch(monitoringEquipments); } List<TParkingLot> parkingLots = data1.getParkingLots(); if (!parkingLots.isEmpty()) { log.info("停车场"+parkingLots); parkingLotService.saveBatch(parkingLots); } List<TParkingRecord> parkingRecords = data1.getParkingRecords(); if (!parkingRecords.isEmpty()) { log.info("停车记录"+parkingRecords); parkingRecordService.saveBatch(parkingRecords); } // List<TPartnerSite> partnerSites = data1.getPartnerSites(); @@ -382,6 +428,8 @@ // } List<TRepair> repairs = data1.getRepairs(); if (!repairs.isEmpty()) { log.info("报修"+repairs); repairService.saveBatch(repairs); } // List<TSiteMenu> siteMenus = data1.getSiteMenus(); @@ -390,6 +438,8 @@ // } List<TVehicleRamp> vehicleRamps = data1.getVehicleRamps(); if (!vehicleRamps.isEmpty()) { log.info("车道"+vehicleRamps); vehicleRampService.saveBatch(vehicleRamps); } } @@ -400,74 +450,110 @@ if (data2 != null) { List<AccountingStrategyDetailOrder> accountingStrategyDetailOrders = data2.getAccountingStrategyDetailOrders(); if (!accountingStrategyDetailOrders.isEmpty()) { log.info("订单明细策略"+accountingStrategyDetailOrders); accountingStrategyDetailOrderService.saveBatch(accountingStrategyDetailOrders); } List<AccountingStrategyOrder> accountingStrategyOrders = data2.getAccountingStrategyOrders(); if (!accountingStrategyOrders.isEmpty()) { log.info("订单策略"+accountingStrategyOrders); accountingStrategyOrderService.saveBatch(accountingStrategyOrders); } List<TChargingBill> chargingBills = data2.getChargingBills(); if (!chargingBills.isEmpty()) { log.info("账单"+chargingBills); chargingBillService.saveBatch(chargingBills); } List<TChargingOrder> chargingOrders = data2.getChargingOrders(); if (!chargingOrders.isEmpty()) { log.info("充电订单"+chargingOrders); chargingOrderService.saveBatch(chargingOrders); } List<TChargingOrderAccountingStrategy> chargingOrderAccountingStrategies = data2.getChargingOrderAccountingStrategies(); if (!chargingOrderAccountingStrategies.isEmpty()) { log.info("充电订单策略"+chargingOrderAccountingStrategies); chargingOrderAccountingStrategyService.saveBatch(chargingOrderAccountingStrategies); } List<TChargingOrderRefund> chargingOrderRefunds = data2.getChargingOrderRefunds(); if (!chargingOrderRefunds.isEmpty()) { log.info("充电订单退款"+chargingOrderRefunds); chargingOrderRefundService.saveBatch(chargingOrderRefunds); } List<TExchangeOrder> exchangeOrders = data2.getExchangeOrders(); if (!exchangeOrders.isEmpty()) { log.info("兑换订单"+exchangeOrders); exchangeOrderService.saveBatch(exchangeOrders); } List<TGrantVip> grantVips = data2.getGrantVips(); if (!grantVips.isEmpty()) { log.info("赠送vip"+grantVips); grantVipService.saveBatch(grantVips); } List<TOrderAppeal> orderAppeals = data2.getOrderAppeals(); if (!orderAppeals.isEmpty()) { log.info("订单申诉"+orderAppeals); orderAppealService.saveBatch(orderAppeals); } List<TOrderEvaluate> orderEvaluates = data2.getOrderEvaluates(); if (!orderEvaluates.isEmpty()) { log.info("订单评价"+orderEvaluates); orderEvaluateService.saveBatch(orderEvaluates); } List<TOrderEvaluateTag> orderEvaluateTags = data2.getOrderEvaluateTags(); if (!orderEvaluateTags.isEmpty()) { log.info("订单评价标签"+orderEvaluateTags); orderEvaluateTagService.saveBatch(orderEvaluateTags); } List<TOrderInvoice> orderInvoices = data2.getOrderInvoices(); if (!orderInvoices.isEmpty()) { log.info("订单开票"+orderInvoices); orderInvoiceService.saveBatch(orderInvoices); } List<TOrderInvoiceDetail> orderInvoiceDetails = data2.getOrderInvoiceDetails(); if (!orderInvoiceDetails.isEmpty()) { log.info("订单开票明细"+orderInvoiceDetails); orderInvoiceDetailService.saveBatch(orderInvoiceDetails); } List<TSettlementConfirm> settlementConfirms = data2.getSettlementConfirms(); if (!settlementConfirms.isEmpty()) { log.info("账单结算"+settlementConfirms); settlementConfirmService.saveBatch(settlementConfirms); } List<TShoppingOrder> shoppingOrders = data2.getShoppingOrders(); if (!shoppingOrders.isEmpty()) { log.info("购物订单"+shoppingOrders); shoppingOrderService.saveBatch(shoppingOrders); } List<TShoppingOrderRefund> shoppingOrderRefunds = data2.getShoppingOrderRefunds(); if (!shoppingOrderRefunds.isEmpty()) { log.info("购物订单退款"+shoppingOrderRefunds); shoppingOrderRefundService.saveBatch(shoppingOrderRefunds); } List<TVipOrder> vipOrders = data2.getVipOrders(); if (!vipOrders.isEmpty()) { log.info("会员订单"+vipOrders); vipOrderService.saveBatch(vipOrders); } List<TVipOrderRefund> vipOrderRefunds = data2.getVipOrderRefunds(); if (!vipOrderRefunds.isEmpty()) { log.info("会员订单退款"+vipOrderRefunds); vipOrderRefundService.saveBatch(vipOrderRefunds); } } @@ -476,62 +562,89 @@ if (data3 != null) { List<Operator> operators = data3.getOperators(); if (!operators.isEmpty()) { log.info("运营商"+operators); operatorService.saveOrUpdateBatch(operators); } List<TActivity> activities = data3.getActivities(); if (!activities.isEmpty()) { log.info("活动"+activities); activityService.saveBatch(activities); } List<TAdvertising> advertisings = data3.getAdvertisings(); if (!advertisings.isEmpty()) { log.info("广告"+advertisings); advertisingService.saveBatch(advertisings); } List<TCompany> companies = data3.getCompanies(); if (!companies.isEmpty()) { log.info("公司"+companies); companyService.saveBatch(companies); } List<TCoupon> coupons = data3.getCoupons(); if (!coupons.isEmpty()) { log.info("优惠券"+coupons); couponService.saveBatch(coupons); } List<TEnterpriseUserApplication> enterpriseUserApplications = data3.getEnterpriseUserApplications(); if (!enterpriseUserApplications.isEmpty()) { log.info("公司申请"+enterpriseUserApplications); enterpriseUserApplicationService.saveBatch(enterpriseUserApplications); } List<TEvaluationTag> evaluationTags = data3.getEvaluationTags(); if (!evaluationTags.isEmpty()) { log.info("评价标签"+evaluationTags); evaluationTagService.saveBatch(evaluationTags); } List<TGoods> goods = data3.getGoods(); if (!goods.isEmpty()) { log.info("商品"+goods); goodsService.saveBatch(goods); } List<THtml> htmls = data3.getHtmls(); if (!htmls.isEmpty()) { log.info("html"+htmls); htmlService.saveOrUpdateBatch(htmls); } List<TIntegralRule> integralRules = data3.getIntegralRules(); if (!integralRules.isEmpty()) { log.info("积分规则"+integralRules); integralRuleService.saveBatch(integralRules); } List<TInvoiceType> invoiceTypes = data3.getInvoiceTypes(); if (!invoiceTypes.isEmpty()) { log.info("开票类型"+invoiceTypes); invoiceTypeService.saveBatch(invoiceTypes); } List<TNotice> notices = data3.getNotices(); if (!notices.isEmpty()) { log.info("通知"+notices); noticeService.saveBatch(notices); } List<TSystemConfiguration> systemConfigurations = data3.getSystemConfigurations(); if (!systemConfigurations.isEmpty()) { log.info("系统设置"+systemConfigurations); systemConfigurationService.saveOrUpdateBatch(systemConfigurations); } List<TUserTag> userTags = data3.getUserTags(); if (!userTags.isEmpty()) { log.info("用户标签"+userTags); userTagService.saveBatch(userTags); } List<TVip> vips = data3.getVips(); if (!vips.isEmpty()) { log.info("会员"+vips); vipService.saveBatch(vips); } } @@ -539,18 +652,22 @@ if (data4 != null) { List<SysLoginLog> loginLogs = data4.getLoginLogs(); if (!loginLogs.isEmpty()) { log.info("登录日志"+loginLogs); sysLoginLogService.saveBatch(loginLogs); } List<SysOperLog> sysOperLogs = data4.getSysOperLogs(); if (!sysOperLogs.isEmpty()) { log.info("操作日志"+sysOperLogs); sysOperLogService.saveBatch(sysOperLogs); } List<SysRole> sysRoles = data4.getSysRoles(); if (!sysRoles.isEmpty()) { log.info("角色"+sysRoles); sysRoleService.saveBatch(sysRoles); } List<SysUser> sysUsers = data4.getSysUsers(); if (!sysUsers.isEmpty()) { log.info("系统用户"+sysUsers); sysUserService.saveBatch(sysUsers); } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -1040,7 +1040,7 @@ dto.setRefundAmount(rechargeAmount.toString()); dto.setRefundReason("充电失败,取消充电订单"); RefundResp resp = h5AliPaymentClient.refund(dto).getData(); if(null != resp){ if(null != resp && "10000".equals(resp.getCode())){ chargingOrderRefundService.save(chargingOrderRefund); //回退会员折扣次数 if(chargingOrder.getVipDiscountAmount().compareTo(BigDecimal.ZERO) > 0){ @@ -1137,7 +1137,7 @@ dto.setRefundAmount(money.toString()); dto.setRefundReason("充电完成退款"); RefundResp resp = h5AliPaymentClient.refund(dto).getData(); if(null != resp){ if(null != resp && "10000".equals(resp.getCode())){ chargingOrderRefundService.save(chargingOrderRefund); try { Thread.sleep(1000); @@ -2737,7 +2737,7 @@ dto.setRefundAmount(refundAmount.toString()); dto.setRefundReason("充电完成退款"); RefundResp resp = h5AliPaymentClient.refund(dto).getData(); if(null != resp){ if(null != resp && "10000".equals(resp.getCode())){ chargingOrderRefundService.save(chargingOrderRefund); this.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null); } @@ -2954,7 +2954,7 @@ dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString()); dto.setRefundReason("取消订单"); RefundResp resp = h5AliPaymentClient.refund(dto).getData(); if(null != resp){ if(null != resp && "10000".equals(resp.getCode())){ chargingOrderRefund.setRefundStatus(2); chargingOrderRefund.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); this.baseMapper.updateById(tChargingOrder); ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TScreenContentController.java
@@ -94,12 +94,22 @@ @ApiOperation(tags = {"储能放电情况"},value = "充电桩数据大屏") @GetMapping(value = "/energyStorageDischarge") public AjaxResult<EnergyStorageDischargeVO> energyStorageDischarge() { //需调用接口 获取光伏发电量 String electricity = KsolarUtils.getElectricity(); List<TSystemConfiguration> list = systemConfigurationService.list(new LambdaQueryWrapper<TSystemConfiguration>().in(TSystemConfiguration::getType, 4, 5)); // 昨日放能 TSystemConfiguration sysConfig = list.stream().filter(e -> e.getType() == 4).findFirst().orElse(null); // 昨日储能 TSystemConfiguration sysConfig1 = list.stream().filter(e -> e.getType() == 5).findFirst().orElse(null); // 总储能 String s = electricity.split("_")[0]; // 总放能 String s1 = electricity.split("_")[1]; EnergyStorageDischargeVO vo = new EnergyStorageDischargeVO(); //今日放能 10:00-11:59 每1分钟随机增值0.5-1,放满90停止;用第一次放能值为基数(85)开始累加,17:00-21:59 每1分钟随机增值0.5-1,放满90停止。 vo.setTodayDischarge(energyRefreshService.getTodayDischarge()); //今日储能 00:00-次日7:59 每1分钟随机增长0.5-1,储满115停止,12:00-16:59 每1分钟随机增长0.5-1,增加到115减第一次放能剩余值(如放能值为85,则放能剩余值为90-85)结束; vo.setTodayStorage(energyRefreshService.getTodayStorage()); BigDecimal subtract = new BigDecimal(s1).subtract(new BigDecimal(sysConfig.getContent())); vo.setTodayDischarge(subtract); BigDecimal subtract1 = new BigDecimal(s).subtract(new BigDecimal(sysConfig1.getContent())); vo.setTodayStorage(subtract1); return AjaxResult.success(vo); } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TScreenContentServiceImpl.java
@@ -57,11 +57,11 @@ EmissionReductionVO vo = new EmissionReductionVO(); //获取总电量 计算累计充电二氧化碳减排量 BigDecimal charge=top.getCarCharge(); BigDecimal multiplier = new BigDecimal("0.1404"); //计算累计充电二氧化碳减排量 if (charge.compareTo(BigDecimal.ZERO) != 0) { // 定义乘数和除数 BigDecimal multiplier = new BigDecimal("0.1404"); // 0.1404 BigDecimal divisor = new BigDecimal("1000"); // 1000 // 0.1404 // 计算:charge × 0.1404 ÷ 1000 charge = charge .multiply(multiplier) // 乘以 0.1404 @@ -70,42 +70,16 @@ vo.setCharge(charge); //获取累计储能放电量 TSystemConfiguration sysConfig = systemConfigurationMapper.selectOne(new LambdaQueryWrapper<TSystemConfiguration>() .eq(TSystemConfiguration::getType,3)); //解析 ScreenStorageConfigVO configVO = JSON.parseObject(sysConfig.getContent(), ScreenStorageConfigVO.class); LocalDate today = LocalDate.now(); // 判断是否等于今天 if (configVO.getLastUpdated().equals(today)) { vo.setEnergyStorage(configVO.getStorageDisCharge().multiply(new BigDecimal("0.1404")).divide(new BigDecimal("1000"),2,RoundingMode.DOWN)); }else { //判断离今天还有几天 int count = (int) ChronoUnit.DAYS.between(configVO.getLastUpdated(), today) +1;//包括今天 BigDecimal storageDisCharge = configVO.getStorageDisCharge(); // 每天生成一个随机值(不超过100)并累加 for (int i = 0; i < count; i++) { int dailyCharge = ThreadLocalRandom.current().nextInt(0, 101); // 0-100的随机数 storageDisCharge = storageDisCharge.add(new BigDecimal(dailyCharge)); } String s = KsolarUtils.getElectricity().split("_")[0]; vo.setEnergyStorage(new BigDecimal(s).multiply(multiplier) // 乘以 0.1404 .divide(new BigDecimal("1000"),2, RoundingMode.HALF_DOWN)); // 更新回对象 configVO.setStorageDisCharge(storageDisCharge); configVO.setLastUpdated(today); String json = JSON.toJSONString(configVO); sysConfig.setContent(json); 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); @@ -173,49 +147,14 @@ vo.setCarDisCharge(carCharge); vo.setGreenElectricity(greenElectricity); //获取系统建设日期和累计储能放电量 TSystemConfiguration sysConfig = systemConfigurationMapper.selectOne(new LambdaQueryWrapper<TSystemConfiguration>() .eq(TSystemConfiguration::getType,3)); //解析 ScreenStorageConfigVO configVO = JSON.parseObject(sysConfig.getContent(), ScreenStorageConfigVO.class); //计算储能充电量 LocalDate systemCreateTime = configVO.getSystemCreateTime(); LocalDate today = LocalDate.now(); int days = (int) ChronoUnit.DAYS.between(systemCreateTime, today) +1;//包括今天 BigDecimal dailyRate = new BigDecimal("100"); BigDecimal totalCharge = dailyRate.multiply(BigDecimal.valueOf(days)); vo.setStorageCharge(totalCharge); String electricity = KsolarUtils.getElectricity(); vo.setStorageCharge(new BigDecimal( electricity.split("_")[0])); 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()); return vo; } //判断离今天还有几天 int count = (int) ChronoUnit.DAYS.between(configVO.getLastUpdated(), today) +1;//包括今天 BigDecimal storageDisCharge = configVO.getStorageDisCharge(); // 每天生成一个随机值(不超过100)并累加 for (int i = 0; i < count; i++) { int dailyCharge = ThreadLocalRandom.current().nextInt(0, 101); // 0-100的随机数 storageDisCharge = storageDisCharge.add(new BigDecimal(dailyCharge)); } // 更新回对象 configVO.setStorageDisCharge(storageDisCharge); configVO.setLastUpdated(today); String json = JSON.toJSONString(configVO); sysConfig.setContent(json); systemConfigurationMapper.updateById(sysConfig); vo.setStorageDisCharge(storageDisCharge); return vo; vo.setStorageDisCharge(new BigDecimal(electricity.split("_")[1])); return vo; } @Override ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/EnergyRefreshService.java
@@ -29,304 +29,21 @@ @Resource private TSystemConfigurationMapper systemConfigurationMapper; // 储能相关参数 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 boolean isFirstChargeCompleted = false; private boolean isSecondChargeCompleted = false; // 放电次数计数器 private int dischargeCount = 0; // 当前阶段总放电量 private BigDecimal currentPhaseDischarge = BigDecimal.ZERO; // 定时任务方法 - 能量刷新 // @Scheduled(cron = "0 * * * * ?") // 每分钟执行一次 public synchronized void refreshValue() { LocalTime now = LocalTime.now(); // 第一轮充电阶段 (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); } } // 充电阶段处理逻辑 private void handleChargePhase() { BigDecimal todayStorage = getTodayStorage(); // 如果已经充满,则不再充电 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); } // 放电阶段处理逻辑 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); // 更新当前阶段放电总量 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点) // 记录截至昨天的总量(每天凌晨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("每日重置完成:今日储能和放电已清零"); String electricity = KsolarUtils.getElectricity(); TSystemConfiguration sysConfig = systemConfigurationMapper.selectOne(new LambdaQueryWrapper<TSystemConfiguration>() .eq(TSystemConfiguration::getType,4)); sysConfig.setContent("0"); .eq(TSystemConfiguration::getType,5)); sysConfig.setContent(electricity.split("_")[0]); systemConfigurationMapper.updateById(sysConfig); } /** * 生成指定范围内的随机 BigDecimal(两位小数) * @param min 最小值(包含) * @param max 最大值(包含) * @return 随机 BigDecimal */ private BigDecimal randomBigDecimal(double min, double max) { // 生成 [0, 1) 随机数 double randomValue = random.nextDouble(); // 计算范围内的随机值 double range = max - min; double value = min + (randomValue * range); // 转换为两位小数的 BigDecimal return BigDecimal.valueOf(value).setScale(2, RoundingMode.HALF_UP); } // 通用配置更新方法 private void updateConfigField(String field, BigDecimal value) { TSystemConfiguration sysConfig = systemConfigurationMapper.selectOne( new LambdaQueryWrapper<TSystemConfiguration>() .eq(TSystemConfiguration::getType, 3) ); if (sysConfig != null) { ScreenStorageConfigVO configVO = JSON.parseObject(sysConfig.getContent(), ScreenStorageConfigVO.class); if ("todayStorage".equals(field)) { configVO.setTodayStorage(value); } else { configVO.setTodayDischarge(value); } sysConfig.setContent(JSON.toJSONString(configVO)); systemConfigurationMapper.updateById(sysConfig); } } // 时间段判断方法 private boolean isInStorageMorning(LocalTime time) { return time.isAfter(LocalTime.of(0, 0)) && time.isBefore(LocalTime.of(8, 0)); } private boolean isInDischargeMorning(LocalTime time) { return time.isAfter(LocalTime.of(10, 0)) && time.isBefore(LocalTime.of(12, 0)); } private boolean isInStorageAfternoon(LocalTime time) { return time.isAfter(LocalTime.of(12, 0)) && time.isBefore(LocalTime.of(17, 0)); } private boolean isInDischargeAfternoon(LocalTime time) { 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>() .eq(TSystemConfiguration::getType, 3) ); if (sysConfig != null) { ScreenStorageConfigVO configVO = JSON.parseObject(sysConfig.getContent(), ScreenStorageConfigVO.class); return configVO.getTodayStorage(); } return BigDecimal.ZERO; } public BigDecimal getTodayDischarge() { TSystemConfiguration sysConfig = systemConfigurationMapper.selectOne( new LambdaQueryWrapper<TSystemConfiguration>() .eq(TSystemConfiguration::getType, 3) ); if (sysConfig != null) { ScreenStorageConfigVO configVO = JSON.parseObject(sysConfig.getContent(), ScreenStorageConfigVO.class); return configVO.getTodayDischarge(); } return BigDecimal.ZERO; } /** *光伏发电和消纳 */ // @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))) { // 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(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( 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(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))) { // 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); TSystemConfiguration sysConfig1 = systemConfigurationMapper.selectOne(new LambdaQueryWrapper<TSystemConfiguration>() .eq(TSystemConfiguration::getType,4)); sysConfig1.setContent(electricity.split("_")[1]); systemConfigurationMapper.updateById(sysConfig1); } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/KsolarUtils.java
@@ -199,6 +199,7 @@ * @return */ public static String getElectricity(){ String valueTotal = "0"; String value = "0"; HttpRequest post = HttpRequest.post("https://www.zsdcloud.cn:8443/openApi/equipment/select.action"); post.form("token", accessToken); @@ -215,16 +216,23 @@ } String string1 = jsonObject.getString("result"); JSONObject jsonObject1 = JSONObject.parseObject(string1); String realInfo = jsonObject1.getString("realInfo"); String realInfo = jsonObject1.getString("childList"); JSONArray jsonArray = JSONArray.parseArray(realInfo); for (Object o : jsonArray) { JSONObject jsonObject2 = JSONObject.parseObject(o.toString()); if(jsonObject2.get("Name").toString().equals("累积日充电量")){ value= jsonObject2.get("Value").toString(); break; String string2 = jsonObject2.get("valueList").toString(); JSONArray jsonArray1 = JSONArray.parseArray(string2); for (Object o1 : jsonArray1) { JSONObject jsonObject3 = JSONObject.parseObject(o1.toString()); if(jsonObject3.get("Name").toString().equals("系统累计充电量")){ valueTotal= jsonObject3.get("Value").toString(); } if(jsonObject3.get("Name").toString().equals("系统累计放电量")){ value= jsonObject3.get("Value").toString(); } } } return value; return valueTotal+"_"+value; } public static void main(String[] args) throws Exception { String electricity = getElectricity(); ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/ali/v2/H5PayUtil.java
@@ -199,11 +199,12 @@ * 支付宝退款 * * @param trade_no 支付宝交易号 * @param outRequestNo 退款业务流水号 * @param refund_amount 退款金额 * @return * @throws AlipayApiException */ public Map<String, String> aliRefund(String trade_no, String refund_amount) { public Map<String, String> aliRefund(String trade_no,String outRequestNo, String refund_amount) { try { // 初始化SDK AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig()); @@ -212,6 +213,7 @@ // 设置订单支付时传入的商户订单号 model.setTradeNo(trade_no); model.setRefundAmount(refund_amount); model.setOutRequestNo(outRequestNo); model.setRefundReason("充电退款"); request.setBizModel(model); AlipayTradeRefundResponse response = alipayClient.execute(request); ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/H5AliPayController.java
@@ -79,7 +79,7 @@ */ @PostMapping("/refund") public R<RefundResp> refund(@RequestBody RefundReq dto){ Map<String, String> map = h5PayUtil.aliRefund(dto.getOutTradeNo(), dto.getRefundAmount()); Map<String, String> map = h5PayUtil.aliRefund(dto.getOutTradeNo(),dto.getOutRequestNo(), dto.getRefundAmount()); RefundResp refundResp = new RefundResp(); refundResp.setCode(map.get("code")); refundResp.setMsg(map.get("msg"));