Pu Zhibing
1 天以前 8b0cf2731d2b61999fdd1aeee91567dc47d67e14
Merge branch 'dev' of http://120.76.84.145:10101/gitblit/r/java/mx_charging_pile

 Conflicts:
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
9个文件已修改
578 ■■■■■ 已修改文件
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/produce/ChargingMessageListener.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/GovernmentCloudTask.java 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TScreenContentController.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TScreenContentServiceImpl.java 79 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/EnergyRefreshService.java 299 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/KsolarUtils.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/ali/v2/H5PayUtil.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/H5AliPayController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
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"));