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