Pu Zhibing
2025-05-07 dfd33b4f9da0811ed1956c06608c2935318644e9
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -697,15 +697,15 @@
      
      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);
//      //异步线程检测远程启动的应答结果。如果失败,则需要全额退款
//      Long id = chargingOrder.getId();
//      //执行5分钟的定时任务检测
//      ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
//      scheduler.scheduleAtFixedRate(()->{
//         if(timingDetection(id)){
//            scheduler.shutdown();
//         }
//      }, 5, 1, TimeUnit.SECONDS);
      return AjaxResult.success();
   }
   
@@ -731,7 +731,7 @@
         Integer counter = counter_map.get(code);
         PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key);
         //5分钟内还未插枪则取消充电,退回金额。
         if(failure_cause == 5 && (null == counter || counter < 300)){
         if(failure_cause == 5 && (null == counter || counter < 1800)){
            counter = (null == counter ? 0 : counter) + 1;
            counter_map.put(code, counter);
            //启动失败
@@ -772,7 +772,7 @@
         log.info(code + ":-------------------未上传开启充电结果-------------------" + counter);
         PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key);
         //5分钟内未启动成功,退回金额。
         if(null == counter || counter < 300){
         if(null == counter || counter < 1800){
            counter = (null == counter ? 0 : counter) + 1;
            boot_failed_map.put(code, counter);
            //启动失败
@@ -970,6 +970,73 @@
            }
         }
      }
   }
   public void refund1(String code, BigDecimal money){
      log.info(code + ":-------------------充电成功,执行手动退款-------------------");
      TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code));
      if(chargingOrder.getOrderSource() == 1){
         BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
         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(money);
         chargingOrderRefund.setRefundStatus(1);
         chargingOrderRefund.setPayType(rechargePaymentType);
         chargingOrderRefund.setRefundStatus(1);
         chargingOrderRefund.setCode(code);
         chargingOrderRefund.setRefundTitle("充电完成退款");
         chargingOrderRefund.setRefundContent("充电完成退款");
         chargingOrderRefund.setRefundReason("充电完成退款");
         chargingOrderRefund.setRefundRemark("充电完成退款,手动退款");
         chargingOrderRefund.setRefundTotalAmount(money);
         chargingOrderRefund.setPayAmount(money);
         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(money.multiply(new BigDecimal(100)).intValue());
            amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
            amount.setCurrency("CNY");
            model.setAmount(amount);
            R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
            if(200 == orderR.getCode()){
               chargingOrderRefundService.save(chargingOrderRefund);
               //手续费
               Map<String, Object> amount1 = (Map<String, Object>) orderR.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.getCode());
            dto.setRefundAmount(money.toString());
            dto.setRefundReason("充电完成退款");
            RefundResp resp = aliPaymentClient.refund(dto).getData();
            if(null != resp){
               chargingOrderRefundService.save(chargingOrderRefund);
               try {
                  Thread.sleep(1000);
               } catch (InterruptedException e) {
                  throw new RuntimeException(e);
               }
               chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
            }
         }
      }
   }
@@ -1332,13 +1399,12 @@
      if (siteIds.isEmpty())siteIds.add(-1);
      dto.setSiteIds(siteIds);
      List<ChargingOrderVO> list = this.baseMapper.chargingOrder(pageInfo,dto,startTime1,startTime2,endTime1,endTime2);
      List<ChargingOrderVO> list1 = this.baseMapper.chargingOrderNolimit(dto,startTime1,startTime2,endTime1,endTime2);
       BigDecimal total = new BigDecimal("0");
       long time = 0L;
       BigDecimal electronicMoney = new BigDecimal("0");
       BigDecimal serviceMoney = new BigDecimal("0");
       BigDecimal commissionMoney = new BigDecimal("0");
       BigDecimal refundMoney = new BigDecimal("0");
//       BigDecimal refundMoney = new BigDecimal("0");
       BigDecimal paymentMoney = new BigDecimal("0");
      List<TChargingOrderAccountingStrategy> list3 = chargingOrderAccountingStrategyService.list();
@@ -1406,15 +1472,11 @@
         }
      }
      List<TChargingOrderRefund> chargingOrderRefunds = chargingOrderRefundService.lambdaQuery()
            .eq(TChargingOrderRefund::getRefundStatus,2).list();
       BigDecimal total = new BigDecimal("0");
       long time = 0L;
       BigDecimal electronicMoney = new BigDecimal("0");
       BigDecimal serviceMoney = new BigDecimal("0");
       BigDecimal refundMoney = new BigDecimal("0");
       BigDecimal paymentMoney = new BigDecimal("0");
//      List<TChargingOrderRefund> chargingOrderRefunds = chargingOrderRefundService.lambdaQuery()
//            .eq(TChargingOrderRefund::getRefundStatus,2).list();
       List<ChargingOrderVO> list1 = this.baseMapper.chargingOrderNolimit(dto,startTime1,startTime2,endTime1,endTime2);
      for (ChargingOrderVO chargingOrderVO : list1) {
         if(null == chargingOrderVO.getStatus() || 5 != chargingOrderVO.getStatus()){
            continue;
@@ -1439,11 +1501,11 @@
            long between = ChronoUnit.SECONDS.between(startTime, endTime);
            time+=between;
         }
         List<TChargingOrderRefund> list2 = chargingOrderRefunds.stream().filter(e -> e.getChargingOrderId() != null && e.getChargingOrderId().equals(chargingOrderVO.getId()))
               .collect(Collectors.toList());
         for (TChargingOrderRefund tChargingOrderRefund : list2) {
            refundMoney = refundMoney.add(tChargingOrderRefund.getRefundTotalAmount());
         }
//         List<TChargingOrderRefund> list2 = chargingOrderRefunds.stream().filter(e -> e.getChargingOrderId() != null && e.getChargingOrderId().equals(chargingOrderVO.getId()))
//               .collect(Collectors.toList());
//         for (TChargingOrderRefund tChargingOrderRefund : list2) {
//            refundMoney = refundMoney.add(tChargingOrderRefund.getRefundTotalAmount());
//         }
      }
      tCharingOrderVO.setTotal(total);
      tCharingOrderVO.setTime(time);
@@ -1819,48 +1881,24 @@
            for (TChargingOrderAccountingStrategy temp : list2) {
               switch (temp.getType()){
                  case 1:
                     if (temp.getChargingCapacity()!=null){
                        jian = jian.add(temp.getChargingCapacity());
                     }
                     if (temp.getElectrovalence()!=null){
                        jianElectronic = jianElectronic.add(temp.getElectrovalence());
                     }
                     if (temp.getServiceCharge()!=null){
                        jianService = jianService.add(temp.getServiceCharge());
                     }
                     jian = jian.add(temp.getChargingCapacity());
                     jianElectronic = jianElectronic.add(temp.getPeriodElectricPrice()).add(temp.getPeriodServicePrice());
                     jianService = jianService.add(temp.getPeriodServicePrice());
                     break;
                  case 2:
                     if (temp.getChargingCapacity()!=null){
                        feng = feng.add(temp.getChargingCapacity());
                     }
                     if (temp.getElectrovalence()!=null){
                        fengElectronic = fengElectronic.add(temp.getElectrovalence());
                     }
                     if (temp.getServiceCharge()!=null){
                        fengService = fengService.add(temp.getServiceCharge());
                     }
                     feng = feng.add(temp.getChargingCapacity());
                     fengElectronic = fengElectronic.add(temp.getPeriodElectricPrice()).add(temp.getPeriodServicePrice());
                     fengService = fengService.add(temp.getPeriodServicePrice());
                     break;
                  case 3:
                     if (temp.getChargingCapacity()!=null){
                        ping = ping.add(temp.getChargingCapacity());
                     }
                     if (temp.getElectrovalence()!=null){
                        pingElectronic = pingElectronic.add(temp.getElectrovalence());
                     }
                     if (temp.getServiceCharge()!=null){
                        pingService = pingService.add(temp.getServiceCharge());
                     }
                     ping = ping.add(temp.getChargingCapacity());
                     pingElectronic = pingElectronic.add(temp.getPeriodElectricPrice()).add(temp.getPeriodServicePrice());
                     pingService = pingService.add(temp.getPeriodServicePrice());
                     break;
                  case 4:
                     if (temp.getChargingCapacity()!=null){
                        gu = gu.add(temp.getChargingCapacity());
                     }
                     if (temp.getElectrovalence()!=null){
                        guElectronic = guElectronic.add(temp.getElectrovalence());
                     }
                     if (temp.getServiceCharge()!=null){
                        guService = guService.add(temp.getServiceCharge());
                     }
                     gu = gu.add(temp.getChargingCapacity());
                     guElectronic = guElectronic.add(temp.getPeriodElectricPrice()).add(temp.getPeriodServicePrice());
                     guService = guService.add(temp.getPeriodServicePrice());
                     break;
               }
            }
@@ -1868,50 +1906,27 @@
            List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategies.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderListVO.getId()))
                  .collect(Collectors.toList());
            for (TChargingOrderAccountingStrategy temp : list2) {
               BigDecimal multiply = temp.getPeriodServicePrice().multiply(new BigDecimal("0.8"));
               switch (temp.getType()){
                  case 1:
                     if (temp.getChargingCapacity()!=null){
                        jian = jian.add(temp.getChargingCapacity());
                     }
                     if (temp.getElectrovalence()!=null){
                        jianElectronic = jianElectronic.add(temp.getElectrovalence());
                     }
                     if (temp.getServiceCharge()!=null){
                        jianService = jianService.add(temp.getServiceCharge().multiply(new BigDecimal("0.2").setScale(2,BigDecimal.ROUND_HALF_UP)));
                     }
                     jian = jian.add(temp.getChargingCapacity());
                     jianElectronic = jianElectronic.add(temp.getPeriodElectricPrice()).add(multiply);
                     jianService = jianService.add(multiply);
                     break;
                  case 2:
                     if (temp.getChargingCapacity()!=null){
                        feng = feng.add(temp.getChargingCapacity());
                     }
                     if (temp.getElectrovalence()!=null){
                        fengElectronic = fengElectronic.add(temp.getElectrovalence());
                     }
                     if (temp.getServiceCharge()!=null){
                        fengService = fengService.add(temp.getServiceCharge().multiply(new BigDecimal("0.2").setScale(2,BigDecimal.ROUND_HALF_UP)));
                     }
                     feng = feng.add(temp.getChargingCapacity());
                     fengElectronic = fengElectronic.add(temp.getPeriodElectricPrice()).add(multiply);
                     fengService = fengService.add(multiply);
                     break;
                  case 3:
                     if (temp.getChargingCapacity()!=null){
                        ping = ping.add(temp.getChargingCapacity());
                     }
                     if (temp.getElectrovalence()!=null){
                        pingElectronic = pingElectronic.add(temp.getElectrovalence());
                     }
                     if (temp.getServiceCharge()!=null){
                        pingService = pingService.add(temp.getServiceCharge().multiply(new BigDecimal("0.2").setScale(2,BigDecimal.ROUND_HALF_UP)));
                     }
                     ping = ping.add(temp.getChargingCapacity());
                     pingElectronic = pingElectronic.add(temp.getPeriodElectricPrice()).add(multiply);
                     pingService = pingService.add(multiply);
                     break;
                  case 4:
                     if (temp.getChargingCapacity()!=null){
                        gu = gu.add(temp.getChargingCapacity());
                     }
                     if (temp.getElectrovalence()!=null){
                        guElectronic = guElectronic.add(temp.getElectrovalence());
                     }
                     if (temp.getServiceCharge()!=null){
                        guService = guService.add(temp.getServiceCharge().multiply(new BigDecimal("0.2").setScale(2,BigDecimal.ROUND_HALF_UP)));
                     }
                     gu = gu.add(temp.getChargingCapacity());
                     guElectronic = guElectronic.add(temp.getPeriodElectricPrice()).add(multiply);
                     guService = guService.add(multiply);
                     break;
               }
            }
@@ -1923,7 +1938,6 @@
      chargingOrderTimeVO.setElectrovalence(electrovalence.setScale(2, BigDecimal.ROUND_HALF_EVEN));
      chargingOrderTimeVO.setServiceCharge(serviceCharge.setScale(2, BigDecimal.ROUND_HALF_EVEN));
      // 计算尖峰平谷充电到账占比
      BigDecimal add = jianElectronic.add(fengElectronic).add(pingElectronic).add(guElectronic);
      // 计算尖峰平谷服务费占比
      BigDecimal add1 = jianService.add(fengService).add(pingService).add(guService);
@@ -2469,10 +2483,16 @@
      
      //推送三方平台
      if(2 == chargingOrder.getOrderSource()){
         tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
         tcecClient.notificationStopChargeResult(chargingOrder.getStartChargeSeq(), chargingOrder.getChargingGunId().toString(),
               chargingOrder.getOperatorId());
         tcecClient.notificationChargeOrderInfo(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
         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();
      }
      
      //开始将优惠券优惠的金额添加到明细中
@@ -2915,6 +2935,8 @@
   @Override
   public TSettlementConfirm settlementAdd(SettlementConfirmAdd dto) {
      List<Site> data = siteClient.getSiteByIds(Arrays.asList(dto.getSiteId())).getData();
      List<TChargingOrderAccountingStrategy> list3 = chargingOrderAccountingStrategyService.list();
      TSettlementConfirm tSettlementConfirm = new TSettlementConfirm();
      if (!data.isEmpty()){
         tSettlementConfirm.setSiteName(data.get(0).getName());
@@ -2941,9 +2963,7 @@
      // 根据站点id和开始时间和结束时间和归属日期 查询充电订单列表
      QueryWrapper<TChargingOrder> eq = new QueryWrapper<TChargingOrder>()
            .eq("site_id", dto.getSiteId())
            .eq("status", 5)
            .eq("recharge_payment_status",2);
            .eq("site_id", dto.getSiteId());
      switch (dto.getType()){
         case 1:
            eq.between("pay_time", localDateTime, localDateTime1);
@@ -2972,25 +2992,37 @@
      // 支付订单金额 需要减去退款金额
      BigDecimal paymentAmount = new BigDecimal("0");
      for (TChargingOrder tChargingOrder : tChargingOrders) {
         // 累加充电总度数
         if (tChargingOrder.getChargingCapacity()!=null){
            chargingElectronic = chargingElectronic.add(tChargingOrder.getChargingCapacity());
         if(null == tChargingOrder.getStatus() || 5 != tChargingOrder.getStatus()){
            continue;
         }
         List<TChargingOrderAccountingStrategy> list4 = list3.stream().filter(e -> e.getChargingOrderId().equals(tChargingOrder.getId())).collect(Collectors.toList());
         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);
         // 累加充电总度数
         chargingElectronic = chargingElectronic.add(chargingCapacity);
         // 累加分佣
         if (tChargingOrder.getOrderSource()==2) {
            sharingAmount = sharingAmount.add(tChargingOrder.getServiceCharge().multiply(new BigDecimal("0.2")).setScale(2,BigDecimal.ROUND_DOWN));
            sharingAmount = sharingAmount.add(service_reduce.multiply(new BigDecimal("0.2")).setScale(2,BigDecimal.ROUND_DOWN));
         }
         // 累加电费
         if (tChargingOrder.getElectrovalence()!=null) {
         electrovalence = electrovalence.add(tChargingOrder.getElectrovalence());
         electrovalence = electrovalence.add(electronic_reduce);
         if (tChargingOrder.getPaymentAmount()!=null && tChargingOrder.getOrderSource()!=2){
            paymentAmount = paymentAmount.add(tChargingOrder.getPaymentAmount());
         }
         if (tChargingOrder.getRechargeAmount()!=null){
            orderCommission = orderCommission.add(tChargingOrder.getRechargeAmount().multiply(new BigDecimal("0.006"))
                  .setScale(2,BigDecimal.ROUND_DOWN));
         }
         // 累加服务费
         if (tChargingOrder.getServiceCharge()!=null){
            if (tChargingOrder.getOrderSource()==2) {
               serviceCharge = serviceCharge.add(tChargingOrder.getServiceCharge().multiply(new BigDecimal("0.2")).setScale(2,BigDecimal.ROUND_DOWN));
               serviceCharge = serviceCharge.add(service_reduce.multiply(new BigDecimal("0.8")).setScale(2,BigDecimal.ROUND_DOWN));
               paymentAmount = paymentAmount.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8")));
            }else{
               serviceCharge = serviceCharge.add(tChargingOrder.getServiceCharge());
               serviceCharge = serviceCharge.add(service_reduce);
            }
         }
         // 累加会员折扣
@@ -3001,11 +3033,7 @@
         if (tChargingOrder.getCouponDiscountAmount()!=null){
            couponDiscount = couponDiscount.add(tChargingOrder.getCouponDiscountAmount());
         }
         if (tChargingOrder.getPaymentAmount()!=null){
            paymentAmount = paymentAmount.add(tChargingOrder.getPaymentAmount());
            orderCommission = orderCommission.add(tChargingOrder.getRechargeAmount().multiply(new BigDecimal("0.006"))
                  .setScale(2,BigDecimal.ROUND_DOWN));
         }
      }
@@ -3857,15 +3885,15 @@
      platformStartCharging.setAccount_balance(rechargeAmount);
      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);
//      //异步线程检测远程启动的应答结果。如果失败,则需要全额退款
//      Long id = chargingOrder.getId();
//      //执行5分钟的定时任务检测
//      ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
//      scheduler.scheduleAtFixedRate(()->{
//         if(timingDetection(id)){
//            scheduler.shutdown();
//         }
//      }, 5, 1, TimeUnit.SECONDS);
      
      //推送三方平台订单状态
      tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
@@ -3934,4 +3962,21 @@
      }
      return R.ok(mapList);
   }
   /**
    *
    * 手动推送订单给第三方平台
    * @param code
    * @return
    */
   @Override
   public R pushOrderInfo(String code) {
      TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code));
      tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
      tcecClient.notificationStopChargeResult(chargingOrder.getStartChargeSeq(), chargingOrder.getChargingGunId().toString(),
            chargingOrder.getOperatorId());
      tcecClient.notificationChargeOrderInfo(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
      return R.ok();
   }
}