From 572df690f72ed4a077d934823f261dec39b3cc7d Mon Sep 17 00:00:00 2001
From: 刘帅 <rr.iii@qq.com>
Date: 星期二, 08 九月 2026 17:11:34 +0800
Subject: [PATCH] feat&bug:文档内容修改
---
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/DataStatisticsController.java | 521 +++++++++++++++++++++++++++++++++------------------------
1 files changed, 301 insertions(+), 220 deletions(-)
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/DataStatisticsController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/DataStatisticsController.java
index 990dbda..52c271e 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/DataStatisticsController.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/DataStatisticsController.java
@@ -7,6 +7,12 @@
import com.dsh.course.feignClient.account.*;
import com.dsh.course.feignClient.account.model.*;
import com.dsh.course.feignClient.activity.PointMercharsClient;
+import com.dsh.course.feignClient.activity.CouponClient;
+import com.dsh.course.feignClient.activity.PayHuiminClient;
+import com.dsh.course.feignClient.activity.model.CouponDeductionQuery;
+import com.dsh.course.feignClient.activity.model.CouponDeductionVO;
+import com.dsh.course.feignClient.activity.model.HuiminPayQuery;
+import com.dsh.course.feignClient.activity.model.UserCouponPayment;
import com.dsh.course.feignClient.competition.CompetitionClient;
import com.dsh.course.feignClient.competition.model.CompetionVO;
import com.dsh.course.feignClient.competition.model.Competition;
@@ -43,6 +49,7 @@
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
+import java.util.function.Predicate;
import java.util.stream.Collectors;
/**
@@ -72,6 +79,33 @@
return storeId;
}
return null;
+ }
+
+ /**
+ * 计算门店每日营业整小时数。相同的起止时间表示全天营业,结束时间早于
+ * 开始时间时按跨午夜营业处理。
+ */
+ private long getDailyBusinessHours(String startTime, String endTime) {
+ if (ToolUtil.isEmpty(startTime) || ToolUtil.isEmpty(endTime)) {
+ return 0;
+ }
+
+ try {
+ LocalTime start = LocalTime.parse(startTime);
+ LocalTime end = LocalTime.parse(endTime);
+ long minutes = Duration.between(start, end).toMinutes();
+ if (minutes <= 0) {
+ minutes += Duration.ofDays(1).toMinutes();
+ }
+ return Duration.ofMinutes(minutes).toHours();
+ } catch (DateTimeException e) {
+ return 0;
+ }
+ }
+
+ private long getStoreOperatingHours(TStore store, Date now) {
+ long operatingDays = Math.max(0, DateUtil.betweenDay(store.getCreateTime(), now, true));
+ return operatingDays * getDailyBusinessHours(store.getStartTime(), store.getEndTime());
}
@Autowired
@@ -106,6 +140,10 @@
private SiteClient siteClient;
@Resource
private PointMercharsClient pointMercharsClient;
+ @Resource
+ private CouponClient couponClient;
+ @Resource
+ private PayHuiminClient payHuiminClient;
@Resource
private RefundCoursePackageClient refundCoursePackageClient;
@Resource
@@ -155,10 +193,13 @@
RechargeRecordsQuery rechargeRecordsQuery = new RechargeRecordsQuery();
// 赛事活动查询query
CompetitionQuery competitionQuery = new CompetitionQuery();
+ competitionQuery.setIncludeRefund(true);
// 会员支付查询query
IncomeQuery incomeQuery = new IncomeQuery();
+ incomeQuery.setIncludeRefund(true);
// 场地预约记录查询query
SiteBookingQuery siteBookingQuery = new SiteBookingQuery();
+ siteBookingQuery.setIncludeRefund(true);
// 智慧球场查询query
GameDataQuery gameDataQuery = new GameDataQuery();
// 筛选运营商的是时候使用
@@ -193,9 +234,21 @@
incomeQuery.setInsertType(roleType);
rechargeRecordsQuery.setObjectId(UserExt.getUser().getObjectId());
List<IncomeVO> incomeVOS = new ArrayList<>();
+ Set<Long> usedCouponIds = new HashSet<>();
// 会员支付记录
List<VipPayment> vipPayments = vipPaymentClient.registrationList(incomeQuery);
for (VipPayment vipPayment : vipPayments) {
+ if (vipPayment.getPayStatus() == 3 && vipPayment.getAmount() != null) {
+ IncomeVO payment = new IncomeVO();
+ payment.setInsertTime(vipPayment.getPayTime() == null ? vipPayment.getInsertTime() : vipPayment.getPayTime());
+ payment.setAmount(BigDecimal.valueOf(vipPayment.getAmount()));
+ incomeVOS.add(payment);
+ IncomeVO refund = new IncomeVO();
+ refund.setInsertTime(vipPayment.getRefundTime() == null ? vipPayment.getInsertTime() : vipPayment.getRefundTime());
+ refund.setRefundAmount(BigDecimal.valueOf(vipPayment.getAmount()));
+ incomeVOS.add(refund);
+ continue;
+ }
IncomeVO temp = new IncomeVO();
if (vipPayment.getState()!=3){
temp.setInsertTime(vipPayment.getPayTime());
@@ -229,6 +282,10 @@
temp.setAmount(registerOrderVO.getMoney());
}
if (registerOrderVO.getPayStatus()==2){
+ if (registerOrderVO.getUserCouponId() != null) {
+ usedCouponIds.add(registerOrderVO.getUserCouponId());
+ temp.setId(registerOrderVO.getUserCouponId().toString());
+ }
incomeVOS.add(temp);
}
}
@@ -239,13 +296,28 @@
// 报名活动
List<PaymentCompetition> competitions = competitionClient.listAllPayment(competitionQuery);
for (PaymentCompetition competition : competitions) {
- if (competition.getPayStatus() != 2) {
- continue;
- }
if (competition.getPayType()==3 || competition.getPayType()==4){
continue;
}
- if (competition.getState()==3)continue;
+ if (competition.getState()==3) {
+ continue;
+ }
+ if (competition.getPayStatus() == 3 && competition.getAmount() != null) {
+ IncomeVO payment = new IncomeVO();
+ payment.setInsertTime(competition.getPayTime() == null
+ ? competition.getInsertTime() : competition.getPayTime());
+ payment.setAmount(BigDecimal.valueOf(competition.getAmount()));
+ incomeVOS.add(payment);
+ IncomeVO refund = new IncomeVO();
+ refund.setInsertTime(competition.getRefundTime() == null
+ ? competition.getInsertTime() : competition.getRefundTime());
+ refund.setRefundAmount(BigDecimal.valueOf(competition.getAmount()));
+ incomeVOS.add(refund);
+ continue;
+ }
+ if (competition.getPayStatus() != 2) {
+ continue;
+ }
IncomeVO temp = new IncomeVO();
temp.setInsertTime(competition.getPayTime());
if (competition.getAmount() != null) {
@@ -260,7 +332,22 @@
List<SiteBooking> siteBookings = siteClient.listAll(siteBookingQuery);
for (SiteBooking siteBooking : siteBookings) {
IncomeVO temp = new IncomeVO();
- if(siteBooking.getStatus()==0 || siteBooking.getStatus()==5){
+ if (siteBooking.getStatus() == 5) {
+ if (siteBooking.getPayMoney() != null) {
+ IncomeVO payment = new IncomeVO();
+ payment.setInsertTime(siteBooking.getPayTime() == null
+ ? siteBooking.getInsertTime() : siteBooking.getPayTime());
+ payment.setAmount(BigDecimal.valueOf(siteBooking.getPayMoney()));
+ incomeVOS.add(payment);
+ IncomeVO refund = new IncomeVO();
+ refund.setInsertTime(siteBooking.getCancelTime() == null
+ ? siteBooking.getInsertTime() : siteBooking.getCancelTime());
+ refund.setRefundAmount(BigDecimal.valueOf(siteBooking.getPayMoney()));
+ incomeVOS.add(refund);
+ }
+ continue;
+ }
+ if (siteBooking.getStatus() == 0) {
continue;
}
if (siteBooking.getPayType() ==3 || siteBooking.getPayType() ==4)continue;
@@ -268,7 +355,22 @@
if (siteBooking.getPayMoney() != null) {
temp.setAmount(new BigDecimal(siteBooking.getPayMoney().toString()));
}
+ if (siteBooking.getUserCouponId() != null) {
+ usedCouponIds.add(siteBooking.getUserCouponId());
+ temp.setId(siteBooking.getUserCouponId().toString());
+ }
incomeVOS.add(temp);
+ }
+ }
+
+ Map<Long, BigDecimal> couponDeductionAmounts = getCouponDeductionAmounts(usedCouponIds);
+ applyCouponDeductions(incomeVOS, couponDeductionAmounts);
+
+ // 惠民卡和优惠券购买不归属到单一课程/场地门店,当前仅在平台或运营商汇总中计入。
+ if (storeId == null) {
+ appendHuiminIncome(incomeVOS, operatorId);
+ if (operatorId == null) {
+ appendCouponPurchaseIncome(incomeVOS);
}
}
@@ -316,176 +418,198 @@
incomeVOS.add(temp);
}
}
- // 最终返回的数据
- Map<String, List<Object>> monthlyData = new HashMap<>();
- // 创建一个 Map 用于存储每年的累计 amount
- Map<Integer, BigDecimal> yearToTotalAmountMap = new HashMap<>();
- // 初始化一个 BigDecimal 用于累加
- BigDecimal totalAmount1 = BigDecimal.ZERO;
- // 用于返回图表上的总营收 年度营收 月度 周度 日度
- List<Object> objects = new ArrayList<>();
- // 遍历 incomeVOS
- for (IncomeVO incomeVO1 : incomeVOS) {
- // 总营收
- BigDecimal total = incomeVO1.getAmount();
- // 累加到总金额
- totalAmount1 = totalAmount1.add(total);
-
- Date insertTime = incomeVO1.getInsertTime();
- BigDecimal amount1 = incomeVO1.getAmount();
- Calendar calendar = Calendar.getInstance();
- calendar.setTime(insertTime);
- int year = calendar.get(Calendar.YEAR); // 获取年份
- // 更新年份对应的累计 amount
- if (yearToTotalAmountMap.containsKey(year)) {
- BigDecimal totalAmount = yearToTotalAmountMap.get(year);
- yearToTotalAmountMap.put(year, totalAmount.add(amount1));
- } else {
- yearToTotalAmountMap.put(year, amount1);
- }
- }
- objects.add(totalAmount1);
- // 创建一个新的列表,按年份升序排列
- List<Integer> sortedYears = new ArrayList<>(yearToTotalAmountMap.keySet());
- Collections.sort(sortedYears);
- // 创建一个新的 IncomeVO 列表,包含按年份累计的 amount
- List<Object> resultIncomeVOS = new ArrayList<>();
- // 当前年往前推十年
- List<Integer> integers1 = new ArrayList<>();
- int years = DateUtil.year(new Date());
- for (int i = 0; i < 10; i++) {
- integers1.add(years-i);
- }
- List<Object> collect = integers1.stream().sorted().collect(Collectors.toList());
- List<Object> objects1 = new ArrayList<>();
- for (Object o : collect) {
- BigDecimal orDefault = yearToTotalAmountMap.getOrDefault(Integer.valueOf(o.toString()), BigDecimal.ZERO);
- objects1.add(orDefault);
- }
- monthlyData.put("yearIncome",objects1);
- BigDecimal yearIn = new BigDecimal("0.00");
- for (Object o : objects1) {
- yearIn = yearIn.add(new BigDecimal(o.toString()));
- }
- BigDecimal orDefault = yearToTotalAmountMap.getOrDefault(years, BigDecimal.ZERO);
- objects.add(orDefault);
- // 创建一个 Map 用于存储今年每个月的累计 amount
- Map<Integer, BigDecimal> monthToTotalAmountMap = new HashMap<>();
- Calendar calendar = Calendar.getInstance();
- int currentYear = calendar.get(Calendar.YEAR);
- List<BigDecimal> monthlyAmountList = new ArrayList<>(Collections.nCopies(12, BigDecimal.ZERO));
-
- for (IncomeVO incomeVO1 : incomeVOS) {
- Calendar calendar1 = Calendar.getInstance();
- calendar1.setTime(incomeVO1.getInsertTime());
- int year = calendar1.get(Calendar.YEAR);
- int month = calendar1.get(Calendar.MONTH) + 1; // 月份从0开始,所以需要加1
- if (year == currentYear) {
- BigDecimal totalAmount = monthlyAmountList.get(month - 1);
- totalAmount = totalAmount.add(incomeVO1.getAmount());
- monthlyAmountList.set(month - 1, totalAmount);
- }
- }
- monthlyData.put("monthIncome", Collections.singletonList(monthlyAmountList));
- //yearMount
- BigDecimal monthI = new BigDecimal("0.00");
- for (BigDecimal bigDecimal : monthlyAmountList) {
- monthI = monthI.add(bigDecimal);
- }
- objects.add(monthI);
- // 获取当前月份
- LocalDate currentDate = LocalDate.now();
- int currentMonth = currentDate.getMonthValue();
- // 初始化一个长度为当前月份的天数的列表,并将每一天的金额初始化为零
- int daysInCurrentMonth = currentDate.lengthOfMonth();
- List<BigDecimal> weekAmount = new ArrayList<>();
-
- // 获取最近四周
- LocalDateTime minNow = LocalDateTime.now().with(LocalTime.MIN);
- LocalDateTime maxNow = LocalDateTime.now().with(LocalTime.MAX);
- // 周度数据
- LocalDateTime week1Start = minNow.minusDays(6);
- LocalDateTime week1End = maxNow;
-
- LocalDateTime week2Start = minNow.minusDays(13);
- LocalDateTime week2End = minNow.minusDays(7);
-
- LocalDateTime week3Start = minNow.minusDays(20);
- LocalDateTime week3End = minNow.minusDays(14);
-
- LocalDateTime week4Start = minNow.minusDays(27);
- LocalDateTime week4End = minNow.minusDays(21);
-
- // 计算每个周的amount总和
- BigDecimal tAmount1 = BigDecimal.ZERO;
- BigDecimal tAmount2 = BigDecimal.ZERO;
- BigDecimal tAmount3 = BigDecimal.ZERO;
- BigDecimal tAmount4 = BigDecimal.ZERO;
- for (IncomeVO incomeVO1 : incomeVOS) {
- Date insertTime = incomeVO1.getInsertTime();
- // 将Date转换为LocalDateTime
- Instant instant = insertTime.toInstant();
- ZoneId zoneId = ZoneId.systemDefault();
- LocalDateTime dateTime = instant.atZone(zoneId).toLocalDateTime();
- // 判断该数据属于哪个周
- if (dateTime.isAfter(week1Start) && dateTime.isBefore(week1End)) {
- BigDecimal amount1 = incomeVO1.getAmount();
- tAmount1=tAmount1.add(amount1);
- } else if (dateTime.isAfter(week2Start) && dateTime.isBefore(week2End)) {
- BigDecimal amount1 = incomeVO1.getAmount();
- tAmount2=tAmount2.add(amount1);
- } else if (dateTime.isAfter(week3Start) && dateTime.isBefore(week3End)) {
- BigDecimal amount1 = incomeVO1.getAmount();
- tAmount4=tAmount3.add(amount1);
- } else if (dateTime.isAfter(week4Start) && dateTime.isBefore(week4End)) {
- BigDecimal amount1 = incomeVO1.getAmount();
- tAmount4=tAmount4.add(amount1);
- }
- }
- weekAmount.add(tAmount1);
- weekAmount.add(tAmount2);
- weekAmount.add(tAmount3);
- weekAmount.add(tAmount4);
- monthlyData.put("weekIncome", Collections.singletonList(weekAmount));
- BigDecimal weekIn = new BigDecimal("0.00");
- for (BigDecimal bigDecimal : weekAmount) {
- weekIn = weekIn.add(bigDecimal);
- }
- objects.add(weekIn);
- LocalDateTime currentDateTime = LocalDateTime.now();
- List<BigDecimal> amountByDay = new ArrayList<>(Collections.nCopies(7, BigDecimal.ZERO));
- for (IncomeVO incomeVO3 : incomeVOS) {
- Date insertTime = incomeVO3.getInsertTime();
- // 将 Date 转换为 LocalDateTime
- LocalDateTime insertDateTime = LocalDateTime.ofInstant(insertTime.toInstant(), ZoneId.systemDefault());
- // 计算日期与当前日期的差距
- long daysDifference = ChronoUnit.DAYS.between(insertDateTime.toLocalDate(), currentDateTime.toLocalDate());
- // 如果日期在七天内,累加金额
- if (daysDifference >= 0 && daysDifference < 7) {
- int index = (int) (6 - daysDifference); // 计算对应的索引位置
- BigDecimal amount3 = incomeVO3.getAmount();
- BigDecimal updatedAmount = amountByDay.get(index).add(amount3);
- amountByDay.set(index, updatedAmount);
-
- }
- }
- monthlyData.put("dayIncome", Collections.singletonList(amountByDay));
- BigDecimal totalToday = new BigDecimal("0.00");
- for (BigDecimal bigDecimal : amountByDay) {
- totalToday = totalToday.add(bigDecimal);
- }
- objects.add(totalToday);
- // 最后put
- monthlyData.put("yearMount",objects);
-
- ArrayList<Object> integers = new ArrayList<>();
- int year = DateUtil.year(new Date());
- for (int i = 0; i < 10; i++) {
- integers.add(year-i);
- }
- List<Object> collect1 = integers.stream().sorted().collect(Collectors.toList());
- monthlyData.put("year",collect1);
+ Map<String, Object> monthlyData = buildIncomeStatistics(incomeVOS);
return monthlyData;
+ }
+
+ /** 惠民卡采用支付、退款两条事实流水,赠送卡不计营收。 */
+ private void appendHuiminIncome(List<IncomeVO> incomeRecords, Integer operatorId) {
+ HuiminPayQuery query = new HuiminPayQuery();
+ query.setGiftPaymentType(3);
+ if (operatorId != null) {
+ query.setOperatorId(operatorId.longValue());
+ }
+ List<SalesDetailVO> records = payHuiminClient.exportData(query);
+ if (records == null) {
+ return;
+ }
+ for (SalesDetailVO record : records) {
+ if (record == null || record.getSalesMoney() == null || record.getPaymentTime() == null) {
+ continue;
+ }
+ IncomeVO payment = new IncomeVO();
+ payment.setInsertTime(record.getPaymentTime());
+ payment.setAmount(record.getSalesMoney());
+ incomeRecords.add(payment);
+ if (Integer.valueOf(3).equals(record.getStatus())
+ || Integer.valueOf(2).equals(record.getRefundStatus())
+ || Integer.valueOf(3).equals(record.getRefundStatus())) {
+ IncomeVO refund = new IncomeVO();
+ refund.setInsertTime(record.getRefundTime() == null ? record.getPaymentTime() : record.getRefundTime());
+ refund.setRefundAmount(record.getSalesMoney());
+ incomeRecords.add(refund);
+ }
+ }
+ }
+
+ /** 仅计入积分+现金的成功优惠券购买,纯积分兑换不形成现金营收。 */
+ private void appendCouponPurchaseIncome(List<IncomeVO> incomeRecords) {
+ List<UserCouponPayment> records = couponClient.listPaidCouponPayments();
+ if (records == null) {
+ return;
+ }
+ for (UserCouponPayment record : records) {
+ if (record == null || record.getCash() == null || record.getPaymentTime() == null) {
+ continue;
+ }
+ IncomeVO payment = new IncomeVO();
+ payment.setInsertTime(record.getPaymentTime());
+ payment.setAmount(BigDecimal.valueOf(record.getCash()));
+ incomeRecords.add(payment);
+ }
+ }
+
+ /** 构建总计及年、月、周、日四个粒度的四维收入统计结果。 */
+ private Map<String, Object> buildIncomeStatistics(List<IncomeVO> incomeRecords) {
+ Map<String, Object> result = new HashMap<>();
+ LocalDate today = LocalDate.now();
+ int currentYear = today.getYear();
+ List<IncomeStatisticsVO> yearly = new ArrayList<>();
+ List<Object> years = new ArrayList<>();
+ for (int year = currentYear - 9; year <= currentYear; year++) {
+ final int statisticYear = year;
+ yearly.add(sumIncomeStatistics(incomeRecords, record -> getRecordDate(record)
+ .getYear() == statisticYear));
+ years.add(year);
+ }
+
+ List<IncomeStatisticsVO> monthly = new ArrayList<>();
+ for (int month = 1; month <= 12; month++) {
+ final int statisticMonth = month;
+ monthly.add(sumIncomeStatistics(incomeRecords, record -> {
+ LocalDate date = getRecordDate(record);
+ return date.getYear() == currentYear && date.getMonthValue() == statisticMonth;
+ }));
+ }
+
+ List<IncomeStatisticsVO> weekly = new ArrayList<>();
+ for (int weekIndex = 3; weekIndex >= 0; weekIndex--) {
+ LocalDate startDate = today.minusDays(weekIndex * 7L + 6L);
+ LocalDate endDate = today.minusDays(weekIndex * 7L);
+ weekly.add(sumIncomeStatistics(incomeRecords, record -> {
+ LocalDate date = getRecordDate(record);
+ return !date.isBefore(startDate) && !date.isAfter(endDate);
+ }));
+ }
+
+ List<IncomeStatisticsVO> daily = new ArrayList<>();
+ for (int dayIndex = 6; dayIndex >= 0; dayIndex--) {
+ LocalDate statisticDate = today.minusDays(dayIndex);
+ daily.add(sumIncomeStatistics(incomeRecords, record -> getRecordDate(record)
+ .equals(statisticDate)));
+ }
+
+ IncomeStatisticsVO total = sumIncomeStatistics(incomeRecords, record -> true);
+ IncomeStatisticsVO currentYearStatistics = yearly.get(yearly.size() - 1);
+ IncomeStatisticsVO currentMonthStatistics = monthly.get(today.getMonthValue() - 1);
+ IncomeStatisticsVO currentWeekStatistics = sumIncomeStatistics(incomeRecords, record -> {
+ LocalDate date = getRecordDate(record);
+ return !date.isBefore(today.minusDays(6)) && !date.isAfter(today);
+ });
+ IncomeStatisticsVO currentDayStatistics = daily.get(daily.size() - 1);
+
+ result.put("incomeStatistics", total);
+ result.put("netIncomeAmount", total.getNetIncomeAmount());
+ result.put("couponDeductionAmount", total.getCouponDeductionAmount());
+ result.put("refundAmount", total.getRefundAmount());
+ result.put("yearIncomeStatistics", yearly);
+ result.put("monthIncomeStatistics", monthly);
+ result.put("weekIncomeStatistics", weekly);
+ result.put("dayIncomeStatistics", daily);
+ result.put("year", years);
+ // 兼容既有图表消费字段,值调整为总营收金额。
+ result.put("yearIncome", yearly.stream().map(IncomeStatisticsVO::getTotalIncomeAmount)
+ .collect(Collectors.toList()));
+ result.put("monthIncome", Collections.singletonList(monthly.stream()
+ .map(IncomeStatisticsVO::getTotalIncomeAmount).collect(Collectors.toList())));
+ result.put("weekIncome", Collections.singletonList(weekly.stream()
+ .map(IncomeStatisticsVO::getTotalIncomeAmount).collect(Collectors.toList())));
+ result.put("dayIncome", Collections.singletonList(daily.stream()
+ .map(IncomeStatisticsVO::getTotalIncomeAmount).collect(Collectors.toList())));
+ result.put("yearMount", Arrays.asList(total.getTotalIncomeAmount(),
+ currentYearStatistics.getTotalIncomeAmount(), currentMonthStatistics.getTotalIncomeAmount(),
+ currentWeekStatistics.getTotalIncomeAmount(), currentDayStatistics.getTotalIncomeAmount()));
+ return result;
+ }
+
+ /** 按给定时间条件汇总四个收入维度。 */
+ private IncomeStatisticsVO sumIncomeStatistics(List<IncomeVO> incomeRecords,
+ Predicate<IncomeVO> timePredicate) {
+ IncomeStatisticsVO statistics = new IncomeStatisticsVO();
+ for (IncomeVO record : incomeRecords) {
+ if (record.getInsertTime() == null || !timePredicate.test(record)) {
+ continue;
+ }
+ BigDecimal receivedAmount = getZeroIfNull(record.getAmount());
+ BigDecimal couponAmount = getZeroIfNull(record.getCouponDeductionAmount());
+ BigDecimal refundAmount = getZeroIfNull(record.getRefundAmount());
+ statistics.setTotalIncomeAmount(statistics.getTotalIncomeAmount()
+ .add(receivedAmount).add(couponAmount));
+ statistics.setCouponDeductionAmount(statistics.getCouponDeductionAmount().add(couponAmount));
+ statistics.setRefundAmount(statistics.getRefundAmount().add(refundAmount));
+ }
+ statistics.setNetIncomeAmount(statistics.getTotalIncomeAmount()
+ .subtract(statistics.getCouponDeductionAmount())
+ .subtract(statistics.getRefundAmount()));
+ return statistics;
+ }
+
+ /** 将收入记录时间转换为本地日期。 */
+ private LocalDate getRecordDate(IncomeVO record) {
+ return LocalDateTime.ofInstant(record.getInsertTime().toInstant(), ZoneId.systemDefault()).toLocalDate();
+ }
+
+ /** 空金额按零参与统计。 */
+ private BigDecimal getZeroIfNull(BigDecimal amount) {
+ return amount == null ? BigDecimal.ZERO : amount;
+ }
+
+ /** 将批量查询到的优惠券抵扣金额回填到对应收入记录。 */
+ private void applyCouponDeductions(List<IncomeVO> incomeRecords,
+ Map<Long, BigDecimal> couponDeductionAmounts) {
+ for (IncomeVO record : incomeRecords) {
+ if (record.getId() == null) {
+ continue;
+ }
+ try {
+ record.setCouponDeductionAmount(couponDeductionAmounts.getOrDefault(
+ Long.valueOf(record.getId()), BigDecimal.ZERO));
+ } catch (NumberFormatException ignored) {
+ record.setCouponDeductionAmount(BigDecimal.ZERO);
+ }
+ }
+ }
+
+ /**
+ * 批量获取已使用优惠券的抵扣金额,避免按订单逐条调用优惠券服务。
+ *
+ * @param usedCouponIds 用户优惠券领取记录 ID 集合
+ * @return 用户优惠券领取记录 ID 与抵扣金额的映射(单位:元)
+ */
+ private Map<Long, BigDecimal> getCouponDeductionAmounts(Set<Long> usedCouponIds) {
+ if (usedCouponIds.isEmpty()) {
+ return Collections.emptyMap();
+ }
+ CouponDeductionQuery query = new CouponDeductionQuery();
+ query.setUserCouponIds(new ArrayList<>(usedCouponIds));
+ List<CouponDeductionVO> deductions = couponClient.queryDeductionAmounts(query);
+ if (deductions == null || deductions.isEmpty()) {
+ return Collections.emptyMap();
+ }
+ return deductions.stream()
+ .filter(deduction -> deduction.getUserCouponId() != null)
+ .collect(Collectors.toMap(CouponDeductionVO::getUserCouponId,
+ deduction -> getZeroIfNull(deduction.getDeductionAmount()), BigDecimal::add));
}
/**
@@ -1034,20 +1158,7 @@
List<TStore> list = storeService.list(new LambdaQueryWrapper<TStore>().eq(TStore::getOperatorId, 0));
long l1=0;
for (TStore tStore : list) {
- long l = DateUtil.betweenDay(tStore.getCreateTime(), new Date(), true);
- String startTime = tStore.getStartTime();
- String endTime = tStore.getEndTime();
- String s = startTime.split(":")[0];
- String s1 = endTime.split(":")[1];
- Integer integer = Integer.valueOf(s);
- Integer integer1 = Integer.valueOf(s1);
- Integer a =0;
- if(integer==0 && integer1==0){
- a=24;
- }else {
- a= integer1-integer;
- }
- l1 += l * a;
+ l1 += getStoreOperatingHours(tStore, new Date());
}
map.put("allHour",l1);
return map;
@@ -1079,20 +1190,7 @@
List<TStore> lists = storeService.list(new LambdaQueryWrapper<TStore>().eq(TStore::getOperatorId, id));
long l1=0;
for (TStore tStore : lists) {
- long l = DateUtil.betweenDay(tStore.getCreateTime(), new Date(), true);
- String startTime = tStore.getStartTime();
- String endTime = tStore.getEndTime();
- String s = startTime.split(":")[0];
- String s1 = endTime.split(":")[1];
- Integer integer = Integer.valueOf(s);
- Integer integer1 = Integer.valueOf(s1);
- Integer a =0;
- if(integer==0 && integer1==0){
- a=24;
- }else {
- a= integer-integer1;
- }
- l1 += l * a;
+ l1 += getStoreOperatingHours(tStore, new Date());
}
map.put("allHour",l1);
return map;
@@ -1117,20 +1215,7 @@
List<TStore> lists = storeService.list(new LambdaQueryWrapper<TStore>().eq(TStore::getOperatorId, 0));
long l1=0;
for (TStore tStore : lists) {
- long l = DateUtil.betweenDay(tStore.getCreateTime(), new Date(), true);
- String startTime = tStore.getStartTime();
- String endTime = tStore.getEndTime();
- String s = startTime.split(":")[0];
- String s1 = endTime.split(":")[1];
- Integer integer = Integer.valueOf(s);
- Integer integer1 = Integer.valueOf(s1);
- Integer a =0;
- if(integer==0 && integer1==0){
- a=24;
- }else {
- a= integer1-integer;
- }
- l1 += l * a;
+ l1 += getStoreOperatingHours(tStore, new Date());
}
map.put("allHour",l1);
return map;
@@ -1644,7 +1729,3 @@
return map1;
}
}
-
-
-
-
--
Gitblit v1.7.1