Pu Zhibing
2024-11-05 c564930d687e421e4e35d7fcafadc6d11ff23b9c
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -50,6 +50,7 @@
import com.ruoyi.order.vo.EndOfChargePageInfo;
import com.ruoyi.other.api.domain.*;
import com.ruoyi.order.vo.ChargingOrderListInfoVO;
import com.ruoyi.other.api.domain.TVip;
import com.ruoyi.other.api.feignClient.*;
import com.ruoyi.payment.api.feignClient.AliPaymentClient;
import com.ruoyi.payment.api.feignClient.WxPaymentClient;
@@ -65,10 +66,12 @@
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import javax.crypto.MacSpi;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
@@ -184,6 +187,9 @@
   
   @Resource
   private SecurityDetectionClient securityDetectionClient;
   @Resource
   private BmsDemandAndChargerExportationClient bmsDemandAndChargerExportationClient;
   //计数器
   private Map<String, Integer> counter_map = new HashMap<>();
@@ -253,11 +259,13 @@
      myChargingOrderInfo.setChargeMode(chargingGun.getChargeMode());
      String name = chargingGunClient.getAllName(chargingOrder.getChargingGunId()).getData();
      myChargingOrderInfo.setName(name);
      if(null != chargingOrder.getAppUserCarId()){
         TAppUserCar tAppUserCar = appUserCarClient.getCarByIds(Arrays.asList(chargingOrder.getAppUserCarId())).getData().get(0);
         myChargingOrderInfo.setLicensePlate(tAppUserCar.getLicensePlate());
      }else{
         myChargingOrderInfo.setLicensePlate("无");
      if(Objects.nonNull(chargingOrder.getAppUserCarId())){
         TAppUserCar tAppUserCar = appUserCarClient.getCarById(chargingOrder.getAppUserCarId().toString()).getData();
         if(null != tAppUserCar){
            myChargingOrderInfo.setLicensePlate(tAppUserCar.getLicensePlate());
         }else{
            myChargingOrderInfo.setLicensePlate("无");
         }
      }
      myChargingOrderInfo.setStartTime(chargingOrder.getStartTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
      myChargingOrderInfo.setEndTime(chargingOrder.getEndTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
@@ -276,9 +284,18 @@
      if(null != dataList){
         //在MongoDB中获取数据
         SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
         List<String> time = dataList.stream().map(s -> sdf.format(s.getCreate_time())).collect(Collectors.toList());
         List<BigDecimal> outputVoltage = dataList.stream().map(UploadRealTimeMonitoringData::getOutput_voltage).collect(Collectors.toList());
         List<BigDecimal> outputCurrent = dataList.stream().map(UploadRealTimeMonitoringData::getOutput_current).collect(Collectors.toList());
         List<UploadRealTimeMonitoringData> dataLists = new ArrayList<>();
         String t = "";
         for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : dataList) {
            if(!sdf.format(uploadRealTimeMonitoringData.getCreate_time()).equals(t)){
               dataLists.add(uploadRealTimeMonitoringData);
               t = sdf.format(uploadRealTimeMonitoringData.getCreate_time());
            }
         }
         List<String> time = dataLists.stream().map(s -> sdf.format(s.getCreate_time())).collect(Collectors.toList());
         List<BigDecimal> outputVoltage = dataLists.stream().map(UploadRealTimeMonitoringData::getOutput_voltage).collect(Collectors.toList());
         List<BigDecimal> outputCurrent = dataLists.stream().map(UploadRealTimeMonitoringData::getOutput_current).collect(Collectors.toList());
         List<Map<String, Object>> currentAndVoltage = new ArrayList<>();
         for (int i = 0; i < time.size(); i++) {
            Map<String, Object> map = new HashMap<>();
@@ -291,8 +308,8 @@
         }
         myChargingOrderInfo.setCurrentAndVoltage(currentAndVoltage);
         //在MongoDB中获取数据
         List<Integer> soc = dataList.stream().map(UploadRealTimeMonitoringData::getSoc).collect(Collectors.toList());
         List<BigDecimal> po = dataList.stream().map(s -> s.getOutput_current().multiply(s.getOutput_voltage()).divide(new BigDecimal(1000),2, RoundingMode.HALF_DOWN)).collect(Collectors.toList());
         List<Integer> soc = dataLists.stream().map(UploadRealTimeMonitoringData::getSoc).collect(Collectors.toList());
         List<BigDecimal> po = dataLists.stream().map(s -> s.getOutput_current().multiply(s.getOutput_voltage()).divide(new BigDecimal(1000),2, RoundingMode.HALF_DOWN)).collect(Collectors.toList());
         List<Map<String, Object>> power = new ArrayList<>();
         for (int i = 0; i < time.size(); i++) {
            Map<String, Object> map = new HashMap<>();
@@ -384,7 +401,7 @@
      TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, addChargingOrder.getId())
            .in(TChargingOrder::getStatus, Arrays.asList(1, 2, 3)).eq(TChargingOrder::getDelFlag, 0));
      if(null != one){
         return AjaxResult.error("充电枪正在充电桩中,启动失败");
         return AjaxResult.error("充电枪正在充电中,启动失败");
      }
      //查询当前充电枪是否有正在支付的订单
      one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, addChargingOrder.getId())
@@ -507,7 +524,7 @@
      if(2 == addChargingOrder.getPaymentType()){
         AliPaymentReq req = new AliPaymentReq();
         req.setOutTradeNo(chargingOrder.getCode());
         req.setTotalAmount(chargingOrder.getPaymentAmount().toString());
         req.setTotalAmount(addChargingOrder.getPaymentAmount().toString());
         req.setSubject("充电充值");
         req.setBuyerOpenId(appUser.getAliOpenid());
         req.setBody("充电充值");
@@ -654,12 +671,106 @@
      platformStartCharging.setCard_number(chargingOrder.getId().toString());
      platformStartCharging.setAccount_balance(account_balance);
      
      log.error(chargingOrder.getCode() + ":-------------------远程调起开始充电请求-------------------" + platformStartCharging.toString());
      log.info(chargingOrder.getCode() + ":-------------------远程调起开始充电请求-------------------" + platformStartCharging.toString());
      sendMessageClient.platformStartCharging(platformStartCharging);
      //异步线程检测远程启动的应答结果。如果失败,则需要全额退款
      Long id = chargingOrder.getId();
      //执行5分钟的定时任务检测
      ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
      scheduler.scheduleAtFixedRate(()->{
         if(timingDetection(id)){
            scheduler.shutdown();
         }
      }, 5, 1, TimeUnit.SECONDS);
      return AjaxResult.success();
   }
   
   /**
    * 定时检测mongodb数据库数据
    * @param id
    * @return
    */
   public boolean timingDetection(Long id){
      TChargingOrder chargingOrder = this.getById(id);
      if(chargingOrder.getStatus() != 2){
         return true;
      }
      String code = chargingOrder.getCode();
      String key = "AQJC_" + chargingOrder.getChargingGunId();
      List<PlatformStartChargingReply> data = platformStartChargingReplyClient.getPlatformStartChargingReply(code).getData();
      log.info(code + ":-------------------开始检查调起充电结果-------------------" + data.toString());
      if(data.size() != 0){
         PlatformStartChargingReply platformStartChargingReply = data.get(1);
         Integer startup_result = platformStartChargingReply.getStartup_result();
         Integer failure_cause = platformStartChargingReply.getFailure_cause();
         Integer counter = counter_map.get(code);
         PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key);
         //5分钟内还未插枪则取消充电,退回金额。
         if(failure_cause == 5 && (null == counter || counter < 300)){
            counter = (null == counter ? 0 : counter) + 1;
            counter_map.put(code, counter);
            //启动失败
            preChargeCheck1.setStartupSuccess(3);
            preChargeCheck1.setFailureCause(failure_cause);
            redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
            return false;
         }
         //清除计时器中的无效数据
         counter_map.remove(code);
         TChargingOrder order = new TChargingOrder();
         order.setId(id);
         order.setAppUserId(chargingOrder.getAppUserId());
         if(0 == startup_result){
            //启动失败
            preChargeCheck1.setStartupSuccess(3);
            preChargeCheck1.setFailureCause(failure_cause);
            //启动失败后取消订单,退款操作
            refund(code);
            order.setStatus(-1);
            order.setEndMode(0);
         }else{
            //启动成功
            preChargeCheck1.setStartupSuccess(2);
            order.setStatus(3);
            order.setStartTime(LocalDateTime.now());
         }
         this.updateById(order);
         redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
         return true;
      }else{
         Integer counter = boot_failed_map.get(code);
         log.info(code + ":-------------------未上传开启充电结果-------------------" + counter);
         PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key);
         //5分钟内未启动成功,退回金额。
         if(null == counter || counter < 300){
            counter = (null == counter ? 0 : counter) + 1;
            boot_failed_map.put(code, counter);
            //启动失败
            preChargeCheck1.setStartupSuccess(1);
            preChargeCheck1.setFailureCause(0);
            redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
            return false;
         }
         //清除计时器中的无效数据
         boot_failed_map.remove(code);
         TChargingOrder order = new TChargingOrder();
         order.setId(id);
         order.setAppUserId(chargingOrder.getAppUserId());
         //启动失败
         preChargeCheck1.setStartupSuccess(3);
         preChargeCheck1.setFailureCause(0);
         //启动失败后取消订单,退款操作
         refund(code);
         order.setStatus(-1);
         order.setEndMode(0);
         this.updateById(order);
         redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
         return true;
      }
   }
   
   
   /**
@@ -726,7 +837,7 @@
    * @param code
    */
   public void refund(String code){
      log.error(code + ":-------------------充电启动失败,执行退款-------------------");
      log.info(code + ":-------------------充电启动失败,执行退款-------------------");
      TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code));
      if(chargingOrder.getStatus() == 2){
         Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
@@ -798,7 +909,10 @@
      one.setRefundTime(LocalDateTime.now());
      chargingOrderRefundService.updateById(one);
      
      TChargingOrder chargingOrder = this.getById(one.getChargingOrderId());
      TChargingOrder order = this.getById(one.getChargingOrderId());
      TChargingOrder chargingOrder = new TChargingOrder();
      chargingOrder.setId(one.getChargingOrderId());
      chargingOrder.setAppUserId(order.getAppUserId());
      chargingOrder.setRefundStatus(2);
      chargingOrder.setRefundSerialNumber(refund_id);
      chargingOrder.setRefundTime(LocalDateTime.now());
@@ -866,31 +980,35 @@
   @Override
   @GlobalTransactional(rollbackFor = Exception.class)
   public AjaxResult stopCharging(String id) {
      TChargingOrder chargingOrder = this.getById(id);
      Integer status = chargingOrder.getStatus();
      TChargingOrder order = this.getById(id);
      Integer status = order.getStatus();
      if(status != 3){
         return AjaxResult.error("还未开始充电");
      }
      if(status == 4 || status == 5){
         return AjaxResult.error("不能重复操作");
      }
      TChargingOrder chargingOrder = new TChargingOrder();
      chargingOrder.setId(Long.valueOf(id));
      chargingOrder.setAppUserId(order.getAppUserId());
      chargingOrder.setEndTime(LocalDateTime.now());
      chargingOrder.setStatus(4);
      chargingOrder.setEndMode(1);
      this.updateById(chargingOrder);
      
      String code1 = chargingOrder.getCode();
      TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
      String code1 = order.getCode();
      TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData();
      //异步线程处理停机
      ExecutorService cachedThreadPool = Executors.newFixedThreadPool(1);
      cachedThreadPool.execute(()->{
         //调用硬件停止充电,停止成功后开始计算费用退款
         TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingOrder.getChargingPileId()).getData();
         TChargingPile chargingPile = chargingPileClient.getChargingPileById(order.getChargingPileId()).getData();
         PlatformStopCharging platformStopCharging = new PlatformStopCharging();
         platformStopCharging.setCharging_pile_code(chargingPile.getCode());
         platformStopCharging.setCharging_gun_code(chargingGun.getCode());
         sendMessageClient.platformStopCharging(platformStopCharging);
         log.error(code1 + ":-------------------远程停止充电请求-------------------");
         log.error(platformStopCharging.toString());
         log.info(code1 + ":-------------------远程停止充电请求-------------------");
         log.info(platformStopCharging.toString());
      });
      return AjaxResult.success();
   }
@@ -991,20 +1109,22 @@
            inviteUser.setAward(num1);
            inviteUserClient.updateInviteUser(inviteUser);
         }
         TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
         String code = Double.valueOf(Math.random() * 1000).intValue() + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
         appUserIntegralChange.setCode(code);
         appUserIntegralChange.setAppUserId(appUser1.getId());
         appUserIntegralChange.setChangeType(5);
         appUserIntegralChange.setHistoricalIntegral(appUser1.getPoints());
         appUserIntegralChange.setCurrentIntegral(appUser1.getPoints() + num1);
         appUserIntegralChange.setCreateTime(LocalDateTime.now());
         appUserIntegralChange.setOrderCode(chargingOrder.getCode());
         appUserIntegralChange.setExtension(chargingOrder.getId().toString());
         appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
         appUser1.setPoints(appUser1.getPoints() + num1);
         appUserClient.updateAppUser(appUser1);
         if(num1 > 0){
            TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
            String code = Double.valueOf(Math.random() * 1000).intValue() + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
            appUserIntegralChange.setCode(code);
            appUserIntegralChange.setAppUserId(appUser1.getId());
            appUserIntegralChange.setChangeType(4);
            appUserIntegralChange.setHistoricalIntegral(appUser1.getPoints());
            appUserIntegralChange.setCurrentIntegral(appUser1.getPoints() + num1);
            appUserIntegralChange.setCreateTime(LocalDateTime.now());
            appUserIntegralChange.setOrderCode(chargingOrder.getCode());
            appUserIntegralChange.setExtension(appUser.getId().toString());
            appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
            appUser1.setPoints(appUser1.getPoints() + num1);
            appUserClient.updateAppUser(appUser1);
         }
      }
   }
   
@@ -1043,7 +1163,7 @@
               failure_cause = "其他";
               break;
         }
         log.error(code1 + ":停机失败:订单号:{},失败原因:{}", order.getCode(), failure_cause);
         log.info(code1 + ":停机失败:订单号:{},失败原因:{}", order.getCode(), failure_cause);
      }else{
         TChargingOrder chargingOrder = new TChargingOrder();
         chargingOrder.setId(order.getId());
@@ -1097,8 +1217,8 @@
       BigDecimal electronicMoney = new BigDecimal("0");
       BigDecimal serviceMoney = new BigDecimal("0");
      for (ChargingOrderVO chargingOrderVO : list) {
         chargingOrderVO.setCommissionAmount(chargingOrderVO.getServiceCharge().multiply(new BigDecimal("0.006")));
         chargingOrderVO.setPlatFormMoney(chargingOrderVO.getServiceCharge().multiply(new BigDecimal("0.006")));
         chargingOrderVO.setCommissionAmount(chargingOrderVO.getOrderAmount().multiply(new BigDecimal("0.006")));
         chargingOrderVO.setPlatFormMoney(chargingOrderVO.getOrderAmount().multiply(new BigDecimal("0.006")));
         chargingOrderVO.setUid(chargingOrderVO.getId()+"");
         TChargingGun data3 = chargingGunClient.getChargingGunById(chargingOrderVO.getChargingGunId()).getData();
         TChargingPile data2 = chargingPileClient.getChargingPileById(chargingOrderVO.getChargingPileId()).getData();
@@ -1154,7 +1274,7 @@
         electronicMoney = electronicMoney.add(chargingOrderVO.getElectrovalence());
         serviceMoney = serviceMoney.add(chargingOrderVO.getServiceCharge());
         income = income.add(chargingOrderVO.getOrderAmount());
         income = income.add(chargingOrderVO.getPaymentAmount());
@@ -1178,9 +1298,9 @@
            payOrderDto.setFinalAmount(payOrderDto.getOrderAmount());
         }
         if (payOrderDto.getType()==1&&payOrderDto.getStatus()==3){
            payOrderDto.setFinalAmount(payOrderDto.getRechargeAmount());
            payOrderDto.setOrderAmount(payOrderDto.getRechargeAmount());
            payOrderDto.setPaymentAmount(payOrderDto.getRechargeAmount());
            payOrderDto.setFinalAmount(payOrderDto.getOrderAmount());
            payOrderDto.setOrderAmount(payOrderDto.getOrderAmount());
            payOrderDto.setPaymentAmount(payOrderDto.getOrderAmount());
         }
      }
      pageInfo.setRecords(list);
@@ -1290,12 +1410,11 @@
      List<ChargingOrderListVO> list = this.baseMapper.chargingList(pageInfo,dto,startTime1,startTime2,endTime1,endTime2);
      for (ChargingOrderListVO chargingOrderListVO : list) {
         chargingOrderListVO.setChargingCapacity(chargingOrderListVO.getElectricity());
         chargingOrderListVO.setPaymentAmount(chargingOrderListVO.getPaymentAmount());
         BigDecimal bigDecimal = new BigDecimal("0.006");
         if (chargingOrderListVO.getOrderAmount()!=null){
            chargingOrderListVO.setCommissionAmount(chargingOrderListVO.getOrderAmount().multiply(bigDecimal));
            chargingOrderListVO.setCommissionAmount(chargingOrderListVO.getPaymentAmount().multiply(bigDecimal));
         }
         chargingOrderListVO.setPaymentAmount(chargingOrderListVO.getResidualAmount()==null?chargingOrderListVO.getPaymentAmount():chargingOrderListVO.getPaymentAmount());
         chargingOrderListVO.setPaymentAmount(chargingOrderListVO.getPaymentAmount());
         chargingOrderListVO.setUid(chargingOrderListVO.getId()+"");
         List<Integer> integers = new ArrayList<>();
         integers.add(chargingOrderListVO.getSiteId());
@@ -1314,17 +1433,27 @@
         UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrderListVO.getCode()).getData();
         if (data5!=null){
            if (data5.getTime_remaining()!=null){
               chargingOrderListVO.setChargingSecond(data5.getTime_remaining()*60L);
               chargingOrderListVO.setChargingSecond(data5.getCumulative_charging_time()*60L);
            }
         }
         // 获取开始SOC 结束soc
         if (chargingOrderListVO.getCode()!=null){
            List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrderListVO.getCode()).getData();
         if (data6!=null && !data6.isEmpty()){
               // 第一条数据soc为开始 最后一条数据soc为结束soc
               chargingOrderListVO.setStartSoc(data6.get(0).getSoc().toString());
               chargingOrderListVO.setEndSoc(data6.get(data6.size()-1).getSoc().toString());
            int min = 100;
            int max = 0;
            for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data6) {
               if (uploadRealTimeMonitoringData.getSoc()>max){
                  max = uploadRealTimeMonitoringData.getSoc();
               }
               if (uploadRealTimeMonitoringData.getSoc()!=0 &&uploadRealTimeMonitoringData.getSoc()<min){
                  min = uploadRealTimeMonitoringData.getSoc();
               }
            }
               chargingOrderListVO.setEndSoc(max+"");
               chargingOrderListVO.setStartSoc(min+"");
            }
         }
@@ -1504,13 +1633,12 @@
   @Override
   public ChargingOrderListInfoVO chargingInfo(String uid) {
      TChargingOrder chargingOrder= this.getById(uid);
      ChargingOrderListInfoVO chargingOrderListInfoVO = new ChargingOrderListInfoVO();
      chargingOrderListInfoVO.setStatus(chargingOrder.getStatus());
      BigDecimal bigDecimal = new BigDecimal("0.006");
      if (chargingOrder.getOrderAmount()!=null){
         chargingOrderListInfoVO.setCommissionAmount(chargingOrder.getOrderAmount().multiply(bigDecimal));
         BigDecimal multiply = chargingOrder.getPaymentAmount().multiply(bigDecimal);
         chargingOrderListInfoVO.setCommissionAmount(multiply.setScale(2, BigDecimal.ROUND_HALF_UP));
      }
      chargingOrderListInfoVO.setElectrovalence(chargingOrder.getElectrovalence());
      chargingOrderListInfoVO.setServiceCharge(chargingOrder.getServiceCharge());
@@ -1544,6 +1672,7 @@
            }
         }
      }
      chargingOrderListInfoVO.setChargingCapacity(chargingOrder.getChargingCapacity());
      chargingOrderListInfoVO.setEndMode(chargingOrder.getEndMode());
@@ -1555,24 +1684,40 @@
               if (uploadRealTimeMonitoringData.getOutput_current()!=null&&
                     uploadRealTimeMonitoringData.getOutput_voltage()!=null){
                  uploadRealTimeMonitoringData.setPower(uploadRealTimeMonitoringData.getOutput_voltage()
                        .multiply(uploadRealTimeMonitoringData.getOutput_current()));
                        .multiply(uploadRealTimeMonitoringData.getOutput_current()).divide(new BigDecimal(1000),2, BigDecimal.ROUND_HALF_UP));
               }
            }
            if (!data6.isEmpty()){
               // 第一条数据soc为开始 最后一条数据soc为结束soc
               chargingOrderListInfoVO.setStartSoc(data6.get(0).getSoc().toString());
               chargingOrderListInfoVO.setEndSoc(data6.get(data6.size()-1).getSoc().toString());
               chargingOrderListInfoVO.setChargingCapacity(data6.get(data6.size()-1).getCharging_degree());
               chargingOrderListInfoVO.setChargingSecond(data6.get(data6.size()-1).getCumulative_charging_time()*60+"");
                  int min = 100;
                  int max = 0;
                  for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data6) {
                     if (uploadRealTimeMonitoringData.getSoc()>max){
                        max = uploadRealTimeMonitoringData.getSoc();
                     }
                     if (uploadRealTimeMonitoringData.getSoc()!=0 &&uploadRealTimeMonitoringData.getSoc()<min){
                        min = uploadRealTimeMonitoringData.getSoc();
                     }
                  }
               chargingOrderListInfoVO.setEndSoc(max+"");
               chargingOrderListInfoVO.setStartSoc(min+"");
               SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
               for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data6) {
                  uploadRealTimeMonitoringData.setCreateTime(simpleDateFormat.format(uploadRealTimeMonitoringData.getCreate_time()));
               }
            }
         }
         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 (chargingOrder.getAppUserCarId()!=null){
         List<TAppUserCar> data3 = appUserCarClient.getCarByIds(Collections.singletonList(chargingOrder.getAppUserCarId())).getData();
@@ -1585,7 +1730,6 @@
      chargingOrderListInfoVO.setCouponDiscountAmount(chargingOrder.getCouponDiscountAmount());
      chargingOrderListInfoVO.setVipDiscountAmount(chargingOrder.getVipDiscountAmount());
      chargingOrderListInfoVO.setSharingAmount(chargingOrder.getSharingAmount());
      chargingOrderListInfoVO.setCommissionAmount(chargingOrder.getCommissionAmount());
      // 查询费用明细列表
      List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.lambdaQuery()
            .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId())
@@ -1626,6 +1770,10 @@
         chargingOrder.setChargingCapacity(query.getCharging_degree());
         chargingOrder.setElectricity(query.getCharging_degree());
         chargingOrder.setTotalElectricity(new BigDecimal(100 - query.getSoc()));
         BmsDemandAndChargerExportation data = bmsDemandAndChargerExportationClient.getBmsDemandAndChargerExportation(chargingOrder.getCode()).getData();
         if(null != data){
            chargingOrder.setNeedElec(data.getBms_current_requirements());
         }
         this.updateById(chargingOrder);
      }
   }
@@ -1665,7 +1813,7 @@
   public void endChargeBillingCharge(TransactionRecordMessageVO vo) {
      TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, vo.getTransaction_serial_number()));
      Integer status = chargingOrder.getStatus();
      if(status == 4 || status == 5){
      if(status == 5){
         return;
      }
      
@@ -1678,9 +1826,11 @@
      
      //获取订单的计费策略
      List<AccountingStrategyDetailOrder> accountingStrategyDetailOrderList = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
      accountingStrategyDetailOrderList.get(accountingStrategyDetailOrderList.size() - 1).setEndTime("23:59");
      //开始处理计费明细数据和优惠数据
      chargingOrderAccountingStrategyService.remove(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
      SimpleDateFormat sdfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      List<AccountingStrategyDetailOrderVo> lists = new ArrayList<>();
      for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) {
         Class<? extends TransactionRecordMessageVO> clazz = vo.getClass();
         try {
@@ -1709,44 +1859,98 @@
               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;
            BigDecimal vipDiscountAmount = BigDecimal.ZERO;
            //计算优惠金额
            if(null != chargingOrder.getVipDiscount()){
               vipDiscountAmount = serviceCharge.multiply(new BigDecimal(1).subtract(chargingOrder.getVipDiscount())).setScale(2, RoundingMode.DOWN);
               serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount()).setScale(2, RoundingMode.DOWN);
            }
            chargingOrderAccountingStrategy.setChargingCapacity(sharp_peak_charge);
            chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc);
            chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge);
            chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice);
            chargingOrderAccountingStrategy.setVipDiscountAmount(vipDiscountAmount);
            chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
            chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy);
            periodElectricPrice_total = periodElectricPrice_total.add(electrovalenc);
            periodServicePrice_total = periodServicePrice_total.add(originalServicePrice);
            total = total.add(electrovalenc.add(originalServicePrice));
            AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo();
            BeanUtils.copyProperties(strategyDetail, vo1);
            vo1.setStart(sdfs.parse(vo.getStart_time().split(" ")[0] + " " + strategyDetail.getStartTime() + ":00").getTime());
            vo1.setEnd(sdfs.parse(vo.getStart_time().split(" ")[0] + " " + strategyDetail.getEndTime() + ":00").getTime());
            vo1.setChargingCapacity(sharp_peak_charge);
            lists.add(vo1);
         } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
         } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
         } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
         } catch (ParseException e) {
            throw new RuntimeException(e);
         }
      }
      Collections.sort(lists, new Comparator<AccountingStrategyDetailOrderVo>() {
         public int compare(AccountingStrategyDetailOrderVo s1, AccountingStrategyDetailOrderVo s2) {
            return s1.getStart() < s2.getStart() ? -1 : s1.getStart() == s2.getStart() ? 0 : 1;
         }
      });
      if(!vo.getStart_time().split(" ")[0].equals(vo.getEnd_time().split(" ")[0])){
         List<AccountingStrategyDetailOrderVo> list1 = new ArrayList<>(lists);
         for (AccountingStrategyDetailOrderVo orderVo : list1) {
            Calendar start = Calendar.getInstance();
            start.setTimeInMillis(orderVo.getStart());
            start.set(Calendar.DAY_OF_YEAR, start.get(Calendar.DAY_OF_YEAR) + 1);
            orderVo.setStart(start.getTimeInMillis());
            Calendar end = Calendar.getInstance();
            end.setTimeInMillis(orderVo.getEnd());
            end.set(Calendar.DAY_OF_YEAR, end.get(Calendar.DAY_OF_YEAR) + 1);
            orderVo.setEnd(end.getTimeInMillis());
         }
         lists.addAll(list1);
      }
      //开始处理明细
      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) {
         BigDecimal sharp_peak_charge = strategyDetail.getChargingCapacity();
         TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy();
         chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId());
         chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId());
         chargingOrderAccountingStrategy.setType(strategyDetail.getType());
         chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence());
         chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge());
         chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge());
         if(start.getTime() >= strategyDetail.getStart()){
            chargingOrderAccountingStrategy.setStartTime(sdf2.format(start));
         }else{
            chargingOrderAccountingStrategy.setStartTime(strategyDetail.getStartTime());
         }
         if(end.getTime() >= strategyDetail.getEnd()){
            chargingOrderAccountingStrategy.setEndTime(strategyDetail.getEndTime());
         }else{
            chargingOrderAccountingStrategy.setEndTime(sdf2.format(end));
         }
         //已充电总度数
         BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(sharp_peak_charge).setScale(2, RoundingMode.HALF_EVEN);
         BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(sharp_peak_charge).setScale(2, RoundingMode.HALF_EVEN);
         BigDecimal serviceCharge = originalServicePrice;
         BigDecimal vipDiscountAmount = BigDecimal.ZERO;
         //计算优惠金额
         if(null != chargingOrder.getVipDiscount()){
            vipDiscountAmount = serviceCharge.multiply(new BigDecimal(1).subtract(chargingOrder.getVipDiscount())).setScale(2, RoundingMode.HALF_EVEN);
            serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount()).setScale(2, RoundingMode.HALF_EVEN);
         }
         chargingOrderAccountingStrategy.setChargingCapacity(sharp_peak_charge);
         chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc);
         chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge);
         chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice);
         chargingOrderAccountingStrategy.setVipDiscountAmount(vipDiscountAmount);
         chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
         chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy);
         periodElectricPrice_total = periodElectricPrice_total.add(electrovalenc);
         periodServicePrice_total = periodServicePrice_total.add(originalServicePrice);
         total = total.add(electrovalenc.add(originalServicePrice));
      }
      
      
      //原金额
@@ -1755,6 +1959,7 @@
      //总金额(充值金额+会员折扣金额)
      BigDecimal decimal = rechargeAmount.add(vipDiscountAmount);
      //退款金额(已经计算了折扣优惠部分)
      //如果充电总金额未使用完,则需要退回费用=(原金额/总金额)*(总金额-实际充电金额)
      BigDecimal refundAmount = rechargeAmount.divide(decimal, new MathContext(4, RoundingMode.HALF_EVEN)).multiply(decimal.subtract(total));
      BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue());
      BigDecimal payAmount = BigDecimal.valueOf(total.doubleValue());
@@ -1773,8 +1978,6 @@
            
            //服务费折扣
            discountAmount = periodServicePrice_total.multiply((new BigDecimal(1).subtract(chargingOrder.getVipDiscount())));
            periodServicePrice_total = periodServicePrice_total.multiply(chargingOrder.getVipDiscount());
            TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
            BigDecimal maximumDeduction = vip.getMaximumDeduction();
            //普通会员有最高优惠限制
@@ -1783,28 +1986,33 @@
            }
         }
      }
      //会员折扣金额
      discountAmount = discountAmount.setScale(2, 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());
      if(null != chargingOrder.getEndMode() && chargingOrder.getEndMode() == 2){
         order.setEndMode(refundAmount.compareTo(BigDecimal.ZERO) > 0 ? 2 : 3);
      }
      if(null == chargingOrder.getEndMode()){
      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);
      }
      order.setResidualAmount(rechargeAmount.subtract(total));
      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")));
      order.setEndTime(LocalDateTime.parse(vo.getEnd_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS")));
      order.setStatus(5);
      order.setOrderAmount(orderAmount);
      order.setOrderAmount(orderAmount.setScale(2, RoundingMode.HALF_EVEN));
      order.setVipDiscountAmount(discountAmount);
      order.setElectrovalence(periodElectricPrice_total);
      order.setElectrovalence(periodElectricPrice_total.setScale(2, RoundingMode.HALF_EVEN));
      order.setChargingCapacity(vo.getTotal_electricity());
      order.setElectricity(vo.getTotal_electricity());
      
      //计算优惠券
      BigDecimal couponDiscount = BigDecimal.ZERO;
      if(null != chargingOrder.getAppCouponId()){
         //判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。
         TAppCoupon appCoupon = appCouponClient.getAppCouponById(chargingOrder.getAppCouponId()).getData();
@@ -1817,17 +2025,11 @@
               BigDecimal couponDiscountAmount = tCoupon.getDiscountAmount();
               //如果优惠金额大于服务费金额,以服务费作为最大限制
               if(periodServicePrice_total.compareTo(couponDiscountAmount) < 0){
                  refundAmount = refundAmount.add(periodServicePrice_total);
                  order.setCouponDiscountAmount(periodServicePrice_total);
                  payAmount = payAmount.subtract(periodServicePrice_total);
                  couponDiscount = periodServicePrice_total;
                  periodServicePrice_total = BigDecimal.ZERO;
               }else{
                  refundAmount = refundAmount.add(couponDiscountAmount);
                  order.setCouponDiscountAmount(couponDiscountAmount);
                  payAmount = payAmount.subtract(couponDiscountAmount);
                  periodServicePrice_total = periodServicePrice_total.subtract(couponDiscountAmount);
                  couponDiscount = couponDiscountAmount;
               }
               appCoupon.setStatus(2);
               appCouponClient.updateAppCoupon(appCoupon);
            }else{
@@ -1844,15 +2046,10 @@
               divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide;
               //如果优惠金额大于服务费金额,以服务费作为最大限制
               if(periodServicePrice_total.compareTo(divide) < 0){
                  refundAmount = refundAmount.add(periodServicePrice_total);
                  order.setCouponDiscountAmount(periodServicePrice_total);
                  payAmount = payAmount.subtract(periodServicePrice_total);
                  couponDiscount = periodServicePrice_total;
                  periodServicePrice_total = BigDecimal.ZERO;
               }else{
                  refundAmount = refundAmount.add(divide);
                  order.setCouponDiscountAmount(divide);
                  payAmount = payAmount.subtract(divide);
                  periodServicePrice_total = periodServicePrice_total.subtract(divide);
                  couponDiscount = divide;
               }
               
               appCoupon.setStatus(2);
@@ -1864,10 +2061,17 @@
            }
         }
      }
      order.setServiceCharge(periodServicePrice_total);
      order.setPaymentAmount(payAmount);
      order.setRefundAmount(refundAmount);
      //优惠券优惠金额
      couponDiscount = couponDiscount.setScale(2, RoundingMode.HALF_EVEN);
      refundAmount = refundAmount.add(couponDiscount);
      payAmount = payAmount.subtract(couponDiscount);
      if(periodServicePrice_total.compareTo(BigDecimal.ZERO) > 0){
         periodServicePrice_total = periodServicePrice_total.subtract(couponDiscount);
      }
      order.setCouponDiscountAmount(couponDiscount);
      order.setServiceCharge(periodServicePrice_total.setScale(2, RoundingMode.HALF_EVEN));
      order.setPaymentAmount(payAmount.setScale(2, RoundingMode.HALF_EVEN));
      order.setRefundAmount(refundAmount.setScale(2, RoundingMode.HALF_EVEN));
      order.setRefundStatus(1);
      this.updateById(order);
      chargingOrder = this.getById(order.getId());
@@ -1876,12 +2080,13 @@
      BigDecimal couponDiscountAmount = order.getCouponDiscountAmount();
      if(null != couponDiscountAmount && couponDiscountAmount.compareTo(BigDecimal.ZERO) > 0){
         List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, order.getId()));
         BigDecimal reduce = list.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
         for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list) {
            BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodServicePrice();
            BigDecimal multiply = couponDiscountAmount.multiply(periodServicePrice.divide(periodServicePrice_total, new MathContext(4, RoundingMode.HALF_EVEN)));
            BigDecimal multiply = couponDiscountAmount.multiply(periodServicePrice.divide(reduce, new MathContext(4, RoundingMode.HALF_EVEN)));
            periodServicePrice = periodServicePrice.subtract(multiply);
            chargingOrderAccountingStrategy.setPeriodServicePrice(periodServicePrice);
            chargingOrderAccountingStrategy.setCouponDiscountAmount(multiply);
            chargingOrderAccountingStrategy.setPeriodServicePrice(periodServicePrice.setScale(2, RoundingMode.HALF_EVEN));
            chargingOrderAccountingStrategy.setCouponDiscountAmount(multiply.setScale(2, RoundingMode.HALF_EVEN));
         }
         chargingOrderAccountingStrategyService.updateBatchById(list);
      }
@@ -1898,7 +2103,7 @@
      if(null != integralRule){
         TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
         Integer num1 = JSON.parseObject(integralRule.getChargeCredit()).getInteger("num1");
         Integer integral = payAmount.multiply(new BigDecimal(num1)).intValue();
         Integer integral = chargingOrder.getServiceCharge().intValue() * num1;
         if(null != appUser.getVipId()){
            TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
            Integer doubleIntegration = vip.getDoubleIntegration();
@@ -1908,17 +2113,19 @@
            }
         }
         
         TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
         appUserIntegralChange.setAppUserId(appUser.getId());
         appUserIntegralChange.setChangeType(2);
         appUserIntegralChange.setHistoricalIntegral(appUser.getPoints());
         appUser.setPoints(appUser.getPoints() + integral);
         appUserIntegralChange.setCurrentIntegral(appUser.getPoints());
         appUserIntegralChange.setCreateTime(LocalDateTime.now());
         appUserIntegralChange.setOrderCode(chargingOrder.getCode());
         appUserIntegralChange.setExtension(chargingOrder.getId().toString());
         appUserClient.updateAppUser(appUser);
         appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
         if(integral > 0){
            TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
            appUserIntegralChange.setAppUserId(appUser.getId());
            appUserIntegralChange.setChangeType(2);
            appUserIntegralChange.setHistoricalIntegral(appUser.getPoints());
            appUser.setPoints(appUser.getPoints() + integral);
            appUserIntegralChange.setCurrentIntegral(appUser.getPoints());
            appUserIntegralChange.setCreateTime(LocalDateTime.now());
            appUserIntegralChange.setOrderCode(chargingOrder.getCode());
            appUserIntegralChange.setExtension(chargingOrder.getId().toString());
            appUserClient.updateAppUser(appUser);
            appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
         }
      }
      //计算用户标签
@@ -1942,7 +2149,7 @@
         chargingOrderRefund.setRefundTitle("充电完成退款");
         chargingOrderRefund.setRefundContent("充电完成退款");
         chargingOrderRefund.setRefundReason("充电完成退款");
         chargingOrderRefund.setRefundRemark("实际充电消费金额:" + refundAmount);
         chargingOrderRefund.setRefundRemark("实际充电消费金额:" + chargingOrder.getPaymentAmount());
         chargingOrderRefund.setRefundTotalAmount(refundAmount);
         chargingOrderRefund.setPayAmount(rechargeAmount);
         if(1 == rechargePaymentType){
@@ -2075,6 +2282,9 @@
            if (tChargingOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount())==-1){
               return R.fail("退款金额需小于支付金额");
            }
            if ((tChargingOrder.getRechargeAmount().subtract(tChargingOrder.getRefundAmount()).compareTo(payOrderQueryDto.getRefundAmount()))==0){
               tChargingOrder.setStatus(5);
            }
            TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
@@ -2141,6 +2351,10 @@
            if (tChargingOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount())==-1){
               return R.fail("退款金额需小于支付金额");
            }
            if ((tChargingOrder.getPaymentAmount().subtract(tChargingOrder.getRefundAmount()).compareTo(payOrderQueryDto.getRefundAmount()))==0){
               tChargingOrder.setStatus(5);
            }
            TShoppingOrderRefund chargingOrderRefund = new TShoppingOrderRefund();
            chargingOrderRefund.setShoppingOrderId(tChargingOrder.getId());
            chargingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount());
@@ -2191,9 +2405,7 @@
                  tChargingOrder.setRefundStatus(2);
                  tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
                  if (payOrderQueryDto.getRefundAmount().compareTo(tChargingOrder.getPaymentAmount())==0){
                     tChargingOrder.setStatus(5);
                  }
                  shoppingOrderService.updateById(tChargingOrder);
                  shoppingOrderRefundService.save(chargingOrderRefund);
@@ -2208,6 +2420,8 @@
         if (tChargingOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount())==-1){
            return R.fail("退款金额需小于支付金额");
         }
         TVipOrderRefund chargingOrderRefund = new TVipOrderRefund();
         chargingOrderRefund.setVipOrderId(tChargingOrder.getId());
         chargingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount());
@@ -2286,8 +2500,8 @@
         return null;
      }
      TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserCarId, appUserCar.getId())
            .eq(TChargingOrder::getDelFlag, 0).gt(TChargingOrder::getStartTime, query.getStartTime())
            .eq(TChargingOrder::getRechargePaymentStatus, 2).ne(TChargingOrder::getStatus, -1));
            .eq(TChargingOrder::getDelFlag, 0).between(TChargingOrder::getStartTime, query.getStartTime(), LocalDateTime.now())
            .eq(TChargingOrder::getRechargePaymentStatus, 2).in(TChargingOrder::getStatus, Arrays.asList(4, 5)));
      return one;
   }
@@ -2321,6 +2535,7 @@
      // 根据站点id和开始时间和结束时间和归属日期 查询充电订单列表
      QueryWrapper<TChargingOrder> eq = new QueryWrapper<TChargingOrder>()
            .eq("site_id", dto.getSiteId())
            .eq("status", 5)
            .eq("recharge_payment_status",2);
      switch (dto.getType()){
         case 1:
@@ -2376,38 +2591,33 @@
         if (tChargingOrder.getCouponDiscountAmount()!=null){
            couponDiscount = couponDiscount.add(tChargingOrder.getCouponDiscountAmount());
         }
         if (tChargingOrder.getRefundStatus()!=null &&tChargingOrder.getRefundStatus() == 2){
            // 如果成功退款 那么减去退款金额
            paymentAmount = paymentAmount.add(tChargingOrder.getOrderAmount());
         }else{
            if (tChargingOrder.getPaymentAmount()!=null){
               paymentAmount = paymentAmount.add(tChargingOrder.getOrderAmount());
            }
         if (tChargingOrder.getPaymentAmount()!=null){
            paymentAmount = paymentAmount.add(tChargingOrder.getPaymentAmount());
            orderCommission = orderCommission.add(tChargingOrder.getPaymentAmount().multiply(new BigDecimal("0.006"))
                  .setScale(2,BigDecimal.ROUND_DOWN));
         }
      }
      // 三方交易手续费 三方收费*0.6%
      commissionAmount = sharingAmount.multiply(new BigDecimal("0.006"));
      // 订单手续费 订单支付金额 - 退款金额*0.6%
      orderCommission = paymentAmount.multiply(new BigDecimal("0.006"));
      tSettlementConfirm.setSharingAmount(sharingAmount.setScale(2, RoundingMode.HALF_DOWN));
      tSettlementConfirm.setCommissionAmount(commissionAmount.setScale(2, RoundingMode.HALF_DOWN));
      tSettlementConfirm.setElectrovalence(electrovalence);
      // 服务费=总服务费-三费收费-交易手续费-交易手续费-服务费会员抵扣-服务费优惠券抵扣
      tSettlementConfirm.setServiceCharge(serviceCharge.subtract(commissionAmount).subtract(sharingAmount).subtract(orderCommission).subtract(vipDiscount).subtract(couponDiscount));
      tSettlementConfirm.setElectrovalence(electrovalence.setScale(2, RoundingMode.HALF_DOWN));
      tSettlementConfirm.setServiceCharge(serviceCharge.subtract(orderCommission).setScale(2, RoundingMode.HALF_DOWN));
      tSettlementConfirm.setOrderCommission(orderCommission);
      tSettlementConfirm.setVipDiscount(vipDiscount);
      tSettlementConfirm.setCouponDiscount(couponDiscount);
      tSettlementConfirm.setSiteId(dto.getSiteId());
      tSettlementConfirm.setChargingElectronic(chargingElectronic);
      tSettlementConfirm.setIncome(chargingElectronic.add(serviceCharge));
      tSettlementConfirm.setProfitMoney(new BigDecimal("0"));
      tSettlementConfirm.setNewMoney(new BigDecimal("0"));
      tSettlementConfirm.setNewSettlement(new BigDecimal("0"));
      tSettlementConfirm.setVipDiscount(vipDiscount);
      tSettlementConfirm.setCouponDiscount(couponDiscount);
      tSettlementConfirm.setType(dto.getType());
      if (dto.getState() == 2){
         tSettlementConfirm.setServiceMoney(dto.getServiceCharge().subtract(dto.getVenue()).subtract(dto.getClean())
               .subtract(dto.getMaintain()).multiply(dto.getServicePartner()));
         tSettlementConfirm.setSupplyElectronic(dto.getSupplyElectronic());
         tSettlementConfirm.setVenue(dto.getVenue());
         tSettlementConfirm.setMetering(dto.getMetering());
@@ -2422,12 +2632,26 @@
         tSettlementConfirm.setTotalService(dto.getTotalService());
         tSettlementConfirm.setRemark(dto.getRemark());
         tSettlementConfirm.setServicePartner(dto.getServicePartner());
         tSettlementConfirm.setServiceMoney(dto.getServiceMoney());
         BigDecimal subtract = new BigDecimal("1").subtract(dto.getProportionPartner());
         BigDecimal subtract9 = new BigDecimal("1").subtract(dto.getServicePartner());
         // 总电损费用
         BigDecimal divide = tSettlementConfirm.getProportionMoney().divide(subtract, 2, RoundingMode.HALF_DOWN);
         // 平台承担电损
         BigDecimal subtract1 = divide.subtract(tSettlementConfirm.getProportionMoney());
         BigDecimal multiply = dto.getServiceMoney().multiply(subtract);
         BigDecimal subtract2 = multiply.subtract(subtract1);
         tSettlementConfirm.setNewMoney(dto.getServiceCharge().subtract(dto.getVenue()).subtract(dto.getClean())
               .subtract(dto.getMaintain()).multiply(subtract9).subtract(subtract1));
         tSettlementConfirm.setTotalService(dto.getTotalService());
         tSettlementConfirm.setServiceRemark(dto.getServiceRemark());
         tSettlementConfirm.setDistribution(dto.getDistribution());
         tSettlementConfirm.setIncome(dto.getElectrovalence().add(dto.getServiceCharge()));
         tSettlementConfirm.setCost(dto.getVenue().add(dto.getClean()).add(dto.getMaintain()));
         tSettlementConfirm.setCost(dto.getVenue().add(dto.getClean()).add(dto.getMaintain()).add(dto.getSupplyElectronic()));
         tSettlementConfirm.setProfitMoney(tSettlementConfirm.getIncome().subtract(tSettlementConfirm.getCost()));
         tSettlementConfirm.setNewSettlement(tSettlementConfirm.getProfitMoney().add(tSettlementConfirm.getCost()));
         tSettlementConfirm.setServiceMoney(dto.getServiceCharge().subtract(dto.getVenue()).subtract(dto.getClean())
               .subtract(dto.getMaintain()).multiply(dto.getServicePartner()));
         tSettlementConfirmMapper.insert(tSettlementConfirm);
      }
      return tSettlementConfirm;
@@ -2435,18 +2659,22 @@
   @Override
   public PageInfo<TSettlementConfirm> settlementList(SettlementListQuery dto) {
      String startTime = null;
      String endTime = null;
      if (StringUtils.hasLength(dto.getStartTime())){
         dto.setType(1);
         String[] split = dto.getStartTime().split(" - ");
         dto.setStartTime(split[0]);
         dto.setEndTime(split[1]);
         startTime = split[0];
         endTime = split[1];
      }
      if (StringUtils.hasLength(dto.getEndTime())){
         dto.setType(2);
         String[] split = dto.getStartTime().split(" - ");
         dto.setStartTime(split[0]);
         dto.setEndTime(split[1]);
         String[] split = dto.getEndTime().split(" - ");
         startTime = split[0];
         endTime = split[1];
      }
      dto.setStartTime(startTime);
      dto.setEndTime(endTime);
      PageInfo<TSettlementConfirm> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize());
      List<TSettlementConfirm> list = tSettlementConfirmMapper.settlementList(pageInfo,dto);
      for (TSettlementConfirm tSettlementConfirm : list) {
@@ -2511,11 +2739,14 @@
//      tSettlementConfirm1.setIncomePercentage();
//      tSettlementConfirm1.setTotalPercentage();
      tSettlementConfirm1.setElectronicRefund(0);
// 上月成本合计
      // 上月成本合计
      BigDecimal beforeCost= new BigDecimal("0");
      // 上月利润合计
      BigDecimal beforeIncome= new BigDecimal("0");
      int i = 1;
      for (TSettlementConfirm tSettlementConfirm : list1) {
         tSettlementConfirm.setXuhao(i);
         tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic());
         List<Site> data1 = siteClient.getSiteByIds(Arrays.asList(tSettlementConfirm.getSiteId())).getData();
         if (!data1.isEmpty()){
            tSettlementConfirm.setSiteName(data1.get(0).getName());
@@ -2568,11 +2799,21 @@
         StringBuilder stringBuilder = new StringBuilder();
         for (TChargingOrder tChargingOrder : tChargingOrders) {
            stringBuilder.append(tChargingOrder.getCode()).append(",");
         }
         Long temp = 0L;
         // 充电总时长
         Long temp = 1L;
         if (StringUtils.hasLength(stringBuilder.toString())){
            List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getOrderInfoByCodes(stringBuilder.substring(0,stringBuilder.length()-1)).getData();
            temp+=data6.stream().mapToLong(UploadRealTimeMonitoringData::getCumulative_charging_time).sum();
            String substring = stringBuilder.substring(0, stringBuilder.length() - 1);
            for (String s : substring.split(",")) {
               UploadRealTimeMonitoringData data6 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(s).getData();
               if (data6!=null){
                  temp+=(data6.getCumulative_charging_time()*60);
               }
            }
         }
         List<TChargingPile> data = siteClient.getPileListBySiteId(tSettlementConfirm.getSiteId()).getData();
         // 计算充电桩的功率平均值
@@ -2583,15 +2824,38 @@
         tSettlementConfirm.setIncome(tSettlementConfirm.getElectrovalence().add(tSettlementConfirm.getServiceCharge()));
         // todo 计算利用率 该电站充电桩本月利用率:
         //利用率=充电量/(桩数量*功率*时间)
         List<TChargingPile> data2 = chargingPileClient.getChargingPileBySiteId(tSettlementConfirm.getSiteId()).getData();
         BigDecimal bigDecimal2 = new BigDecimal("0");
         if (data2!=null && (!data2.isEmpty())){
            for (TChargingPile tChargingPile : data2) {
               bigDecimal2 = bigDecimal2.add(tChargingPile.getRatedPower());
            }
            BigDecimal bigDecimal1 = new BigDecimal(data2.size()+"");
            // 平均功率
            BigDecimal divide = bigDecimal2.divide(bigDecimal1, 2, RoundingMode.HALF_DOWN);
            // 充电量
            BigDecimal chargingElectronic1 = tSettlementConfirm.getChargingElectronic();
            // 桩数量
            BigDecimal bigDecimal3 = new BigDecimal(data2.size());
            BigDecimal multiply = chargingElectronic1.multiply(new BigDecimal("24"));
            BigDecimal multiply1 = bigDecimal3.multiply(divide).multiply(new BigDecimal(temp));
            tSettlementConfirm.setRate(chargingElectronic1.divide(multiply1,2,RoundingMode.HALF_DOWN)+"");
         }else{
            tSettlementConfirm.setRate("");
         }
         for (TSettlementConfirm settlementConfirm : list2) {
            int value = parse.getMonth().getValue();
            settlementConfirm.setMonth(value);
            settlementConfirm.setIncome(settlementConfirm.getElectrovalence().add(settlementConfirm.getServiceCharge()));
            tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic());
            if (tSettlementConfirm.getSiteId().equals(settlementConfirm.getSiteId())){
               // 电站相同比较收入涨幅跌幅
               if (tSettlementConfirm.getIncome().compareTo(BigDecimal.ZERO)>0){
                  BigDecimal subtract = tSettlementConfirm.getIncome().subtract(settlementConfirm.getIncome()).divide(tSettlementConfirm.getIncome()).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"));
                  BigDecimal subtract = tSettlementConfirm.getIncome().subtract(settlementConfirm.getIncome()).divide(tSettlementConfirm.getIncome(),2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"));
                  tSettlementConfirm.setIncomePercentage(subtract+"%");
               }else {
                  tSettlementConfirm.setIncomePercentage("100"+"%");
@@ -2608,11 +2872,11 @@
               tSettlementConfirm.setTotalPercentage(bigDecimal1+"%");            }
            beforeCost = beforeCost.add(settlementConfirm.getCost());
            beforeIncome = beforeIncome.add(settlementConfirm.getIncome());
         }
         i++;
      }
      TSettlementConfirm tSettlementConfirm = new TSettlementConfirm();
      tSettlementConfirm.setMonth(parse.getMonthValue());
      tSettlementConfirm.setMeteringElectronic(meteringElectronic);
      tSettlementConfirm.setChargingElectronic(chargingElectronic);
      tSettlementConfirm.setLossElectronic(lossElectronic);
@@ -2666,8 +2930,8 @@
   }
   @Override
   public List<Map<String, Object>> countBySource(List<Integer> siteIds) {
      return this.baseMapper.countBySource(siteIds);
   public List<Map<String, Object>> countBySource(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
      return this.baseMapper.countBySource(siteIds,statisticsQueryDto);
   }
   @Override
@@ -2769,4 +3033,34 @@
   public Long countNoTag() {
      return this.baseMapper.countNoTag();
   }
   @Override
   public List<TChargingOrder> getChargingOrder(TChargingOrderVo order) {
      LambdaQueryWrapper<TChargingOrder> queryWrapper = new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getDelFlag, 0);
      if(null != order.getChargingPileId()){
         queryWrapper.eq(TChargingOrder::getChargingPileId, order.getChargingPileId());
      }
      if(null != order.getChargingGunId()){
         queryWrapper.eq(TChargingOrder::getChargingGunId, order.getChargingGunId());
      }
      if(null != order.getStatus()){
         queryWrapper.eq(TChargingOrder::getStatus, order.getStatus());
      }
      if(null != order.getAppUserId()){
         queryWrapper.eq(TChargingOrder::getAppUserId, order.getAppUserId());
      }
      if(null != order.getStatusList()){
         queryWrapper.in(TChargingOrder::getStatus, order.getStatusList());
      }
      if(null != order.getEndMode()){
         queryWrapper.eq(TChargingOrder::getEndMode, order.getEndMode());
      }
      return this.list(queryWrapper.orderByDesc(TChargingOrder::getCreateTime));
   }
   @Override
   public Long countCar(List<String> brands) {
      return this.baseMapper.countCar(brands);
   }
}