From fe392cb2511e6b5100e389320a2e1f292288d8f0 Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期五, 15 五月 2026 09:04:55 +0800
Subject: [PATCH] feat:联调修改

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java |  146 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 145 insertions(+), 1 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 16f1b43..f4be950 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
@@ -1873,6 +1873,9 @@
 			return tCharingOrderVO;
 		}
 
+		/**
+		 * 填充充电桩订单列表余额收入,余额收入按真实充值余额统计,赠送余额单独展示。
+		 */
 		private void fillChargingOrderBalanceIncome(List<ChargingOrderVO> list) {
 			if (list == null || list.isEmpty()) {
 				return;
@@ -1929,6 +1932,9 @@
 		dto.setSiteIds(siteIds);
 	}
 
+	/**
+	 * 查询充电桩订单余额收入明细,余额收入按真实充值余额统计,赠送收入单独展示。
+	 */
 	@Override
 	public List<ChargingOrderBalanceIncomeDetailVO> balanceIncomeDetail(ChargingOrderQuery dto) {
 		String startTime1 = null;
@@ -2012,6 +2018,9 @@
 		tCharingOrderVO.setWhitelistRefund(BigDecimal.ZERO);
 	}
 
+	/**
+	 * 汇总充电桩订单余额收入,兑换码使用记录的usedAmount包含赠送余额,SQL中需扣除giftUsedAmount。
+	 */
 	private Map<String, Object> getExchangeCodeBalanceSummary(ChargingOrderQuery dto, String startTime1, String startTime2, String endTime1, String endTime2) {
 		Map<String, Object> totalMap = new HashMap<>();
 		totalMap.put("balanceIncome", BigDecimal.ZERO);
@@ -2113,6 +2122,111 @@
 	@Override
 	public Map<String, Object> countAll(List<Integer> siteIds) {
 		return this.baseMapper.countAll(siteIds);
+	}
+
+	/**
+	 * 统计近六月订单收入支付方式占比;服务层聚合避免复杂CASE SQL在当前数据库驱动中转换异常。
+	 */
+	@Override
+	public List<SixIncomeCircleDto> payTypeCircle(LocalDate sixBefore, List<Integer> siteIds) {
+		if (siteIds == null || siteIds.isEmpty()) {
+			return buildPayTypeCircleData(BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO);
+		}
+		List<TChargingOrder> orders = this.lambdaQuery()
+				.select(TChargingOrder::getRechargePaymentType, TChargingOrder::getPayMethod,
+						TChargingOrder::getThirdPayAmount, TChargingOrder::getThirdRefundAmount,
+						TChargingOrder::getBalancePayAmount, TChargingOrder::getBalanceRefundAmount,
+						TChargingOrder::getPaymentAmount, TChargingOrder::getRechargeAmount,
+						TChargingOrder::getRefundAmount)
+				.eq(TChargingOrder::getDelFlag, 0)
+				.eq(TChargingOrder::getRechargePaymentStatus, 2)
+				.eq(TChargingOrder::getStatus, 5)
+				.ge(sixBefore != null, TChargingOrder::getCreateTime, sixBefore == null ? null : sixBefore.atStartOfDay())
+				.in(TChargingOrder::getSiteId, siteIds)
+				.list();
+		BigDecimal wechatAmount = BigDecimal.ZERO;
+		BigDecimal alipayAmount = BigDecimal.ZERO;
+		BigDecimal balanceAmount = BigDecimal.ZERO;
+		for (TChargingOrder order : orders) {
+			BigDecimal thirdPayAmount = getThirdPayNetAmount(order);
+			BigDecimal balancePayAmount = getBalancePayNetAmount(order);
+			Integer rechargePaymentType = order.getRechargePaymentType();
+			if (Integer.valueOf(1).equals(rechargePaymentType)) {
+				wechatAmount = wechatAmount.add(thirdPayAmount);
+			}
+			if (Integer.valueOf(2).equals(rechargePaymentType) || Integer.valueOf(3).equals(rechargePaymentType)) {
+				alipayAmount = alipayAmount.add(thirdPayAmount);
+			}
+			Integer payMethod = order.getPayMethod();
+			if (Integer.valueOf(1).equals(payMethod) || Integer.valueOf(2).equals(payMethod)) {
+				balanceAmount = balanceAmount.add(balancePayAmount);
+			}
+		}
+		return buildPayTypeCircleData(wechatAmount, alipayAmount, balanceAmount);
+	}
+
+	/**
+	 * 构造固定三类支付方式数据,保证前端饼图在无订单时也有稳定结构。
+	 */
+	private List<SixIncomeCircleDto> buildPayTypeCircleData(BigDecimal wechatAmount, BigDecimal alipayAmount, BigDecimal balanceAmount) {
+		List<SixIncomeCircleDto> data = new ArrayList<>();
+		data.add(buildIncomeCircleDto("微信支付", wechatAmount));
+		data.add(buildIncomeCircleDto("支付宝支付", alipayAmount));
+		data.add(buildIncomeCircleDto("余额支付", balanceAmount));
+		return data;
+	}
+
+	/**
+	 * 构造单个饼图项并统一金额精度。
+	 */
+	private SixIncomeCircleDto buildIncomeCircleDto(String name, BigDecimal paymentAmount) {
+		SixIncomeCircleDto dto = new SixIncomeCircleDto();
+		dto.setName(name);
+		dto.setPaymentAmount(nullToZero(paymentAmount).setScale(2, RoundingMode.HALF_EVEN));
+		return dto;
+	}
+
+	/**
+	 * 计算第三方渠道实收:优先使用拆分字段,兼容旧订单回退到paymentAmount/rechargeAmount。
+	 */
+	private BigDecimal getThirdPayNetAmount(TChargingOrder order) {
+		BigDecimal payAmount = order.getThirdPayAmount();
+		if (payAmount == null && Integer.valueOf(3).equals(order.getPayMethod())) {
+			payAmount = firstNonNull(order.getPaymentAmount(), order.getRechargeAmount());
+		}
+		BigDecimal refundAmount = order.getThirdRefundAmount();
+		if (refundAmount == null && Integer.valueOf(3).equals(order.getPayMethod())) {
+			refundAmount = order.getRefundAmount();
+		}
+		return nonNegative(nullToZero(payAmount).subtract(nullToZero(refundAmount)));
+	}
+
+	/**
+	 * 计算余额渠道实收:组合支付优先使用拆分字段,兼容旧余额订单回退到paymentAmount。
+	 */
+	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 refundAmount = order.getBalanceRefundAmount();
+		if (refundAmount == null && (Integer.valueOf(1).equals(payMethod) || Integer.valueOf(2).equals(payMethod))) {
+			refundAmount = order.getRefundAmount();
+		}
+		return nonNegative(nullToZero(payAmount).subtract(nullToZero(refundAmount)));
+	}
+
+	private BigDecimal firstNonNull(BigDecimal first, BigDecimal second) {
+		return first != null ? first : second;
+	}
+
+	private BigDecimal nullToZero(BigDecimal value) {
+		return value == null ? BigDecimal.ZERO : value;
+	}
+
+	private BigDecimal nonNegative(BigDecimal value) {
+		return value.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : value;
 	}
 	
 	@Override
@@ -2517,7 +2631,36 @@
 		}
 		dto.setSiteIds(siteIds);
 		List<ChargingOrderListVO> list1 = this.baseMapper.chargingList(dto, startTime1, startTime2, endTime1, endTime2);
+		fillChargingPeriodExportBalanceIncome(list1);
 		return list1;
+	}
+
+	/**
+	 * 充电时段统计导出补充余额收入;兑换码usedAmount包含赠送金额,需沿用订单列表口径拆分。
+	 */
+	private void fillChargingPeriodExportBalanceIncome(List<ChargingOrderListVO> list) {
+		if (list == null || list.isEmpty()) {
+			return;
+		}
+		List<Long> orderIds = list.stream().map(ChargingOrderListVO::getId).filter(Objects::nonNull).collect(Collectors.toList());
+		if (orderIds.isEmpty()) {
+			return;
+		}
+		Map<Long, Map<String, Object>> incomeMap = new HashMap<>();
+		List<Map<String, Object>> rows = this.baseMapper.exchangeCodeBalanceIncomeByOrderIds(orderIds);
+		if (rows != null) {
+			for (Map<String, Object> row : rows) {
+				Long orderId = getSummaryLong(row, "orderId");
+				if (orderId != null) {
+					incomeMap.put(orderId, row);
+				}
+			}
+		}
+		for (ChargingOrderListVO item : list) {
+			Map<String, Object> row = incomeMap.get(item.getId());
+			item.setBalanceIncome(getSummaryDecimal(row, "balanceIncome"));
+			item.setBalanceGiftIncome(getSummaryDecimal(row, "balanceGiftIncome"));
+		}
 	}
 	
 	
@@ -3041,7 +3184,8 @@
                 refundAmount = thirdRefundAmount.add(balanceRefundAmount);
                 chargingOrder.setBalanceRefundAmount(balanceRefundAmount.setScale(2, RoundingMode.HALF_UP));
                 chargingOrder.setThirdRefundAmount(thirdRefundAmount.setScale(2, RoundingMode.HALF_UP));
-                chargingOrder.setPaymentAmount(actualThirdPayAmount.setScale(2, RoundingMode.HALF_EVEN));
+                // paymentAmount用于小程序展示实际消费金额,需包含第三方实扣和余额实扣,不能只取第三方渠道金额。
+                chargingOrder.setPaymentAmount(actualThirdPayAmount.add(actualBalancePayAmount).setScale(2, RoundingMode.HALF_EVEN));
                 chargingOrder.setRefundAmount(refundAmount.setScale(2, RoundingMode.HALF_EVEN));
                 chargingOrder.setRefundStatus(1);
                 UploadRealTimeMonitoringData asc = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode(), "asc");

--
Gitblit v1.7.1