Pu Zhibing
2024-10-23 69d20563ea30538dbe6ad6423bc123e685118751
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -812,21 +812,21 @@
      chargingDetails.setId(one.getId().toString());
      TChargingGun chargingGun = chargingGunClient.getChargingGunById(id).getData();
      TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingGun.getChargingPileId()).getData();
         Site site = siteClient.getSiteByIds(Arrays.asList(chargingPile.getSiteId())).getData().get(0);
         chargingDetails.setName(site.getName() + "-" + chargingPile.getName());
         chargingDetails.setCode(one.getCode());
         chargingDetails.setStatus(one.getStatus());
         chargingDetails.setChargingCost(one.getResidualAmount());
         UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataClient.chargingOrderInfo(one.getCode()).getData();
         if(null != data){
            chargingDetails.setChargeCurrent(data.getOutput_current());
            chargingDetails.setChargeVoltage(data.getOutput_voltage());
            BigDecimal power = data.getOutput_current().multiply(data.getOutput_voltage()).divide(new BigDecimal(1000));
            chargingDetails.setChargePower(power);
            chargingDetails.setCompletionRatio(data.getSoc());
            chargingDetails.setRemainingChargeTime(data.getTime_remaining());
            chargingDetails.setChargedDegrees(data.getCharging_degree());
            Integer h = Integer.valueOf(data.getCumulative_charging_time() / 60);
      Site site = siteClient.getSiteByIds(Arrays.asList(chargingPile.getSiteId())).getData().get(0);
      chargingDetails.setName(site.getName() + "-" + chargingPile.getName());
      chargingDetails.setCode(one.getCode());
      chargingDetails.setStatus(one.getStatus());
      chargingDetails.setChargingCost(one.getResidualAmount());
      UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataClient.chargingOrderInfo(one.getCode()).getData();
      if(null != data){
         chargingDetails.setChargeCurrent(data.getOutput_current());
         chargingDetails.setChargeVoltage(data.getOutput_voltage());
         BigDecimal power = data.getOutput_current().multiply(data.getOutput_voltage()).divide(new BigDecimal(1000), new MathContext(4, RoundingMode.HALF_EVEN));
         chargingDetails.setChargePower(power);
         chargingDetails.setCompletionRatio(data.getSoc());
         chargingDetails.setRemainingChargeTime(data.getTime_remaining());
         chargingDetails.setChargedDegrees(data.getCharging_degree());
         Integer h = Integer.valueOf(data.getCumulative_charging_time() / 60);
         Integer m = Integer.valueOf(data.getCumulative_charging_time() % 60);
         chargingDetails.setChargedTime(String.format("%02d", h) + ":" + String.format("%02d", m));
      }
@@ -916,30 +916,29 @@
            appUserTagClient.addUserTag(data1);
         }
      }
      //充电评率
      //充电频率
      List<TUserTag> userTagList2 = data.stream().filter(s -> s.getStandardCondition() == 2).collect(Collectors.toList());
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      for (TUserTag tUserTag : userTagList2) {
         TAppUserTag appUserTag = new TAppUserTag();
         appUserTag.setAppUserId(chargingOrder.getAppUserId());
         appUserTag.setUserTagId(tUserTag.getId());
         TAppUserTag data1 = appUserTagClient.getUserTag(appUserTag).getData();
         if(null == data1){
            Integer day = JSON.parseObject(tUserTag.getConditions()).getInteger("day");
            Integer times = JSON.parseObject(tUserTag.getConditions()).getInteger("times");
            Calendar start = Calendar.getInstance();
            start.set(Calendar.DAY_OF_YEAR, start.get(Calendar.DAY_OF_YEAR) + day);
            count1 = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId())
                  .eq(TChargingOrder::getRechargePaymentStatus, 2).isNotNull(TChargingOrder::getPaymentAmount)
                  .between(TChargingOrder::getStartTime, sdf.format(start.getTime()), sdf.format(new Date())).eq(TChargingOrder::getDelFlag, 0));
            //加上本次充电
            if(count1 >= times){
               data1 = new TAppUserTag();
               data1.setAppUserId(chargingOrder.getAppUserId());
               data1.setUserTagId(tUserTag.getId());
               data1.setCreateTime(LocalDateTime.now());
               appUserTagClient.addUserTag(data1);
            }
         Integer day = JSON.parseObject(tUserTag.getConditions()).getInteger("day");
         Integer times = JSON.parseObject(tUserTag.getConditions()).getInteger("times");
         LocalDateTime endTime = LocalDateTime.now();
         endTime.plusDays(day);
         String start = tUserTag.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
         String end = endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
         count1 = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId())
               .eq(TChargingOrder::getRechargePaymentStatus, 2).isNotNull(TChargingOrder::getPaymentAmount)
               .between(TChargingOrder::getStartTime, start, end).eq(TChargingOrder::getDelFlag, 0));
         if(null == data1 && (count1 + 1) >= times){
            data1 = new TAppUserTag();
            data1.setAppUserId(chargingOrder.getAppUserId());
            data1.setUserTagId(tUserTag.getId());
            data1.setCreateTime(LocalDateTime.now());
            appUserTagClient.addUserTag(data1);
         }
      }
   }
@@ -1616,11 +1615,6 @@
         return;
      }
      
      //计算用户标签
      editUserTag(chargingOrder);
      //用户推荐奖励
      referralReward(chargingOrder);
      //如果使用优惠券需要判断优惠券是否满足使用条件
      //根据实际的充电金额计算退款金额   退回费用=(原金额/总金额)*(总金额-实际充电金额)
      //退款金额=优惠券金额+剩余充电金额
@@ -1712,7 +1706,8 @@
      if(null != chargingOrder.getVipDiscount()){
         //服务费折扣
         discountAmount = periodServicePrice_total.multiply((new BigDecimal(1).subtract(chargingOrder.getVipDiscount())));
         periodServicePrice_total = periodServicePrice_total.multiply(chargingOrder.getVipDiscount());
         TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
         if(null != appUser.getVipId()){
            //判断会员是否还有充电优惠次数
@@ -1765,9 +1760,20 @@
         if(1 == preferentialMode){
            //满减
            if(payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0){
               refundAmount = refundAmount.add(tCoupon.getDiscountAmount());
               order.setCouponDiscountAmount(tCoupon.getDiscountAmount());
               payAmount = payAmount.subtract(tCoupon.getDiscountAmount());
               BigDecimal couponDiscountAmount = tCoupon.getDiscountAmount();
               //如果优惠金额大于服务费金额,以服务费作为最大限制
               if(periodServicePrice_total.compareTo(couponDiscountAmount) < 0){
                  refundAmount = refundAmount.add(periodServicePrice_total);
                  order.setCouponDiscountAmount(periodServicePrice_total);
                  payAmount = payAmount.subtract(periodServicePrice_total);
               }else{
                  refundAmount = refundAmount.add(couponDiscountAmount);
                  order.setCouponDiscountAmount(couponDiscountAmount);
                  payAmount = payAmount.subtract(couponDiscountAmount);
               }
               appCoupon.setStatus(2);
               appCouponClient.updateAppCoupon(appCoupon);
            }else{
               order.setAppCouponId(null);
               order.setCouponDiscountAmount(BigDecimal.ZERO);
@@ -1780,9 +1786,19 @@
               //折扣金额
               BigDecimal divide = payAmount.multiply(new BigDecimal(10).subtract(tCoupon.getDiscount())).divide(new BigDecimal(10));
               divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide;
               refundAmount = refundAmount.add(divide);
               order.setCouponDiscountAmount(divide);
               payAmount = payAmount.subtract(divide);
               //如果优惠金额大于服务费金额,以服务费作为最大限制
               if(periodServicePrice_total.compareTo(divide) < 0){
                  refundAmount = refundAmount.add(periodServicePrice_total);
                  order.setCouponDiscountAmount(periodServicePrice_total);
                  payAmount = payAmount.subtract(periodServicePrice_total);
               }else{
                  refundAmount = refundAmount.add(divide);
                  order.setCouponDiscountAmount(divide);
                  payAmount = payAmount.subtract(divide);
               }
               appCoupon.setStatus(2);
               appCouponClient.updateAppCoupon(appCoupon);
            }else{
               order.setAppCouponId(null);
               order.setCouponDiscountAmount(BigDecimal.ZERO);
@@ -1830,7 +1846,11 @@
         appUserClient.updateAppUser(appUser);
         appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
      }
      //计算用户标签
      editUserTag(chargingOrder);
      //用户推荐奖励
      referralReward(chargingOrder);
      
      //开始构建退款费用
      if(refundAmount.compareTo(BigDecimal.ZERO) > 0){
@@ -2567,12 +2587,13 @@
      info.setRefundAmount(chargingOrder.getRefundAmount());
      LocalDateTime startTime = chargingOrder.getStartTime();
      LocalDateTime endTime = chargingOrder.getEndTime();
      info.setStartDay(startTime.format(DateTimeFormatter.ofPattern("MM月dd日")) + " 周" + startTime.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.SIMPLIFIED_CHINESE));
      info.setStartDay(startTime.format(DateTimeFormatter.ofPattern("MM月dd日")) + " " + startTime.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.SIMPLIFIED_CHINESE));
      info.setStartHour(startTime.format(DateTimeFormatter.ofPattern("HH:mm")));
      info.setEndDay(endTime.format(DateTimeFormatter.ofPattern("MM月dd日")) + " 周" + endTime.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.SIMPLIFIED_CHINESE));
      info.setEndDay(endTime.format(DateTimeFormatter.ofPattern("MM月dd日")) + " " + endTime.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.SIMPLIFIED_CHINESE));
      info.setEndHour(endTime.format(DateTimeFormatter.ofPattern("HH:mm")));
      int hour = endTime.getHour() - startTime.getHour();
      int second = endTime.getMinute() - startTime.getMinute();
      long time = (endTime.toEpochSecond(ZoneOffset.UTC) - startTime.toEpochSecond(ZoneOffset.UTC)) / 60;
      long hour = time / 60;
      long second = time % 60;
      info.setDuration(0 == hour ? String.format("%s分钟", second) : String.format("%s小时%s分钟", hour, second));
      return info;
   }