Pu Zhibing
15 小时以前 4c77ac6367145e4740141e872e1cda1c16efa9b1
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -21,7 +21,6 @@
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.integration.api.feignClient.ChargingHandshakeClient;
import com.ruoyi.integration.api.feignClient.PlatformStartChargingReplyClient;
import com.ruoyi.integration.api.feignClient.SendMessageClient;
import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient;
@@ -50,6 +49,9 @@
import com.ruoyi.order.service.TChargingOrderService;
import com.ruoyi.order.service.TOrderEvaluateService;
import com.ruoyi.order.service.*;
import com.ruoyi.order.util.mongodb.service.PlatformStartChargingReplyService;
import com.ruoyi.order.util.mongodb.service.TransactionRecordService;
import com.ruoyi.order.util.mongodb.service.UploadRealTimeMonitoringDataService;
import com.ruoyi.order.vo.EndOfChargePageInfo;
import com.ruoyi.other.api.domain.*;
import com.ruoyi.order.vo.ChargingOrderListInfoVO;
@@ -140,7 +142,7 @@
   private RedisService redisService;
   
   @Resource
   private UploadRealTimeMonitoringDataClient uploadRealTimeMonitoringDataClient;
   private UploadRealTimeMonitoringDataService uploadRealTimeMonitoringDataService;
   
   @Resource
   private TCECClient tcecClient;
@@ -161,7 +163,7 @@
   private AccountingStrategyClient accountingStrategyClient;
   @Resource
   private PlatformStartChargingReplyClient platformStartChargingReplyClient;
   private PlatformStartChargingReplyService platformStartChargingReplyService;
   @Resource
   private TChargingOrderRefundService chargingOrderRefundService;
@@ -196,9 +198,6 @@
   @Resource
   private SecurityDetectionClient securityDetectionClient;
   
   @Resource
   private BmsDemandAndChargerExportationClient bmsDemandAndChargerExportationClient;
   //计数器
   private Map<String, Integer> counter_map = new HashMap<>();
   
@@ -209,7 +208,7 @@
   private OperatorClient operatorClient;
   
   @Resource
   private TransactionRecordClient transactionRecordClient;
   private TransactionRecordService transactionRecordService;
   
   @Resource
   private ITChargingOrderSummaryDataService chargingOrderSummaryDataService;
@@ -286,8 +285,12 @@
      }else{
         myChargingOrderInfo.setLicensePlate(chargingOrder.getPlateNum());
      }
      myChargingOrderInfo.setStartTime(chargingOrder.getStartTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
      myChargingOrderInfo.setEndTime(chargingOrder.getEndTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
      if(null != chargingOrder.getStartTime()){
         myChargingOrderInfo.setStartTime(chargingOrder.getStartTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
      }
      if(null != chargingOrder.getEndTime()){
         myChargingOrderInfo.setEndTime(chargingOrder.getEndTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
      }
      myChargingOrderInfo.setOrderAmount(chargingOrder.getOrderAmount());
      myChargingOrderInfo.setPaymentAmount(chargingOrder.getPaymentAmount());
      myChargingOrderInfo.setRechargeAmount(chargingOrder.getRechargeAmount());
@@ -299,7 +302,7 @@
                  .orderByAsc(TChargingOrderAccountingStrategy::getStartTime)
      );
      myChargingOrderInfo.setStageCost(stageCost);
      List<UploadRealTimeMonitoringData> dataList = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrder.getCode()).getData();
      List<UploadRealTimeMonitoringData> dataList = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode());
      if(null != dataList){
         //在MongoDB中获取数据
         SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
@@ -385,7 +388,6 @@
    * @return
    */
   @Override
   @GlobalTransactional(rollbackFor = Exception.class)
   public AjaxResult paymentChargingOrder(AddChargingOrder addChargingOrder) {
      Long userId = tokenService.getLoginUserApplet().getUserId();
      TAppUser appUser = appUserClient.getUserById(userId).getData();
@@ -572,7 +574,6 @@
    * @return
    */
   @Override
   @GlobalTransactional(rollbackFor = Exception.class)
   public AjaxResult chargingOrderCallback(Integer paymentType, String out_trade_no, String transaction_id, String attach) {
      TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, out_trade_no));
      if(chargingOrder.getRechargePaymentStatus() == 2){
@@ -725,7 +726,7 @@
      }
      String code = chargingOrder.getCode();
      String key = "AQJC_" + chargingOrder.getChargingGunId();
      List<PlatformStartChargingReply> data = platformStartChargingReplyClient.getPlatformStartChargingReply(code).getData();
      List<PlatformStartChargingReply> data = platformStartChargingReplyService.getPlatformStartChargingReply(code);
      log.info(code + ":-------------------开始检查调起充电结果-------------------" + data.toString());
      if(data.size() != 0){
         PlatformStartChargingReply platformStartChargingReply = data.get(1);
@@ -1095,7 +1096,7 @@
      chargingDetails.setCode(one.getCode());
      chargingDetails.setStatus(one.getStatus());
      chargingDetails.setChargingCost(one.getResidualAmount());
      UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataClient.chargingOrderInfo(one.getCode()).getData();
      UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataService.getLastDataById(one.getCode());
      if(null != data){
         chargingDetails.setChargeCurrent(data.getOutput_current());
         chargingDetails.setChargeVoltage(data.getOutput_voltage());
@@ -1124,7 +1125,6 @@
    * @return
    */
   @Override
   @GlobalTransactional(rollbackFor = Exception.class)
   public AjaxResult stopCharging(String id) {
      TChargingOrder order = this.getById(id);
      Integer status = order.getStatus();
@@ -1736,7 +1736,7 @@
         }
         // 获取开始SOC 结束soc
         if (chargingOrderListVO.getCode()!=null){
            List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrderListVO.getCode()).getData();
            List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrderListVO.getCode());
         if (data6!=null && !data6.isEmpty()){
            int min = 100;
@@ -2045,7 +2045,7 @@
      // 获取开始SOC 结束soc
      if (chargingOrder.getCode()!=null){
         List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrder.getCode()).getData();
         List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode());
         if (data6!=null){
            for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data6) {
               if (uploadRealTimeMonitoringData.getOutput_current()!=null&&
@@ -2119,7 +2119,6 @@
    * @param query
    */
   @Override
   @GlobalTransactional(rollbackFor = Exception.class)
   public void chargeMonitoring(UploadRealTimeMonitoringDataQuery query) {
      if(com.ruoyi.common.core.utils.StringUtils.isNotEmpty(query.getTransaction_serial_number())){
         //获取当前的计费策略
@@ -2145,10 +2144,6 @@
         chargingOrder.setChargingCapacity(query.getCharging_degree());
         chargingOrder.setElectricity(query.getCharging_degree());
         chargingOrder.setTotalElectricity(new BigDecimal(100 - query.getSoc()));
         BmsDemandAndChargerExportation data = bmsDemandAndChargerExportationClient.getBmsDemandAndChargerExportation(chargingOrder1.getCode()).getData();
         if(null != data){
            chargingOrder.setNeedElec(data.getBms_current_requirements());
         }
         this.updateById(chargingOrder);
      }
   }
@@ -2159,7 +2154,6 @@
    * @param orderCode
    */
   @Override
   @GlobalTransactional(rollbackFor = Exception.class)
   public void endCharge(String orderCode, Integer endMode) {
      TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, orderCode));
      TChargingOrder chargingOrder = new TChargingOrder();
@@ -2184,33 +2178,38 @@
    * @param vo
    */
   @Override
   @GlobalTransactional(rollbackFor = Exception.class)
   public R endChargeBillingCharge(TransactionRecordMessageVO vo) {
      TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, vo.getTransaction_serial_number()));
      if(null == chargingOrder){
      Boolean hasKey = redisService.hasKey("endOrder:" + vo.getTransaction_serial_number());
      if(hasKey){
         return R.ok();
      }
      Integer status = chargingOrder.getStatus();
      if(status == 5){
         return R.ok();
      }
      //如果使用优惠券需要判断优惠券是否满足使用条件
      //退款金额=优惠券金额+剩余充电金额
      BigDecimal periodElectricPrice_total = BigDecimal.ZERO;
      BigDecimal periodServicePrice_total = BigDecimal.ZERO;
      BigDecimal vipDiscountAmount_total = BigDecimal.ZERO;
      BigDecimal serviceCharge_total = BigDecimal.ZERO;
      BigDecimal total = BigDecimal.ZERO;
      //获取订单的计费策略
      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<>();
      //添加1分钟的缓存
      redisService.setCacheObject("endOrder:" + vo.getTransaction_serial_number(), vo.getTransaction_serial_number(), 1L, TimeUnit.MINUTES);
      try {
         TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, vo.getTransaction_serial_number()));
         if(null == chargingOrder){
            return R.ok();
         }
         Integer status = chargingOrder.getStatus();
         if(status == 5){
            return R.ok();
         }
         //如果使用优惠券需要判断优惠券是否满足使用条件
         //退款金额=优惠券金额+剩余充电金额
         BigDecimal periodElectricPrice_total = BigDecimal.ZERO;
         BigDecimal periodServicePrice_total = BigDecimal.ZERO;
         BigDecimal vipDiscountAmount_total = BigDecimal.ZERO;
         BigDecimal serviceCharge_total = BigDecimal.ZERO;
         BigDecimal total = BigDecimal.ZERO;
         //获取订单的计费策略
         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<>();
         //跨天
         if(!vo.getStart_time().split(" ")[0].equals(vo.getEnd_time().split(" ")[0])){
            //当天的
@@ -2331,330 +2330,331 @@
               lists.add(vo1);
            }
         }
      }catch (Exception e){
         e.printStackTrace();
         R.fail("处理失败");
      }
      //开始处理明细
      for (int i = 0; i < lists.size(); i++) {
         AccountingStrategyDetailOrderVo strategyDetail = lists.get(i);
         BigDecimal sharp_peak_charge = strategyDetail.getChargingCapacity();
         TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy();
         chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId());
         chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId());
         chargingOrderAccountingStrategy.setType(strategyDetail.getType());
         chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence());
         chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge());
         chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge());
         if(i == 0){
            String time = vo.getStart_time().split(" ")[1];
            chargingOrderAccountingStrategy.setStartTime(time.substring(0, time.lastIndexOf(":")));
         }else{
            chargingOrderAccountingStrategy.setStartTime(strategyDetail.getStartTime());
         }
         if(i == lists.size() - 1){
            String time = vo.getEnd_time().split(" ")[1];
            chargingOrderAccountingStrategy.setEndTime(time.substring(0, time.lastIndexOf(":")));
         }else{
            chargingOrderAccountingStrategy.setEndTime(strategyDetail.getEndTime());
         //开始处理明细
         for (int i = 0; i < lists.size(); i++) {
            AccountingStrategyDetailOrderVo strategyDetail = lists.get(i);
            BigDecimal sharp_peak_charge = strategyDetail.getChargingCapacity();
            TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy();
            chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId());
            chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId());
            chargingOrderAccountingStrategy.setType(strategyDetail.getType());
            chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence());
            chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge());
            chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge());
            if(i == 0){
               String time = vo.getStart_time().split(" ")[1];
               chargingOrderAccountingStrategy.setStartTime(time.substring(0, time.lastIndexOf(":")));
            }else{
               chargingOrderAccountingStrategy.setStartTime(strategyDetail.getStartTime());
            }
            if(i == lists.size() - 1){
               String time = vo.getEnd_time().split(" ")[1];
               chargingOrderAccountingStrategy.setEndTime(time.substring(0, time.lastIndexOf(":")));
            }else{
               chargingOrderAccountingStrategy.setEndTime(strategyDetail.getEndTime());
            }
            //已充电总度数
            BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(sharp_peak_charge);
            BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(sharp_peak_charge);
            BigDecimal serviceCharge = originalServicePrice;
            BigDecimal vipDiscountAmount = BigDecimal.ZERO;
            //计算优惠金额
            if(null != chargingOrder.getVipDiscount()){
               //0.58折
               vipDiscountAmount = serviceCharge.multiply(new BigDecimal(1).subtract(chargingOrder.getVipDiscount()));
               serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount());
            }
            chargingOrderAccountingStrategy.setChargingCapacity(sharp_peak_charge);
            chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc.setScale(4, RoundingMode.HALF_EVEN));
            chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge.setScale(4, RoundingMode.HALF_EVEN));
            chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice.setScale(4, RoundingMode.HALF_EVEN));
            chargingOrderAccountingStrategy.setVipDiscountAmount(vipDiscountAmount.setScale(4, RoundingMode.HALF_EVEN));
            chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
            chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy);
            //电费
            periodElectricPrice_total = periodElectricPrice_total.add(electrovalenc);
            //服务费(含折扣)
            serviceCharge_total = serviceCharge_total.add(serviceCharge);
            //服务费(不含折扣)
            periodServicePrice_total = periodServicePrice_total.add(originalServicePrice);
            //会员折扣优惠金额
            vipDiscountAmount_total = vipDiscountAmount_total.add(vipDiscountAmount);
            //原始总金额(不含折扣)
            total = total.add(electrovalenc.add(originalServicePrice));
         }
         
         //已充电总度数
         BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(sharp_peak_charge);
         BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(sharp_peak_charge);
         BigDecimal serviceCharge = originalServicePrice;
         BigDecimal vipDiscountAmount = BigDecimal.ZERO;
         //计算优惠金额
         if(null != chargingOrder.getVipDiscount()){
            //0.58折
            vipDiscountAmount = serviceCharge.multiply(new BigDecimal(1).subtract(chargingOrder.getVipDiscount()));
            serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount());
         }
         chargingOrderAccountingStrategy.setChargingCapacity(sharp_peak_charge);
         chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc.setScale(4, RoundingMode.HALF_EVEN));
         chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge.setScale(4, RoundingMode.HALF_EVEN));
         chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice.setScale(4, RoundingMode.HALF_EVEN));
         chargingOrderAccountingStrategy.setVipDiscountAmount(vipDiscountAmount.setScale(4, RoundingMode.HALF_EVEN));
         chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
         chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy);
         //电费
         periodElectricPrice_total = periodElectricPrice_total.add(electrovalenc);
         //服务费(含折扣)
         serviceCharge_total = serviceCharge_total.add(serviceCharge);
         //服务费(不含折扣)
         periodServicePrice_total = periodServicePrice_total.add(originalServicePrice);
         //会员折扣优惠金额
         vipDiscountAmount_total = vipDiscountAmount_total.add(vipDiscountAmount);
         //原始总金额(不含折扣)
         total = total.add(electrovalenc.add(originalServicePrice));
      }
      BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue());
      //原金额
      BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
      //支付金额
      BigDecimal payAmount = periodElectricPrice_total.add(serviceCharge_total);
      //退款金额=充值金额-实际支付金额
      BigDecimal refundAmount = rechargeAmount.subtract(payAmount);
      TChargingOrder order = new TChargingOrder();
      order.setId(chargingOrder.getId());
      order.setAppUserId(chargingOrder.getAppUserId());
      UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrder.getCode()).getData();
      if(null != uploadRealTimeMonitoringData && null == chargingOrder.getEndMode()){
         Integer soc = uploadRealTimeMonitoringData.getSoc();
         if(soc >= 98){
            order.setEndMode(2);
         }else if(chargingOrder.getResidualAmount().compareTo(new BigDecimal(1)) <= 0){
            order.setEndMode(3);
         }else{
            order.setEndMode(0);
         }
      }
      order.setResidualAmount(rechargeAmount.subtract(total).setScale(2, RoundingMode.HALF_EVEN));
      order.setStartTime(LocalDateTime.parse(vo.getStart_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS")));
      order.setEndTime(LocalDateTime.parse(vo.getEnd_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS")));
      order.setStatus(5);
      order.setOrderAmount(orderAmount.setScale(2, RoundingMode.HALF_EVEN));
      order.setElectrovalence(periodElectricPrice_total.setScale(2, RoundingMode.HALF_EVEN));
      order.setChargingCapacity(vo.getTotal_electricity());
      order.setElectricity(vo.getTotal_electricity());
      order.setVipDiscountAmount(vipDiscountAmount_total);
      if(vipDiscountAmount_total.compareTo(BigDecimal.ZERO) == 0){
         order.setVipDiscount(BigDecimal.valueOf(1));
      }
      //计算优惠券
      BigDecimal couponDiscount = BigDecimal.ZERO;
      if(null != chargingOrder.getAppCouponId()){
         //判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。
         TAppCoupon appCoupon = appCouponClient.getAppCouponById(chargingOrder.getAppCouponId()).getData();
         String couponJson = appCoupon.getCouponJson();
         TCoupon tCoupon = JSON.parseObject(couponJson, TCoupon.class);
         Integer preferentialMode = tCoupon.getPreferentialMode();
         if(1 == preferentialMode){
            //满减
            if(payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0){
               BigDecimal couponDiscountAmount = tCoupon.getDiscountAmount();
               //如果优惠金额大于服务费金额,以服务费作为最大限制
               if(serviceCharge_total.compareTo(couponDiscountAmount) < 0){
                  couponDiscount = serviceCharge_total;
                  serviceCharge_total = BigDecimal.ZERO;
               }else{
                  couponDiscount = couponDiscountAmount;
               }
               appCoupon.setStatus(2);
               appCouponClient.updateAppCoupon(appCoupon);
         BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue());
         //原金额
         BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
         //支付金额
         BigDecimal payAmount = periodElectricPrice_total.add(serviceCharge_total);
         //退款金额=充值金额-实际支付金额
         BigDecimal refundAmount = rechargeAmount.subtract(payAmount);
         TChargingOrder order = new TChargingOrder();
         order.setId(chargingOrder.getId());
         order.setAppUserId(chargingOrder.getAppUserId());
         UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataService.getLastDataById(chargingOrder.getCode());
         if(null != uploadRealTimeMonitoringData && null == chargingOrder.getEndMode()){
            Integer soc = uploadRealTimeMonitoringData.getSoc();
            if(soc >= 98){
               order.setEndMode(2);
            }else if(chargingOrder.getResidualAmount().compareTo(new BigDecimal(1)) <= 0){
               order.setEndMode(3);
            }else{
               order.setAppCouponId(null);
               order.setCouponDiscountAmount(BigDecimal.ZERO);
               appCouponClient.refund(chargingOrder.getAppCouponId().toString());
               order.setEndMode(0);
            }
         }
         if(2 == preferentialMode){
            //抵扣
            if(payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0){
               //折扣金额
               BigDecimal divide = payAmount.multiply(new BigDecimal(10).subtract(tCoupon.getDiscount())).divide(new BigDecimal(10));
               divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide;
               //如果优惠金额大于服务费金额,以服务费作为最大限制
               if(serviceCharge_total.compareTo(divide) < 0){
                  couponDiscount = serviceCharge_total;
                  serviceCharge_total = BigDecimal.ZERO;
         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.setScale(2, RoundingMode.HALF_EVEN));
         order.setElectrovalence(periodElectricPrice_total.setScale(2, RoundingMode.HALF_EVEN));
         order.setChargingCapacity(vo.getTotal_electricity());
         order.setElectricity(vo.getTotal_electricity());
         order.setVipDiscountAmount(vipDiscountAmount_total);
         if(vipDiscountAmount_total.compareTo(BigDecimal.ZERO) == 0){
            order.setVipDiscount(BigDecimal.valueOf(1));
         }
         //计算优惠券
         BigDecimal couponDiscount = BigDecimal.ZERO;
         if(null != chargingOrder.getAppCouponId()){
            //判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。
            TAppCoupon appCoupon = appCouponClient.getAppCouponById(chargingOrder.getAppCouponId()).getData();
            String couponJson = appCoupon.getCouponJson();
            TCoupon tCoupon = JSON.parseObject(couponJson, TCoupon.class);
            Integer preferentialMode = tCoupon.getPreferentialMode();
            if(1 == preferentialMode){
               //满减
               if(payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0){
                  BigDecimal couponDiscountAmount = tCoupon.getDiscountAmount();
                  //如果优惠金额大于服务费金额,以服务费作为最大限制
                  if(serviceCharge_total.compareTo(couponDiscountAmount) < 0){
                     couponDiscount = serviceCharge_total;
                     serviceCharge_total = BigDecimal.ZERO;
                  }else{
                     couponDiscount = couponDiscountAmount;
                  }
                  appCoupon.setStatus(2);
                  appCouponClient.updateAppCoupon(appCoupon);
               }else{
                  couponDiscount = divide;
                  order.setAppCouponId(null);
                  order.setCouponDiscountAmount(BigDecimal.ZERO);
                  appCouponClient.refund(chargingOrder.getAppCouponId().toString());
               }
            }
            if(2 == preferentialMode){
               //抵扣
               if(payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0){
                  //折扣金额
                  BigDecimal divide = payAmount.multiply(new BigDecimal(10).subtract(tCoupon.getDiscount())).divide(new BigDecimal(10));
                  divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide;
                  //如果优惠金额大于服务费金额,以服务费作为最大限制
                  if(serviceCharge_total.compareTo(divide) < 0){
                     couponDiscount = serviceCharge_total;
                     serviceCharge_total = BigDecimal.ZERO;
                  }else{
                     couponDiscount = divide;
                  }
                  appCoupon.setStatus(2);
                  appCouponClient.updateAppCoupon(appCoupon);
               }else{
                  order.setAppCouponId(null);
                  order.setCouponDiscountAmount(BigDecimal.ZERO);
                  appCouponClient.refund(chargingOrder.getAppCouponId().toString());
               }
            }
         }
         //优惠券优惠金额
         couponDiscount = couponDiscount.setScale(4, RoundingMode.HALF_EVEN);
         //退款金额+优惠券
         refundAmount = refundAmount.add(couponDiscount);
         //实际支付金额-优惠券
         payAmount = payAmount.subtract(couponDiscount);
         if(serviceCharge_total.compareTo(BigDecimal.ZERO) > 0){
            serviceCharge_total = serviceCharge_total.subtract(couponDiscount);
         }
         order.setCouponDiscountAmount(couponDiscount.setScale(2, RoundingMode.HALF_EVEN));
         order.setServiceCharge(serviceCharge_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());
         //推送三方平台
         if(2 == chargingOrder.getOrderSource()){
            TChargingOrder finalChargingOrder = chargingOrder;
            new Thread(new Runnable() {
               @Override
               public void run() {
                  tcecClient.notificationEquipChargeStatus(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getOperatorId());
                  tcecClient.notificationStopChargeResult(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getChargingGunId().toString(),
                        finalChargingOrder.getOperatorId());
                  tcecClient.notificationChargeOrderInfo(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getOperatorId());
               }
            }).start();
         }
         //开始将优惠券优惠的金额添加到明细中
         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(reduce, new MathContext(4, RoundingMode.HALF_EVEN)));
               periodServicePrice = periodServicePrice.subtract(multiply);
               chargingOrderAccountingStrategy.setPeriodServicePrice(periodServicePrice.setScale(2, RoundingMode.HALF_EVEN));
               chargingOrderAccountingStrategy.setCouponDiscountAmount(multiply.setScale(2, RoundingMode.HALF_EVEN));
            }
            chargingOrderAccountingStrategyService.updateBatchById(list);
         }
         // 将枪状态重置为空闲
         TChargingGun chargingGun = new TChargingGun();
         chargingGun.setId(chargingOrder.getChargingGunId());
         chargingGun.setStatus(2);
         chargingGun.setChargingPower(BigDecimal.ZERO);
         chargingGunClient.updateChargingGunById(chargingGun);
         //推送状态给三方平台
         if(2 == chargingOrder.getOrderSource()){
            tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), chargingGun.getStatus());
         }
         //添加积分
         if(1 == chargingOrder.getOrderSource()){
            TIntegralRule integralRule = integralRuleClient.getSet().getData();
            if(null != integralRule){
               TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
               Integer num1 = JSON.parseObject(integralRule.getChargeCredit()).getInteger("num1");
               Integer integral = chargingOrder.getServiceCharge().intValue() * num1;
               if(null != appUser.getVipId()){
                  TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
                  Integer doubleIntegration = vip.getDoubleIntegration();
                  //双倍积分
                  if(1 == doubleIntegration){
                     integral *= 2;
                  }
               }
               
               appCoupon.setStatus(2);
               appCouponClient.updateAppCoupon(appCoupon);
            }else{
               order.setAppCouponId(null);
               order.setCouponDiscountAmount(BigDecimal.ZERO);
               appCouponClient.refund(chargingOrder.getAppCouponId().toString());
            }
         }
      }
      //优惠券优惠金额
      couponDiscount = couponDiscount.setScale(4, RoundingMode.HALF_EVEN);
      //退款金额+优惠券
      refundAmount = refundAmount.add(couponDiscount);
      //实际支付金额-优惠券
      payAmount = payAmount.subtract(couponDiscount);
      if(serviceCharge_total.compareTo(BigDecimal.ZERO) > 0){
         serviceCharge_total = serviceCharge_total.subtract(couponDiscount);
      }
      order.setCouponDiscountAmount(couponDiscount.setScale(2, RoundingMode.HALF_EVEN));
      order.setServiceCharge(serviceCharge_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());
      //推送三方平台
      if(2 == chargingOrder.getOrderSource()){
         TChargingOrder finalChargingOrder = chargingOrder;
         new Thread(new Runnable() {
            @Override
            public void run() {
               tcecClient.notificationEquipChargeStatus(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getOperatorId());
               tcecClient.notificationStopChargeResult(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getChargingGunId().toString(),
                     finalChargingOrder.getOperatorId());
               tcecClient.notificationChargeOrderInfo(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getOperatorId());
            }
         }).start();
      }
      //开始将优惠券优惠的金额添加到明细中
      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(reduce, new MathContext(4, RoundingMode.HALF_EVEN)));
            periodServicePrice = periodServicePrice.subtract(multiply);
            chargingOrderAccountingStrategy.setPeriodServicePrice(periodServicePrice.setScale(2, RoundingMode.HALF_EVEN));
            chargingOrderAccountingStrategy.setCouponDiscountAmount(multiply.setScale(2, RoundingMode.HALF_EVEN));
         }
         chargingOrderAccountingStrategyService.updateBatchById(list);
      }
      // 将枪状态重置为空闲
      TChargingGun chargingGun = new TChargingGun();
      chargingGun.setId(chargingOrder.getChargingGunId());
      chargingGun.setStatus(2);
      chargingGun.setChargingPower(BigDecimal.ZERO);
      chargingGunClient.updateChargingGunById(chargingGun);
      //推送状态给三方平台
      if(2 == chargingOrder.getOrderSource()){
         tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), chargingGun.getStatus());
      }
      //添加积分
      if(1 == chargingOrder.getOrderSource()){
         TIntegralRule integralRule = integralRuleClient.getSet().getData();
         if(null != integralRule){
            TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
            Integer num1 = JSON.parseObject(integralRule.getChargeCredit()).getInteger("num1");
            Integer integral = chargingOrder.getServiceCharge().intValue() * num1;
            if(null != appUser.getVipId()){
               TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
               Integer doubleIntegration = vip.getDoubleIntegration();
               //双倍积分
               if(1 == doubleIntegration){
                  integral *= 2;
               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);
               }
            }
            
            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);
            }
         }
         //计算用户标签
         editUserTag(chargingOrder);
         //用户推荐奖励
         referralReward(chargingOrder);
         //开始构建退款费用
         refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN);
         if(refundAmount.compareTo(BigDecimal.ZERO) > 0){
            Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
            //构建退款明细
            TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
            chargingOrderRefund.setChargingOrderId(chargingOrder.getId());
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
            chargingOrderRefund.setRefundAmount(refundAmount);
            chargingOrderRefund.setRefundStatus(1);
            chargingOrderRefund.setPayType(rechargePaymentType);
            chargingOrderRefund.setRefundStatus(1);
            chargingOrderRefund.setCode(chargingOrder.getCode());
            chargingOrderRefund.setRefundTitle("充电完成退款");
            chargingOrderRefund.setRefundContent("充电完成退款");
            chargingOrderRefund.setRefundReason("充电完成退款");
            chargingOrderRefund.setRefundRemark("实际充电消费金额:" + chargingOrder.getPaymentAmount());
            chargingOrderRefund.setRefundTotalAmount(refundAmount);
            chargingOrderRefund.setPayAmount(rechargeAmount);
            if(1 == rechargePaymentType){
               WxPaymentRefundModel model = new WxPaymentRefundModel();
               model.setOut_trade_no(chargingOrder.getCode());
               model.setOut_refund_no(chargingOrderRefund.getRefundCode());
               model.setReason("充电完成退款");
               model.setNotify_url("/payment/wx/refund/notify");
               WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
               amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue());
               amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
               amount.setCurrency("CNY");
               model.setAmount(amount);
               R<Map<String, Object>> result = wxPaymentClient.refundOrderR(model);
               if(200 == result.getCode()){
                  chargingOrderRefundService.save(chargingOrderRefund);
                  //手续费
                  Map<String, Object> amount1 = (Map<String, Object>) result.getData().get("amount");
                  Object refund_fee1 = amount1.get("refund_fee");
                  BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100));
                  chargingOrderRefund.setRefundFee(refund_fee);
                  chargingOrderRefundService.updateById(chargingOrderRefund);
               }
            }
            if(2 == rechargePaymentType){
               RefundReq dto = new RefundReq();
               dto.setOutTradeNo(chargingOrder.getCode());
               dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
               dto.setRefundAmount(refundAmount.toString());
               dto.setRefundReason("充电完成退款");
               RefundResp resp = aliPaymentClient.refund(dto).getData();
               if(null != resp){
                  chargingOrderRefundService.save(chargingOrderRefund);
                  this.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
               }
            }
            //计算用户标签
            editUserTag(chargingOrder);
            //用户推荐奖励
            referralReward(chargingOrder);
            
            //开始构建退款费用
            refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN);
            if(refundAmount.compareTo(BigDecimal.ZERO) > 0){
               Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
               //构建退款明细
               TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
               chargingOrderRefund.setChargingOrderId(chargingOrder.getId());
               SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
               chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
               chargingOrderRefund.setRefundAmount(refundAmount);
               chargingOrderRefund.setRefundStatus(1);
               chargingOrderRefund.setPayType(rechargePaymentType);
               chargingOrderRefund.setRefundStatus(1);
               chargingOrderRefund.setCode(chargingOrder.getCode());
               chargingOrderRefund.setRefundTitle("充电完成退款");
               chargingOrderRefund.setRefundContent("充电完成退款");
               chargingOrderRefund.setRefundReason("充电完成退款");
               chargingOrderRefund.setRefundRemark("实际充电消费金额:" + chargingOrder.getPaymentAmount());
               chargingOrderRefund.setRefundTotalAmount(refundAmount);
               chargingOrderRefund.setPayAmount(rechargeAmount);
               if(1 == rechargePaymentType){
                  WxPaymentRefundModel model = new WxPaymentRefundModel();
                  model.setOut_trade_no(chargingOrder.getCode());
                  model.setOut_refund_no(chargingOrderRefund.getRefundCode());
                  model.setReason("充电完成退款");
                  model.setNotify_url("/payment/wx/refund/notify");
                  WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                  amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue());
                  amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
                  amount.setCurrency("CNY");
                  model.setAmount(amount);
                  R<Map<String, Object>> result = wxPaymentClient.refundOrderR(model);
                  if(200 == result.getCode()){
                     chargingOrderRefundService.save(chargingOrderRefund);
                     //手续费
                     Map<String, Object> amount1 = (Map<String, Object>) result.getData().get("amount");
                     Object refund_fee1 = amount1.get("refund_fee");
                     BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100));
                     chargingOrderRefund.setRefundFee(refund_fee);
                     chargingOrderRefundService.updateById(chargingOrderRefund);
                  }
               }
               if(2 == rechargePaymentType){
                  RefundReq dto = new RefundReq();
                  dto.setOutTradeNo(chargingOrder.getCode());
                  dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
                  dto.setRefundAmount(refundAmount.toString());
                  dto.setRefundReason("充电完成退款");
                  RefundResp resp = aliPaymentClient.refund(dto).getData();
                  if(null != resp){
                     chargingOrderRefundService.save(chargingOrderRefund);
                     this.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
                  }
               }
            }
         }
         //添加汇总统计数据
         List<TChargingOrderAccountingStrategy> list4 = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>().eq("charging_order_id", chargingOrder.getId()));
         BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
         BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
         BigDecimal chargingCapacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
         BigDecimal serviceMoney = BigDecimal.ZERO;
         BigDecimal paymentMoney = BigDecimal.ZERO;
         long time = 0;
         if (!chargingOrder.getOrderSource().equals(2)) {
            serviceMoney = serviceMoney.add(service_reduce);
            paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce);
         }else{
            serviceMoney = serviceMoney.add(service_reduce.multiply(new BigDecimal("0.8")));
            paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8")));
         }
         if (chargingOrder.getStartTime()!=null && chargingOrder.getEndTime()!=null){
            LocalDateTime startTime = chargingOrder.getStartTime();
            LocalDateTime endTime = chargingOrder.getEndTime();
            // 计算时间差 单位秒
            time = ChronoUnit.SECONDS.between(startTime, endTime);
         }
         TChargingOrderSummaryData summaryData = new TChargingOrderSummaryData();
         summaryData.setChargingOrderId(chargingOrder.getId());
         summaryData.setChargingCapacity(chargingCapacity);
         summaryData.setChargingDuration(time);
         summaryData.setIncome(paymentMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN));
         summaryData.setElectricPrice(electronic_reduce.setScale(2, BigDecimal.ROUND_HALF_EVEN));
         summaryData.setServicePrice(serviceMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN));
         chargingOrderSummaryDataService.save(summaryData);
      }catch (Exception e) {
         e.printStackTrace();
      }finally {
         redisService.deleteObject("endOrder:" + vo.getTransaction_serial_number());
      }
      //添加汇总统计数据
      List<TChargingOrderAccountingStrategy> list4 = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>().eq("charging_order_id", chargingOrder.getId()));
      BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
      BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
      BigDecimal chargingCapacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
      BigDecimal serviceMoney = BigDecimal.ZERO;
      BigDecimal paymentMoney = BigDecimal.ZERO;
      long time = 0;
      if (!chargingOrder.getOrderSource().equals(2)) {
         serviceMoney = serviceMoney.add(service_reduce);
         paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce);
      }else{
         serviceMoney = serviceMoney.add(service_reduce.multiply(new BigDecimal("0.8")));
         paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8")));
      }
      if (chargingOrder.getStartTime()!=null && chargingOrder.getEndTime()!=null){
         LocalDateTime startTime = chargingOrder.getStartTime();
         LocalDateTime endTime = chargingOrder.getEndTime();
         // 计算时间差 单位秒
         time = ChronoUnit.SECONDS.between(startTime, endTime);
      }
      TChargingOrderSummaryData summaryData = new TChargingOrderSummaryData();
      summaryData.setChargingOrderId(chargingOrder.getId());
      summaryData.setChargingCapacity(chargingCapacity);
      summaryData.setChargingDuration(time);
      summaryData.setIncome(paymentMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN));
      summaryData.setElectricPrice(electronic_reduce.setScale(2, BigDecimal.ROUND_HALF_EVEN));
      summaryData.setServicePrice(serviceMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN));
      chargingOrderSummaryDataService.save(summaryData);
      return R.ok();
   }
   
@@ -3995,7 +3995,7 @@
            .ne(TChargingOrder::getElectricity, 0).in(TChargingOrder::getStatus, Arrays.asList(4, 5)));
      List<Map<String, Object>> mapList = new ArrayList<>();
      for (TChargingOrder order : list) {
         TransactionRecord transactionRecord = transactionRecordClient.findTransactionRecord(order.getCode()).getData();
         TransactionRecord transactionRecord = transactionRecordService.findOne(order.getCode());
         Map<String, Object> map = new HashMap<>();
         map.put("order", order);
         map.put("transactionRecord", transactionRecord);