diff --git a/models/cloudbrain_static.go b/models/cloudbrain_static.go index ae9358dc1..3c5da2fd3 100644 --- a/models/cloudbrain_static.go +++ b/models/cloudbrain_static.go @@ -63,11 +63,23 @@ type DurationStatisticOptions struct { EndTime time.Time AiCenterCode string } + +type DurationRateStatistic struct { + AiCenterTotalDurationStat map[string]int `json:"aiCenterTotalDurationStat"` + AiCenterUsageDurationStat map[string]int `json:"aiCenterUsageDurationStat"` + TotalUsageRate float64 `json:"totalUsageRate"` +} type DateCloudbrainStatistic struct { - Date string `json:"date"` - AiCenterUsageDuration map[string]int `json:"aiCenterUsageDuration"` - AiCenterTotalDuration map[string]int `json:"aiCenterTotalDuration"` - AiCenterUsageRate map[string]int `json:"aiCenterUsageRate"` + Date string `json:"date"` + AiCenterUsageDuration map[string]int `json:"aiCenterUsageDuration"` + AiCenterTotalDuration map[string]int `json:"aiCenterTotalDuration"` + AiCenterUsageRate map[string]float64 `json:"aiCenterUsageRate"` +} + +type HourTimeStatistic struct { + HourTimeUsageDuration map[int]int `json:"hourTimeUsageDuration"` + HourTimeTotalDuration map[int]int `json:"hourTimeTotalDuration"` + HourTimeUsageRate map[int]float64 `json:"hourTimeUsageRate"` } func GetTodayCreatorCount(beginTime time.Time, endTime time.Time) (int64, error) { @@ -345,8 +357,7 @@ func GetDurationRecordBeginTime() ([]*CloudbrainDurationStatistic, error) { defer sess.Close() sess.OrderBy("cloudbrain_duration_statistic.id ASC limit 1") CloudbrainDurationStatistics := make([]*CloudbrainDurationStatistic, 0) - if err := sess.Table(&CloudbrainDurationStatistic{}).Unscoped(). - Find(&CloudbrainDurationStatistics); err != nil { + if err := sess.Table(&CloudbrainDurationStatistic{}).Find(&CloudbrainDurationStatistics); err != nil { log.Info("find error.") } return CloudbrainDurationStatistics, nil diff --git a/modules/cron/tasks_basic.go b/modules/cron/tasks_basic.go index b68d747d8..38ac37852 100755 --- a/modules/cron/tasks_basic.go +++ b/modules/cron/tasks_basic.go @@ -259,7 +259,7 @@ func registerHandleCloudbrainDurationStatistic() { RegisterTaskFatal("handle_cloudbrain_duration_statistic", &BaseConfig{ Enabled: true, RunAtStart: false, - Schedule: "@every 60m", + Schedule: "55 59 * * * ?", }, func(ctx context.Context, _ *models.User, _ Config) error { repo.CloudbrainDurationStatisticHour() return nil @@ -283,7 +283,6 @@ func initBasicTasks() { registerHandleRepoAndUserStatistic() registerHandleSummaryStatistic() - registerHandleCloudbrainDurationStatistic() registerSyncCloudbrainStatus() registerHandleOrgStatistic() @@ -292,4 +291,5 @@ func initBasicTasks() { //registerRewardPeriodTask() registerCloudbrainPointDeductTask() + registerHandleCloudbrainDurationStatistic() } diff --git a/routers/api/v1/repo/cloudbrain_dashboard.go b/routers/api/v1/repo/cloudbrain_dashboard.go index caac24aad..468692663 100755 --- a/routers/api/v1/repo/cloudbrain_dashboard.go +++ b/routers/api/v1/repo/cloudbrain_dashboard.go @@ -1487,13 +1487,15 @@ func GetCloudbrainResourceUsage(ctx *context.Context) { func GetCloudbrainResourceUsageDetail(ctx *context.Context) { queryType := ctx.QueryTrim("type") now := time.Now() - beginTimeStr := ctx.QueryTrim("beginTime") endTimeStr := ctx.QueryTrim("endTime") + aiCenterCode := ctx.QueryTrim("aiCenterCode") + var beginTime time.Time var endTime time.Time var endTimeTemp time.Time dayCloudbrainDuration := make([]models.DateCloudbrainStatistic, 0) + hourCloudbrainDuration := models.HourTimeStatistic{} var err error var count int if queryType != "" { @@ -1505,14 +1507,22 @@ func GetCloudbrainResourceUsageDetail(ctx *context.Context) { return } brainRecordBeginTime := recordCloudbrainDuration[0].CreatedUnix.AsTime() + log.Info("recordCloudbrainDuration:", recordCloudbrainDuration) + log.Info("brainRecordBeginTime:", brainRecordBeginTime) beginTime = brainRecordBeginTime endTime = now - dayCloudbrainDuration, count, err = getDayCloudbrainDuration(beginTime, endTime) + dayCloudbrainDuration, count, err = getDayCloudbrainDuration(beginTime, endTime, aiCenterCode) if err != nil { log.Error("Can not query dayCloudbrainDuration.", err) ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainInfo_get_error")) return } + hourCloudbrainDuration = getHourCloudbrainDuration(beginTime, endTime, aiCenterCode) + if err != nil { + log.Error("Can not query hourCloudbrainDuration.", err) + ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainInfo_get_error")) + return + } } else if queryType == "today" { beginTime = now.AddDate(0, 0, 0) beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location()) @@ -1644,19 +1654,21 @@ func GetCloudbrainResourceUsageDetail(ctx *context.Context) { pagesize = 5 } pageDateCloudbrainDuration := getPageDateCloudbrainDuration(dayCloudbrainDuration, page, pagesize) + durationRateStatistic := getDurationStatistic(beginTime, endTime) ctx.JSON(http.StatusOK, map[string]interface{}{ "totalCount": count, "pageDateCloudbrainDuration": pageDateCloudbrainDuration, + "durationRateStatistic": durationRateStatistic, + "hourCloudbrainDuration": hourCloudbrainDuration, }) } -func getAiCenterUsageDuration(beginTime time.Time, endTime time.Time, cloudbrainStatistics []*models.CloudbrainDurationStatistic) (map[string]int, map[string]int, map[string]int) { - +func getAiCenterUsageDuration(beginTime time.Time, endTime time.Time, cloudbrainStatistics []*models.CloudbrainDurationStatistic) (map[string]int, map[string]int, map[string]float64) { aiCenterTotalDuration := make(map[string]int) aiCenterUsageDuration := make(map[string]int) - aiCenterUsageRate := make(map[string]int) + aiCenterUsageRate := make(map[string]float64) for _, cloudbrainStatistic := range cloudbrainStatistics { if int64(cloudbrainStatistic.CreatedUnix) >= beginTime.Unix() && int64(cloudbrainStatistic.CreatedUnix) < endTime.Unix() { if cloudbrainStatistic.TotalCanUse { @@ -1674,10 +1686,21 @@ func getAiCenterUsageDuration(beginTime time.Time, endTime time.Time, cloudbrain } } } + ResourceAiCenterRes, err := models.GetResourceAiCenters() + if err != nil { + log.Error("Can not get ResourceAiCenterRes.", err) + return nil, nil, nil + } + for _, v := range ResourceAiCenterRes { + if _, ok := aiCenterUsageDuration[v.AiCenterCode]; !ok { + aiCenterUsageDuration[v.AiCenterCode] = 0 + } + } + for k, v := range aiCenterTotalDuration { for i, j := range aiCenterUsageDuration { if k == i { - aiCenterUsageRate[k] = j / v + aiCenterUsageRate[k] = float64(j) / float64(v) } } } @@ -1685,6 +1708,61 @@ func getAiCenterUsageDuration(beginTime time.Time, endTime time.Time, cloudbrain return aiCenterUsageDuration, aiCenterTotalDuration, aiCenterUsageRate } +func getDurationStatistic(beginTime time.Time, endTime time.Time) models.DurationRateStatistic { + aiCenterTotalDurationStat := make(map[string]int) + aiCenterUsageDurationStat := make(map[string]int) + durationRateStatistic := models.DurationRateStatistic{} + cardDurationStatistics, err := models.GetCardDurationStatistics(&models.DurationStatisticOptions{ + BeginTime: beginTime, + EndTime: endTime, + }) + if err != nil { + log.Error("GetCardDurationStatistics error:", err) + return durationRateStatistic + } + for _, cloudbrainStatistic := range cardDurationStatistics { + if cloudbrainStatistic.TotalCanUse { + if _, ok := aiCenterTotalDurationStat[cloudbrainStatistic.AiCenterCode]; !ok { + aiCenterTotalDurationStat[cloudbrainStatistic.AiCenterCode] = cloudbrainStatistic.CardsTotalDuration + } else { + aiCenterTotalDurationStat[cloudbrainStatistic.AiCenterCode] += cloudbrainStatistic.CardsTotalDuration + } + } else { + if _, ok := aiCenterUsageDurationStat[cloudbrainStatistic.AiCenterCode]; !ok { + aiCenterUsageDurationStat[cloudbrainStatistic.AiCenterCode] = cloudbrainStatistic.CardsTotalDuration + } else { + aiCenterUsageDurationStat[cloudbrainStatistic.AiCenterCode] += cloudbrainStatistic.CardsTotalDuration + } + } + } + ResourceAiCenterRes, err := models.GetResourceAiCenters() + if err != nil { + log.Error("Can not get ResourceAiCenterRes.", err) + return durationRateStatistic + } + for _, v := range ResourceAiCenterRes { + if _, ok := aiCenterUsageDurationStat[v.AiCenterCode]; !ok { + aiCenterUsageDurationStat[v.AiCenterCode] = 0 + } + } + totalCanUse := float64(0) + totalUse := float64(0) + for k, v := range aiCenterTotalDurationStat { + for i, j := range aiCenterUsageDurationStat { + if k == i { + totalUse += float64(j) + totalCanUse += float64(v) + } + } + } + totalUsageRate := totalUse / totalCanUse + + durationRateStatistic.AiCenterTotalDurationStat = aiCenterTotalDurationStat + durationRateStatistic.AiCenterUsageDurationStat = aiCenterUsageDurationStat + durationRateStatistic.TotalUsageRate = totalUsageRate + return durationRateStatistic +} + func getDayCloudbrainDuration(beginTime time.Time, endTime time.Time) ([]models.DateCloudbrainStatistic, int, error) { now := time.Now() endTimeTemp := time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 0, 0, 0, 0, now.Location()) @@ -1699,6 +1777,7 @@ func getDayCloudbrainDuration(beginTime time.Time, endTime time.Time) ([]models. log.Error("GetCardDurationStatistics error:", err) return nil, 0, err } + dayCloudbrainInfo := make([]models.DateCloudbrainStatistic, 0) count := 0 for beginTime.Before(endTimeTemp) || beginTime.Equal(endTimeTemp) { @@ -1711,7 +1790,64 @@ func getDayCloudbrainDuration(beginTime time.Time, endTime time.Time) ([]models. }) endTime = endTimeTemp endTimeTemp = endTimeTemp.AddDate(0, 0, -1) + if endTimeTemp.Before(beginTime) && beginTime.Before(endTime) { + endTimeTemp = beginTime + } count += 1 } return dayCloudbrainInfo, count, nil } + +func getHourCloudbrainDuration(beginTime time.Time, endTime time.Time, aiCenterCode string) models.HourTimeStatistic { + hourTimeTotalDuration := make(map[int]int) + hourTimeUsageDuration := make(map[int]int) + hourTimeUsageRate := make(map[int]float64) + hourTimeStatistic := models.HourTimeStatistic{} + + cardDurationStatistics, err := models.GetCardDurationStatistics(&models.DurationStatisticOptions{ + BeginTime: beginTime, + EndTime: endTime, + }) + if err != nil { + log.Error("GetCardDurationStatistics error:", err) + return hourTimeStatistic + } + for _, cloudbrainStatistic := range cardDurationStatistics { + if cloudbrainStatistic.AiCenterCode == aiCenterCode { + if cloudbrainStatistic.TotalCanUse { + if _, ok := hourTimeTotalDuration[cloudbrainStatistic.HourTime]; !ok { + hourTimeTotalDuration[cloudbrainStatistic.HourTime] = cloudbrainStatistic.CardsTotalDuration + } else { + hourTimeTotalDuration[cloudbrainStatistic.HourTime] += cloudbrainStatistic.CardsTotalDuration + } + } else { + if _, ok := hourTimeUsageDuration[cloudbrainStatistic.HourTime]; !ok { + hourTimeUsageDuration[cloudbrainStatistic.HourTime] = cloudbrainStatistic.CardsTotalDuration + } else { + hourTimeUsageDuration[cloudbrainStatistic.HourTime] += cloudbrainStatistic.CardsTotalDuration + } + } + hourTimeList := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23} + for _, v := range hourTimeList { + if _, ok := hourTimeUsageDuration[v]; !ok { + hourTimeUsageDuration[v] = 0 + } + if _, ok := hourTimeTotalDuration[v]; !ok { + hourTimeTotalDuration[v] = 0 + } + } + + for k, v := range hourTimeTotalDuration { + for i, j := range hourTimeUsageDuration { + if k == i { + hourTimeUsageRate[k] = float64(j) / float64(v) + } + } + } + } + } + hourTimeStatistic.HourTimeTotalDuration = hourTimeTotalDuration + hourTimeStatistic.HourTimeUsageDuration = hourTimeUsageDuration + hourTimeStatistic.HourTimeUsageRate = hourTimeUsageRate + return hourTimeStatistic +}