Commit 134aedb9 by Jony.L

首页统计4.0 改为按年、月、日统计

parent d12c9ff3
package com.luhu.computility.module.biz.controller.admin.home; package com.luhu.computility.module.biz.controller.admin.home;
import com.luhu.computility.framework.common.pojo.CommonResult; import com.luhu.computility.framework.common.pojo.CommonResult;
import com.luhu.computility.module.apihub.service.apiorder.ApiOrderService;
import com.luhu.computility.module.biz.controller.admin.home.vo.HomeIndexApiCallsRespVO; import com.luhu.computility.module.biz.controller.admin.home.vo.HomeIndexApiCallsRespVO;
import com.luhu.computility.module.biz.controller.admin.home.vo.HomeIndexOrdersCountRespVO; import com.luhu.computility.module.biz.controller.admin.home.vo.HomeIndexOrdersCountRespVO;
import com.luhu.computility.module.biz.controller.admin.home.vo.HomeIndexTopBarRespVO; import com.luhu.computility.module.biz.controller.admin.home.vo.HomeIndexTopBarRespVO;
import com.luhu.computility.module.biz.controller.admin.home.vo.HomeIndexUsersCountRespVO; import com.luhu.computility.module.biz.controller.admin.home.vo.HomeIndexUsersCountRespVO;
import com.luhu.computility.module.biz.service.home.HomeIndexService; import com.luhu.computility.module.biz.service.home.HomeIndexService;
import com.luhu.computility.module.member.service.user.MemberUserService;
import com.luhu.computility.module.trade.service.order.TradeOrderQueryService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
......
...@@ -83,34 +83,46 @@ public class HomeIndexServiceImpl implements HomeIndexService { ...@@ -83,34 +83,46 @@ public class HomeIndexServiceImpl implements HomeIndexService {
public List<HomeIndexUsersCountRespVO> getUsersData(String dateType) { public List<HomeIndexUsersCountRespVO> getUsersData(String dateType) {
MemberUserPageReqVO queryVO = new MemberUserPageReqVO(); MemberUserPageReqVO queryVO = new MemberUserPageReqVO();
// 统一查询截至"统计截止日"的所有用户(日/月统计共用) // 统一查询截至"统计截止日"的所有用户
LocalDate today = LocalDate.now(); LocalDate today = LocalDate.now();
LocalDateTime endTime = null; // 统计截止时间(所有用户注册时间<=该时间) LocalDateTime endTime = null; // 统计截止时间(所有用户注册时间<=该时间)
List<LocalDate> timeNodes = new ArrayList<>(); // 统计节点(7个:7天或7个月的结束日) List<LocalDate> timeNodes = new ArrayList<>(); // 统计节点
if ("d".equals(dateType) || ObjectUtil.isEmpty(dateType)) { if ("d".equals(dateType) || ObjectUtil.isEmpty(dateType)) {
// 近7天(截止到昨天,避免今天未结束的数据不准) // 近7天(截止到昨天,避免今天未结束的数据不准)
LocalDate yesterday = today.minusDays(1); LocalDate yesterday = today.minusDays(1);
LocalDate startDate = yesterday.minusDays(6); LocalDate startDate = yesterday.minusDays(6);
endTime = yesterday.atTime(23, 59, 59, 999_999_999); endTime = yesterday.atTime(23, 59, 59, 999_999_999);
// 生成7个日期节点(每天) // 生成7个日期节点(每天)
for (int i = 0; i < 7; i++) { for (int i = 0; i < 7; i++) {
timeNodes.add(startDate.plusDays(i)); timeNodes.add(startDate.plusDays(i));
} }
} else if ("m".equals(dateType)) { } else if ("m".equals(dateType)) {
// 月统计:近7个月(截止到上月末,避免当月未结束的数据不准) // 近30天(截止到昨天,避免今天未结束的数据不准)
LocalDate yesterday = today.minusDays(1);
LocalDate startDate = yesterday.minusDays(29);
endTime = yesterday.atTime(23, 59, 59, 999_999_999);
// 生成30个日期节点(每天)
for (int i = 0; i < 30; i++) {
timeNodes.add(startDate.plusDays(i));
}
} else if ("y".equals(dateType)) {
// 近12个月(截止到上月末,避免当月未结束的数据不准)
YearMonth lastMonth = YearMonth.from(today.minusMonths(1)); // 上月 YearMonth lastMonth = YearMonth.from(today.minusMonths(1)); // 上月
endTime = lastMonth.atEndOfMonth().atTime(23, 59, 59, 999_999_999); endTime = lastMonth.atEndOfMonth().atTime(23, 59, 59, 999_999_999);
// 生成7个月份节点(每个月的最后一天)
for (int i = 6; i >= 0; i--) { // 从6个月前到上月 // 生成12个月份节点(每个月的最后一天)
for (int i = 11; i >= 0; i--) { // 从11个月前到上月
YearMonth currentMonth = lastMonth.minusMonths(i); YearMonth currentMonth = lastMonth.minusMonths(i);
timeNodes.add(currentMonth.atEndOfMonth()); // 当月最后一天(如2025-09-30) timeNodes.add(currentMonth.atEndOfMonth());
} }
} else { } else {
throw new ServiceException("未传入正确的统计时间类型!"); throw new ServiceException("未传入正确的统计时间类型!支持的类型:d(近7天)、m(近30天)、y(近12个月)");
} }
// 查询截止到endTime的所有用户(日/月统计共用此数据) // 查询截止到endTime的所有用户(共用此数据)
LocalDateTime[] allTimePeriod = {LocalDate.of(1970, 1, 1).atStartOfDay(), endTime}; LocalDateTime[] allTimePeriod = {LocalDate.of(1970, 1, 1).atStartOfDay(), endTime};
queryVO.setCreateTime(allTimePeriod); queryVO.setCreateTime(allTimePeriod);
List<MemberUserDO> allUserList = memberUserService.getUserList(queryVO); List<MemberUserDO> allUserList = memberUserService.getUserList(queryVO);
...@@ -129,10 +141,16 @@ public class HomeIndexServiceImpl implements HomeIndexService { ...@@ -129,10 +141,16 @@ public class HomeIndexServiceImpl implements HomeIndexService {
List<HomeIndexUsersCountRespVO> resultList = new ArrayList<>(); List<HomeIndexUsersCountRespVO> resultList = new ArrayList<>();
for (LocalDate node : timeNodes) { for (LocalDate node : timeNodes) {
HomeIndexUsersCountRespVO respVO = new HomeIndexUsersCountRespVO(); HomeIndexUsersCountRespVO respVO = new HomeIndexUsersCountRespVO();
// 日统计显示"yyyy-MM-dd",月统计显示"yyyy-MM"
respVO.setCountDate("d".equals(dateType) // 根据不同类型格式化日期显示
? node.toString() if ("d".equals(dateType) || ObjectUtil.isEmpty(dateType) || "m".equals(dateType)) {
: node.format(DateTimeFormatter.ofPattern("yyyy-MM"))); // 日和月统计显示"yyyy-MM-dd"
respVO.setCountDate(node.toString());
} else if ("y".equals(dateType)) {
// 年统计显示"yyyy-MM"
respVO.setCountDate(node.format(DateTimeFormatter.ofPattern("yyyy-MM")));
}
respVO.setUsersCount(totalMap.get(node).intValue()); respVO.setUsersCount(totalMap.get(node).intValue());
resultList.add(respVO); resultList.add(respVO);
} }
...@@ -160,30 +178,40 @@ public class HomeIndexServiceImpl implements HomeIndexService { ...@@ -160,30 +178,40 @@ public class HomeIndexServiceImpl implements HomeIndexService {
timeNodes.add(startDate.plusDays(i)); timeNodes.add(startDate.plusDays(i));
} }
} else if ("m".equals(dateType)) { } else if ("m".equals(dateType)) {
// 月统计:近7个月(截止到上月末) // 月统计:近30天(截止到昨天)
LocalDate yesterday = today.minusDays(1);
LocalDate startDate = yesterday.minusDays(29);
endTime = yesterday.atTime(23, 59, 59, 999_999_999);
for (int i = 0; i < 30; i++) {
timeNodes.add(startDate.plusDays(i));
}
} else if ("y".equals(dateType)) {
// 年统计:近12个月(截止到上月末)
YearMonth lastMonth = YearMonth.from(today.minusMonths(1)); YearMonth lastMonth = YearMonth.from(today.minusMonths(1));
endTime = lastMonth.atEndOfMonth().atTime(23, 59, 59, 999_999_999); endTime = lastMonth.atEndOfMonth().atTime(23, 59, 59, 999_999_999);
for (int i = 6; i >= 0; i--) { for (int i = 11; i >= 0; i--) {
YearMonth currentMonth = lastMonth.minusMonths(i); YearMonth currentMonth = lastMonth.minusMonths(i);
timeNodes.add(currentMonth.atEndOfMonth()); timeNodes.add(currentMonth.atEndOfMonth());
} }
} else { } else {
throw new ServiceException("未传入正确的统计时间类型!"); throw new ServiceException("未传入正确的统计时间类型!支持的类型:d(近7天)、m(近30天)、y(近12个月)");
} }
LocalDateTime[] allTimePeriod = {LocalDate.of(1970, 1, 1).atStartOfDay(), endTime}; LocalDateTime[] allTimePeriod = {LocalDate.of(1970, 1, 1).atStartOfDay(), endTime};
queryVO.setCreateTime(allTimePeriod); queryVO.setCreateTime(allTimePeriod);
List<ApiCallLogDO> apiCallLogList = apiCallLogService.getApiCallLogList(queryVO); List<ApiCallLogDO> apiCallLogList = apiCallLogService.getApiCallLogList(queryVO);
// 按统计节点计算API调用次数(核心修改:非累计 // 按统计节点计算API调用次数(非累计,当前节点周期内的调用次数
Map<LocalDate, Long> callsMap = new HashMap<>(); Map<LocalDate, Long> callsMap = new HashMap<>();
for (LocalDate node : timeNodes) { for (LocalDate node : timeNodes) {
long count = apiCallLogList.stream() long count = apiCallLogList.stream()
.filter(log -> { .filter(log -> {
LocalDate logDate = log.getCreateTime().toLocalDate(); LocalDate logDate = log.getCreateTime().toLocalDate();
if ("d".equals(dateType) || ObjectUtil.isEmpty(dateType)) { if ("d".equals(dateType) || ObjectUtil.isEmpty(dateType) || "m".equals(dateType)) {
// 日和月统计:精确到天
return logDate.isEqual(node); return logDate.isEqual(node);
} else { } else {
// 年统计:按月份匹配
return YearMonth.from(logDate).equals(YearMonth.from(node)); return YearMonth.from(logDate).equals(YearMonth.from(node));
} }
}) })
...@@ -195,9 +223,16 @@ public class HomeIndexServiceImpl implements HomeIndexService { ...@@ -195,9 +223,16 @@ public class HomeIndexServiceImpl implements HomeIndexService {
List<HomeIndexApiCallsRespVO> resultList = new ArrayList<>(); List<HomeIndexApiCallsRespVO> resultList = new ArrayList<>();
for (LocalDate node : timeNodes) { for (LocalDate node : timeNodes) {
HomeIndexApiCallsRespVO respVO = new HomeIndexApiCallsRespVO(); HomeIndexApiCallsRespVO respVO = new HomeIndexApiCallsRespVO();
respVO.setCountDate("d".equals(dateType) || ObjectUtil.isEmpty(dateType)
? node.toString() // 根据不同类型格式化日期显示
: node.format(DateTimeFormatter.ofPattern("yyyy-MM"))); if ("d".equals(dateType) || ObjectUtil.isEmpty(dateType) || "m".equals(dateType)) {
// 日和月统计显示"yyyy-MM-dd"
respVO.setCountDate(node.toString());
} else {
// 年统计显示"yyyy-MM"
respVO.setCountDate(node.format(DateTimeFormatter.ofPattern("yyyy-MM")));
}
respVO.setCallsCount(callsMap.get(node).intValue()); respVO.setCallsCount(callsMap.get(node).intValue());
resultList.add(respVO); resultList.add(respVO);
} }
...@@ -238,8 +273,8 @@ public class HomeIndexServiceImpl implements HomeIndexService { ...@@ -238,8 +273,8 @@ public class HomeIndexServiceImpl implements HomeIndexService {
.sum(); .sum();
homeIndexTopBarRespVO.setNewUsersCount(userList.size()); homeIndexTopBarRespVO.setNewUsersCount(userList.size());
homeIndexTopBarRespVO.setNewOrdersCount(computeOrderList.size()+apiOrderList.size()); homeIndexTopBarRespVO.setNewOrdersCount(computeOrderList.size() + apiOrderList.size());
homeIndexTopBarRespVO.setNewOrdersAmount(newComputeOrdersAmount+newApiOrdersAmount); homeIndexTopBarRespVO.setNewOrdersAmount(newComputeOrdersAmount + newApiOrdersAmount);
return homeIndexTopBarRespVO; return homeIndexTopBarRespVO;
...@@ -247,79 +282,79 @@ public class HomeIndexServiceImpl implements HomeIndexService { ...@@ -247,79 +282,79 @@ public class HomeIndexServiceImpl implements HomeIndexService {
@Override @Override
public List<HomeIndexOrdersCountRespVO> getOrdersData(String dateType) { public List<HomeIndexOrdersCountRespVO> getOrdersData(String dateType) {
// 统一查询截至"统计截止日"的所有订单(日/月统计共用)
LocalDate today = LocalDate.now(); LocalDate today = LocalDate.now();
LocalDateTime endTime = null; // 统计截止时间(所有订单创建时间<=该时间) LocalDateTime endTime = null;
List<LocalDate> timeNodes = new ArrayList<>(); // 统计节点(7个:7天或7个月的结束日) List<LocalDate> timeNodes = new ArrayList<>();
// 根据dateType确定统计周期和节点 // 1. 根据时间类型生成统计节点和截止时间
if ("d".equals(dateType) || ObjectUtil.isEmpty(dateType)) { if ("d".equals(dateType) || ObjectUtil.isEmpty(dateType)) {
// 日统计:近7天(截止到昨天,避免今天未结束的数据) // 日统计:近7天(截止到昨天,避免今日未结束数据)
LocalDate yesterday = today.minusDays(1); LocalDate yesterday = today.minusDays(1);
LocalDate startDate = yesterday.minusDays(6); LocalDate startDate = yesterday.minusDays(6);
endTime = yesterday.atTime(23, 59, 59, 999_999_999); endTime = yesterday.atTime(23, 59, 59, 999_999_999);
// 生成7个日期节点(每天) // 生成7个日节点
for (int i = 0; i < 7; i++) { for (int i = 0; i < 7; i++) {
timeNodes.add(startDate.plusDays(i)); timeNodes.add(startDate.plusDays(i));
} }
} else if ("m".equals(dateType)) { } else if ("m".equals(dateType)) {
// 月统计:近7个月(截止到上月末,避免当月未结束的数据) // 月统计:近30天(截止到昨天)
YearMonth lastMonth = YearMonth.from(today.minusMonths(1)); // 上月 LocalDate yesterday = today.minusDays(1);
LocalDate startDate = yesterday.minusDays(29);
endTime = yesterday.atTime(23, 59, 59, 999_999_999);
// 生成30个日节点
for (int i = 0; i < 30; i++) {
timeNodes.add(startDate.plusDays(i));
}
} else if ("y".equals(dateType)) {
// 年统计:近12个月(截止到上月末)
YearMonth lastMonth = YearMonth.from(today.minusMonths(1));
endTime = lastMonth.atEndOfMonth().atTime(23, 59, 59, 999_999_999); endTime = lastMonth.atEndOfMonth().atTime(23, 59, 59, 999_999_999);
// 生成7个月份节点(每个月的最后一天) // 生成12个月度节点(每月最后一天)
for (int i = 6; i >= 0; i--) { // 从6个月前到上月 for (int i = 11; i >= 0; i--) {
YearMonth currentMonth = lastMonth.minusMonths(i); YearMonth currentMonth = lastMonth.minusMonths(i);
timeNodes.add(currentMonth.atEndOfMonth()); // 当月最后一天(如2025-09-30) timeNodes.add(currentMonth.atEndOfMonth());
} }
} else { } else {
throw new ServiceException("未传入正确的统计时间类型!"); throw new ServiceException("未传入正确的统计时间类型!支持:d(近7天)、m(近30天)、y(近12个月)");
} }
// 查询截止到endTime的所有订单(日/月统计共用 // 2. 查询目标订单(截止到endTime的有效订单
LocalDateTime[] allTimePeriod = {LocalDate.of(1970, 1, 1).atStartOfDay(), endTime}; LocalDateTime[] allTimePeriod = {LocalDate.of(1970, 1, 1).atStartOfDay(), endTime};
// 算力订单:已完成状态
// 算力订单(已完成)
TradeOrderPageReqVO computeQueryVO = new TradeOrderPageReqVO(); TradeOrderPageReqVO computeQueryVO = new TradeOrderPageReqVO();
computeQueryVO.setCreateTime(allTimePeriod); computeQueryVO.setCreateTime(allTimePeriod);
computeQueryVO.setStatus(TradeOrderStatusEnum.COMPLETED.getStatus()); computeQueryVO.setStatus(TradeOrderStatusEnum.COMPLETED.getStatus());
List<TradeOrderDO> computeOrderList = tradeOrderQueryService.getOrderList(computeQueryVO); List<TradeOrderDO> computeOrderList = tradeOrderQueryService.getOrderList(computeQueryVO);
// API订单:已支付状态
// API订单(已支付)
ApiOrderPageReqVO apiQueryVO = new ApiOrderPageReqVO(); ApiOrderPageReqVO apiQueryVO = new ApiOrderPageReqVO();
apiQueryVO.setCreateTime(allTimePeriod); apiQueryVO.setCreateTime(allTimePeriod);
apiQueryVO.setStatus(ApiOrderStatus.PAID.getValue()); apiQueryVO.setStatus(ApiOrderStatus.PAID.getValue());
List<ApiOrderDO> apiOrderList = apiOrderService.getOrderList(apiQueryVO); List<ApiOrderDO> apiOrderList = apiOrderService.getOrderList(apiQueryVO);
// 3. 按统计节点分组统计:数量和金额 // 3. 按节点分组统计:数量 + 金额
Map<LocalDate, Long> computeCountMap = groupOrderByNode(computeOrderList, timeNodes,dateType); Map<LocalDate, Long> computeCountMap = groupOrderByNode(computeOrderList, timeNodes, dateType);
Map<LocalDate, Long> apiCountMap = groupOrderByNode(apiOrderList, timeNodes,dateType); Map<LocalDate, Long> apiCountMap = groupOrderByNode(apiOrderList, timeNodes, dateType);
Map<LocalDate, Integer> computeAmountMap = groupComputeAmountByNode(computeOrderList, timeNodes,dateType); Map<LocalDate, Integer> computeAmountMap = groupComputeAmountByNode(computeOrderList, timeNodes, dateType);
Map<LocalDate, Integer> apiAmountMap = groupApiAmountByNode(apiOrderList, timeNodes,dateType); Map<LocalDate, Integer> apiAmountMap = groupApiAmountByNode(apiOrderList, timeNodes, dateType);
// 4. 构建结果列表 // 4. 构建返回结果
List<HomeIndexOrdersCountRespVO> resultList = new ArrayList<>(); List<HomeIndexOrdersCountRespVO> resultList = new ArrayList<>();
for (LocalDate node : timeNodes) { for (LocalDate node : timeNodes) {
// 统计数量 // 计算数量(算力+API+合计)
long computeCount = computeCountMap.getOrDefault(node, 0L); long computeCount = computeCountMap.getOrDefault(node, 0L);
long apiCount = apiCountMap.getOrDefault(node, 0L); long apiCount = apiCountMap.getOrDefault(node, 0L);
long totalCount = computeCount + apiCount; long totalCount = computeCount + apiCount;
// 计算金额(算力+API+合计)
// 统计金额
int computeAmount = computeAmountMap.getOrDefault(node, 0); int computeAmount = computeAmountMap.getOrDefault(node, 0);
int apiAmount = apiAmountMap.getOrDefault(node, 0); int apiAmount = apiAmountMap.getOrDefault(node, 0);
int totalAmount = computeAmount + apiAmount; int totalAmount = computeAmount + apiAmount;
// 封装VO // 封装VO
HomeIndexOrdersCountRespVO respVO = new HomeIndexOrdersCountRespVO(); HomeIndexOrdersCountRespVO respVO = new HomeIndexOrdersCountRespVO();
// 日期格式:日统计yyyy-MM-dd,月统计yyyy-MM respVO.setCountDate(getFormattedDate(node, dateType)); // 适配日期格式
respVO.setCountDate("d".equals(dateType)
? node.toString()
: node.format(DateTimeFormatter.ofPattern("yyyy-MM")));
// 数量字段
respVO.setComputeOrdersCount((int) computeCount); respVO.setComputeOrdersCount((int) computeCount);
respVO.setApiOrdersCount((int) apiCount); respVO.setApiOrdersCount((int) apiCount);
respVO.setTotalOrdersCount((int) totalCount); respVO.setTotalOrdersCount((int) totalCount);
// 金额字段
respVO.setComputeOrdersAmount(computeAmount); respVO.setComputeOrdersAmount(computeAmount);
respVO.setApiOrdersAmount(apiAmount); respVO.setApiOrdersAmount(apiAmount);
respVO.setTotalOrdersAmount(totalAmount); respVO.setTotalOrdersAmount(totalAmount);
...@@ -332,88 +367,94 @@ public class HomeIndexServiceImpl implements HomeIndexService { ...@@ -332,88 +367,94 @@ public class HomeIndexServiceImpl implements HomeIndexService {
return resultList; return resultList;
} }
/**
* 通用订单数量分组统计(支持d/m/y)
* @param orderList 订单列表(TradeOrderDO/ApiOrderDO)
* @param nodes 统计节点
* @param dateType 时间类型
*/
private <T> Map<LocalDate, Long> groupOrderByNode(List<T> orderList, List<LocalDate> nodes, String dateType) { private <T> Map<LocalDate, Long> groupOrderByNode(List<T> orderList, List<LocalDate> nodes, String dateType) {
if (CollectionUtils.isEmpty(orderList)) { if (CollectionUtils.isEmpty(orderList)) {
return new HashMap<>(); return new HashMap<>();
} }
return nodes.stream() return nodes.stream().collect(Collectors.toMap(
.collect(Collectors.toMap( node -> node,
node -> node, // 以统计节点为key node -> orderList.stream().filter(order -> {
node -> orderList.stream() try {
.filter(order -> { // 反射获取订单创建时间(适配两种订单DO)
try { LocalDateTime createTime = (LocalDateTime) order.getClass()
LocalDateTime createTime = (LocalDateTime) order.getClass() .getMethod("getCreateTime")
.getMethod("getCreateTime") .invoke(order);
.invoke(order); LocalDate orderDate = createTime.toLocalDate();
LocalDate orderDate = createTime.toLocalDate(); // 匹配订单日期与统计节点
return isDateMatch(orderDate, node, dateType);
// 核心修改:按当天/当月统计(非累计) } catch (Exception e) {
if ("d".equals(dateType)) { throw new RuntimeException("提取订单创建时间失败", e);
// 日统计:仅统计订单日期 == 节点日期(当天) }
return orderDate.isEqual(node); }).count()
} else { ));
// 月统计:仅统计订单日期在节点所在月份(当月)
return YearMonth.from(orderDate).equals(YearMonth.from(node));
}
} catch (Exception e) {
throw new RuntimeException("订单日期提取失败", e);
}
})
.count()
));
} }
/** /**
* 按统计节点分组统计算力订单金额(支持当天/当月统计) * 算力订单金额分组统计(支持d/m/y)
* 新增dateType参数,区分日/月统计逻辑
*/ */
private Map<LocalDate, Integer> groupComputeAmountByNode(List<TradeOrderDO> orderList, List<LocalDate> nodes, String dateType) { private Map<LocalDate, Integer> groupComputeAmountByNode(List<TradeOrderDO> orderList, List<LocalDate> nodes, String dateType) {
if (CollectionUtils.isEmpty(orderList)) { if (CollectionUtils.isEmpty(orderList)) {
return new HashMap<>(); return new HashMap<>();
} }
return nodes.stream() return nodes.stream().collect(Collectors.toMap(
.collect(Collectors.toMap( node -> node,
node -> node, node -> orderList.stream()
node -> orderList.stream() .filter(order -> isDateMatch(order.getCreateTime().toLocalDate(), node, dateType))
.filter(order -> { .mapToInt(TradeOrderDO::getPayPrice)
LocalDate orderDate = order.getCreateTime().toLocalDate(); .sum()
if ("d".equals(dateType)) { ));
return orderDate.isEqual(node); // 当天
} else if("m".equals(dateType)) {
return YearMonth.from(orderDate).equals(YearMonth.from(node)); // 当月
}else{
throw new ServiceException("未传入正确的统计时间类型!");
}
})
.mapToInt(TradeOrderDO::getPayPrice)
.sum()
));
} }
/** /**
* 按统计节点分组统计API订单金额(支持当天/当月统计) * API订单金额分组统计(支持d/m/y)
* 新增dateType参数,区分日/月统计逻辑
*/ */
private Map<LocalDate, Integer> groupApiAmountByNode(List<ApiOrderDO> orderList, List<LocalDate> nodes, String dateType) { private Map<LocalDate, Integer> groupApiAmountByNode(List<ApiOrderDO> orderList, List<LocalDate> nodes, String dateType) {
if (CollectionUtils.isEmpty(orderList)) { if (CollectionUtils.isEmpty(orderList)) {
return new HashMap<>(); return new HashMap<>();
} }
return nodes.stream() return nodes.stream().collect(Collectors.toMap(
.collect(Collectors.toMap( node -> node,
node -> node, node -> orderList.stream()
node -> orderList.stream() .filter(order -> isDateMatch(order.getCreateTime().toLocalDate(), node, dateType))
.filter(order -> { .mapToInt(ApiOrderDO::getCostPrice)
LocalDate orderDate = order.getCreateTime().toLocalDate(); .sum()
if ("d".equals(dateType)) { ));
return orderDate.isEqual(node); // 当天 }
} else if("m".equals(dateType)) {
return YearMonth.from(orderDate).equals(YearMonth.from(node)); // 当月 /**
}else{ * 通用日期匹配(判断订单日期是否属于当前统计节点)
throw new ServiceException("未传入正确的统计时间类型!"); * @param orderDate 订单日期
} * @param node 统计节点
}) * @param dateType 时间类型
.mapToInt(ApiOrderDO::getCostPrice) */
.sum() private boolean isDateMatch(LocalDate orderDate, LocalDate node, String dateType) {
)); if ("d".equals(dateType) || ObjectUtil.isEmpty(dateType) || "m".equals(dateType)) {
// 日/月统计:精确到天(订单日期 == 节点日期)
return orderDate.isEqual(node);
} else if ("y".equals(dateType)) {
// 年统计:精确到月(订单月份 == 节点月份)
return YearMonth.from(orderDate).equals(YearMonth.from(node));
}
throw new ServiceException("无效的统计时间类型:" + dateType);
}
/**
* 通用日期格式化(适配不同时间类型的显示)
*/
private String getFormattedDate(LocalDate node, String dateType) {
if ("d".equals(dateType) || ObjectUtil.isEmpty(dateType) || "m".equals(dateType)) {
// 日/月统计:显示完整日期(yyyy-MM-dd)
return node.toString();
} else if ("y".equals(dateType)) {
// 年统计:显示年月(yyyy-MM)
return node.format(DateTimeFormatter.ofPattern("yyyy-MM"));
}
throw new ServiceException("无效的统计时间类型:" + dateType);
} }
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment