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);
@@ -2421,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();
      }
      
      //开始将优惠券优惠的金额添加到明细中
@@ -3817,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());
@@ -3894,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();
   }
}