Pu Zhibing
2024-10-22 b4b44f2021dbf083b7057fb7e192b72d08b4bf17
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -70,9 +70,7 @@
import java.math.MathContext;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.time.temporal.WeekFields;
@@ -207,6 +205,7 @@
      Map<String, Object> map = new HashMap<>();
      int size = this.baseMapper.getMyChargingOrderList(appUserId, 1, null, null).size();
      map.put("number", size);
      query.setPageCurr((query.getPageCurr() - 1) * query.getPageSize());
      List<TChargingOrder> list = this.baseMapper.getMyChargingOrderList(appUserId, query.getType(), query.getPageCurr(), query.getPageSize());
      List<MyChargingOrderList> orderLists = new ArrayList<>();
      for (TChargingOrder tChargingOrder : list) {
@@ -260,8 +259,8 @@
      }else{
         myChargingOrderInfo.setLicensePlate("无");
      }
      myChargingOrderInfo.setStartTime(chargingOrder.getStartTime().toInstant(ZoneOffset.of("+8")).toEpochMilli());
      myChargingOrderInfo.setEndTime(chargingOrder.getEndTime().toInstant(ZoneOffset.of("+8")).toEpochMilli());
      myChargingOrderInfo.setStartTime(chargingOrder.getStartTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
      myChargingOrderInfo.setEndTime(chargingOrder.getEndTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
      myChargingOrderInfo.setOrderAmount(chargingOrder.getOrderAmount());
      myChargingOrderInfo.setPaymentAmount(chargingOrder.getPaymentAmount());
      myChargingOrderInfo.setRechargeAmount(chargingOrder.getRechargeAmount());
@@ -306,7 +305,7 @@
         }
         myChargingOrderInfo.setPower(power);
      }
      myChargingOrderInfo.setActionable(myChargingOrderInfo.getEndTime() + 604800000L > System.currentTimeMillis() ? 0 : 1);
      myChargingOrderInfo.setActionable(myChargingOrderInfo.getEndTime() + 604800000L < System.currentTimeMillis() ? 0 : 1);
      return myChargingOrderInfo;
   }
   
@@ -319,6 +318,8 @@
   @Override
   public List<MyChargingOrderList> getNoInvoicedOrder(GetNoInvoicedOrder query) {
      Long appUserId = tokenService.getLoginUserApplet().getUserId();
      query.setPageCurr((query.getPageCurr() - 1) * query.getPageSize());
      List<TChargingOrder> orderList = this.baseMapper.getNoInvoicedOrder(appUserId, query.getMonth(), query.getPageCurr(), query.getPageSize());
      List<MyChargingOrderList> list = new ArrayList<>();
      for (TChargingOrder tChargingOrder : orderList) {
@@ -440,7 +441,6 @@
      chargingOrder.setRechargePaymentStatus(1);
      chargingOrder.setRechargeAmount(addChargingOrder.getPaymentAmount());
      chargingOrder.setAppCouponId(addChargingOrder.getAppUserCouponId());
      chargingOrder.setVipDiscount(new BigDecimal(10));
      chargingOrder.setVipDiscountAmount(BigDecimal.ZERO);
      chargingOrder.setOrderSource(0);
      chargingOrder.setTitle("【充电桩充电】" + chargingPile.getNumber() + "号桩/" + tChargingGun.getCode() + "号枪");
@@ -470,7 +470,7 @@
         TAppUserVipDetail vipDetail = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
         if(null != vipDetail){
            Integer chargeNum = vipDetail.getChargeNum();
            if(0 > chargeNum){
            if(0 < chargeNum){
               chargingOrder.setVipDiscount(discount);
            }
         }
@@ -582,7 +582,7 @@
               Integer start = Integer.valueOf(accountingStrategyDetailOrder.getStartTime().replaceAll(":", ""));
               Integer end = Integer.valueOf(accountingStrategyDetailOrder.getEndTime().replaceAll(":", ""));
               String[] split = accountingStrategyDetailOrder.getEndTime().split(":");
               if(sta || now >= start){
               if(sta || (now >= start && now < end)){
                  sta = true;
                  
                  Calendar end_calendar = Calendar.getInstance();
@@ -604,16 +604,16 @@
                  //每秒需要支付的服务费金额
                  BigDecimal s_server_amount = s_degrees.multiply(accountingStrategyDetailOrder.getServiceCharge());
                  //计算剩余金额能充多长时间的电
                  long times = rechargeAmount1.divide(s_server_amount, 0, RoundingMode.DOWN).longValue();
                  long times = rechargeAmount1.divide(s_total_amount, 0, RoundingMode.DOWN).longValue();
                  if(times > m){
                     //充电时间跨度两个计费策略,需要继续对下一个策略进行计算
                     serviceCharge = s_server_amount.multiply(new BigDecimal(m));
                     discountAmount = discountAmount.add(serviceCharge.multiply((new BigDecimal(10).subtract(discount)).divide(new BigDecimal(10))));
                     discountAmount = discountAmount.add(serviceCharge.multiply((new BigDecimal(1).subtract(discount))));
                     rechargeAmount1 = rechargeAmount1.subtract(s_total_amount.multiply(new BigDecimal(m)));
                     nowTimeMillis = null;
                  }else{
                     serviceCharge = s_server_amount.multiply(new BigDecimal(times));
                     discountAmount = discountAmount.add(serviceCharge.multiply((new BigDecimal(10).subtract(discount)).divide(new BigDecimal(10))));
                     discountAmount = discountAmount.add(serviceCharge.multiply((new BigDecimal(1).subtract(discount))));
                     break;
                  }
               }
@@ -932,7 +932,9 @@
         chargingDetails.setCompletionRatio(data.getSoc());
         chargingDetails.setRemainingChargeTime(data.getTime_remaining());
         chargingDetails.setChargedDegrees(data.getCharging_degree());
         chargingDetails.setChargedTime(data.getCumulative_charging_time());
         Integer h = Integer.valueOf(data.getCumulative_charging_time() / 60);
         Integer m = Integer.valueOf(data.getCumulative_charging_time() % 60);
         chargingDetails.setChargedTime(String.format("%02d", h) + ":" + String.format("%02d", m));
      }
      ChargingHandshake chargingHandshake = chargingHandshakeClient.getDataByOrderCode(one.getCode()).getData();
      if(null != chargingHandshake && null != data && null != one.getAppUserCarId()){
@@ -991,7 +993,12 @@
            GetPlatformStopChargingReply query = new GetPlatformStopChargingReply();
            query.setCharging_gun_code(chargingGun.getCode());
            query.setCharging_pile_code(chargingPile.getCode());
            query.setEnd_time(chargingOrder.getEndTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
            //将时间转换成UTC时间后查询数据(mongodb存储时间以UTC格式存储)
            ZoneId zoneId = ZoneId.systemDefault();
            ZonedDateTime zonedDateTime = ZonedDateTime.of(chargingOrder.getEndTime(), zoneId);
            ZonedDateTime endTime = zonedDateTime.withZoneSameInstant(ZoneId.of("UTC"));
            query.setEnd_time(endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
            PlatformStopChargingReply reply = platformStopChargingReplyClient.getPlatformStopChargingReply(query).getData();
            log.error(code1 + ":-------------------查询远程停止充电应答-------------------");
            if(null == reply){
@@ -1251,6 +1258,7 @@
       BigDecimal electronicMoney = new BigDecimal("0");
       BigDecimal serviceMoney = new BigDecimal("0");
      for (ChargingOrderVO chargingOrderVO : list) {
         chargingOrderVO.setUid(chargingOrderVO.getId()+"");
         TChargingGun data3 = chargingGunClient.getChargingGunById(chargingOrderVO.getChargingGunId()).getData();
         TChargingPile data2 = chargingPileClient.getChargingPileById(chargingOrderVO.getChargingPileId()).getData();
         if (chargingOrderVO.getSiteId()!=null){
@@ -1264,38 +1272,24 @@
         }
         if (chargingOrderVO.getChargingCapacity()!=null){
            total = total.add(chargingOrderVO.getChargingCapacity());
            total = total.add(chargingOrderVO.getElectricity());
         }
         // 充电订单 明细记录
         List<TChargingOrderAccountingStrategy> chargingOrderId = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>()
               .eq("charging_order_id", chargingOrderVO.getId()));
         // 单个订单累计电费
         BigDecimal electronicMoney1 = new BigDecimal("0");
         // 单个订单累计服务费
         BigDecimal serviceMoney1 = new BigDecimal("0");
         UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrderVO.getCode()).getData();
         if (data5!=null){
            chargingOrderVO.setChargingSecond(data5.getTime_remaining()*60L);
            long l = data5.getCumulative_charging_time() * 60L;
            chargingOrderVO.setChargingSecond(l);
            time+=l;
         }
         // 总收入
         if (chargingOrderVO.getRefundStatus() !=null && chargingOrderVO.getRefundStatus() == 2){
            income = income.add(chargingOrderVO.getPaymentAmount().subtract(chargingOrderVO.getRefundAmount()));
         }else{
            if (chargingOrderVO.getPaymentAmount()!=null){
               income = income.add(chargingOrderVO.getPaymentAmount());
            }
         electronicMoney = electronicMoney.add(chargingOrderVO.getElectrovalence());
         serviceMoney = serviceMoney.add(chargingOrderVO.getServiceCharge());
         income = income.add(chargingOrderVO.getServiceCharge().add(chargingOrderVO.getElectrovalence()));
         if (chargingOrderVO.getRefundAmount()!=null){
            income = income.subtract(chargingOrderVO.getRefundAmount());
         }
         for (TChargingOrderAccountingStrategy tChargingOrderAccountingStrategy : chargingOrderId) {
            // 累计电费
            electronicMoney1 = electronicMoney1.add(tChargingOrderAccountingStrategy.getElectrovalence()
                  .multiply(tChargingOrderAccountingStrategy.getChargingCapacity()));
            electronicMoney = electronicMoney.add(electronicMoney1);
            // 累计服务费
            serviceMoney1 = serviceMoney1.add(tChargingOrderAccountingStrategy.getServiceCharge());
            serviceMoney = serviceMoney.add(serviceMoney1);
         }
         chargingOrderVO.setServiceCharge(serviceMoney1);
         chargingOrderVO.setElectrovalence(electronicMoney1);
         // 充电时段数
         int size = chargingOrderId.size();
         chargingOrderVO.setCount(size);
@@ -1402,10 +1396,40 @@
         startTime2 = split[1];
      }
      ChargingOrderTimeVO chargingOrderTimeVO = new ChargingOrderTimeVO();
      if (StringUtils.hasLength(dto.getPhone())){
         List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData();
         if(data!=null){
            if (!data.isEmpty()){
               dto.setUserIds(data);
            }
         }else{
            dto.setUserIds(new ArrayList<Long>());
         }
         if (dto.getUserIds().isEmpty()){
            List<Long> carIds = dto.getUserIds();
            carIds.add(-1L);
            dto.setUserIds(carIds);
         }
      }
      if (StringUtils.hasLength(dto.getPhone())){
         List<Long> data = appUserCarClient.getAppUserCarByLicensePlates(dto.getLicensePlate()).getData();
         if(data!=null){
            if (!data.isEmpty()){
               dto.setCarIds(data);
            }
         }else{
            dto.setCarIds(new ArrayList<Long>());
         }
         if (dto.getCarIds().isEmpty()){
            List<Long> carIds = dto.getCarIds();
            carIds.add(-1L);
            dto.setCarIds(carIds);
         }
      }
      PageInfo<ChargingOrderListVO> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize());
      List<ChargingOrderListVO> list = this.baseMapper.chargingList(pageInfo,dto,startTime1,startTime2,endTime1,endTime2);
      for (ChargingOrderListVO chargingOrderListVO : list) {
         chargingOrderListVO.setPaymentAmount(chargingOrderListVO.getResidualAmount()==null?chargingOrderListVO.getPaymentAmount():chargingOrderListVO.getPaymentAmount().subtract(chargingOrderListVO.getResidualAmount()));
         chargingOrderListVO.setUid(chargingOrderListVO.getId()+"");
         List<Integer> integers = new ArrayList<>();
         integers.add(chargingOrderListVO.getSiteId());
@@ -1431,7 +1455,7 @@
         // 获取开始SOC 结束soc
         if (chargingOrderListVO.getCode()!=null){
            List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrderListVO.getCode()).getData();
            if (!data6.isEmpty()){
         if (data6!=null && !data6.isEmpty()){
               // 第一条数据soc为开始 最后一条数据soc为结束soc
               chargingOrderListVO.setStartSoc(data6.get(0).getSoc().toString());
               chargingOrderListVO.setEndSoc(data6.get(data6.size()-1).getSoc().toString());
@@ -1449,7 +1473,7 @@
                     if (data4!=null && !data4.isEmpty()) chargingOrderListVO.setLicensePlate(data4.get(0).getLicensePlate());
                  }
               }
               if (data3 != null) chargingOrderListVO.setPhone(data3.getPhone());
               chargingOrderListVO.setPhone(data3.getPhone());
            }
         }
@@ -1697,102 +1721,14 @@
      if(com.ruoyi.common.core.utils.StringUtils.isNotEmpty(query.getTransaction_serial_number())){
         //获取当前的计费策略
         TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, query.getTransaction_serial_number()));
         AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderClient.getNowAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
         TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = chargingOrderAccountingStrategyService.getOne(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>()
               .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()).orderByDesc(TChargingOrderAccountingStrategy::getCreateTime).last(" limit 0, 1"));
         if(null == chargingOrderAccountingStrategy){
            chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy();
            chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId());
            chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId());
            chargingOrderAccountingStrategy.setType(strategyDetail.getType());
            chargingOrderAccountingStrategy.setStartTime(chargingOrder.getStartTime().format(DateTimeFormatter.ofPattern("HH:mm")));
            chargingOrderAccountingStrategy.setEndTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm")));
            chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence());
            chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge());
            chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge());
            //已充电总度数
            BigDecimal charging_degree = query.getCharging_degree();
            BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(charging_degree);
            BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(charging_degree);
            BigDecimal serviceCharge = originalServicePrice;
            //计算优惠金额
            if(null != chargingOrder.getVipDiscount()){
               serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10)));
            }
            chargingOrderAccountingStrategy.setChargingCapacity(charging_degree);
            chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc);
            chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge);
            chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice);
            chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
            chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy);
         }else{
            if(chargingOrderAccountingStrategy.getAccountingStrategyDetailId().equals(strategyDetail.getId())){
               //已充电总度数
               BigDecimal charging_degree = query.getCharging_degree();
               BigDecimal chargingCapacity = chargingOrderAccountingStrategy.getChargingCapacity();
               //计算本阶段充电度数
               BigDecimal subtract = charging_degree.subtract(chargingCapacity);
               //计算本阶段费用
               BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(subtract);
               BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(subtract);
               BigDecimal serviceCharge = originalServicePrice;
               //计算优惠金额
               if(null != chargingOrder.getVipDiscount()){
                  serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10)));
               }
               //将本阶段的费用增加到总费用中
               electrovalenc = electrovalenc.add(chargingOrderAccountingStrategy.getPeriodElectricPrice());
               originalServicePrice = originalServicePrice.add(chargingOrderAccountingStrategy.getPeriodOriginalServicePrice());
               serviceCharge = serviceCharge.add(chargingOrderAccountingStrategy.getPeriodServicePrice());
               chargingOrderAccountingStrategy.setChargingCapacity(charging_degree);
               chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc);
               chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge);
               chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice);
               chargingOrderAccountingStrategy.setEndTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm")));
               chargingOrderAccountingStrategyService.updateById(chargingOrderAccountingStrategy);
            }else{
               chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy();
               chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId());
               chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId());
               chargingOrderAccountingStrategy.setType(strategyDetail.getType());
               chargingOrderAccountingStrategy.setStartTime(chargingOrder.getStartTime().format(DateTimeFormatter.ofPattern("HH:mm")));
               chargingOrderAccountingStrategy.setEndTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm")));
               chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence());
               chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge());
               chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge());
               //已充电总度数
               BigDecimal charging_degree = query.getCharging_degree();
               BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(charging_degree);
               BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(charging_degree);
               BigDecimal serviceCharge = originalServicePrice;
               //计算优惠金额
               if(null != chargingOrder.getVipDiscount()){
                  serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10)));
               }
               chargingOrderAccountingStrategy.setChargingCapacity(charging_degree);
               chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc);
               chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge);
               chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice);
               chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
               chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy);
            }
         }
         List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>()
               .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
         //总充电金额
         BigDecimal t = BigDecimal.ZERO;
         for (TChargingOrderAccountingStrategy coas : list) {
            t = t.add(coas.getPeriodServicePrice()).add(coas.getPeriodElectricPrice());
         }
         BigDecimal residualAmount = chargingOrder.getRechargeAmount().subtract(t).setScale(4, RoundingMode.HALF_EVEN);
         BigDecimal residualAmount = chargingOrder.getRechargeAmount().add(chargingOrder.getVipDiscountAmount()).subtract(query.getPaid_amount());
         chargingOrder.setResidualAmount(residualAmount);
         if(query.getOutput_current().compareTo(BigDecimal.ZERO) != 0){
            BigDecimal divide = (query.getOutput_current().multiply(query.getOutput_voltage())).divide(new BigDecimal(1000));
            chargingOrder.setChargingPower(divide);
            chargingOrder.setCurrent(query.getOutput_current());
            chargingOrder.setVoltage(query.getOutput_voltage());
            chargingOrder.setPower(query.getOutput_current().multiply(query.getOutput_voltage()));
            chargingOrder.setPower(divide);
            chargingOrder.setNeedElec(query.getOutput_current());
            
            TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
@@ -1860,54 +1796,63 @@
      //获取订单的计费策略
      List<AccountingStrategyDetailOrder> accountingStrategyDetailOrderList = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
      chargingOrderAccountingStrategyService.remove(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
      for (int i = 0; i < 12; i++) {
      for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) {
         Class<? extends TransactionRecordMessageVO> clazz = vo.getClass();
         try {
            String time = (String) clazz.getMethod("getTime" + (i + 1)).invoke(vo);
            if(StringUtils.hasLength(time)){
               //充电度数
               Object invoke = clazz.getMethod("getSharp_peak_charge" + (i + 1)).invoke(vo);
               if(null == invoke || invoke.toString().equals("0")){
                  continue;
               }
               BigDecimal Sharp_peak_charge = new BigDecimal(invoke.toString());
               //充电金额
               Object invoke1 = clazz.getMethod("getSharp_peak_amount" + (i + 1)).invoke(vo);
               BigDecimal sharp_peak_amount = new BigDecimal(invoke1.toString());
               String[] split = time.split("-");
               AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.stream().filter(s -> s.getStartTime().equals(split[0]) && s.getEndTime().equals(split[1])).findFirst().get();
               TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy();
               chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId());
               chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId());
               chargingOrderAccountingStrategy.setType(strategyDetail.getType());
               chargingOrderAccountingStrategy.setStartTime(chargingOrder.getStartTime().format(DateTimeFormatter.ofPattern("HH:mm")));
               chargingOrderAccountingStrategy.setEndTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm")));
               chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence());
               chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge());
               chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge());
               //已充电总度数
               BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(Sharp_peak_charge);
               BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(Sharp_peak_charge);
               BigDecimal serviceCharge = originalServicePrice;
               //计算优惠金额
               if(null != chargingOrder.getVipDiscount()){
                  serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10)));
               }
               chargingOrderAccountingStrategy.setChargingCapacity(Sharp_peak_charge);
               chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc);
               chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge);
               chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice);
               chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
               chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy);
               BigDecimal periodElectricPrice = chargingOrderAccountingStrategy.getPeriodElectricPrice();
               BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodOriginalServicePrice();
               periodElectricPrice_total = periodElectricPrice_total.add(periodElectricPrice);
               periodServicePrice_total = periodServicePrice_total.add(periodServicePrice);
               total = total.add(periodElectricPrice).add(periodServicePrice);
            AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i);
            //阶段(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());
            TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy();
            chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId());
            chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId());
            chargingOrderAccountingStrategy.setType(strategyDetail.getType());
            chargingOrderAccountingStrategy.setStartTime(chargingOrder.getStartTime().format(DateTimeFormatter.ofPattern("HH:mm")));
            chargingOrderAccountingStrategy.setEndTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm")));
            chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence());
            chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge());
            chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge());
            //已充电总度数
            BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(sharp_peak_charge).setScale(2, RoundingMode.DOWN);
            BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(sharp_peak_charge).setScale(2, RoundingMode.DOWN);
            BigDecimal serviceCharge = originalServicePrice;
            //计算优惠金额
            if(null != chargingOrder.getVipDiscount()){
               serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount()).setScale(2, RoundingMode.DOWN);
            }
            chargingOrderAccountingStrategy.setChargingCapacity(sharp_peak_charge);
            chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc);
            chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge);
            chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice);
            chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
            chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy);
            BigDecimal periodElectricPrice = chargingOrderAccountingStrategy.getPeriodElectricPrice();
            BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodOriginalServicePrice();
            periodElectricPrice_total = periodElectricPrice_total.add(periodElectricPrice);
            periodServicePrice_total = periodServicePrice_total.add(periodServicePrice);
            total = total.add(periodElectricPrice.add(periodServicePrice));
         } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
         } catch (InvocationTargetException e) {
@@ -1931,7 +1876,7 @@
      BigDecimal discountAmount = BigDecimal.ZERO;
      if(null != chargingOrder.getVipDiscount()){
         //服务费折扣
         discountAmount = periodServicePrice_total.multiply((new BigDecimal(10).subtract(chargingOrder.getVipDiscount())).divide(new BigDecimal(10)));
         discountAmount = periodServicePrice_total.multiply((new BigDecimal(1).subtract(chargingOrder.getVipDiscount())));
         
         TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
         if(null != appUser.getVipId()){
@@ -1973,6 +1918,7 @@
      order.setServiceCharge(periodServicePrice_total);
      order.setElectrovalence(periodElectricPrice_total);
      order.setChargingCapacity(vo.getTotal_electricity());
      order.setElectricity(vo.getTotal_electricity());
      
      //计算优惠券
      if(null != chargingOrder.getAppCouponId()){
@@ -2136,6 +2082,10 @@
   @Override
   public List<Map<String, Object>> usersByQuery(ChargingStatisticsQueryDto statisticsQueryDto) {
      return this.baseMapper.usersByQuery(statisticsQueryDto);
   }
   @Override
   public List<Map<String, Object>> usersByQuery1(ChargingStatisticsQueryDto statisticsQueryDto) {
      return this.baseMapper.usersByQuery(statisticsQueryDto);
   }
@@ -2786,7 +2736,7 @@
      info.setEndDay(endTime.format(DateTimeFormatter.ofPattern("MM月dd日")) + " 周" + endTime.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.SIMPLIFIED_CHINESE));
      info.setEndHour(endTime.format(DateTimeFormatter.ofPattern("HH:mm")));
      int hour = endTime.getHour() - startTime.getHour();
      int second = endTime.getSecond() - startTime.getSecond();
      int second = endTime.getMinute() - startTime.getMinute();
      info.setDuration(0 == hour ? String.format("%s分钟", second) : String.format("%s小时%s分钟", hour, second));
      return info;
   }