无关风月
2025-02-12 d0b83b31dba32844fc6fe8ff84afa0d960e18de7
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -80,6 +80,7 @@
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.time.temporal.ChronoUnit;
import java.time.temporal.WeekFields;
import java.util.*;
import java.util.concurrent.*;
@@ -395,7 +396,7 @@
            if(null != data){
               //支付失败,删除无效的订单
               String tradeStatus = data.getTradeStatus();
               if(tradeStatus.equals("TRADE_CLOSED")){
               if(null != tradeStatus && tradeStatus.equals("TRADE_CLOSED")){
                  this.removeById(tChargingOrder.getId());
               }
            }
@@ -887,10 +888,13 @@
            dto.setRefundReason("充电失败,取消充电订单");
            RefundResp resp = aliPaymentClient.refund(dto).getData();
            if(null != resp){
               AjaxResult success = chargingOrderStartupFailureWxRefund(resp.getOutTradeNo(), resp.getTradeNo(), "SUCCESS", null);
               if(success.isSuccess()){
                  chargingOrderRefundService.save(chargingOrderRefund);
               chargingOrderRefundService.save(chargingOrderRefund);
               try {
                  Thread.sleep(1000);
               } catch (InterruptedException e) {
                  throw new RuntimeException(e);
               }
               chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
            }
         }
@@ -1096,7 +1100,7 @@
            if(1 == doubleIntegration){
               num1 *= 2;
            }
         }
         
         GetInviteUser query = new GetInviteUser();
@@ -1147,7 +1151,7 @@
      TChargingGun chargingGun = chargingGunClient.getChargingGunByCode(code).getData();
      TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, chargingGun.getId())
            .orderByDesc(TChargingOrder::getEndTime).eq(TChargingOrder::getRechargePaymentStatus, 2).last(" limit 0, 1"));
      if(null != order && order.getStatus() != 3){
      if(null != order && order.getStatus() != 4){
         return;
      }
      
@@ -1186,8 +1190,12 @@
    @Override
    public TCharingOrderVO chargingOrder(ChargingOrderQuery dto) {
      TCharingOrderVO tCharingOrderVO = new TCharingOrderVO();
      List<TChargingGun> allGun = chargingGunClient.getAllGun().getData();
      List<TChargingPile> allPile = chargingGunClient.getAllPile().getData();
      List<Site> data9 = siteClient.getSiteAll().getData();
      List<TAppUser> data6 = appUserClient.getAllUser().getData();
      List<Partner> data7 = siteClient.getAllPartner().getData();
      List<TAppUserCar> data4 = appUserCarClient.getAllCar().getData();
      String startTime1 = null;
      String startTime2 = null;
      String endTime1 = null;
@@ -1204,7 +1212,7 @@
         endTime2 = split[1];
      }
      PageInfo<ChargingOrderVO> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize());
      PageInfo<ChargingOrderVO> pageInfo1 = new PageInfo<>(1,9999999);
      PageInfo<ChargingOrderVO> pageInfo1 = new PageInfo<>(1,999999999);
      if (StringUtils.hasLength(dto.getPhone())){
         List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData();
@@ -1259,6 +1267,8 @@
       BigDecimal commissionMoney = new BigDecimal("0");
       BigDecimal refundMoney = new BigDecimal("0");
       BigDecimal paymentMoney = new BigDecimal("0");
      List<String> collect2 = list.stream().map(TChargingOrder::getCode).collect(Collectors.toList());
      List<TChargingOrderAccountingStrategy> list3 = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>());
      for (ChargingOrderVO chargingOrderVO : list) {
         if (roleType == 2){
@@ -1272,65 +1282,71 @@
         chargingOrderVO.setCommissionAmount(chargingOrderVO.getOrderAmount()!=null?chargingOrderVO.getOrderAmount().multiply(new BigDecimal("0.006")):new BigDecimal("0"));
         chargingOrderVO.setPlatFormMoney(chargingOrderVO.getOrderAmount()!=null?chargingOrderVO.getOrderAmount().multiply(new BigDecimal("0.006")).setScale(2,BigDecimal.ROUND_DOWN):new BigDecimal("0"));
         chargingOrderVO.setUid(chargingOrderVO.getId()+"");
         TChargingGun data3 = chargingGunClient.getChargingGunById(chargingOrderVO.getChargingGunId()).getData();
         TChargingPile data2 = chargingPileClient.getChargingPileById(chargingOrderVO.getChargingPileId()).getData();
         TChargingGun data3 = allGun.stream().filter(e->e.getId().equals(chargingOrderVO.getChargingGunId())).findFirst().orElse(null);
         TChargingPile data2 = allPile.stream().filter(e->e.getId().equals(chargingOrderVO.getChargingPileId())).findFirst().orElse(null);
         if (chargingOrderVO.getSiteId()!=null){
            List<Integer> integers = new ArrayList<>();
            integers.add(chargingOrderVO.getSiteId());
            List<Site> data = siteClient.getSiteByIds(integers).getData();
            if (!data.isEmpty())chargingOrderVO.setSiteName(data.get(0).getName());
            Site site = data9.stream().filter(e -> e.getId().equals(chargingOrderVO.getSiteId())).findFirst().orElse(null);
            if (site!=null)chargingOrderVO.setSiteName(site.getName());
         }
         if (data2!=null && data3!=null){
            chargingOrderVO.setTerminalName(data2.getName()+"-"+data3.getName());
         }
         // 充电订单 明细记录
         List<TChargingOrderAccountingStrategy> chargingOrderId = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>()
               .eq("charging_order_id", chargingOrderVO.getId()));
         UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrderVO.getCode()).getData();
         if (data5!=null && data5.getCumulative_charging_time()!=null){
            long l = data5.getCumulative_charging_time() * 60L;
            chargingOrderVO.setChargingSecond(l);
         List<TChargingOrderAccountingStrategy> chargingOrderId = list3.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderVO.getId())).collect(Collectors.toList());
         if (chargingOrderVO.getStartTime()!=null && chargingOrderVO.getEndTime()!=null){
            LocalDateTime startTime = chargingOrderVO.getStartTime();
            LocalDateTime endTime = chargingOrderVO.getEndTime();
            // 计算时间差 单位秒
            long between = ChronoUnit.SECONDS.between(startTime, endTime);
            chargingOrderVO.setChargingSecond(between);
         }
         // 充电时段数
         int size = chargingOrderId.size();
         chargingOrderVO.setCount(size);
         // 用户手机号
         TAppUser data = appUserClient.getUserById(chargingOrderVO.getAppUserId()).getData();
         TAppUser data = data6.stream().filter(e -> e.getId().equals(chargingOrderVO.getAppUserId())).findFirst().orElse(null);
         if (data!=null){
            // 车牌号
            chargingOrderVO.setPhone(data.getPhone());
            List<Long> longs = new ArrayList<>();
            if (chargingOrderVO.getAppUserCarId()!=null){
               longs.add(chargingOrderVO.getAppUserCarId());
               List<TAppUserCar> data1 = appUserCarClient.getCarByIds(longs).getData();
               if (!data1.isEmpty()){
                  chargingOrderVO.setLicensePlate(data1.get(0).getLicensePlate());
               TAppUserCar tAppUserCar = data4.stream().filter(e -> e.getId().equals(chargingOrderVO.getAppUserCarId())).findFirst().orElse(null);
               if (tAppUserCar!=null){
                  chargingOrderVO.setLicensePlate(tAppUserCar.getLicensePlate());
               }
            }
         }
      }
      List<Long> orderIds = list1.stream().map(TChargingOrder::getId).collect(Collectors.toList());
      if(orderIds.isEmpty())orderIds.add(-1L);
      List<TChargingOrderRefund> chargingOrderRefunds = chargingOrderRefundService.lambdaQuery()
            .in(TChargingOrderRefund::getChargingOrderId, orderIds)
            .eq(TChargingOrderRefund::getRefundStatus,2).list();
      for (ChargingOrderVO chargingOrderVO : list1) {
         paymentMoney= paymentMoney.add(chargingOrderVO.getPaymentAmount()!=null?chargingOrderVO.getPaymentAmount():new BigDecimal("0"));
         commissionMoney = commissionMoney.add(chargingOrderVO.getOrderAmount()!=null?chargingOrderVO.getOrderAmount().multiply(new BigDecimal("0.006")):new BigDecimal("0"));
         if (chargingOrderVO.getChargingCapacity()!=null){
            total = total.add(chargingOrderVO.getElectricity()!=null?chargingOrderVO.getElectricity():new BigDecimal("0"));
         }
         // 充电订单 明细记录
         List<TChargingOrderAccountingStrategy> chargingOrderId = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>()
               .eq("charging_order_id", chargingOrderVO.getId()));
         UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrderVO.getCode()).getData();
         if (data5!=null && data5.getCumulative_charging_time()!=null){
            long l = data5.getCumulative_charging_time() * 60L;
            chargingOrderVO.setChargingSecond(l);
            time+=l;
         if (chargingOrderVO.getStartTime()!=null && chargingOrderVO.getEndTime()!=null){
            LocalDateTime startTime = chargingOrderVO.getStartTime();
            LocalDateTime endTime = chargingOrderVO.getEndTime();
            // 计算时间差 单位秒
            long between = ChronoUnit.SECONDS.between(startTime, endTime);
            time+=between;
         }
         List<TChargingOrderRefund> list2 = chargingOrderRefundService.lambdaQuery().eq(TChargingOrderRefund::getRefundStatus, 2)
               .eq(TChargingOrderRefund::getChargingOrderId, chargingOrderVO.getId()).list();
         List<TChargingOrderRefund> list2 = chargingOrderRefunds.stream().filter(e -> e.getChargingOrderId() != null && e.getChargingOrderId().equals(chargingOrderVO.getId()))
               .collect(Collectors.toList());
         for (TChargingOrderRefund tChargingOrderRefund : list2) {
            if (tChargingOrderRefund.getRefundStatus()==2){
               refundMoney = refundMoney.add(tChargingOrderRefund.getRefundTotalAmount());
            }
         }
         electronicMoney = electronicMoney.add(chargingOrderVO.getElectrovalence()!=null?chargingOrderVO.getElectrovalence():new BigDecimal("0"));
         serviceMoney = serviceMoney.add(chargingOrderVO.getServiceCharge()!=null?chargingOrderVO.getServiceCharge():new BigDecimal("0"));
@@ -1427,6 +1443,9 @@
      String endTime1 = null;
      String endTime2 = null;
      List<TChargingGun> allGun = chargingGunClient.getAllGun().getData();
      List<TChargingPile> allPile = chargingGunClient.getAllPile().getData();
      if (StringUtils.hasLength(dto.getStartTime())){
         String[] split = dto.getStartTime().split(" - ");
         startTime1 = split[0];
@@ -1499,6 +1518,9 @@
      dto.setSiteIds(siteIds);
      PageInfo<ChargingOrderListVO> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize());
      List<ChargingOrderListVO> list = this.baseMapper.chargingList(pageInfo,dto,startTime1,startTime2,endTime1,endTime2);
      List<Integer> siteIdsList = list.stream().map(ChargingOrderListVO::getSiteId).collect(Collectors.toList());
      if (siteIdsList.isEmpty())siteIdsList.add(-1);
      List<Site> sites = siteClient.getSiteByIds(siteIdsList).getData();
      for (ChargingOrderListVO chargingOrderListVO : list) {
         if (roleType==2){
@@ -1515,24 +1537,23 @@
         chargingOrderListVO.setUid(chargingOrderListVO.getId()+"");
         List<Integer> integers = new ArrayList<>();
         integers.add(chargingOrderListVO.getSiteId());
         List<Site> data = siteClient.getSiteByIds(integers).getData();
         if (!data.isEmpty()) {
            chargingOrderListVO.setSiteName(data.get(0).getName());
         Site site = sites.stream().filter(e -> e.getId().equals(chargingOrderListVO.getSiteId())).findFirst().orElse(null);
         if (site!=null){
            chargingOrderListVO.setSiteName(site.getName());
         }
         if (chargingOrderListVO.getChargingGunId()!=null && chargingOrderListVO.getChargingPileId()!=null){
            TChargingGun data1 = chargingGunClient.getChargingGunById(chargingOrderListVO.getChargingGunId()).getData();
            TChargingPile data2 = chargingPileClient.getChargingPileById(chargingOrderListVO.getChargingPileId()).getData();
            TChargingGun data1 = allGun.stream().filter(e->e.getId().equals(chargingOrderListVO.getChargingGunId())).findFirst().orElse(null);
            TChargingPile data2 = allPile.stream().filter(e->e.getId().equals(chargingOrderListVO.getChargingPileId())).findFirst().orElse(null);
            if (data2 != null && data1 != null) {
               chargingOrderListVO.setTerminalName(data2.getName() + "-" + data1.getName());
            }
         }
         // 获取充电时间
         UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrderListVO.getCode()).getData();
         if (data5!=null){
            if (data5.getTime_remaining()!=null){
               chargingOrderListVO.setChargingSecond(data5.getCumulative_charging_time()*60L);
            }
         if (chargingOrderListVO.getStartTime()!=null && chargingOrderListVO.getEndTime()!=null){
            LocalDateTime startTime = chargingOrderListVO.getStartTime();
            LocalDateTime endTime = chargingOrderListVO.getEndTime();
            // 计算时间差 单位秒
            long between = ChronoUnit.SECONDS.between(startTime, endTime);
            chargingOrderListVO.setChargingSecond(between);
         }
         // 获取开始SOC 结束soc
         if (chargingOrderListVO.getCode()!=null){
@@ -1568,7 +1589,6 @@
                  }
               }
               chargingOrderListVO.setPhone(data3.getPhone());
            }
         }
         List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategyService.lambdaQuery()
@@ -1617,6 +1637,28 @@
      // 不分页
      PageInfo<ChargingOrderListVO> pageInfo1 = new PageInfo<>(1,999999999);
      List<ChargingOrderListVO> list1 = this.baseMapper.chargingList(pageInfo1,dto,startTime1,startTime2,endTime1,endTime2);
      for (ChargingOrderListVO chargingOrderListVO : list1) {
         List<Integer> integers = new ArrayList<>();
         integers.add(chargingOrderListVO.getSiteId());
         Site site = sites.stream().filter(e -> e.getId().equals(chargingOrderListVO.getSiteId())).findFirst().orElse(null);
         if (site!=null){
            chargingOrderListVO.setSiteName(site.getName());
         }
         if (chargingOrderListVO.getStartTime()!=null && chargingOrderListVO.getEndTime()!=null){
            LocalDateTime startTime = chargingOrderListVO.getStartTime();
            LocalDateTime endTime = chargingOrderListVO.getEndTime();
            // 计算时间差 单位秒
            long between = ChronoUnit.SECONDS.between(startTime, endTime);
            chargingOrderListVO.setChargingSecond(between);
         }
         if (chargingOrderListVO.getChargingGunId()!=null && chargingOrderListVO.getChargingPileId()!=null){
            TChargingGun data1 = allGun.stream().filter(e->e.getId().equals(chargingOrderListVO.getChargingGunId())).findFirst().orElse(null);
            TChargingPile data2 = allPile.stream().filter(e->e.getId().equals(chargingOrderListVO.getChargingPileId())).findFirst().orElse(null);
            if (data2 != null && data1 != null) {
               chargingOrderListVO.setTerminalName(data2.getName() + "-" + data1.getName());
            }
         }
      }
      chargingOrderTimeVO.setExportList(list1);
      chargingOrderTimeVO.setOrderCount(list1.size());
      // 计算充电总度数
@@ -1642,14 +1684,17 @@
      BigDecimal feng = new BigDecimal("0");
      BigDecimal ping = new BigDecimal("0");
      BigDecimal gu = new BigDecimal("0");
      List<Long> collect = list1.stream().map(ChargingOrderListVO::getId).collect(Collectors.toList());
      List<TChargingOrderAccountingStrategy> chargingOrderAccountingStrategies = chargingOrderAccountingStrategyService.lambdaQuery()
            .in(TChargingOrderAccountingStrategy::getChargingOrderId,collect).list();
      for (ChargingOrderListVO chargingOrderListVO : list1) {
         if (chargingOrderListVO.getChargingCapacity()!=null)electronic = electronic.add(chargingOrderListVO.getElectricity());
         if (chargingOrderListVO.getPaymentAmount()!=null)paymentAmount = paymentAmount.add(chargingOrderListVO.getPaymentAmount());
         if (chargingOrderListVO.getElectrovalence()!=null)electrovalence = electrovalence.add(chargingOrderListVO.getElectrovalence());
         if (chargingOrderListVO.getServiceCharge()!=null)serviceCharge = serviceCharge.add(chargingOrderListVO.getServiceCharge());
         List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategyService.lambdaQuery()
               .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrderListVO.getId()).list();
         List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategies.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderListVO.getId()))
               .collect(Collectors.toList());
         for (TChargingOrderAccountingStrategy temp : list2) {
            switch (temp.getType()){
               case 1:
@@ -1731,6 +1776,8 @@
   public ChargingOrderListInfoVO chargingInfo(String uid) {
      TChargingOrder chargingOrder= this.getById(uid);
      ChargingOrderListInfoVO chargingOrderListInfoVO = new ChargingOrderListInfoVO();
      chargingOrderListInfoVO.setStartTime(chargingOrder.getStartTime());
      chargingOrderListInfoVO.setEndTime(chargingOrder.getEndTime());
      chargingOrderListInfoVO.setStatus(chargingOrder.getStatus());
      BigDecimal bigDecimal = new BigDecimal("0.006");
      if (chargingOrder.getOrderAmount()!=null){
@@ -1807,13 +1854,12 @@
         chargingOrderListInfoVO.setList(data6);
      }
      // 获取充电时间
      UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrder.getCode()).getData();
      if (data5!=null){
         if (data5.getTime_remaining()!=null){
            chargingOrderListInfoVO.setChargingSecond(data5.getCumulative_charging_time()*60L+"");
         }
      if (chargingOrderListInfoVO.getStartTime()!=null && chargingOrderListInfoVO.getEndTime()!=null){
         LocalDateTime startTime = chargingOrderListInfoVO.getStartTime();
         LocalDateTime endTime = chargingOrderListInfoVO.getEndTime();
         // 计算时间差 单位秒
         long between = ChronoUnit.SECONDS.between(startTime, endTime);
         chargingOrderListInfoVO.setChargingSecond(between+"");
      }
      if (chargingOrder.getAppUserCarId()!=null){
@@ -1907,11 +1953,11 @@
    */
   @Override
   @GlobalTransactional(rollbackFor = Exception.class)
   public void endChargeBillingCharge(TransactionRecordMessageVO vo) {
   public R endChargeBillingCharge(TransactionRecordMessageVO vo) {
      TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, vo.getTransaction_serial_number()));
      Integer status = chargingOrder.getStatus();
      if(status == 5){
         return;
         return R.ok();
      }
      
      //如果使用优惠券需要判断优惠券是否满足使用条件
@@ -1937,45 +1983,45 @@
            String end_time = vo.getEnd_time();
            long start = sdfs.parse(start_time).getTime();
            long end = sdfs.parse(end_time).getTime();
            boolean b = false;
            Class<? extends TransactionRecordMessageVO> clazz = vo.getClass();
            for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) {
               AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i);
               long time = sdfs.parse(start_time.split(" ")[0] + " " + strategyDetail.getStartTime() + ":00").getTime();
               if(start >= time){
                  b = true;
            /**
             * "start_time": "2025-01-03 23:06:43.00",
             *    "end_time": "2025-01-04 00:39:39.00",
             */
            for (int i = accountingStrategyDetailOrderList.size(); i > 0; i--) {
               AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i - 1);
               long time = sdfs.parse(start_time.split(" ")[0] + " " + strategyDetail.getEndTime() + ":00").getTime();
               if(time < start){
                  break;
               }
               //开始充电
               if(b){
                  //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)
                  Object invoke = null;
                  switch (strategyDetail.getType()){
                     case 1:
                        //充电度数
                        invoke = clazz.getMethod("getSpike_charge" + (i + 1)).invoke(vo);
                        break;
                     case 2:
                        //充电度数
                        invoke = clazz.getMethod("getPeak_charge" + (i + 1)).invoke(vo);
                        break;
                     case 3:
                        //充电度数
                        invoke = clazz.getMethod("getFlat_charge" + (i + 1)).invoke(vo);
                        break;
                     case 4:
                        //充电度数
                        invoke = clazz.getMethod("getValley_charge" + (i + 1)).invoke(vo);
                        break;
                  }
                  if(null == invoke || Double.valueOf(invoke.toString()) == 0){
                     continue;
                  }
                  BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString());
                  AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo();
                  BeanUtils.copyProperties(strategyDetail, vo1);
                  vo1.setChargingCapacity(sharp_peak_charge);
                  lists.add(vo1);
               //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)
               Object invoke = null;
               switch (strategyDetail.getType()){
                  case 1:
                     //充电度数
                     invoke = clazz.getMethod("getSpike_charge" + (i)).invoke(vo);
                     break;
                  case 2:
                     //充电度数
                     invoke = clazz.getMethod("getPeak_charge" + (i)).invoke(vo);
                     break;
                  case 3:
                     //充电度数
                     invoke = clazz.getMethod("getFlat_charge" + (i)).invoke(vo);
                     break;
                  case 4:
                     //充电度数
                     invoke = clazz.getMethod("getValley_charge" + (i)).invoke(vo);
                     break;
               }
               if(null == invoke || Double.valueOf(invoke.toString()) == 0){
                  continue;
               }
               BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString());
               AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo();
               BeanUtils.copyProperties(strategyDetail, vo1);
               vo1.setChargingCapacity(sharp_peak_charge);
               lists.add(vo1);
            }
            
            //第二天的
@@ -1986,37 +2032,34 @@
               if(time > end){
                  break;
               }
               //开始充电
               if(b){
                  //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)
                  Object invoke = null;
                  switch (strategyDetail.getType()){
                     case 1:
                        //充电度数
                        invoke = clazz.getMethod("getSpike_charge" + (i + 1)).invoke(vo);
                        break;
                     case 2:
                        //充电度数
                        invoke = clazz.getMethod("getPeak_charge" + (i + 1)).invoke(vo);
                        break;
                     case 3:
                        //充电度数
                        invoke = clazz.getMethod("getFlat_charge" + (i + 1)).invoke(vo);
                        break;
                     case 4:
                        //充电度数
                        invoke = clazz.getMethod("getValley_charge" + (i + 1)).invoke(vo);
                        break;
                  }
                  if(null == invoke || Double.valueOf(invoke.toString()) == 0){
                     continue;
                  }
                  BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString());
                  AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo();
                  BeanUtils.copyProperties(strategyDetail, vo1);
                  vo1.setChargingCapacity(sharp_peak_charge);
                  lists.add(vo1);
               //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)
               Object invoke = null;
               switch (strategyDetail.getType()){
                  case 1:
                     //充电度数
                     invoke = clazz.getMethod("getSpike_charge" + (i + 1)).invoke(vo);
                     break;
                  case 2:
                     //充电度数
                     invoke = clazz.getMethod("getPeak_charge" + (i + 1)).invoke(vo);
                     break;
                  case 3:
                     //充电度数
                     invoke = clazz.getMethod("getFlat_charge" + (i + 1)).invoke(vo);
                     break;
                  case 4:
                     //充电度数
                     invoke = clazz.getMethod("getValley_charge" + (i + 1)).invoke(vo);
                     break;
               }
               if(null == invoke || Double.valueOf(invoke.toString()) == 0){
                  continue;
               }
               BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString());
               AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo();
               BeanUtils.copyProperties(strategyDetail, vo1);
               vo1.setChargingCapacity(sharp_peak_charge);
               lists.add(vo1);
            }
         }else{
            for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) {
@@ -2054,21 +2097,12 @@
         }
      }catch (Exception e){
         e.printStackTrace();
         R.fail("处理失败");
      }
      
      //开始处理明细
      SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SS");
      SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm");
      Date start = null;
      Date end = null;
      try {
         start = sdf3.parse(vo.getStart_time());
         end = sdf3.parse(vo.getEnd_time());
      } catch (ParseException e) {
         throw new RuntimeException(e);
      }
      for (AccountingStrategyDetailOrderVo strategyDetail : lists) {
      for (int i = 0; i < lists.size(); i++) {
         AccountingStrategyDetailOrderVo strategyDetail = lists.get(i);
         BigDecimal sharp_peak_charge = strategyDetail.getChargingCapacity();
         TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy();
         chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId());
@@ -2077,16 +2111,17 @@
         chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence());
         chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge());
         chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge());
         if(start.getTime() >= strategyDetail.getStart()){
            chargingOrderAccountingStrategy.setStartTime(sdf2.format(start));
         if(i == 0){
            String time = vo.getStart_time().split(" ")[1];
            chargingOrderAccountingStrategy.setStartTime(time.substring(0, time.lastIndexOf(":")));
         }else{
            chargingOrderAccountingStrategy.setStartTime(strategyDetail.getStartTime());
         }
         if(end.getTime() >= strategyDetail.getEnd()){
            chargingOrderAccountingStrategy.setEndTime(strategyDetail.getEndTime());
         if(i == lists.size() - 1){
            String time = vo.getEnd_time().split(" ")[1];
            chargingOrderAccountingStrategy.setEndTime(time.substring(0, time.lastIndexOf(":")));
         }else{
            chargingOrderAccountingStrategy.setEndTime(sdf2.format(end));
            chargingOrderAccountingStrategy.setEndTime(strategyDetail.getEndTime());
         }
         
         //已充电总度数
@@ -2096,6 +2131,7 @@
         BigDecimal vipDiscountAmount = BigDecimal.ZERO;
         //计算优惠金额
         if(null != chargingOrder.getVipDiscount()){
            //0.58折
            vipDiscountAmount = serviceCharge.multiply(new BigDecimal(1).subtract(chargingOrder.getVipDiscount()));
            serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount());
         }
@@ -2111,8 +2147,6 @@
         periodServicePrice_total = periodServicePrice_total.add(originalServicePrice);
         total = total.add(electrovalenc.add(originalServicePrice));
      }
      
      //原金额
      BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
@@ -2151,16 +2185,20 @@
      discountAmount = discountAmount.setScale(4, RoundingMode.HALF_EVEN);
      payAmount = payAmount.subtract(discountAmount);
      periodServicePrice_total = periodServicePrice_total.subtract(discountAmount);
      TChargingOrder order = new TChargingOrder();
      order.setId(chargingOrder.getId());
      order.setAppUserId(chargingOrder.getAppUserId());
      UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrder.getCode()).getData();
      if(null != uploadRealTimeMonitoringData && null == chargingOrder.getEndMode()){
         Integer soc = uploadRealTimeMonitoringData.getSoc();
         order.setEndMode(soc > 98 ? 2 : 3);
      }else{
         order.setEndMode(1);
         if(soc > 98){
            order.setEndMode(2);
         }else if(chargingOrder.getResidualAmount().compareTo(new BigDecimal(1)) <= 0){
            order.setEndMode(3);
         }else{
            order.setEndMode(0);
         }
      }
      order.setResidualAmount(rechargeAmount.subtract(total).setScale(2, RoundingMode.HALF_EVEN));
      order.setStartTime(LocalDateTime.parse(vo.getStart_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS")));
@@ -2295,6 +2333,7 @@
      referralReward(chargingOrder);
      
      //开始构建退款费用
      refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN);
      if(refundAmount.compareTo(BigDecimal.ZERO) > 0){
         Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
         //构建退款明细
@@ -2332,20 +2371,22 @@
         if(2 == rechargePaymentType){
            RefundReq dto = new RefundReq();
            dto.setOutTradeNo(chargingOrder.getCode());
            dto.setOutRequestNo(chargingOrderRefund.getCode());
            dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
            dto.setRefundAmount(refundAmount.toString());
            dto.setRefundReason("充电完成退款");
            RefundResp resp = aliPaymentClient.refund(dto).getData();
            if(null != resp){
               AjaxResult success = chargingOrderStartupFailureWxRefund(resp.getOutTradeNo(), resp.getTradeNo(), "SUCCESS", null);
               if(success.isSuccess()){
                  chargingOrderRefundService.save(chargingOrderRefund);
               }
               chargingOrderRefundService.save(chargingOrderRefund);
               this.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
            }
         }
         
      }
      return R.ok();
   }
   
   @Override
   public List<Map<String, Object>> getByDate(List<Long> chargingOrderIds) {
@@ -2435,6 +2476,10 @@
   private TVipOrderService vipOrderService;
   @Resource
   private TVipOrderRefundService vipOrderRefundService;
   @Override
   public R payRefund(PayOrderRefundDto payOrderQueryDto) {
         if (payOrderQueryDto.getType()==1){
@@ -2492,7 +2537,6 @@
               dto.setRefundReason("取消订单");
               RefundResp resp = aliPaymentClient.refund(dto).getData();
               if(null != resp){
                  SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
                  chargingOrderRefund.setRefundStatus(2);
                  chargingOrderRefund.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
                  this.baseMapper.updateById(tChargingOrder);
@@ -2500,11 +2544,6 @@
               }
            }
         }
         if (payOrderQueryDto.getType()==2){
            TShoppingOrder tChargingOrder = shoppingOrderService.getById(payOrderQueryDto.getOrderId());
@@ -2560,16 +2599,10 @@
               dto.setRefundReason("取消订单");
               RefundResp resp = aliPaymentClient.refund(dto).getData();
               if(null != resp){
                  SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
                  tChargingOrder.setRefundStatus(2);
                  tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
                  shoppingOrderService.updateById(tChargingOrder);
                  shoppingOrderRefundService.save(chargingOrderRefund);
               }
            }
@@ -2580,8 +2613,6 @@
         if (tChargingOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount())==-1){
            return R.fail("退款金额需小于支付金额");
         }
         TVipOrderRefund chargingOrderRefund = new TVipOrderRefund();
         chargingOrderRefund.setVipOrderId(tChargingOrder.getId());
         chargingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount());
@@ -2627,23 +2658,13 @@
            dto.setRefundReason("取消订单");
            RefundResp resp = aliPaymentClient.refund(dto).getData();
            if(null != resp){
               SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
               tChargingOrder.setRefundStatus(2);
               tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
               vipOrderService.updateById(tChargingOrder);
               vipOrderRefundService.save(chargingOrderRefund);
            }
         }
      }
      return R.ok();
   }
@@ -2699,7 +2720,7 @@
            .eq("recharge_payment_status",2);
      switch (dto.getType()){
         case 1:
            eq.between("start_time", localDateTime, localDateTime1);
            eq.between("pay_time", localDateTime, localDateTime1);
            break;
         case 2:
            eq.between("end_time", localDateTime, localDateTime1);