Pu Zhibing
2024-09-27 72fc79723a5be2d4b132357d8e03cc0a67bedea7
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -550,7 +550,9 @@
      //根据当前充值的金额和计费模板算出充电的金额
      BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
      BigDecimal rechargeAmount1 = new BigDecimal(rechargeAmount.toString());
      Long now = System.currentTimeMillis();
      SimpleDateFormat sdf = new SimpleDateFormat("HHmm");
      Long now = Long.valueOf(sdf.format(new Date()));
      Long nowTimeMillis = System.currentTimeMillis();
      //根据支付金额,获取出使用的计费策略明细
      //计算电费金额和服务费
      BigDecimal serviceCharge = BigDecimal.ZERO;
@@ -559,20 +561,27 @@
      BigDecimal discount = chargingOrder.getVipDiscount();
      //先根据额定功率计算出每秒充电度数,然后计算出支付金额能充多少度电
      TChargingGun tChargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
      BigDecimal s_degrees = tChargingGun.getRatedPower().divide(new BigDecimal(3600));
      BigDecimal s_degrees = tChargingGun.getRatedPower().divide(new BigDecimal(3600), 6, RoundingMode.HALF_EVEN);
      TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
      List<AccountingStrategyDetailOrder> list = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
      for (AccountingStrategyDetailOrder accountingStrategyDetailOrder : list) {
         AccountingStrategyOrder accountingStrategyOrder = accountingStrategyOrderClient.getAccountingStrategyOrderById(accountingStrategyDetailOrder.getAccountingStrategyOrderId()).getData();
         Integer start = Integer.valueOf(accountingStrategyDetailOrder.getStartTime().replaceAll(":", ""));
         Integer end = Integer.valueOf(accountingStrategyDetailOrder.getEndTime().replaceAll(":", ""));
         String[] split = accountingStrategyDetailOrder.getEndTime().split(":");
         if(now >= start){
         if(now >= start && now < end){
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split[0]));
            calendar.set(Calendar.MINUTE, Integer.valueOf(split[1]));
            //到此策略结束的秒数
            long m = (calendar.getTimeInMillis() - now) / 1000;
            if(null == nowTimeMillis){
               String[] split1 = accountingStrategyDetailOrder.getStartTime().split(":");
               Calendar calendar1 = Calendar.getInstance();
               calendar1.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split1[0]));
               calendar1.set(Calendar.MINUTE, Integer.valueOf(split1[1]));
               nowTimeMillis = calendar.getTimeInMillis();
            }
            long m = (calendar.getTimeInMillis() - nowTimeMillis) / 1000;
            //每度电的单价
            BigDecimal total_unit = accountingStrategyDetailOrder.getElectrovalence().add(accountingStrategyDetailOrder.getServiceCharge());
            //每秒需要支付的金额
@@ -585,6 +594,7 @@
               serviceCharge = accountingStrategyDetailOrder.getServiceCharge().multiply(s_degrees).multiply(new BigDecimal(m));
               discountAmount = discountAmount.add(serviceCharge.multiply((new BigDecimal(10).subtract(discount)).divide(new BigDecimal(10))));
               rechargeAmount1 = rechargeAmount1.subtract(multiply.multiply(new BigDecimal(m)));
               nowTimeMillis = null;
            }else{
               electrovalence = accountingStrategyDetailOrder.getElectrovalence().multiply(s_degrees).multiply(new BigDecimal(times));
               serviceCharge = accountingStrategyDetailOrder.getServiceCharge().multiply(s_degrees).multiply(new BigDecimal(times));
@@ -649,10 +659,9 @@
            Integer failure_cause = platformStartChargingReply.getFailure_cause();
            Integer counter = counter_map.get(code);
            PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key);
            //状态为5的时候,硬件会间隔60秒后再次检测,依然未插枪,则不启动充电
            //因这里是间隔5秒执行检测,所以累计次数在30次以上
            if(failure_cause == 5 && (null == counter || counter < 35)){
               counter++;
            //5分钟内还未插枪则取消充电,退回金额。
            if(failure_cause == 5 && (null == counter || counter < 300)){
               counter = (null == counter ? 0 : counter) + 1;
               counter_map.put(code, counter);
               //启动失败
               preChargeCheck1.setStartupSuccess(3);
@@ -660,9 +669,9 @@
               redisService.setCacheObject(key, preChargeCheck1);
               return;
            }
            //清除计时器中的无效数据
            counter_map.remove(code);
            //开始处理退款
            TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code));
            if(0 == startup_result){
               //启动失败
@@ -673,6 +682,7 @@
               order.setStatus(-1);
               order.setEndMode(0);
            }else{
               //启动成功
               preChargeCheck1.setStartupSuccess(2);
               order.setStatus(3);
               order.setStartTime(LocalDateTime.now());
@@ -681,8 +691,10 @@
            redisService.setCacheObject(key, preChargeCheck1);
            //提前结束定时任务
            scheduler.shutdown();
         }else{
            log.error("未上传开启充电结果........");
         }
      }, 5, 300, TimeUnit.SECONDS);
      }, 5, 1, TimeUnit.SECONDS);
      return AjaxResult.success();
   }
   
@@ -1195,6 +1207,12 @@
      for (ChargingOrderVO chargingOrderVO : list) {
         TChargingGun data3 = chargingGunClient.getChargingGunById(chargingOrderVO.getChargingGunId()).getData();
         TChargingPile data2 = chargingPileClient.getChargingPileById(chargingOrderVO.getChargingPileId()).getData();
         if (chargingOrderVO.getSiteId()!=null){
            List<Integer> integers = new ArrayList<>();
            integers.add(chargingOrderVO.getSiteId());
            List<Site> data = siteClient.getSiteByIds(integers).getData();
            if (!data.isEmpty())chargingOrderVO.setSiteName(data.get(0).getName());
         }
         if (data2!=null && data3!=null){
            chargingOrderVO.setTerminalName(data2.getName()+"-"+data3.getName());
@@ -1210,7 +1228,9 @@
         // 单个订单累计服务费
         BigDecimal serviceMoney1 = new BigDecimal("0");
         UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrderVO.getCode()).getData();
         chargingOrderVO.setChargingSecond(data5.getTime_remaining()*60L);
         if (data5!=null){
            chargingOrderVO.setChargingSecond(data5.getTime_remaining()*60L);
         }
         // 总收入
         if (chargingOrderVO.getRefundStatus() !=null && chargingOrderVO.getRefundStatus() == 2){
            income = income.add(chargingOrderVO.getPaymentAmount().subtract(chargingOrderVO.getRefundAmount()));