✨ 首页统计
This commit is contained in:
@@ -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"` // 成功执行的任务数
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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{}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user