From c615b9c504d6bf6f51a600d9e8c056b0321240fb Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期五, 28 二月 2025 12:01:03 +0800 Subject: [PATCH] 修改会员折扣退款bug --- ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java | 99 +++++++++++++++++++++++++++++-------------------- 1 files changed, 58 insertions(+), 41 deletions(-) diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java index bc67496..fc64e04 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java @@ -859,7 +859,7 @@ chargingGun.setStatus(4); chargingGunClient.updateChargingGunById(chargingGun); //推送状态给三方平台 - tcecClient.pushChargingGunStatus(chargingGun.getId(), chargingGun.getStatus()); + tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), chargingGun.getStatus()); } redisService.setCacheObject("AQJC_" + order.getChargingGunId(), preChargeCheck1, 24L, TimeUnit.HOURS); this.updateById(order); @@ -915,9 +915,15 @@ amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue()); amount.setCurrency("CNY"); model.setAmount(amount); - R<String> orderR = wxPaymentClient.refundOrderR(model); + 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){ @@ -1378,7 +1384,9 @@ for (ChargingOrderVO chargingOrderVO : list1) { paymentMoney= paymentMoney.add(chargingOrderVO.getPaymentAmount()!=null?chargingOrderVO.getPaymentAmount():new BigDecimal("0")); - commissionMoney = commissionMoney.add(chargingOrderVO.getRechargeAmount()!=null?chargingOrderVO.getRechargeAmount().multiply(new BigDecimal("0.006")):new BigDecimal("0")); + if (chargingOrderVO.getRechargeAmount()!=null){ + commissionMoney = commissionMoney.add(chargingOrderVO.getRechargeAmount().multiply(new BigDecimal("0.006")).setScale(2,BigDecimal.ROUND_DOWN)); + } if (chargingOrderVO.getChargingCapacity()!=null){ total = total.add(chargingOrderVO.getElectricity()!=null?chargingOrderVO.getElectricity():new BigDecimal("0")); } @@ -1399,7 +1407,8 @@ } tCharingOrderVO.setTotal(total); tCharingOrderVO.setTime(time); - tCharingOrderVO.setIncome(paymentMoney.subtract(commissionMoney)); +// tCharingOrderVO.setIncome(paymentMoney.subtract(commissionMoney)); + tCharingOrderVO.setIncome(paymentMoney); tCharingOrderVO.setElectronicMoney(electronicMoney); tCharingOrderVO.setServiceMoney(serviceMoney); pageInfo.setRecords(list); @@ -2007,6 +2016,9 @@ @GlobalTransactional(rollbackFor = Exception.class) public R endChargeBillingCharge(TransactionRecordMessageVO vo) { TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, vo.getTransaction_serial_number())); + if(null == chargingOrder){ + return R.ok(); + } Integer status = chargingOrder.getStatus(); if(status == 5){ return R.ok(); @@ -2200,42 +2212,19 @@ total = total.add(electrovalenc.add(originalServicePrice)); } + BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue()); + //折扣金额 + BigDecimal discountAmount = chargingOrder.getVipDiscountAmount(); //原金额 BigDecimal rechargeAmount = chargingOrder.getRechargeAmount(); - BigDecimal vipDiscountAmount = chargingOrder.getVipDiscountAmount(); //总金额(充值金额+会员折扣金额) - BigDecimal decimal = rechargeAmount.add(vipDiscountAmount); + BigDecimal decimal = rechargeAmount.add(discountAmount); //退款金额(已经计算了折扣优惠部分) //如果充电总金额未使用完,则需要退回费用=(原金额/总金额)*(总金额-实际充电金额) BigDecimal refundAmount = rechargeAmount.divide(decimal, new MathContext(4, RoundingMode.HALF_EVEN)).multiply(decimal.subtract(total)); - BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue()); - BigDecimal payAmount = BigDecimal.valueOf(total.doubleValue()); - //折扣金额 - BigDecimal discountAmount = BigDecimal.ZERO; - if(null != chargingOrder.getVipDiscount()){ - TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData(); - //判断会员是否还有充电优惠次数 - GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail(); - getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId()); - getAppUserVipDetail.setVipId(appUser.getVipId()); - TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData(); - if(null != data && data.getChargeNum() > 0){ - data.setChargeNum(data.getChargeNum() - 1); - appUserVipDetailClient.updateAppUserVipDetail(data); - - //服务费折扣 - discountAmount = periodServicePrice_total.multiply((new BigDecimal(1).subtract(chargingOrder.getVipDiscount()))); - TVip vip = vipClient.getInfo1(appUser.getVipId()).getData(); - BigDecimal maximumDeduction = vip.getMaximumDeduction(); - //普通会员有最高优惠限制 - if(vip.getType() == 1 && discountAmount.compareTo(maximumDeduction) > 0){ - discountAmount = maximumDeduction; - } - } - } - //会员折扣金额 - discountAmount = discountAmount.setScale(4, RoundingMode.HALF_EVEN); - payAmount = payAmount.subtract(discountAmount); + //支付金额 + BigDecimal payAmount = rechargeAmount.subtract(refundAmount); + //实际充值服务费-会员折扣 periodServicePrice_total = periodServicePrice_total.subtract(discountAmount); TChargingOrder order = new TChargingOrder(); @@ -2257,10 +2246,12 @@ order.setEndTime(LocalDateTime.parse(vo.getEnd_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS"))); order.setStatus(5); order.setOrderAmount(orderAmount.setScale(2, RoundingMode.HALF_EVEN)); - order.setVipDiscountAmount(discountAmount.setScale(2, RoundingMode.HALF_EVEN)); order.setElectrovalence(periodElectricPrice_total.setScale(2, RoundingMode.HALF_EVEN)); order.setChargingCapacity(vo.getTotal_electricity()); order.setElectricity(vo.getTotal_electricity()); + if(discountAmount.compareTo(BigDecimal.ZERO) == 0){ + order.setVipDiscount(BigDecimal.valueOf(1)); + } //计算优惠券 BigDecimal couponDiscount = BigDecimal.ZERO; @@ -2314,7 +2305,9 @@ } //优惠券优惠金额 couponDiscount = couponDiscount.setScale(4, RoundingMode.HALF_EVEN); + //退款金额+优惠券 refundAmount = refundAmount.add(couponDiscount); + //实际支付金额-优惠券 payAmount = payAmount.subtract(couponDiscount); if(periodServicePrice_total.compareTo(BigDecimal.ZERO) > 0){ periodServicePrice_total = periodServicePrice_total.subtract(couponDiscount); @@ -2358,7 +2351,7 @@ chargingGunClient.updateChargingGunById(chargingGun); //推送状态给三方平台 if(2 == chargingOrder.getOrderSource()){ - tcecClient.pushChargingGunStatus(chargingGun.getId(), chargingGun.getStatus()); + tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), chargingGun.getStatus()); } //添加积分 @@ -2428,9 +2421,15 @@ amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue()); amount.setCurrency("CNY"); model.setAmount(amount); - R<String> orderR = wxPaymentClient.refundOrderR(model); - if(200 == orderR.getCode()){ + 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){ @@ -2586,12 +2585,18 @@ amount.setTotal(tChargingOrder.getRechargeAmount().multiply(new BigDecimal(100)).intValue()); amount.setCurrency("CNY"); model.setAmount(amount); - R<String> orderR = wxPaymentClient.refundOrderR(model); + R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model); if(200 == orderR.getCode()){ tChargingOrder.setRefundStatus(2); tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); this.baseMapper.updateById(tChargingOrder); 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); } } @@ -2648,12 +2653,18 @@ amount.setTotal(tChargingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue()); amount.setCurrency("CNY"); model.setAmount(amount); - R<String> orderR = wxPaymentClient.refundOrderR(model); + R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model); if(200 == orderR.getCode()){ tChargingOrder.setRefundStatus(2); tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); shoppingOrderService.updateById(tChargingOrder); shoppingOrderRefundService.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); + shoppingOrderRefundService.updateById(chargingOrderRefund); } } @@ -2707,12 +2718,18 @@ amount.setTotal(tChargingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue()); amount.setCurrency("CNY"); model.setAmount(amount); - R<String> orderR = wxPaymentClient.refundOrderR(model); + R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model); if(200 == orderR.getCode()){ tChargingOrder.setRefundStatus(2); tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); vipOrderService.updateById(tChargingOrder); vipOrderRefundService.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); + vipOrderRefundService.updateById(chargingOrderRefund); } } -- Gitblit v1.7.1