Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
api
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
134aedb9
authored
Sep 12, 2025
by
Jony.L
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
首页统计4.0 改为按年、月、日统计
parent
d12c9ff3
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
159 additions
and
120 deletions
+159
-120
computility-module-biz/src/main/java/com/luhu/computility/module/biz/controller/admin/home/HomeIndexController.java
+0
-3
computility-module-biz/src/main/java/com/luhu/computility/module/biz/service/home/HomeIndexServiceImpl.java
+159
-117
No files found.
computility-module-biz/src/main/java/com/luhu/computility/module/biz/controller/admin/home/HomeIndexController.java
View file @
134aedb9
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
;
...
...
computility-module-biz/src/main/java/com/luhu/computility/module/biz/service/home/HomeIndexServiceImpl.java
View file @
134aedb9
...
@@ -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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment