From ac4b626821dcc42828e57a0893ff84b5202caf6c Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期四, 23 七月 2026 08:55:05 +0800
Subject: [PATCH] 导出模板变更
---
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java | 156 +++++++++++++++++++++++++++++++++++++++------------
1 files changed, 118 insertions(+), 38 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 621e638..4b16515 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
@@ -739,6 +739,33 @@
}
return vipId == null ? null : vipClient.getInfo1(vipId).getData();
}
+
+ /**
+ * 将会员配置转换为订单统一使用的 0~1 折扣系数。
+ * 常规会员的计费策略已按系数保存;内部会员后台按“8折”这种 0~10 数值保存。
+ */
+ BigDecimal resolveChargingVipDiscount(TVip vip, TAccountingStrategy accountingStrategy) {
+ if (vip == null) {
+ return null;
+ }
+ BigDecimal discount;
+ if (Integer.valueOf(1).equals(vip.getType())) {
+ discount = accountingStrategy == null ? null : accountingStrategy.getDiscount();
+ } else {
+ discount = vip.getDiscount() == null ? null : vip.getDiscount().divide(BigDecimal.TEN);
+ }
+ return isEffectiveVipDiscount(discount) ? discount : null;
+ }
+
+ boolean isEffectiveVipDiscount(BigDecimal discount) {
+ return discount != null
+ && discount.compareTo(BigDecimal.ZERO) > 0
+ && discount.compareTo(BigDecimal.ONE) < 0;
+ }
+
+ boolean shouldConsumeVipDiscount(BigDecimal discountAmount) {
+ return discountAmount != null && discountAmount.compareTo(BigDecimal.ZERO) > 0;
+ }
@Override
public AjaxResult paymentChargingOrder(AddChargingOrder addChargingOrder) {
Long userId = tokenService.getLoginUserApplet().getUserId();
@@ -916,14 +943,7 @@
TAppUserVipDetail vipDetail = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
TVip vip = getVipSnapshot(vipDetail, appUser.getVipId());
if (null != vip && null != vipDetail) {
- BigDecimal discount = null;
- if (Integer.valueOf(1).equals(vip.getType())) {
- //普通会员折扣使用积分策略上的折扣,且有最高优惠金额
- discount = accountingStrategy.getDiscount();
- } else {
- //内部会员使用会员信息设置的折扣,没有最高优惠金额
- discount = vip.getDiscount();
- }
+ BigDecimal discount = resolveChargingVipDiscount(vip, accountingStrategy);
Integer chargeNum = vipDetail.getChargeNum();
if (null != discount && null != chargeNum && 0 < chargeNum) {
chargingOrder.setVipDiscount(discount);
@@ -954,7 +974,7 @@
recordBalanceConsume(chargingOrder, balancePayAmount);
}
if (thirdPayAmount.compareTo(BigDecimal.ZERO) == 0) {
- return chargingOrderCallback(addChargingOrder.getPaymentType(), chargingOrder.getCode(), whitelistMatched ? "WHITELIST" : "BALANCE", null);
+ return completeChargingOrderPayment(chargingOrder, whitelistMatched ? "WHITELIST" : "BALANCE");
}
//会员优惠折扣将其计入增加充电时长(增加总充电金额)
//如果充电总金额未使用完,则需要退回费用=(原金额/总金额)*(总金额-实际充电金额)
@@ -1417,10 +1437,18 @@
if (chargingOrder == null) {
return AjaxResult.error("支付回调订单不存在");
}
+ return completeChargingOrderPayment(chargingOrder, transaction_id);
+ }
+
+ /**
+ * 完成订单支付状态和充电额度初始化。
+ * 本地余额、白名单零元支付直接传入刚保存的订单,避免读写分离下立即回查读不到新订单。
+ */
+ AjaxResult completeChargingOrderPayment(TChargingOrder chargingOrder, String transactionId) {
if (chargingOrder.getRechargePaymentStatus() == 2) {
- if (isIcbcOrder(chargingOrder) && StringUtils.hasLength(transaction_id)
- && !transaction_id.equals(chargingOrder.getRechargeSerialNumber())) {
- chargingOrder.setRechargeSerialNumber(transaction_id);
+ if (isIcbcOrder(chargingOrder) && StringUtils.hasLength(transactionId)
+ && !transactionId.equals(chargingOrder.getRechargeSerialNumber())) {
+ chargingOrder.setRechargeSerialNumber(transactionId);
this.updateById(chargingOrder);
}
return AjaxResult.success();
@@ -1430,7 +1458,7 @@
.eq(TChargingOrder::getId, chargingOrder.getId())
.eq(TChargingOrder::getRechargePaymentStatus, 1)
.set(TChargingOrder::getRechargePaymentStatus, 2)
- .set(TChargingOrder::getRechargeSerialNumber, transaction_id)
+ .set(TChargingOrder::getRechargeSerialNumber, transactionId)
.set(TChargingOrder::getStatus, 2)
.set(TChargingOrder::getPayTime, callbackPayTime));
if (claimed == 0) {
@@ -1447,7 +1475,7 @@
recordBalanceConsume(chargingOrder, money(chargingOrder.getBalancePayAmount()));
}
chargingOrder.setRechargePaymentStatus(2);
- chargingOrder.setRechargeSerialNumber(transaction_id);
+ chargingOrder.setRechargeSerialNumber(transactionId);
chargingOrder.setStatus(2);
chargingOrder.setPayTime(callbackPayTime);
@@ -1480,12 +1508,12 @@
TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
//判断会员是否还有充电优惠次数,计算会员优惠的折扣金额
- if (!isWhitelistOrder(chargingOrder) && null != appUser.getVipId()) {
+ if (!isWhitelistOrder(chargingOrder) && null != appUser.getVipId() && isEffectiveVipDiscount(discount)) {
GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId());
getAppUserVipDetail.setVipId(appUser.getVipId());
TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
- if (null != data && data.getChargeNum() > 0) {
+ if (null != data && data.getChargeNum() != null && data.getChargeNum() > 0) {
//计算折扣
List<AccountingStrategyDetailOrder> list = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
list.get(list.size() - 1).setEndTime("23:59");
@@ -1530,21 +1558,19 @@
}
}
}
- if (null != discount) {
- discountAmount = serviceCharge.multiply(new BigDecimal(1).subtract(discount));
- }
-
- if (discountAmount.compareTo(BigDecimal.ZERO) >= 0) {
- //计算会员最大优惠金额
- TVip vip = getVipSnapshot(data, appUser.getVipId());
- BigDecimal maximumDeduction = vip == null ? null : vip.getMaximumDeduction();
- //普通会员有最高优惠限制
- if (vip != null && Integer.valueOf(1).equals(vip.getType()) && maximumDeduction != null && discountAmount.compareTo(maximumDeduction) > 0) {
- discountAmount = maximumDeduction;
- }
+ discountAmount = serviceCharge.multiply(BigDecimal.ONE.subtract(discount));
+
+ //计算会员最大优惠金额
+ TVip vip = getVipSnapshot(data, appUser.getVipId());
+ BigDecimal maximumDeduction = vip == null ? null : vip.getMaximumDeduction();
+ //普通会员有最高优惠限制
+ if (vip != null && Integer.valueOf(1).equals(vip.getType()) && maximumDeduction != null
+ && maximumDeduction.compareTo(BigDecimal.ZERO) >= 0
+ && discountAmount.compareTo(maximumDeduction) > 0) {
+ discountAmount = maximumDeduction;
}
discountAmount = discountAmount.setScale(4, RoundingMode.HALF_EVEN);
- if (discountAmount.compareTo(BigDecimal.ZERO) >= 0) {
+ if (shouldConsumeVipDiscount(discountAmount)) {
data.setChargeNum(data.getChargeNum() - 1);
appUserVipDetailClient.updateAppUserVipDetail(data);
}
@@ -2305,7 +2331,11 @@
public ChargingDetails getChargingDetails(Integer id) {
Long userId = tokenService.getLoginUserApplet().getUserId();
TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, userId).eq(TChargingOrder::getChargingGunId, id)
- .eq(TChargingOrder::getRechargePaymentStatus, 2).eq(TChargingOrder::getDelFlag, 0).orderByDesc(TChargingOrder::getStartTime).last(" limit 0, 1"));
+ .eq(TChargingOrder::getRechargePaymentStatus, 2)
+ .in(TChargingOrder::getStatus, Arrays.asList(2, 3, 4))
+ .eq(TChargingOrder::getDelFlag, 0)
+ .orderByDesc(TChargingOrder::getCreateTime)
+ .last(" limit 0, 1"));
if (null == one || !one.getAppUserId().equals(userId)) {
return null;
}
@@ -2316,7 +2346,11 @@
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.setReservationTime(one.getReservationTime());
+ boolean reservationPending = one.getReservationTime() != null
+ && one.getReservationTime().isAfter(LocalDateTime.now())
+ && Integer.valueOf(2).equals(one.getStatus());
+ chargingDetails.setStatus(reservationPending ? 1 : one.getStatus());
chargingDetails.setChargingCost(one.getResidualAmount());
UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataService.getLastDataById(one.getCode());
if (null != data) {
@@ -3104,12 +3138,43 @@
@Override
public List<SixChargingDto> charge(LocalDate sixBefore, List<Integer> siteIds, Boolean partnerView) {
- return this.baseMapper.charge(sixBefore, siteIds, partnerView);
+ List<SixChargingDto> result = this.baseMapper.charge(sixBefore, siteIds, partnerView);
+ if (result != null) {
+ for (SixChargingDto item : result) {
+ if (item == null) {
+ continue;
+ }
+ if (item.getMonth() != null) {
+ try {
+ int month = Integer.parseInt(item.getMonth());
+ if (month >= 1 && month <= 12) {
+ item.setMonth(String.format("%02d", month));
+ }
+ } catch (NumberFormatException ignored) {
+ }
+ }
+ if (item.getElectrovalence() != null) {
+ item.setElectrovalence(item.getElectrovalence().setScale(2, RoundingMode.HALF_UP));
+ }
+ if (item.getServiceCharge() != null) {
+ item.setServiceCharge(item.getServiceCharge().setScale(2, RoundingMode.HALF_UP));
+ }
+ }
+ }
+ return result;
}
@Override
public List<SixCircleDto> circle(List<Integer> siteIds, LocalDate sixBefore, Boolean partnerView) {
- return this.baseMapper.circle(siteIds, sixBefore, partnerView);
+ List<SixCircleDto> result = this.baseMapper.circle(siteIds, sixBefore, partnerView);
+ if (result != null) {
+ for (SixCircleDto item : result) {
+ if (item != null && item.getPaymentAmount() != null) {
+ item.setPaymentAmount(item.getPaymentAmount().setScale(2, RoundingMode.HALF_UP));
+ }
+ }
+ }
+ return result;
}
@Override
@@ -3213,11 +3278,17 @@
*/
private BigDecimal getThirdPayNetAmount(TChargingOrder order) {
BigDecimal payAmount = order.getThirdPayAmount();
- if (payAmount == null && Integer.valueOf(3).equals(order.getPayMethod())) {
- payAmount = firstNonNull(order.getPaymentAmount(), order.getRechargeAmount());
+ Integer payMethod = order.getPayMethod();
+ BigDecimal totalPaidAmount = firstNonNull(order.getPaymentAmount(), order.getRechargeAmount());
+ if (isNullOrZero(payAmount)) {
+ if (Integer.valueOf(3).equals(payMethod)) {
+ payAmount = totalPaidAmount;
+ } else if (Integer.valueOf(2).equals(payMethod) && totalPaidAmount != null) {
+ payAmount = nonNegative(totalPaidAmount.subtract(nullToZero(order.getBalancePayAmount())));
+ }
}
BigDecimal refundAmount = order.getThirdRefundAmount();
- if (refundAmount == null && Integer.valueOf(3).equals(order.getPayMethod())) {
+ if (refundAmount == null && Integer.valueOf(3).equals(payMethod)) {
refundAmount = order.getRefundAmount();
}
return nonNegative(nullToZero(payAmount).subtract(nullToZero(refundAmount)));
@@ -3229,8 +3300,13 @@
private BigDecimal getBalancePayNetAmount(TChargingOrder order) {
BigDecimal payAmount = order.getBalancePayAmount();
Integer payMethod = order.getPayMethod();
- if (payAmount == null && (Integer.valueOf(1).equals(payMethod) || Integer.valueOf(2).equals(payMethod))) {
- payAmount = order.getPaymentAmount();
+ BigDecimal totalPaidAmount = firstNonNull(order.getPaymentAmount(), order.getRechargeAmount());
+ if (isNullOrZero(payAmount)) {
+ if (Integer.valueOf(1).equals(payMethod)) {
+ payAmount = totalPaidAmount;
+ } else if (Integer.valueOf(2).equals(payMethod) && totalPaidAmount != null) {
+ payAmount = nonNegative(totalPaidAmount.subtract(nullToZero(order.getThirdPayAmount())));
+ }
}
BigDecimal refundAmount = order.getBalanceRefundAmount();
if (refundAmount == null && (Integer.valueOf(1).equals(payMethod) || Integer.valueOf(2).equals(payMethod))) {
@@ -3243,6 +3319,10 @@
return first != null ? first : second;
}
+ private boolean isNullOrZero(BigDecimal value) {
+ return value == null || value.compareTo(BigDecimal.ZERO) == 0;
+ }
+
private BigDecimal nullToZero(BigDecimal value) {
return value == null ? BigDecimal.ZERO : value;
}
--
Gitblit v1.7.1