From 9bc378e6bb9b4563a0dec222e1c2d5d3278632cb Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期三, 17 九月 2025 17:41:54 +0800 Subject: [PATCH] 修改bug --- ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java | 553 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 525 insertions(+), 28 deletions(-) diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java index c9c2c85..4529c75 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java @@ -4,24 +4,44 @@ import com.alibaba.fastjson2.util.UUIDUtils; import com.alibaba.nacos.common.utils.UuidUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ruoyi.account.api.feignClient.AppCouponClient; +import com.ruoyi.account.api.feignClient.AppUserClient; +import com.ruoyi.account.api.feignClient.AppUserIntegralChangeClient; +import com.ruoyi.account.api.feignClient.AppUserVipDetailClient; +import com.ruoyi.account.api.model.TAppCoupon; +import com.ruoyi.account.api.model.TAppUser; +import com.ruoyi.account.api.model.TAppUserIntegralChange; +import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient; import com.ruoyi.chargingPile.api.feignClient.SiteClient; import com.ruoyi.chargingPile.api.model.Site; +import com.ruoyi.chargingPile.api.model.TChargingGun; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.StringUtils; +import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.integration.api.feignClient.ChargingMessageClient; +import com.ruoyi.integration.api.feignClient.TCECClient; import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient; import com.ruoyi.integration.api.model.TransactionRecord; import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData; import com.ruoyi.integration.api.vo.ChargingOrderVo; -import com.ruoyi.order.api.model.TChargingBill; -import com.ruoyi.order.api.model.TChargingOrder; -import com.ruoyi.order.api.model.TChargingOrderRefund; +import com.ruoyi.order.api.model.*; +import com.ruoyi.order.api.vo.AccountingStrategyDetailOrderVo; import com.ruoyi.order.api.vo.TransactionRecordMessageVO; -import com.ruoyi.order.service.TChargingBillService; -import com.ruoyi.order.service.TChargingOrderRefundService; -import com.ruoyi.order.service.TChargingOrderService; +import com.ruoyi.order.service.*; import com.ruoyi.order.util.mongodb.service.TransactionRecordService; import com.ruoyi.order.util.mongodb.service.UploadRealTimeMonitoringDataService; +import com.ruoyi.other.api.domain.TCoupon; +import com.ruoyi.other.api.domain.TIntegralRule; +import com.ruoyi.other.api.domain.TVip; +import com.ruoyi.other.api.feignClient.IntegralRuleClient; +import com.ruoyi.other.api.feignClient.VipClient; +import com.ruoyi.payment.api.feignClient.AliPaymentClient; +import com.ruoyi.payment.api.feignClient.H5AliPaymentClient; +import com.ruoyi.payment.api.feignClient.WxPaymentClient; +import com.ruoyi.payment.api.model.RefundReq; +import com.ruoyi.payment.api.model.RefundResp; +import com.ruoyi.payment.api.model.WxPaymentRefundModel; import lombok.extern.slf4j.Slf4j; import org.apache.logging.log4j.core.util.UuidUtil; import org.apache.poi.util.StringUtil; @@ -33,14 +53,16 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.MathContext; +import java.math.RoundingMode; +import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Random; +import java.time.temporal.ChronoUnit; +import java.util.*; import java.util.stream.Collectors; /** @@ -71,6 +93,42 @@ private ChargingMessageClient chargingMessageClient; private Integer port = null; + @Resource + private AccountingStrategyDetailOrderService accountingStrategyDetailOrderService; + + @Resource + private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService; + + @Resource + private AppCouponClient appCouponClient; + + @Resource + private TCECClient tcecClient; + + @Resource + private VipClient vipClient; + + @Resource + private ChargingGunClient chargingGunClient; + + @Resource + private IntegralRuleClient integralRuleClient; + @Resource + private AppUserClient appUserClient; + + @Resource + private AppUserIntegralChangeClient appUserIntegralChangeClient; + + @Resource + private WxPaymentClient wxPaymentClient; + + @Resource + private AliPaymentClient aliPaymentClient; + @Resource + private H5AliPaymentClient h5AliPaymentClient; + + @Resource + private ITChargingOrderSummaryDataService chargingOrderSummaryDataService; //十分钟循环执行的定时任务 @@ -80,30 +138,36 @@ List<TChargingOrder> failedStartupOrder = chargingOrderService.findFailedStartupOrder(); log.info("定时任务执行,查询到启动失败的订单数量:{}", failedStartupOrder.size()); for (TChargingOrder order : failedStartupOrder) { + log.info("定时任务执行,查询到启动失败的订单:{}", order.getCode()); //查询是否有充电信息 List<UploadRealTimeMonitoringData> dataByOrderCode = uploadRealTimeMonitoringDataService.getDataByOrderCode(order.getCode()); - log.info("充电实时数据:{}", JSON.toJSONString(dataByOrderCode)); + log.info("充电实时数据:{}", dataByOrderCode.size()); //没有充电数据,则执行退款 if(null == dataByOrderCode || dataByOrderCode.isEmpty()){ log.info("定时任务执行,查询到启动失败的订单,执行退款:{}", order.getCode()); - chargingOrderService.refund(order.getCode()); - int num = 0; - while (true){ - TChargingOrderRefund one = chargingOrderRefundService.getOne(new LambdaQueryWrapper<TChargingOrderRefund>().eq(TChargingOrderRefund::getChargingOrderId, order.getId())); - if(null != one && 2 == one.getRefundStatus()){ - order.setStatus(-1); - chargingOrderService.updateById(order); - break; + if(1 == order.getOrderSource()){ + chargingOrderService.refund(order.getCode()); + int num = 0; + while (true){ + TChargingOrderRefund one = chargingOrderRefundService.getOne(new LambdaQueryWrapper<TChargingOrderRefund>().eq(TChargingOrderRefund::getChargingOrderId, order.getId())); + if(null != one && 2 == one.getRefundStatus()){ + order.setStatus(-1); + chargingOrderService.updateById(order); + break; + } + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + num++; + if(num > 10){ + break; + } } - try { - Thread.sleep(5000); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - num++; - if(num > 10){ - break; - } + }else{ + order.setStatus(-1); + chargingOrderService.updateById(order); } } } @@ -111,28 +175,59 @@ List<TChargingOrder> stoppedOrder = chargingOrderService.findStoppedOrder(); log.info("定时任务执行,查询到停止中的订单数量:{}", stoppedOrder.size()); for (TChargingOrder order : stoppedOrder) { + log.info("定时任务执行,查询到停止中的订单:{}", order.getCode()); TransactionRecord one = transactionRecordService.findOne(order.getCode()); if(null != one){ log.info("定时任务执行,查询到停止中的订单账单数据:{}", JSON.toJSONString(one)); + if(null == order.getStartTime()){ + order.setStartTime(LocalDateTime.parse(one.getStart_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS").withZone(ZoneId.systemDefault()))); + } + if(null == order.getEndTime()){ + order.setEndTime(LocalDateTime.parse(one.getEnd_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS").withZone(ZoneId.systemDefault()))); + } + chargingOrderService.updateById(order); TransactionRecordMessageVO vo = new TransactionRecordMessageVO(); BeanUtils.copyProperties(one, vo); R r = chargingOrderService.endChargeBillingCharge(vo); log.info("定时任务执行,停止中的订单处理结果:{}", JSON.toJSONString(r)); + }else{ +// endOrder(order); } } //处理状态为充电中,但硬件已完成的订单 List<TChargingOrder> chargingOrder = chargingOrderService.findChargingOrder(); log.info("定时任务执行,查询到充电中的订单数量:{}", chargingOrder.size()); for (TChargingOrder order : chargingOrder) { + log.info("定时任务执行,查询到充电中的订单:{}", order.getCode()); TransactionRecord one = transactionRecordService.findOne(order.getCode()); if(null != one && StringUtils.isNotEmpty(one.getResult())){ log.info("定时任务执行,查询到充电中的订单账单数据:{}", JSON.toJSONString(one)); + if(null == order.getStartTime()){ + order.setStartTime(LocalDateTime.parse(one.getStart_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS").withZone(ZoneId.systemDefault()))); + } + if(null == order.getEndTime()){ + order.setEndTime(LocalDateTime.parse(one.getEnd_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS").withZone(ZoneId.systemDefault()))); + } + chargingOrderService.updateById(order); TransactionRecordMessageVO vo = new TransactionRecordMessageVO(); BeanUtils.copyProperties(one, vo); R r = chargingOrderService.endChargeBillingCharge(vo); log.info("定时任务执行,充电中的订单处理结果:{}", JSON.toJSONString(r)); } } + //处理还未退款,但是订单状态已结束的数据 + List<TChargingOrder> endChargingOrder = chargingOrderService.findEndChargingOrder(); + log.info("定时任务执行,查询到已结束未退款的订单数量:{}", endChargingOrder.size()); + for (TChargingOrder order : endChargingOrder) { + if(-1 == order.getStatus()){ + order.setStatus(2); + } + if(5 == order.getStatus()){ + order.setStatus(4); + } + chargingOrderService.updateById(order); + } + } } @@ -263,4 +358,406 @@ port = event.getWebServer().getPort(); System.out.println("端口号:" + port); } + + + + public void endOrder(TChargingOrder order){ + List<UploadRealTimeMonitoringData> dataList = uploadRealTimeMonitoringDataService.getDataByOrderCode(order.getCode()); + if(!dataList.isEmpty()){ + //获取当前订单的计费规则,然后分段计算总的度数和充电金额 + List<AccountingStrategyDetailOrder> detailOrders = accountingStrategyDetailOrderService.list(new LambdaQueryWrapper<AccountingStrategyDetailOrder>() + .eq(AccountingStrategyDetailOrder::getChargingOrderId, order.getId()).last(" order by start_time")); + detailOrders.get(detailOrders.size() - 1).setEndTime("23:59"); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); + //开始解析每个时段的充电度数 + BigDecimal decimal = BigDecimal.ZERO; + //如果使用优惠券需要判断优惠券是否满足使用条件 + //退款金额=优惠券金额+剩余充电金额 + BigDecimal periodElectricPrice_total = BigDecimal.ZERO; + BigDecimal periodServicePrice_total = BigDecimal.ZERO; + BigDecimal vipDiscountAmount_total = BigDecimal.ZERO; + BigDecimal serviceCharge_total = BigDecimal.ZERO; + BigDecimal total = BigDecimal.ZERO; + //判断实时数据是否跨天 + SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd"); + Date end_time = dataList.get(0).getCreate_time(); + String end = sdf2.format(end_time); + Date start_time = dataList.get(dataList.size() - 1).getCreate_time(); + String start = sdf2.format(start_time); + if(!end.equals(start)){ + List<AccountingStrategyDetailOrder> list = detailOrders.stream().map(s->{ + AccountingStrategyDetailOrder accountingStrategyDetailOrder = new AccountingStrategyDetailOrder(); + BeanUtils.copyProperties(s, accountingStrategyDetailOrder); + return accountingStrategyDetailOrder; + }).collect(Collectors.toList()); + for (AccountingStrategyDetailOrder detailOrder : detailOrders) { + detailOrder.setStartTime(start + " " + detailOrder.getStartTime()); + detailOrder.setEndTime(start + " " + detailOrder.getEndTime()); + } + for (AccountingStrategyDetailOrder detailOrder : list) { + detailOrder.setStartTime(end + " " + detailOrder.getStartTime()); + detailOrder.setEndTime(end + " " + detailOrder.getEndTime()); + } + detailOrders.addAll(list); + }else{ + for (AccountingStrategyDetailOrder detailOrder : detailOrders) { + detailOrder.setStartTime(start + " " + detailOrder.getStartTime()); + detailOrder.setEndTime(start + " " + detailOrder.getEndTime()); + } + } + + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMddHHmm"); + List<TChargingOrderAccountingStrategy> list = new ArrayList<>(); + for (AccountingStrategyDetailOrder detailOrder : detailOrders) { + long startTime = Long.parseLong(detailOrder.getStartTime().replaceAll("-", "").replaceAll(" ", "").replaceAll(":", "")); + long endTime = Long.parseLong(detailOrder.getEndTime().replaceAll("-", "").replaceAll(" ", "").replaceAll(":", "")); + List<UploadRealTimeMonitoringData> collect = dataList.stream().filter(s -> Long.parseLong(sdf1.format(s.getCreate_time())) > startTime && Long.parseLong(sdf1.format(s.getCreate_time())) <= endTime).collect(Collectors.toList()); + + if(!collect.isEmpty()){ + //升序排序 + collect.sort(new Comparator<UploadRealTimeMonitoringData>(){ + @Override + public int compare(UploadRealTimeMonitoringData o1, UploadRealTimeMonitoringData o2) { + return o1.getCharging_degree().compareTo(o2.getCharging_degree()); + } + }); + UploadRealTimeMonitoringData uploadRealTimeMonitoringData = collect.get(collect.size() - 1); + BigDecimal chargingDegree = uploadRealTimeMonitoringData.getCharging_degree(); + BigDecimal subtract = chargingDegree.subtract(decimal); + decimal = chargingDegree; + if(subtract.compareTo(BigDecimal.ZERO) > 0){ + //组装充电明细数据 + TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy(); + chargingOrderAccountingStrategy.setChargingOrderId(order.getId()); + chargingOrderAccountingStrategy.setAccountingStrategyDetailId(detailOrder.getId()); + chargingOrderAccountingStrategy.setType(detailOrder.getType()); + chargingOrderAccountingStrategy.setElectrovalence(detailOrder.getElectrovalence()); + chargingOrderAccountingStrategy.setServiceCharge(detailOrder.getServiceCharge()); + chargingOrderAccountingStrategy.setCostServiceCharge(detailOrder.getCostServiceCharge()); + chargingOrderAccountingStrategy.setChargingCapacity(subtract); + chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now()); + + if (list.size() == 0) { + String time = sdf.format(collect.get(0).getCreate_time()); + chargingOrderAccountingStrategy.setStartTime(time); + } else { + chargingOrderAccountingStrategy.setStartTime(detailOrder.getStartTime().split(" ")[1]); + } + chargingOrderAccountingStrategy.setEndTime(detailOrder.getEndTime().split(" ")[1]); + + //已充电总度数 + BigDecimal electrovalenc = detailOrder.getElectrovalence().multiply(subtract); + BigDecimal originalServicePrice = detailOrder.getServiceCharge().multiply(subtract); + BigDecimal serviceCharge = originalServicePrice; + BigDecimal vipDiscountAmount = BigDecimal.ZERO; + //计算优惠金额 + if (null != order.getVipDiscount()) { + //0.58折 + vipDiscountAmount = serviceCharge.multiply(new BigDecimal(1).subtract(order.getVipDiscount())); + serviceCharge = serviceCharge.multiply(order.getVipDiscount()); + } + 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()); + list.add(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)); + } + } + + } + list.get(list.size() - 1).setEndTime(sdf.format(dataList.get(0).getCreate_time())); + chargingOrderAccountingStrategyService.saveBatch(list); + + BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue()); + //原金额 + BigDecimal rechargeAmount = order.getRechargeAmount(); + //支付金额 + BigDecimal payAmount = periodElectricPrice_total.add(serviceCharge_total); + //退款金额=充值金额-实际支付金额 + BigDecimal refundAmount = rechargeAmount.subtract(payAmount); + + UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataService.getLastDataById(order.getCode()); + if (null != uploadRealTimeMonitoringData && null == order.getEndMode()) { + Integer soc = uploadRealTimeMonitoringData.getSoc(); + if (soc >= 98) { + order.setEndMode(2); + } else if (null != order.getResidualAmount() && order.getResidualAmount().compareTo(new BigDecimal(1)) <= 0) { + order.setEndMode(3); + } else { + order.setEndMode(1); + } + } + + order.setResidualAmount(rechargeAmount.subtract(total).setScale(2, RoundingMode.HALF_EVEN)); + order.setStartTime(list.get(0).getCreateTime()); + order.setEndTime(list.get(list.size() - 1).getCreateTime()); + order.setStatus(5); + order.setOrderAmount(orderAmount.setScale(2, RoundingMode.HALF_EVEN)); + order.setElectrovalence(periodElectricPrice_total.setScale(2, RoundingMode.HALF_EVEN)); + order.setChargingCapacity(list.get(list.size() - 1).getChargingCapacity()); + order.setElectricity(list.get(list.size() - 1).getChargingCapacity()); + order.setVipDiscountAmount(vipDiscountAmount_total); + if (vipDiscountAmount_total.compareTo(BigDecimal.ZERO) == 0) { + order.setVipDiscount(BigDecimal.valueOf(1)); + } + + //计算优惠券 + BigDecimal couponDiscount = BigDecimal.ZERO; + if (null != order.getAppCouponId()) { + //判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。 + TAppCoupon appCoupon = appCouponClient.getAppCouponById(order.getAppCouponId()).getData(); + String couponJson = appCoupon.getCouponJson(); + TCoupon tCoupon = com.alibaba.fastjson2.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 { + appCouponClient.refund(order.getAppCouponId().toString()); + order.setAppCouponId(null); + order.setCouponDiscountAmount(BigDecimal.ZERO); + } + } + 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(order.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); + chargingOrderService.updateById(order); + + order = chargingOrderService.getById(order.getId()); + + //推送三方平台 + if (2 == order.getOrderSource()) { + TChargingOrder finalChargingOrder = order; + 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> list1 = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, order.getId())); + BigDecimal reduce = list1.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); + for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list1) { + 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(list1); + } + + // 将枪状态重置为空闲 + TChargingGun chargingGun = new TChargingGun(); + chargingGun.setId(order.getChargingGunId()); + chargingGun.setStatus(2); + chargingGun.setChargingPower(BigDecimal.ZERO); + chargingGunClient.updateChargingGunById(chargingGun); + chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData(); + //推送状态给三方平台 + if (2 == order.getOrderSource()) { + tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), 2); + } + + //添加积分 + if (1 == order.getOrderSource()) { + TIntegralRule integralRule = integralRuleClient.getSet().getData(); + if (null != integralRule) { + TAppUser appUser = appUserClient.getUserById(order.getAppUserId()).getData(); + Integer num1 = com.alibaba.fastjson2.JSON.parseObject(integralRule.getChargeCredit()).getInteger("num1"); + Integer integral = order.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(order.getCode()); + appUserIntegralChange.setExtension(order.getId().toString()); + appUserClient.updateAppUser(appUser); + appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange); + } + } + + //计算用户标签 + chargingOrderService.editUserTag(order); + //用户推荐奖励 + chargingOrderService.referralReward(order); + + //开始构建退款费用 + refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN); + if (refundAmount.compareTo(BigDecimal.ZERO) > 0) { + Integer rechargePaymentType = order.getRechargePaymentType(); + //构建退款明细 + TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund(); + chargingOrderRefund.setChargingOrderId(order.getId()); + SimpleDateFormat sdfaa = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + chargingOrderRefund.setRefundCode("CDF" + sdfaa.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue())); + chargingOrderRefund.setRefundAmount(refundAmount); + chargingOrderRefund.setRefundStatus(1); + chargingOrderRefund.setPayType(rechargePaymentType); + chargingOrderRefund.setRefundStatus(1); + chargingOrderRefund.setCode(order.getCode()); + chargingOrderRefund.setRefundTitle("充电完成退款"); + chargingOrderRefund.setRefundContent("充电完成退款"); + chargingOrderRefund.setRefundReason("充电完成退款"); + chargingOrderRefund.setRefundRemark("实际充电消费金额:" + order.getPaymentAmount()); + chargingOrderRefund.setRefundTotalAmount(refundAmount); + chargingOrderRefund.setPayAmount(rechargeAmount); + if (1 == rechargePaymentType) { + WxPaymentRefundModel model = new WxPaymentRefundModel(); + model.setOut_trade_no(order.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(order.getCode()); + dto.setOutRequestNo(chargingOrderRefund.getRefundCode()); + dto.setRefundAmount(refundAmount.toString()); + dto.setRefundReason("充电完成退款"); + RefundResp resp = aliPaymentClient.refund(dto).getData(); + if (null != resp) { + chargingOrderRefundService.save(chargingOrderRefund); + chargingOrderService.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null); + } + } + if (3 == rechargePaymentType) { + RefundReq dto = new RefundReq(); + dto.setOutTradeNo(order.getRechargeSerialNumber()); + dto.setOutRequestNo(chargingOrderRefund.getRefundCode()); + dto.setRefundAmount(refundAmount.toString()); + dto.setRefundReason("充电完成退款"); + RefundResp resp = h5AliPaymentClient.refund(dto).getData(); + if (null != resp && "10000".equals(resp.getCode())) { + chargingOrderRefundService.save(chargingOrderRefund); + chargingOrderService.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null); + } + } + } + } + + //添加汇总统计数据 + List<TChargingOrderAccountingStrategy> list4 = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>().eq("charging_order_id", order.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 (!order.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 (order.getStartTime() != null && order.getEndTime() != null) { + time = ChronoUnit.SECONDS.between(order.getStartTime(), order.getEndTime()); + } + TChargingOrderSummaryData summaryData = new TChargingOrderSummaryData(); + summaryData.setChargingOrderId(order.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); + + //推送监管平台订单状态和订单详情 + ChargingOrderVo chargingOrderVo = new ChargingOrderVo(); + BeanUtils.copyProperties(order, chargingOrderVo); + chargingMessageClient.pushOrderInfo(chargingOrderVo); + chargingMessageClient.pushOrderStatus(chargingOrderVo); + } + } } -- Gitblit v1.7.1