✨ 首页统计

This commit is contained in:
sugarBecomer
2025-11-26 09:58:32 +08:00
parent b2f0f91712
commit d9049095e3
6 changed files with 67 additions and 1 deletions
+8
View File
@@ -0,0 +1,8 @@
package v1
// TaskStatisticsItem 每日任务统计项
type TaskStatisticsItem struct {
Date string `json:"date"` // 日期 格式:2006-01-02
PendingTask int `json:"pendingTask"` // 需要完成的任务数
SuccessTask int `json:"successTask"` // 成功执行的任务数
}
+4
View File
@@ -72,3 +72,7 @@ type FindLocationReq struct {
g.Meta `path:"/task/location" method:"get" tags:"CpTask" summary:"查找地址"`
Address string `json:"address"`
}
type GetTaskStatisticsReq struct {
g.Meta `path:"/task/statistics" method:"get" tags:"CpTask" summary:"获取近七日任务统计数据"`
}
@@ -10,7 +10,7 @@ import (
func TestRuoliSubmitCaptchaResolver_GetCaptchaTicket(t *testing.T) {
loginClient, detail := testutil.LoginTestUser()
resolver := NewRuoliResolver(loginClient, detail.WecloudUrl, "abcdefg", types.TaskTypeSleepCheck)
resolver := NewNormalResolver(loginClient, detail.WecloudUrl, "abcdefg", types.TaskTypeSleepCheck)
info := resolver.GetValidationInfo(context.Background())
@@ -65,6 +65,12 @@ func (c CpTaskCtrlV1) PauseTask(ctx context.Context, req *v1.PauseTaskReq) (res
defer utils.Pass(&err)
return service.Global.CpTask.PauseTask(ctx, req), nil
}
func (c CpTaskCtrlV1) GetTaskStatistics(ctx context.Context, req *v1.GetTaskStatisticsReq) (res *utils.Response[[]*v1.TaskStatisticsItem], err error) {
defer utils.Pass(&err)
return service.Global.CpTask.GetTaskStatistics(ctx, req), nil
}
func NewCpTaskCtrlV1() ICpTaskCtrlV1 {
return &CpTaskCtrlV1{}
}
@@ -19,4 +19,5 @@ type ICpTaskCtrlV1 interface {
ExecuteNow(ctx context.Context, req *v1.ExecuteNowReq) (res *utils.Response[any], err error)
PauseTask(ctx context.Context, req *v1.PauseTaskReq) (res *utils.Response[any], err error)
FindLocation(ctx context.Context, req *v1.FindLocationReq) (res *utils.Response[any], err error)
GetTaskStatistics(ctx context.Context, req *v1.GetTaskStatisticsReq) (res *utils.Response[[]*v1.TaskStatisticsItem], err error)
}
+47
View File
@@ -299,6 +299,53 @@ func (v CpTaskServiceV1) PauseTask(ctx context.Context, req *v1.PauseTaskReq) *u
}
}
func (v CpTaskServiceV1) GetTaskStatistics(ctx context.Context, req *v1.GetTaskStatisticsReq) *utils.Response[[]*v1.TaskStatisticsItem] {
user := utils.GetUserInfoFromCtx(ctx)
// 计算近七日的日期范围
now := time.Now()
statistics := make([]*v1.TaskStatisticsItem, 7)
for i := 6; i >= 0; i-- {
date := now.AddDate(0, 0, -i)
dateStr := date.Format("2006-01-02")
// 计算当天的开始和结束时间戳
startOfDay := time.Date(date.Year(), date.Month(), date.Day(), 0, 0, 0, 0, date.Location())
endOfDay := startOfDay.AddDate(0, 0, 1)
// 查询需要完成的任务数:状态不是暂停的任务,且执行次数大于成功次数
pendingCount := db2.Global.CpTask.Query().
Where(
cptask.HasSysUserWith(sysuser.ID(user.ID)),
cptask.TaskStatusNEQ(cptask.TaskStatusPause),
cptask.FrequencyGT(0),
).
Where(func(s *sql.Selector) {
s.Where(sql.ExprP("frequency > success_count"))
}).
CountX(ctx)
// 查询成功执行的任务数:当天成功的任务日志数
successCount := db2.Global.CpTaskLog.Query().
Where(func(s *sql.Selector) {
s.Where(sql.GTE(s.C("create_time"), startOfDay))
s.Where(sql.LT(s.C("create_time"), endOfDay))
s.Where(sql.EQ(s.C("is_success"), true))
s.Where(sql.EQ(s.C("system_user_id"), user.ID))
}).
CountX(ctx)
statistics[6-i] = &v1.TaskStatisticsItem{
Date: dateStr,
PendingTask: pendingCount,
SuccessTask: successCount,
}
}
return utils.SuccessWithData[[]*v1.TaskStatisticsItem](statistics)
}
func NewCpTaskServiceV1() *CpTaskServiceV1 {
return &CpTaskServiceV1{}
}