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