| @@ -388,7 +388,7 @@ type JobResultPayload struct { | |||||
| AppProgress string `json:"appProgress"` | AppProgress string `json:"appProgress"` | ||||
| AppTrackingURL string `json:"appTrackingUrl"` | AppTrackingURL string `json:"appTrackingUrl"` | ||||
| AppLaunchedTime int64 `json:"appLaunchedTime"` | AppLaunchedTime int64 `json:"appLaunchedTime"` | ||||
| AppCompletedTime int64 `json:"appCompletedTime"` | |||||
| AppCompletedTime interface{} `json:"appCompletedTime"` | |||||
| AppExitCode int `json:"appExitCode"` | AppExitCode int `json:"appExitCode"` | ||||
| AppExitDiagnostics string `json:"appExitDiagnostics"` | AppExitDiagnostics string `json:"appExitDiagnostics"` | ||||
| AppExitType interface{} `json:"appExitType"` | AppExitType interface{} `json:"appExitType"` | ||||
| @@ -1370,6 +1370,16 @@ func getRepoCloudBrain(cb *Cloudbrain) (*Cloudbrain, error) { | |||||
| return cb, nil | return cb, nil | ||||
| } | } | ||||
| func getRepoCloudBrainWithDeleted(cb *Cloudbrain) (*Cloudbrain, error) { | |||||
| has, err := x.Unscoped().Get(cb) | |||||
| if err != nil { | |||||
| return nil, err | |||||
| } else if !has { | |||||
| return nil, ErrJobNotExist{} | |||||
| } | |||||
| return cb, nil | |||||
| } | |||||
| func GetRepoCloudBrainByJobID(repoID int64, jobID string) (*Cloudbrain, error) { | func GetRepoCloudBrainByJobID(repoID int64, jobID string) (*Cloudbrain, error) { | ||||
| cb := &Cloudbrain{JobID: jobID, RepoID: repoID} | cb := &Cloudbrain{JobID: jobID, RepoID: repoID} | ||||
| return getRepoCloudBrain(cb) | return getRepoCloudBrain(cb) | ||||
| @@ -1386,6 +1396,12 @@ func GetCloudbrainByID(id string) (*Cloudbrain, error) { | |||||
| return getRepoCloudBrain(cb) | return getRepoCloudBrain(cb) | ||||
| } | } | ||||
| func GetCloudbrainByIDWithDeleted(id string) (*Cloudbrain, error) { | |||||
| idInt64, _ := strconv.ParseInt(id, 10, 64) | |||||
| cb := &Cloudbrain{ID: idInt64} | |||||
| return getRepoCloudBrainWithDeleted(cb) | |||||
| } | |||||
| func GetCloudbrainByJobIDAndVersionName(jobID string, versionName string) (*Cloudbrain, error) { | func GetCloudbrainByJobIDAndVersionName(jobID string, versionName string) (*Cloudbrain, error) { | ||||
| cb := &Cloudbrain{JobID: jobID, VersionName: versionName} | cb := &Cloudbrain{JobID: jobID, VersionName: versionName} | ||||
| return getRepoCloudBrain(cb) | return getRepoCloudBrain(cb) | ||||
| @@ -139,20 +139,7 @@ func SearchDatasetCondition(opts *SearchDatasetOptions) builder.Cond { | |||||
| var cond = builder.NewCond() | var cond = builder.NewCond() | ||||
| cond = cond.And(builder.Neq{"dataset.status": DatasetStatusDeleted}) | cond = cond.And(builder.Neq{"dataset.status": DatasetStatusDeleted}) | ||||
| if len(opts.Keyword) > 0 { | |||||
| cond = cond.And(builder.Or(builder.Like{"dataset.title", opts.Keyword}, builder.Like{"dataset.description", opts.Keyword})) | |||||
| } | |||||
| if len(opts.Category) > 0 { | |||||
| cond = cond.And(builder.Eq{"dataset.category": opts.Category}) | |||||
| } | |||||
| if len(opts.Task) > 0 { | |||||
| cond = cond.And(builder.Eq{"dataset.task": opts.Task}) | |||||
| } | |||||
| if len(opts.License) > 0 { | |||||
| cond = cond.And(builder.Eq{"dataset.license": opts.License}) | |||||
| } | |||||
| cond = generateFilterCond(opts, cond) | |||||
| if opts.RepoID > 0 { | if opts.RepoID > 0 { | ||||
| cond = cond.And(builder.Eq{"dataset.repo_id": opts.RepoID}) | cond = cond.And(builder.Eq{"dataset.repo_id": opts.RepoID}) | ||||
| @@ -162,14 +149,12 @@ func SearchDatasetCondition(opts *SearchDatasetOptions) builder.Cond { | |||||
| cond = cond.And(builder.Eq{"dataset.status": DatasetStatusPublic}) | cond = cond.And(builder.Eq{"dataset.status": DatasetStatusPublic}) | ||||
| cond = cond.And(builder.Eq{"attachment.is_private": false}) | cond = cond.And(builder.Eq{"attachment.is_private": false}) | ||||
| if opts.OwnerID > 0 { | if opts.OwnerID > 0 { | ||||
| if len(opts.Keyword) == 0 { | |||||
| cond = cond.Or(builder.Eq{"repository.owner_id": opts.OwnerID}) | |||||
| } else { | |||||
| subCon := builder.NewCond() | |||||
| subCon = subCon.And(builder.Eq{"repository.owner_id": opts.OwnerID}, builder.Or(builder.Like{"dataset.title", opts.Keyword}, builder.Like{"dataset.description", opts.Keyword})) | |||||
| cond = cond.Or(subCon) | |||||
| } | |||||
| subCon := builder.NewCond() | |||||
| subCon = subCon.And(builder.Eq{"repository.owner_id": opts.OwnerID}) | |||||
| subCon = generateFilterCond(opts, subCon) | |||||
| cond = cond.Or(subCon) | |||||
| } | } | ||||
| } else if opts.OwnerID > 0 { | } else if opts.OwnerID > 0 { | ||||
| cond = cond.And(builder.Eq{"repository.owner_id": opts.OwnerID}) | cond = cond.And(builder.Eq{"repository.owner_id": opts.OwnerID}) | ||||
| @@ -182,6 +167,25 @@ func SearchDatasetCondition(opts *SearchDatasetOptions) builder.Cond { | |||||
| return cond | return cond | ||||
| } | } | ||||
| func generateFilterCond(opts *SearchDatasetOptions, cond builder.Cond) builder.Cond { | |||||
| if len(opts.Keyword) > 0 { | |||||
| cond = cond.And(builder.Or(builder.Like{"dataset.title", opts.Keyword}, builder.Like{"dataset.description", opts.Keyword})) | |||||
| } | |||||
| if len(opts.Category) > 0 { | |||||
| cond = cond.And(builder.Eq{"dataset.category": opts.Category}) | |||||
| } | |||||
| if len(opts.Task) > 0 { | |||||
| cond = cond.And(builder.Eq{"dataset.task": opts.Task}) | |||||
| } | |||||
| if len(opts.License) > 0 { | |||||
| cond = cond.And(builder.Eq{"dataset.license": opts.License}) | |||||
| } | |||||
| return cond | |||||
| } | |||||
| func SearchDatasetByCondition(opts *SearchDatasetOptions, cond builder.Cond) (DatasetList, int64, error) { | func SearchDatasetByCondition(opts *SearchDatasetOptions, cond builder.Cond) (DatasetList, int64, error) { | ||||
| if opts.Page <= 0 { | if opts.Page <= 0 { | ||||
| opts.Page = 1 | opts.Page = 1 | ||||
| @@ -348,7 +352,7 @@ func GetDatasetByRepo(repo *Repository) (*Dataset, error) { | |||||
| if has { | if has { | ||||
| return dataset, nil | return dataset, nil | ||||
| } else { | } else { | ||||
| return nil, errors.New("Not Found") | |||||
| return nil, ErrNotExist{repo.ID} | |||||
| } | } | ||||
| } | } | ||||
| @@ -154,6 +154,8 @@ func init() { | |||||
| new(UserBusinessAnalysisCurrentWeek), | new(UserBusinessAnalysisCurrentWeek), | ||||
| new(UserBusinessAnalysisYesterday), | new(UserBusinessAnalysisYesterday), | ||||
| new(UserLoginLog), | new(UserLoginLog), | ||||
| new(UserMetrics), | |||||
| new(UserAnalysisPara), | |||||
| ) | ) | ||||
| gonicNames := []string{"SSL", "UID"} | gonicNames := []string{"SSL", "UID"} | ||||
| @@ -1607,14 +1607,16 @@ func updateRepository(e Engine, repo *Repository, visibilityChanged bool) (err e | |||||
| } | } | ||||
| dataset, err := GetDatasetByRepo(repo) | dataset, err := GetDatasetByRepo(repo) | ||||
| if err != nil { | |||||
| if err != nil && !IsErrNotExist(err) { | |||||
| return err | return err | ||||
| } | } | ||||
| _, err = e.Where("dataset_id = ?", dataset.ID).Cols("is_private").Update(&Attachment{ | |||||
| IsPrivate: true, | |||||
| }) | |||||
| if err != nil { | |||||
| return err | |||||
| if dataset != nil { | |||||
| _, err = e.Where("dataset_id = ?", dataset.ID).Cols("is_private").Update(&Attachment{ | |||||
| IsPrivate: true, | |||||
| }) | |||||
| if err != nil { | |||||
| return err | |||||
| } | |||||
| } | } | ||||
| } else { | } else { | ||||
| @@ -6,7 +6,6 @@ import ( | |||||
| "strconv" | "strconv" | ||||
| "time" | "time" | ||||
| "code.gitea.io/gitea/modules/git" | |||||
| "code.gitea.io/gitea/modules/log" | "code.gitea.io/gitea/modules/log" | ||||
| "code.gitea.io/gitea/modules/timeutil" | "code.gitea.io/gitea/modules/timeutil" | ||||
| "xorm.io/builder" | "xorm.io/builder" | ||||
| @@ -81,6 +80,19 @@ type UserBusinessAnalysisAll struct { | |||||
| Name string `xorm:"NOT NULL"` | Name string `xorm:"NOT NULL"` | ||||
| DataDate string `xorm:"NULL"` | DataDate string `xorm:"NULL"` | ||||
| //cloudbraintask | |||||
| CloudBrainTaskNum int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuDebugJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuDebugJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuTrainJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuTrainJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuInferenceJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuBenchMarkJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| CloudBrainRunTime int `xorm:"NOT NULL DEFAULT 0"` | |||||
| CommitDatasetNum int `xorm:"NOT NULL DEFAULT 0"` | |||||
| UserIndex float64 `xorm:"NOT NULL DEFAULT 0"` | |||||
| UserLocation string `xorm:"NULL"` | |||||
| } | } | ||||
| type UserBusinessAnalysis struct { | type UserBusinessAnalysis struct { | ||||
| @@ -146,6 +158,18 @@ type UserBusinessAnalysis struct { | |||||
| Name string `xorm:"NOT NULL"` | Name string `xorm:"NOT NULL"` | ||||
| DataDate string `xorm:"NULL"` | DataDate string `xorm:"NULL"` | ||||
| CloudBrainTaskNum int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuDebugJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuDebugJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuTrainJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuTrainJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuInferenceJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuBenchMarkJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| CloudBrainRunTime int `xorm:"NOT NULL DEFAULT 0"` | |||||
| CommitDatasetNum int `xorm:"NOT NULL DEFAULT 0"` | |||||
| UserIndex float64 `xorm:"NOT NULL DEFAULT 0"` | |||||
| UserLocation string `xorm:"NULL"` | |||||
| } | } | ||||
| type UserBusinessAnalysisQueryOptions struct { | type UserBusinessAnalysisQueryOptions struct { | ||||
| @@ -183,6 +207,29 @@ func getLastCountDate() int64 { | |||||
| return pageStartTime.Unix() | return pageStartTime.Unix() | ||||
| } | } | ||||
| func QueryMetrics(start int64, end int64) ([]*UserMetrics, int64) { | |||||
| statictisSess := xStatistic.NewSession() | |||||
| defer statictisSess.Close() | |||||
| userMetricsList := make([]*UserMetrics, 0) | |||||
| if err := statictisSess.Table(new(UserMetrics)).Where("count_date >" + fmt.Sprint(start) + " and count_date<" + fmt.Sprint(end)).OrderBy("count_date desc"). | |||||
| Find(&userMetricsList); err != nil { | |||||
| return nil, 0 | |||||
| } | |||||
| return userMetricsList, int64(len(userMetricsList)) | |||||
| } | |||||
| func QueryRankList(key string, tableName string, limit int) ([]*UserBusinessAnalysisAll, int64) { | |||||
| statictisSess := xStatistic.NewSession() | |||||
| defer statictisSess.Close() | |||||
| userBusinessAnalysisAllList := make([]*UserBusinessAnalysisAll, 0) | |||||
| if err := statictisSess.Table(tableName).OrderBy(key+" desc,id desc").Limit(limit, 0). | |||||
| Find(&userBusinessAnalysisAllList); err != nil { | |||||
| return nil, 0 | |||||
| } | |||||
| return userBusinessAnalysisAllList, int64(len(userBusinessAnalysisAllList)) | |||||
| } | |||||
| func QueryUserStaticDataByTableName(start int, pageSize int, tableName string, queryObj interface{}, userName string) ([]*UserBusinessAnalysisAll, int64) { | func QueryUserStaticDataByTableName(start int, pageSize int, tableName string, queryObj interface{}, userName string) ([]*UserBusinessAnalysisAll, int64) { | ||||
| statictisSess := xStatistic.NewSession() | statictisSess := xStatistic.NewSession() | ||||
| defer statictisSess.Close() | defer statictisSess.Close() | ||||
| @@ -334,6 +381,7 @@ func QueryUserStaticDataPage(opts *UserBusinessAnalysisQueryOptions) ([]*UserBus | |||||
| resultMap[userRecord.ID].WatchedCount += userRecord.WatchedCount | resultMap[userRecord.ID].WatchedCount += userRecord.WatchedCount | ||||
| resultMap[userRecord.ID].CommitCodeSize += userRecord.CommitCodeSize | resultMap[userRecord.ID].CommitCodeSize += userRecord.CommitCodeSize | ||||
| resultMap[userRecord.ID].CommitDatasetSize += userRecord.CommitDatasetSize | resultMap[userRecord.ID].CommitDatasetSize += userRecord.CommitDatasetSize | ||||
| resultMap[userRecord.ID].CommitDatasetNum += userRecord.CommitDatasetNum | |||||
| resultMap[userRecord.ID].CommitModelCount += userRecord.CommitModelCount | resultMap[userRecord.ID].CommitModelCount += userRecord.CommitModelCount | ||||
| resultMap[userRecord.ID].SolveIssueCount += userRecord.SolveIssueCount | resultMap[userRecord.ID].SolveIssueCount += userRecord.SolveIssueCount | ||||
| resultMap[userRecord.ID].EncyclopediasCount += userRecord.EncyclopediasCount | resultMap[userRecord.ID].EncyclopediasCount += userRecord.EncyclopediasCount | ||||
| @@ -353,7 +401,7 @@ func QueryUserStaticDataPage(opts *UserBusinessAnalysisQueryOptions) ([]*UserBus | |||||
| return userBusinessAnalysisReturnList, count | return userBusinessAnalysisReturnList, count | ||||
| } | } | ||||
| func refreshUserStaticTable(wikiCountMap map[string]int, CommitCodeSizeMap map[string]*git.UserKPIStats, tableName string, pageStartTime time.Time, pageEndTime time.Time) { | |||||
| func refreshUserStaticTable(wikiCountMap map[string]int, tableName string, pageStartTime time.Time, pageEndTime time.Time, userMetrics map[string]int) { | |||||
| sess := x.NewSession() | sess := x.NewSession() | ||||
| defer sess.Close() | defer sess.Close() | ||||
| @@ -379,14 +427,15 @@ func refreshUserStaticTable(wikiCountMap map[string]int, CommitCodeSizeMap map[s | |||||
| FocusRepoCountMap := queryWatch(start_unix, end_unix) | FocusRepoCountMap := queryWatch(start_unix, end_unix) | ||||
| StarRepoCountMap := queryStar(start_unix, end_unix) | StarRepoCountMap := queryStar(start_unix, end_unix) | ||||
| WatchedCountMap := queryFollow(start_unix, end_unix) | WatchedCountMap := queryFollow(start_unix, end_unix) | ||||
| CommitDatasetSizeMap := queryDatasetSize(start_unix, end_unix) | |||||
| CommitCodeSizeMap := queryCommitCodeSize(start_unix, end_unix) | |||||
| CommitDatasetSizeMap, CommitDatasetNumMap := queryDatasetSize(start_unix, end_unix) | |||||
| SolveIssueCountMap := querySolveIssue(start_unix, end_unix) | SolveIssueCountMap := querySolveIssue(start_unix, end_unix) | ||||
| CreateRepoCountMap := queryUserCreateRepo(start_unix, end_unix) | CreateRepoCountMap := queryUserCreateRepo(start_unix, end_unix) | ||||
| LoginCountMap := queryLoginCount(start_unix, end_unix) | LoginCountMap := queryLoginCount(start_unix, end_unix) | ||||
| OpenIIndexMap := queryUserRepoOpenIIndex(startTime.Unix(), end_unix) | OpenIIndexMap := queryUserRepoOpenIIndex(startTime.Unix(), end_unix) | ||||
| CloudBrainTaskMap, CloudBrainTaskItemMap := queryCloudBrainTask(start_unix, end_unix) | |||||
| AiModelManageMap := queryUserModel(start_unix, end_unix) | |||||
| DataDate := currentTimeNow.Format("2006-01-02") + " 00:01" | DataDate := currentTimeNow.Format("2006-01-02") + " 00:01" | ||||
| cond := "type != 1 and is_active=true" | cond := "type != 1 and is_active=true" | ||||
| @@ -395,6 +444,7 @@ func refreshUserStaticTable(wikiCountMap map[string]int, CommitCodeSizeMap map[s | |||||
| log.Info("query user error. return.") | log.Info("query user error. return.") | ||||
| return | return | ||||
| } | } | ||||
| ParaWeight := getParaWeight() | |||||
| var indexTotal int64 | var indexTotal int64 | ||||
| indexTotal = 0 | indexTotal = 0 | ||||
| insertCount := 0 | insertCount := 0 | ||||
| @@ -412,84 +462,22 @@ func refreshUserStaticTable(wikiCountMap map[string]int, CommitCodeSizeMap map[s | |||||
| dateRecordAll.Name = userRecord.Name | dateRecordAll.Name = userRecord.Name | ||||
| dateRecordAll.GiteaAgeMonth = subMonth(currentTimeNow, userRecord.CreatedUnix.AsTime()) | dateRecordAll.GiteaAgeMonth = subMonth(currentTimeNow, userRecord.CreatedUnix.AsTime()) | ||||
| dateRecordAll.DataDate = DataDate | dateRecordAll.DataDate = DataDate | ||||
| if _, ok := CodeMergeCountMap[dateRecordAll.ID]; !ok { | |||||
| dateRecordAll.CodeMergeCount = 0 | |||||
| } else { | |||||
| dateRecordAll.CodeMergeCount = CodeMergeCountMap[dateRecordAll.ID] | |||||
| } | |||||
| if _, ok := CommitCountMap[dateRecordAll.ID]; !ok { | |||||
| dateRecordAll.CommitCount = 0 | |||||
| } else { | |||||
| dateRecordAll.CommitCount = CommitCountMap[dateRecordAll.ID] | |||||
| } | |||||
| if _, ok := IssueCountMap[dateRecordAll.ID]; !ok { | |||||
| dateRecordAll.IssueCount = 0 | |||||
| } else { | |||||
| dateRecordAll.IssueCount = IssueCountMap[dateRecordAll.ID] | |||||
| } | |||||
| if _, ok := CommentCountMap[dateRecordAll.ID]; !ok { | |||||
| dateRecordAll.CommentCount = 0 | |||||
| } else { | |||||
| dateRecordAll.CommentCount = CommentCountMap[dateRecordAll.ID] | |||||
| } | |||||
| if _, ok := FocusRepoCountMap[dateRecordAll.ID]; !ok { | |||||
| dateRecordAll.FocusRepoCount = 0 | |||||
| } else { | |||||
| dateRecordAll.FocusRepoCount = FocusRepoCountMap[dateRecordAll.ID] | |||||
| } | |||||
| if _, ok := StarRepoCountMap[dateRecordAll.ID]; !ok { | |||||
| dateRecordAll.StarRepoCount = 0 | |||||
| } else { | |||||
| dateRecordAll.StarRepoCount = StarRepoCountMap[dateRecordAll.ID] | |||||
| } | |||||
| if _, ok := WatchedCountMap[dateRecordAll.ID]; !ok { | |||||
| dateRecordAll.WatchedCount = 0 | |||||
| } else { | |||||
| dateRecordAll.WatchedCount = WatchedCountMap[dateRecordAll.ID] | |||||
| } | |||||
| if _, ok := CommitCodeSizeMap[dateRecordAll.Email]; !ok { | |||||
| dateRecordAll.CommitCodeSize = 0 | |||||
| } else { | |||||
| dateRecordAll.CommitCodeSize = int(CommitCodeSizeMap[dateRecordAll.Email].CommitLines) | |||||
| } | |||||
| if _, ok := CommitDatasetSizeMap[dateRecordAll.ID]; !ok { | |||||
| dateRecordAll.CommitDatasetSize = 0 | |||||
| } else { | |||||
| dateRecordAll.CommitDatasetSize = CommitDatasetSizeMap[dateRecordAll.ID] | |||||
| } | |||||
| if _, ok := SolveIssueCountMap[dateRecordAll.ID]; !ok { | |||||
| dateRecordAll.SolveIssueCount = 0 | |||||
| } else { | |||||
| dateRecordAll.SolveIssueCount = SolveIssueCountMap[dateRecordAll.ID] | |||||
| } | |||||
| if _, ok := wikiCountMap[dateRecordAll.Name]; !ok { | |||||
| dateRecordAll.EncyclopediasCount = 0 | |||||
| } else { | |||||
| dateRecordAll.EncyclopediasCount = wikiCountMap[dateRecordAll.Name] | |||||
| } | |||||
| if _, ok := CreateRepoCountMap[dateRecordAll.ID]; !ok { | |||||
| dateRecordAll.CreateRepoCount = 0 | |||||
| } else { | |||||
| dateRecordAll.CreateRepoCount = CreateRepoCountMap[dateRecordAll.ID] | |||||
| } | |||||
| if _, ok := LoginCountMap[dateRecordAll.ID]; !ok { | |||||
| dateRecordAll.LoginCount = 0 | |||||
| } else { | |||||
| dateRecordAll.LoginCount = LoginCountMap[dateRecordAll.ID] | |||||
| } | |||||
| dateRecordAll.UserLocation = userRecord.Location | |||||
| dateRecordAll.CodeMergeCount = getMapValue(dateRecordAll.ID, CodeMergeCountMap) | |||||
| dateRecordAll.CommitCount = getMapValue(dateRecordAll.ID, CommitCountMap) | |||||
| dateRecordAll.IssueCount = getMapValue(dateRecordAll.ID, IssueCountMap) | |||||
| dateRecordAll.CommentCount = getMapValue(dateRecordAll.ID, CommentCountMap) | |||||
| dateRecordAll.FocusRepoCount = getMapValue(dateRecordAll.ID, FocusRepoCountMap) | |||||
| dateRecordAll.StarRepoCount = getMapValue(dateRecordAll.ID, StarRepoCountMap) | |||||
| dateRecordAll.WatchedCount = getMapValue(dateRecordAll.ID, WatchedCountMap) | |||||
| dateRecordAll.CommitCodeSize = getMapValue(dateRecordAll.ID, CommitCodeSizeMap) | |||||
| dateRecordAll.CommitDatasetSize = getMapValue(dateRecordAll.ID, CommitDatasetSizeMap) | |||||
| dateRecordAll.CommitDatasetNum = getMapValue(dateRecordAll.ID, CommitDatasetNumMap) | |||||
| dateRecordAll.SolveIssueCount = getMapValue(dateRecordAll.ID, SolveIssueCountMap) | |||||
| dateRecordAll.EncyclopediasCount = getMapKeyStringValue(dateRecordAll.Name, wikiCountMap) | |||||
| dateRecordAll.CreateRepoCount = getMapValue(dateRecordAll.ID, CreateRepoCountMap) | |||||
| dateRecordAll.LoginCount = getMapValue(dateRecordAll.ID, LoginCountMap) | |||||
| if _, ok := OpenIIndexMap[dateRecordAll.ID]; !ok { | if _, ok := OpenIIndexMap[dateRecordAll.ID]; !ok { | ||||
| dateRecordAll.OpenIIndex = 0 | dateRecordAll.OpenIIndex = 0 | ||||
| @@ -497,7 +485,15 @@ func refreshUserStaticTable(wikiCountMap map[string]int, CommitCodeSizeMap map[s | |||||
| dateRecordAll.OpenIIndex = OpenIIndexMap[dateRecordAll.ID] | dateRecordAll.OpenIIndex = OpenIIndexMap[dateRecordAll.ID] | ||||
| } | } | ||||
| dateRecordAll.CommitModelCount = 0 | |||||
| dateRecordAll.CloudBrainTaskNum = getMapValue(dateRecordAll.ID, CloudBrainTaskMap) | |||||
| dateRecordAll.GpuDebugJob = getMapKeyStringValue(fmt.Sprint(dateRecordAll.ID)+"_GpuDebugJob", CloudBrainTaskItemMap) | |||||
| dateRecordAll.NpuDebugJob = getMapKeyStringValue(fmt.Sprint(dateRecordAll.ID)+"_NpuDebugJob", CloudBrainTaskItemMap) | |||||
| dateRecordAll.GpuTrainJob = getMapKeyStringValue(fmt.Sprint(dateRecordAll.ID)+"_GpuTrainJob", CloudBrainTaskItemMap) | |||||
| dateRecordAll.NpuTrainJob = getMapKeyStringValue(fmt.Sprint(dateRecordAll.ID)+"_NpuTrainJob", CloudBrainTaskItemMap) | |||||
| dateRecordAll.NpuInferenceJob = getMapKeyStringValue(fmt.Sprint(dateRecordAll.ID)+"_NpuInferenceJob", CloudBrainTaskItemMap) | |||||
| dateRecordAll.GpuBenchMarkJob = getMapKeyStringValue(fmt.Sprint(dateRecordAll.ID)+"_GpuBenchMarkJob", CloudBrainTaskItemMap) | |||||
| dateRecordAll.CommitModelCount = getMapValue(dateRecordAll.ID, AiModelManageMap) | |||||
| dateRecordAll.UserIndex = getUserIndexFromAnalysisAll(dateRecordAll, ParaWeight) | |||||
| dateRecordBatch = append(dateRecordBatch, dateRecordAll) | dateRecordBatch = append(dateRecordBatch, dateRecordAll) | ||||
| if len(dateRecordBatch) >= BATCH_INSERT_SIZE { | if len(dateRecordBatch) >= BATCH_INSERT_SIZE { | ||||
| @@ -508,6 +504,11 @@ func refreshUserStaticTable(wikiCountMap map[string]int, CommitCodeSizeMap map[s | |||||
| } | } | ||||
| dateRecordBatch = make([]UserBusinessAnalysisAll, 0) | dateRecordBatch = make([]UserBusinessAnalysisAll, 0) | ||||
| } | } | ||||
| if tableName == "user_business_analysis_all" { | |||||
| if dateRecordAll.UserIndex > 0 || dateRecordAll.LoginCount > 0 { | |||||
| userMetrics["TotalHasActivityUser"] = getMapKeyStringValue("TotalHasActivityUser", userMetrics) + 1 | |||||
| } | |||||
| } | |||||
| } | } | ||||
| indexTotal += PAGE_SIZE | indexTotal += PAGE_SIZE | ||||
| if indexTotal >= count { | if indexTotal >= count { | ||||
| @@ -529,7 +530,7 @@ func insertTable(dateRecords []UserBusinessAnalysisAll, tableName string, static | |||||
| insertBatchSql := "INSERT INTO public." + tableName + | insertBatchSql := "INSERT INTO public." + tableName + | ||||
| "(id, count_date, code_merge_count, commit_count, issue_count, comment_count, focus_repo_count, star_repo_count, watched_count, gitea_age_month, commit_code_size, commit_dataset_size, " + | "(id, count_date, code_merge_count, commit_count, issue_count, comment_count, focus_repo_count, star_repo_count, watched_count, gitea_age_month, commit_code_size, commit_dataset_size, " + | ||||
| "commit_model_count, solve_issue_count, encyclopedias_count, regist_date, create_repo_count, login_count, open_i_index, email, name, data_date) " + | |||||
| "commit_model_count, solve_issue_count, encyclopedias_count, regist_date, create_repo_count, login_count, open_i_index, email, name, data_date,cloud_brain_task_num,gpu_debug_job,npu_debug_job,gpu_train_job,npu_train_job,npu_inference_job,gpu_bench_mark_job,cloud_brain_run_time,commit_dataset_num,user_index,user_location) " + | |||||
| "VALUES" | "VALUES" | ||||
| for i, record := range dateRecords { | for i, record := range dateRecords { | ||||
| @@ -537,7 +538,7 @@ func insertTable(dateRecords []UserBusinessAnalysisAll, tableName string, static | |||||
| ", " + fmt.Sprint(record.IssueCount) + ", " + fmt.Sprint(record.CommentCount) + ", " + fmt.Sprint(record.FocusRepoCount) + ", " + fmt.Sprint(record.StarRepoCount) + | ", " + fmt.Sprint(record.IssueCount) + ", " + fmt.Sprint(record.CommentCount) + ", " + fmt.Sprint(record.FocusRepoCount) + ", " + fmt.Sprint(record.StarRepoCount) + | ||||
| ", " + fmt.Sprint(record.WatchedCount) + ", " + fmt.Sprint(record.GiteaAgeMonth) + ", " + fmt.Sprint(record.CommitCodeSize) + ", " + fmt.Sprint(record.CommitDatasetSize) + | ", " + fmt.Sprint(record.WatchedCount) + ", " + fmt.Sprint(record.GiteaAgeMonth) + ", " + fmt.Sprint(record.CommitCodeSize) + ", " + fmt.Sprint(record.CommitDatasetSize) + | ||||
| ", " + fmt.Sprint(record.CommitModelCount) + ", " + fmt.Sprint(record.SolveIssueCount) + ", " + fmt.Sprint(record.EncyclopediasCount) + ", " + fmt.Sprint(record.RegistDate) + | ", " + fmt.Sprint(record.CommitModelCount) + ", " + fmt.Sprint(record.SolveIssueCount) + ", " + fmt.Sprint(record.EncyclopediasCount) + ", " + fmt.Sprint(record.RegistDate) + | ||||
| ", " + fmt.Sprint(record.CreateRepoCount) + ", " + fmt.Sprint(record.LoginCount) + ", " + fmt.Sprint(record.OpenIIndex) + ", '" + record.Email + "', '" + record.Name + "', '" + record.DataDate + "')" | |||||
| ", " + fmt.Sprint(record.CreateRepoCount) + ", " + fmt.Sprint(record.LoginCount) + ", " + fmt.Sprint(record.OpenIIndex) + ", '" + record.Email + "', '" + record.Name + "', '" + record.DataDate + "'," + fmt.Sprint(record.CloudBrainTaskNum) + "," + fmt.Sprint(record.GpuDebugJob) + "," + fmt.Sprint(record.NpuDebugJob) + "," + fmt.Sprint(record.GpuTrainJob) + "," + fmt.Sprint(record.NpuTrainJob) + "," + fmt.Sprint(record.NpuInferenceJob) + "," + fmt.Sprint(record.GpuBenchMarkJob) + "," + fmt.Sprint(record.CloudBrainRunTime) + "," + fmt.Sprint(record.CommitDatasetNum) + "," + fmt.Sprint(record.UserIndex) + ",'" + record.UserLocation + "')" | |||||
| if i < (len(dateRecords) - 1) { | if i < (len(dateRecords) - 1) { | ||||
| insertBatchSql += "," | insertBatchSql += "," | ||||
| } | } | ||||
| @@ -546,36 +547,36 @@ func insertTable(dateRecords []UserBusinessAnalysisAll, tableName string, static | |||||
| statictisSess.Exec(insertBatchSql) | statictisSess.Exec(insertBatchSql) | ||||
| } | } | ||||
| func RefreshUserStaticAllTabel(wikiCountMap map[string]int, CommitCodeSizeMap map[string]*git.UserKPIStats) { | |||||
| func RefreshUserStaticAllTabel(wikiCountMap map[string]int, userMetrics map[string]int) { | |||||
| currentTimeNow := time.Now() | currentTimeNow := time.Now() | ||||
| pageStartTime := time.Date(2021, 11, 5, 0, 0, 0, 0, currentTimeNow.Location()) | pageStartTime := time.Date(2021, 11, 5, 0, 0, 0, 0, currentTimeNow.Location()) | ||||
| pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 23, 59, 59, 0, currentTimeNow.Location()) | pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 23, 59, 59, 0, currentTimeNow.Location()) | ||||
| refreshUserStaticTable(wikiCountMap, CommitCodeSizeMap, "user_business_analysis_all", pageStartTime, pageEndTime) | |||||
| refreshUserStaticTable(wikiCountMap, "user_business_analysis_all", pageStartTime, pageEndTime, userMetrics) | |||||
| log.Info("refresh all data finished.") | log.Info("refresh all data finished.") | ||||
| pageStartTime = time.Date(currentTimeNow.Year(), 1, 1, 0, 0, 0, 0, currentTimeNow.Location()) | pageStartTime = time.Date(currentTimeNow.Year(), 1, 1, 0, 0, 0, 0, currentTimeNow.Location()) | ||||
| refreshUserStaticTable(wikiCountMap, CommitCodeSizeMap, "user_business_analysis_current_year", pageStartTime, pageEndTime) | |||||
| refreshUserStaticTable(wikiCountMap, "user_business_analysis_current_year", pageStartTime, pageEndTime, userMetrics) | |||||
| thisMonth := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), 1, 0, 0, 0, 0, currentTimeNow.Location()) | thisMonth := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), 1, 0, 0, 0, 0, currentTimeNow.Location()) | ||||
| refreshUserStaticTable(wikiCountMap, CommitCodeSizeMap, "user_business_analysis_current_month", thisMonth, pageEndTime) | |||||
| refreshUserStaticTable(wikiCountMap, "user_business_analysis_current_month", thisMonth, pageEndTime, userMetrics) | |||||
| offset := int(time.Monday - currentTimeNow.Weekday()) | offset := int(time.Monday - currentTimeNow.Weekday()) | ||||
| if offset > 0 { | if offset > 0 { | ||||
| offset = -6 | offset = -6 | ||||
| } | } | ||||
| pageStartTime = time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, offset) | pageStartTime = time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, offset) | ||||
| refreshUserStaticTable(wikiCountMap, CommitCodeSizeMap, "user_business_analysis_current_week", pageStartTime, pageEndTime) | |||||
| refreshUserStaticTable(wikiCountMap, "user_business_analysis_current_week", pageStartTime, pageEndTime, userMetrics) | |||||
| pageStartTime = time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, -30) | pageStartTime = time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, -30) | ||||
| refreshUserStaticTable(wikiCountMap, CommitCodeSizeMap, "user_business_analysis_last30_day", pageStartTime, pageEndTime) | |||||
| refreshUserStaticTable(wikiCountMap, "user_business_analysis_last30_day", pageStartTime, pageEndTime, userMetrics) | |||||
| pageStartTime = time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, -1) | pageStartTime = time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, -1) | ||||
| pageEndTime = time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 23, 59, 59, 0, currentTimeNow.Location()).AddDate(0, 0, -1) | pageEndTime = time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 23, 59, 59, 0, currentTimeNow.Location()).AddDate(0, 0, -1) | ||||
| refreshUserStaticTable(wikiCountMap, CommitCodeSizeMap, "user_business_analysis_yesterday", pageStartTime, pageEndTime) | |||||
| refreshUserStaticTable(wikiCountMap, "user_business_analysis_yesterday", pageStartTime, pageEndTime, userMetrics) | |||||
| pageStartTime = thisMonth.AddDate(0, -1, 0) | pageStartTime = thisMonth.AddDate(0, -1, 0) | ||||
| pageEndTime = time.Date(currentTimeNow.Year(), currentTimeNow.Month(), 1, 23, 59, 59, 0, currentTimeNow.Location()).AddDate(0, 0, -1) | pageEndTime = time.Date(currentTimeNow.Year(), currentTimeNow.Month(), 1, 23, 59, 59, 0, currentTimeNow.Location()).AddDate(0, 0, -1) | ||||
| refreshUserStaticTable(wikiCountMap, CommitCodeSizeMap, "user_business_analysis_last_month", pageStartTime, pageEndTime) | |||||
| refreshUserStaticTable(wikiCountMap, "user_business_analysis_last_month", pageStartTime, pageEndTime, userMetrics) | |||||
| } | } | ||||
| @@ -613,12 +614,13 @@ func CounDataByDateAndReCount(wikiCountMap map[string]int, startTime time.Time, | |||||
| } else { | } else { | ||||
| log.Info("query commit code size, len=" + fmt.Sprint(len(CommitCodeSizeMap))) | log.Info("query commit code size, len=" + fmt.Sprint(len(CommitCodeSizeMap))) | ||||
| } | } | ||||
| CommitDatasetSizeMap := queryDatasetSize(start_unix, end_unix) | |||||
| CommitDatasetSizeMap, CommitDatasetNumMap := queryDatasetSize(start_unix, end_unix) | |||||
| SolveIssueCountMap := querySolveIssue(start_unix, end_unix) | SolveIssueCountMap := querySolveIssue(start_unix, end_unix) | ||||
| CreateRepoCountMap := queryUserCreateRepo(start_unix, end_unix) | CreateRepoCountMap := queryUserCreateRepo(start_unix, end_unix) | ||||
| LoginCountMap := queryLoginCount(start_unix, end_unix) | LoginCountMap := queryLoginCount(start_unix, end_unix) | ||||
| OpenIIndexMap := queryUserRepoOpenIIndex(start_unix, end_unix) | OpenIIndexMap := queryUserRepoOpenIIndex(start_unix, end_unix) | ||||
| CloudBrainTaskMap, CloudBrainTaskItemMap := queryCloudBrainTask(start_unix, end_unix) | |||||
| AiModelManageMap := queryUserModel(start_unix, end_unix) | |||||
| statictisSess := xStatistic.NewSession() | statictisSess := xStatistic.NewSession() | ||||
| defer statictisSess.Close() | defer statictisSess.Close() | ||||
| @@ -628,6 +630,9 @@ func CounDataByDateAndReCount(wikiCountMap map[string]int, startTime time.Time, | |||||
| log.Info("query user error. return.") | log.Info("query user error. return.") | ||||
| return err | return err | ||||
| } | } | ||||
| ParaWeight := getParaWeight() | |||||
| userMetrics := make(map[string]int) | |||||
| var indexTotal int64 | var indexTotal int64 | ||||
| indexTotal = 0 | indexTotal = 0 | ||||
| for { | for { | ||||
| @@ -648,47 +653,14 @@ func CounDataByDateAndReCount(wikiCountMap map[string]int, startTime time.Time, | |||||
| dateRecord.Name = userRecord.Name | dateRecord.Name = userRecord.Name | ||||
| dateRecord.GiteaAgeMonth = subMonth(currentTimeNow, userRecord.CreatedUnix.AsTime()) | dateRecord.GiteaAgeMonth = subMonth(currentTimeNow, userRecord.CreatedUnix.AsTime()) | ||||
| dateRecord.DataDate = DataDate | dateRecord.DataDate = DataDate | ||||
| if _, ok := CodeMergeCountMap[dateRecord.ID]; !ok { | |||||
| dateRecord.CodeMergeCount = 0 | |||||
| } else { | |||||
| dateRecord.CodeMergeCount = CodeMergeCountMap[dateRecord.ID] | |||||
| } | |||||
| if _, ok := CommitCountMap[dateRecord.ID]; !ok { | |||||
| dateRecord.CommitCount = 0 | |||||
| } else { | |||||
| dateRecord.CommitCount = CommitCountMap[dateRecord.ID] | |||||
| } | |||||
| if _, ok := IssueCountMap[dateRecord.ID]; !ok { | |||||
| dateRecord.IssueCount = 0 | |||||
| } else { | |||||
| dateRecord.IssueCount = IssueCountMap[dateRecord.ID] | |||||
| } | |||||
| if _, ok := CommentCountMap[dateRecord.ID]; !ok { | |||||
| dateRecord.CommentCount = 0 | |||||
| } else { | |||||
| dateRecord.CommentCount = CommentCountMap[dateRecord.ID] | |||||
| } | |||||
| if _, ok := FocusRepoCountMap[dateRecord.ID]; !ok { | |||||
| dateRecord.FocusRepoCount = 0 | |||||
| } else { | |||||
| dateRecord.FocusRepoCount = FocusRepoCountMap[dateRecord.ID] | |||||
| } | |||||
| if _, ok := StarRepoCountMap[dateRecord.ID]; !ok { | |||||
| dateRecord.StarRepoCount = 0 | |||||
| } else { | |||||
| dateRecord.StarRepoCount = StarRepoCountMap[dateRecord.ID] | |||||
| } | |||||
| if _, ok := WatchedCountMap[dateRecord.ID]; !ok { | |||||
| dateRecord.WatchedCount = 0 | |||||
| } else { | |||||
| dateRecord.WatchedCount = WatchedCountMap[dateRecord.ID] | |||||
| } | |||||
| dateRecord.CodeMergeCount = getMapValue(dateRecord.ID, CodeMergeCountMap) | |||||
| dateRecord.CommitCount = getMapValue(dateRecord.ID, CommitCountMap) | |||||
| dateRecord.IssueCount = getMapValue(dateRecord.ID, IssueCountMap) | |||||
| dateRecord.CommentCount = getMapValue(dateRecord.ID, CommentCountMap) | |||||
| dateRecord.FocusRepoCount = getMapValue(dateRecord.ID, FocusRepoCountMap) | |||||
| dateRecord.StarRepoCount = getMapValue(dateRecord.ID, StarRepoCountMap) | |||||
| dateRecord.WatchedCount = getMapValue(dateRecord.ID, WatchedCountMap) | |||||
| if _, ok := CommitCodeSizeMap[dateRecord.Email]; !ok { | if _, ok := CommitCodeSizeMap[dateRecord.Email]; !ok { | ||||
| dateRecord.CommitCodeSize = 0 | dateRecord.CommitCodeSize = 0 | ||||
| @@ -696,35 +668,15 @@ func CounDataByDateAndReCount(wikiCountMap map[string]int, startTime time.Time, | |||||
| dateRecord.CommitCodeSize = int(CommitCodeSizeMap[dateRecord.Email].CommitLines) | dateRecord.CommitCodeSize = int(CommitCodeSizeMap[dateRecord.Email].CommitLines) | ||||
| } | } | ||||
| if _, ok := CommitDatasetSizeMap[dateRecord.ID]; !ok { | |||||
| dateRecord.CommitDatasetSize = 0 | |||||
| } else { | |||||
| dateRecord.CommitDatasetSize = CommitDatasetSizeMap[dateRecord.ID] | |||||
| } | |||||
| dateRecord.CommitDatasetSize = getMapValue(dateRecord.ID, CommitDatasetSizeMap) | |||||
| dateRecord.CommitDatasetNum = getMapValue(dateRecord.ID, CommitDatasetNumMap) | |||||
| dateRecord.SolveIssueCount = getMapValue(dateRecord.ID, SolveIssueCountMap) | |||||
| if _, ok := SolveIssueCountMap[dateRecord.ID]; !ok { | |||||
| dateRecord.SolveIssueCount = 0 | |||||
| } else { | |||||
| dateRecord.SolveIssueCount = SolveIssueCountMap[dateRecord.ID] | |||||
| } | |||||
| dateRecord.EncyclopediasCount = getMapKeyStringValue(dateRecord.Name, wikiCountMap) | |||||
| if _, ok := wikiCountMap[dateRecord.Name]; !ok { | |||||
| dateRecord.EncyclopediasCount = 0 | |||||
| } else { | |||||
| dateRecord.EncyclopediasCount = wikiCountMap[dateRecord.Name] | |||||
| } | |||||
| dateRecord.CreateRepoCount = getMapValue(dateRecord.ID, CreateRepoCountMap) | |||||
| if _, ok := CreateRepoCountMap[dateRecord.ID]; !ok { | |||||
| dateRecord.CreateRepoCount = 0 | |||||
| } else { | |||||
| dateRecord.CreateRepoCount = CreateRepoCountMap[dateRecord.ID] | |||||
| } | |||||
| if _, ok := LoginCountMap[dateRecord.ID]; !ok { | |||||
| dateRecord.LoginCount = 0 | |||||
| } else { | |||||
| dateRecord.LoginCount = LoginCountMap[dateRecord.ID] | |||||
| } | |||||
| dateRecord.LoginCount = getMapValue(dateRecord.ID, LoginCountMap) | |||||
| if _, ok := OpenIIndexMap[dateRecord.ID]; !ok { | if _, ok := OpenIIndexMap[dateRecord.ID]; !ok { | ||||
| dateRecord.OpenIIndex = 0 | dateRecord.OpenIIndex = 0 | ||||
| @@ -732,8 +684,17 @@ func CounDataByDateAndReCount(wikiCountMap map[string]int, startTime time.Time, | |||||
| dateRecord.OpenIIndex = OpenIIndexMap[dateRecord.ID] | dateRecord.OpenIIndex = OpenIIndexMap[dateRecord.ID] | ||||
| } | } | ||||
| dateRecord.CommitModelCount = 0 | |||||
| dateRecord.CloudBrainTaskNum = getMapValue(dateRecord.ID, CloudBrainTaskMap) | |||||
| dateRecord.GpuDebugJob = getMapKeyStringValue(fmt.Sprint(dateRecord.ID)+"_GpuDebugJob", CloudBrainTaskItemMap) | |||||
| dateRecord.NpuDebugJob = getMapKeyStringValue(fmt.Sprint(dateRecord.ID)+"_NpuDebugJob", CloudBrainTaskItemMap) | |||||
| dateRecord.GpuTrainJob = getMapKeyStringValue(fmt.Sprint(dateRecord.ID)+"_GpuTrainJob", CloudBrainTaskItemMap) | |||||
| dateRecord.NpuTrainJob = getMapKeyStringValue(fmt.Sprint(dateRecord.ID)+"_NpuTrainJob", CloudBrainTaskItemMap) | |||||
| dateRecord.NpuInferenceJob = getMapKeyStringValue(fmt.Sprint(dateRecord.ID)+"_NpuInferenceJob", CloudBrainTaskItemMap) | |||||
| dateRecord.GpuBenchMarkJob = getMapKeyStringValue(fmt.Sprint(dateRecord.ID)+"_GpuBenchMarkJob", CloudBrainTaskItemMap) | |||||
| dateRecord.CloudBrainRunTime = getMapKeyStringValue(fmt.Sprint(dateRecord.ID)+"_CloudBrainRunTime", CloudBrainTaskItemMap) | |||||
| dateRecord.CommitModelCount = getMapValue(dateRecord.ID, AiModelManageMap) | |||||
| dateRecord.UserIndex = getUserIndex(dateRecord, ParaWeight) | |||||
| setUserMetrics(userMetrics, userRecord, start_unix, end_unix, dateRecord) | |||||
| _, err = statictisSess.Insert(&dateRecord) | _, err = statictisSess.Insert(&dateRecord) | ||||
| if err != nil { | if err != nil { | ||||
| log.Info("insert daterecord failed." + err.Error()) | log.Info("insert daterecord failed." + err.Error()) | ||||
| @@ -747,11 +708,142 @@ func CounDataByDateAndReCount(wikiCountMap map[string]int, startTime time.Time, | |||||
| } | } | ||||
| } | } | ||||
| RefreshUserStaticAllTabel(wikiCountMap, CommitCodeSizeMap) | |||||
| RefreshUserStaticAllTabel(wikiCountMap, userMetrics) | |||||
| //insert userMetrics table | |||||
| var useMetrics UserMetrics | |||||
| useMetrics.CountDate = CountDate.Unix() | |||||
| statictisSess.Delete(&useMetrics) | |||||
| useMetrics.ActivateRegistUser = getMapKeyStringValue("ActivateRegistUser", userMetrics) | |||||
| useMetrics.HasActivityUser = getMapKeyStringValue("HasActivityUser", userMetrics) | |||||
| useMetrics.NotActivateRegistUser = getMapKeyStringValue("NotActivateRegistUser", userMetrics) | |||||
| useMetrics.TotalActivateRegistUser = getMapKeyStringValue("TotalActivateRegistUser", userMetrics) | |||||
| useMetrics.TotalHasActivityUser = getMapKeyStringValue("TotalHasActivityUser", userMetrics) | |||||
| statictisSess.Insert(&useMetrics) | |||||
| return nil | return nil | ||||
| } | } | ||||
| func setUserMetrics(userMetrics map[string]int, user *User, start_time int64, end_time int64, dateRecord UserBusinessAnalysis) { | |||||
| //ActivateRegistUser int `xorm:"NOT NULL DEFAULT 0"` | |||||
| //NotActivateRegistUser int `xorm:"NOT NULL DEFAULT 0"` | |||||
| //HasActivityUser int `xorm:"NOT NULL DEFAULT 0"` | |||||
| //TotalActivateRegistUser int `xorm:"NOT NULL DEFAULT 0"` | |||||
| //TotalHasActivityUser | |||||
| regist_time := user.CreatedUnix.AsTime().Unix() | |||||
| if regist_time >= start_time && regist_time <= end_time { | |||||
| if user.IsActive { | |||||
| userMetrics["ActivateRegistUser"] = getMapKeyStringValue("ActivateRegistUser", userMetrics) + 1 | |||||
| } else { | |||||
| userMetrics["NotActivateRegistUser"] = getMapKeyStringValue("NotActivateRegistUser", userMetrics) + 1 | |||||
| } | |||||
| } | |||||
| if user.IsActive { | |||||
| userMetrics["TotalActivateRegistUser"] = getMapKeyStringValue("TotalActivateRegistUser", userMetrics) + 1 | |||||
| } | |||||
| if dateRecord.UserIndex > 0 || dateRecord.LoginCount > 0 { | |||||
| userMetrics["HasActivityUser"] = getMapKeyStringValue("HasActivityUser", userMetrics) + 1 | |||||
| } | |||||
| } | |||||
| func getParaWeight() map[string]float64 { | |||||
| result := make(map[string]float64) | |||||
| statictisSess := xStatistic.NewSession() | |||||
| defer statictisSess.Close() | |||||
| statictisSess.Select("*").Table(new(UserAnalysisPara)) | |||||
| paraList := make([]*UserAnalysisPara, 0) | |||||
| statictisSess.Find(¶List) | |||||
| for _, paraRecord := range paraList { | |||||
| result[paraRecord.Key] = paraRecord.Value | |||||
| } | |||||
| return result | |||||
| } | |||||
| func getUserIndexFromAnalysisAll(dateRecord UserBusinessAnalysisAll, ParaWeight map[string]float64) float64 { | |||||
| var result float64 | |||||
| // PR数 0.20 | |||||
| // commit数 0.20 | |||||
| // 提出任务数 0.20 | |||||
| // 评论数 0.20 | |||||
| // 关注项目数 0.10 | |||||
| // 点赞项目数 0.10 | |||||
| // 登录次数 0.10 | |||||
| result = float64(dateRecord.CodeMergeCount) * getParaWeightValue("CodeMergeCount", ParaWeight, 0.2) | |||||
| result += float64(dateRecord.CommitCount) * getParaWeightValue("CommitCount", ParaWeight, 0.2) | |||||
| log.Info("1 result=" + fmt.Sprint(result)) | |||||
| result += float64(dateRecord.IssueCount) * getParaWeightValue("IssueCount", ParaWeight, 0.2) | |||||
| result += float64(dateRecord.CommentCount) * getParaWeightValue("CommentCount", ParaWeight, 0.2) | |||||
| result += float64(dateRecord.FocusRepoCount) * getParaWeightValue("FocusRepoCount", ParaWeight, 0.1) | |||||
| result += float64(dateRecord.StarRepoCount) * getParaWeightValue("StarRepoCount", ParaWeight, 0.1) | |||||
| result += float64(dateRecord.LoginCount) * getParaWeightValue("LoginCount", ParaWeight, 0.1) | |||||
| result += float64(dateRecord.WatchedCount) * getParaWeightValue("WatchedCount", ParaWeight, 0.3) | |||||
| result += float64(dateRecord.CommitCodeSize) * getParaWeightValue("CommitCodeSize", ParaWeight, 0.1) | |||||
| result += float64(dateRecord.SolveIssueCount) * getParaWeightValue("SolveIssueCount", ParaWeight, 0.2) | |||||
| result += float64(dateRecord.EncyclopediasCount) * getParaWeightValue("EncyclopediasCount", ParaWeight, 0.1) | |||||
| result += float64(dateRecord.CreateRepoCount) * getParaWeightValue("CreateRepoCount", ParaWeight, 0.05) | |||||
| result += float64(dateRecord.CloudBrainTaskNum) * getParaWeightValue("CloudBrainTaskNum", ParaWeight, 0.3) | |||||
| result += float64(dateRecord.CommitModelCount) * getParaWeightValue("CommitModelCount", ParaWeight, 0.2) | |||||
| result += dateRecord.OpenIIndex * getParaWeightValue("OpenIIndex", ParaWeight, 0.1) | |||||
| return result | |||||
| } | |||||
| func getUserIndex(dateRecord UserBusinessAnalysis, ParaWeight map[string]float64) float64 { | |||||
| var result float64 | |||||
| // PR数 0.20 | |||||
| // commit数 0.20 | |||||
| // 提出任务数 0.20 | |||||
| // 评论数 0.20 | |||||
| // 关注项目数 0.10 | |||||
| // 点赞项目数 0.10 | |||||
| // 登录次数 0.10 | |||||
| result = float64(dateRecord.CodeMergeCount) * getParaWeightValue("CodeMergeCount", ParaWeight, 0.2) | |||||
| result += float64(dateRecord.CommitCount) * getParaWeightValue("CommitCount", ParaWeight, 0.2) | |||||
| log.Info("2 result=" + fmt.Sprint(result)) | |||||
| result += float64(dateRecord.IssueCount) * getParaWeightValue("IssueCount", ParaWeight, 0.2) | |||||
| result += float64(dateRecord.CommentCount) * getParaWeightValue("CommentCount", ParaWeight, 0.2) | |||||
| result += float64(dateRecord.FocusRepoCount) * getParaWeightValue("FocusRepoCount", ParaWeight, 0.1) | |||||
| result += float64(dateRecord.StarRepoCount) * getParaWeightValue("StarRepoCount", ParaWeight, 0.1) | |||||
| result += float64(dateRecord.LoginCount) * getParaWeightValue("LoginCount", ParaWeight, 0.1) | |||||
| result += float64(dateRecord.WatchedCount) * getParaWeightValue("WatchedCount", ParaWeight, 0.3) | |||||
| result += float64(dateRecord.CommitCodeSize) * getParaWeightValue("CommitCodeSize", ParaWeight, 0.1) | |||||
| result += float64(dateRecord.SolveIssueCount) * getParaWeightValue("SolveIssueCount", ParaWeight, 0.2) | |||||
| result += float64(dateRecord.EncyclopediasCount) * getParaWeightValue("EncyclopediasCount", ParaWeight, 0.1) | |||||
| result += float64(dateRecord.CreateRepoCount) * getParaWeightValue("CreateRepoCount", ParaWeight, 0.05) | |||||
| result += float64(dateRecord.CloudBrainTaskNum) * getParaWeightValue("CloudBrainTaskNum", ParaWeight, 0.3) | |||||
| result += float64(dateRecord.CommitModelCount) * getParaWeightValue("CommitModelCount", ParaWeight, 0.2) | |||||
| result += dateRecord.OpenIIndex * getParaWeightValue("OpenIIndex", ParaWeight, 0.1) | |||||
| return result | |||||
| } | |||||
| func getParaWeightValue(key string, valueMap map[string]float64, defaultValue float64) float64 { | |||||
| if _, ok := valueMap[key]; !ok { | |||||
| return defaultValue | |||||
| } else { | |||||
| return valueMap[key] | |||||
| } | |||||
| } | |||||
| func getMapKeyStringValue(key string, valueMap map[string]int) int { | |||||
| if _, ok := valueMap[key]; !ok { | |||||
| return 0 | |||||
| } else { | |||||
| return valueMap[key] | |||||
| } | |||||
| } | |||||
| func getMapValue(userId int64, valueMap map[int64]int) int { | |||||
| if _, ok := valueMap[userId]; !ok { | |||||
| return 0 | |||||
| } else { | |||||
| return valueMap[userId] | |||||
| } | |||||
| } | |||||
| func getInt(str string) int { | func getInt(str string) int { | ||||
| re, err := strconv.ParseInt(str, 10, 32) | re, err := strconv.ParseInt(str, 10, 32) | ||||
| if err != nil { | if err != nil { | ||||
| @@ -1052,16 +1144,17 @@ func queryFollow(start_unix int64, end_unix int64) map[int64]int { | |||||
| return resultMap | return resultMap | ||||
| } | } | ||||
| func queryDatasetSize(start_unix int64, end_unix int64) map[int64]int { | |||||
| func queryDatasetSize(start_unix int64, end_unix int64) (map[int64]int, map[int64]int) { | |||||
| sess := x.NewSession() | sess := x.NewSession() | ||||
| defer sess.Close() | defer sess.Close() | ||||
| resultMap := make(map[int64]int) | |||||
| resultSizeMap := make(map[int64]int) | |||||
| resultNumMap := make(map[int64]int) | |||||
| cond := " created_unix>=" + fmt.Sprint(start_unix) + " and created_unix<=" + fmt.Sprint(end_unix) | cond := " created_unix>=" + fmt.Sprint(start_unix) + " and created_unix<=" + fmt.Sprint(end_unix) | ||||
| count, err := sess.Where(cond).Count(new(Attachment)) | count, err := sess.Where(cond).Count(new(Attachment)) | ||||
| if err != nil { | if err != nil { | ||||
| log.Info("query attachment error. return.") | log.Info("query attachment error. return.") | ||||
| return resultMap | |||||
| return resultSizeMap, resultNumMap | |||||
| } | } | ||||
| var indexTotal int64 | var indexTotal int64 | ||||
| indexTotal = 0 | indexTotal = 0 | ||||
| @@ -1072,10 +1165,12 @@ func queryDatasetSize(start_unix int64, end_unix int64) map[int64]int { | |||||
| log.Info("query Attachment size=" + fmt.Sprint(len(attachmentList))) | log.Info("query Attachment size=" + fmt.Sprint(len(attachmentList))) | ||||
| for _, attachRecord := range attachmentList { | for _, attachRecord := range attachmentList { | ||||
| if _, ok := resultMap[attachRecord.UploaderID]; !ok { | |||||
| resultMap[attachRecord.UploaderID] = int(attachRecord.Size / (1024 * 1024)) //MB | |||||
| if _, ok := resultSizeMap[attachRecord.UploaderID]; !ok { | |||||
| resultSizeMap[attachRecord.UploaderID] = int(attachRecord.Size / (1024 * 1024)) //MB | |||||
| resultNumMap[attachRecord.UploaderID] = 1 | |||||
| } else { | } else { | ||||
| resultMap[attachRecord.UploaderID] += int(attachRecord.Size / (1024 * 1024)) //MB | |||||
| resultSizeMap[attachRecord.UploaderID] += int(attachRecord.Size / (1024 * 1024)) //MB | |||||
| resultNumMap[attachRecord.UploaderID] += 1 | |||||
| } | } | ||||
| } | } | ||||
| @@ -1085,7 +1180,7 @@ func queryDatasetSize(start_unix int64, end_unix int64) map[int64]int { | |||||
| } | } | ||||
| } | } | ||||
| return resultMap | |||||
| return resultSizeMap, resultNumMap | |||||
| } | } | ||||
| func queryUserCreateRepo(start_unix int64, end_unix int64) map[int64]int { | func queryUserCreateRepo(start_unix int64, end_unix int64) map[int64]int { | ||||
| @@ -1212,6 +1307,133 @@ func queryLoginCount(start_unix int64, end_unix int64) map[int64]int { | |||||
| return resultMap | return resultMap | ||||
| } | } | ||||
| func queryCommitCodeSize(start_unix int64, end_unix int64) map[int64]int { | |||||
| statictisSess := xStatistic.NewSession() | |||||
| defer statictisSess.Close() | |||||
| resultMap := make(map[int64]int) | |||||
| cond := "count_date>=" + fmt.Sprint(start_unix) + " and count_date<=" + fmt.Sprint(end_unix) | |||||
| count, err := statictisSess.Where(cond).Count(new(UserBusinessAnalysis)) | |||||
| if err != nil { | |||||
| log.Info("query commit code size error. return.") | |||||
| return resultMap | |||||
| } | |||||
| var indexTotal int64 | |||||
| indexTotal = 0 | |||||
| for { | |||||
| statictisSess.Select("id,commit_code_size").Table("user_business_analysis").Where(cond).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal)) | |||||
| userBusinessAnalysisList := make([]*UserBusinessAnalysis, 0) | |||||
| statictisSess.Find(&userBusinessAnalysisList) | |||||
| log.Info("query user login size=" + fmt.Sprint(len(userBusinessAnalysisList))) | |||||
| for _, analysisRecord := range userBusinessAnalysisList { | |||||
| if _, ok := resultMap[analysisRecord.ID]; !ok { | |||||
| resultMap[analysisRecord.ID] = analysisRecord.CommitCodeSize | |||||
| } else { | |||||
| resultMap[analysisRecord.ID] += analysisRecord.CommitCodeSize | |||||
| } | |||||
| } | |||||
| indexTotal += PAGE_SIZE | |||||
| if indexTotal >= count { | |||||
| break | |||||
| } | |||||
| } | |||||
| log.Info("user commit code size=" + fmt.Sprint(len(resultMap))) | |||||
| return resultMap | |||||
| } | |||||
| func queryUserModel(start_unix int64, end_unix int64) map[int64]int { | |||||
| sess := x.NewSession() | |||||
| defer sess.Close() | |||||
| resultMap := make(map[int64]int) | |||||
| cond := " created_unix>=" + fmt.Sprint(start_unix) + " and created_unix<=" + fmt.Sprint(end_unix) | |||||
| count, err := sess.Where(cond).Count(new(AiModelManage)) | |||||
| if err != nil { | |||||
| log.Info("query AiModelManage error. return.") | |||||
| return resultMap | |||||
| } | |||||
| var indexTotal int64 | |||||
| indexTotal = 0 | |||||
| for { | |||||
| sess.Select("id,user_id").Table("ai_model_manage").Where(cond).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal)) | |||||
| aiModelList := make([]*AiModelManage, 0) | |||||
| sess.Find(&aiModelList) | |||||
| log.Info("query AiModelManage size=" + fmt.Sprint(len(aiModelList))) | |||||
| for _, aiModelRecord := range aiModelList { | |||||
| if _, ok := resultMap[aiModelRecord.UserId]; !ok { | |||||
| resultMap[aiModelRecord.UserId] = 1 | |||||
| } else { | |||||
| resultMap[aiModelRecord.UserId] += 1 | |||||
| } | |||||
| } | |||||
| indexTotal += PAGE_SIZE | |||||
| if indexTotal >= count { | |||||
| break | |||||
| } | |||||
| } | |||||
| return resultMap | |||||
| } | |||||
| func queryCloudBrainTask(start_unix int64, end_unix int64) (map[int64]int, map[string]int) { | |||||
| sess := x.NewSession() | |||||
| defer sess.Close() | |||||
| resultMap := make(map[int64]int) | |||||
| resultItemMap := make(map[string]int) | |||||
| cond := " created_unix>=" + fmt.Sprint(start_unix) + " and created_unix<=" + fmt.Sprint(end_unix) | |||||
| count, err := sess.Where(cond).Count(new(Cloudbrain)) | |||||
| if err != nil { | |||||
| log.Info("query cloudbrain error. return.") | |||||
| return resultMap, resultItemMap | |||||
| } | |||||
| var indexTotal int64 | |||||
| indexTotal = 0 | |||||
| for { | |||||
| sess.Select("id,job_type,user_id,duration,train_job_duration,type").Table("cloudbrain").Where(cond).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal)) | |||||
| cloudTaskList := make([]*Cloudbrain, 0) | |||||
| sess.Find(&cloudTaskList) | |||||
| log.Info("query cloudbrain size=" + fmt.Sprint(len(cloudTaskList))) | |||||
| for _, cloudTaskRecord := range cloudTaskList { | |||||
| if _, ok := resultMap[cloudTaskRecord.UserID]; !ok { | |||||
| resultMap[cloudTaskRecord.UserID] = 1 | |||||
| } else { | |||||
| resultMap[cloudTaskRecord.UserID] += 1 | |||||
| } | |||||
| setMapKey("CloudBrainRunTime", cloudTaskRecord.UserID, int(cloudTaskRecord.Duration), resultItemMap) | |||||
| if cloudTaskRecord.Type == 1 { //npu | |||||
| if cloudTaskRecord.JobType == "TRAIN" { | |||||
| setMapKey("NpuTrainJob", cloudTaskRecord.UserID, 1, resultItemMap) | |||||
| } else if cloudTaskRecord.JobType == "INFERENCE" { | |||||
| setMapKey("NpuInferenceJob", cloudTaskRecord.UserID, 1, resultItemMap) | |||||
| } else { | |||||
| setMapKey("NpuDebugJob", cloudTaskRecord.UserID, 1, resultItemMap) | |||||
| } | |||||
| } else { //type=0 gpu | |||||
| if cloudTaskRecord.JobType == "TRAIN" { | |||||
| setMapKey("GpuTrainJob", cloudTaskRecord.UserID, 1, resultItemMap) | |||||
| } else if cloudTaskRecord.JobType == "BENCHMARK" { | |||||
| setMapKey("GpuBenchMarkJob", cloudTaskRecord.UserID, 1, resultItemMap) | |||||
| } else { | |||||
| setMapKey("GpuDebugJob", cloudTaskRecord.UserID, 1, resultItemMap) | |||||
| } | |||||
| } | |||||
| } | |||||
| indexTotal += PAGE_SIZE | |||||
| if indexTotal >= count { | |||||
| break | |||||
| } | |||||
| } | |||||
| return resultMap, resultItemMap | |||||
| } | |||||
| func setMapKey(key string, userId int64, value int, resultItemMap map[string]int) { | |||||
| newKey := fmt.Sprint(userId) + "_" + key | |||||
| if _, ok := resultItemMap[newKey]; !ok { | |||||
| resultItemMap[newKey] = value | |||||
| } else { | |||||
| resultItemMap[newKey] += value | |||||
| } | |||||
| } | |||||
| func subMonth(t1, t2 time.Time) (month int) { | func subMonth(t1, t2 time.Time) (month int) { | ||||
| y1 := t1.Year() | y1 := t1.Year() | ||||
| y2 := t2.Year() | y2 := t2.Year() | ||||
| @@ -44,6 +44,18 @@ type UserBusinessAnalysisCurrentYear struct { | |||||
| //user | //user | ||||
| Name string `xorm:"NOT NULL"` | Name string `xorm:"NOT NULL"` | ||||
| DataDate string `xorm:"NULL"` | DataDate string `xorm:"NULL"` | ||||
| CloudBrainTaskNum int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuDebugJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuDebugJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuTrainJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuTrainJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuInferenceJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuBenchMarkJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| CloudBrainRunTime int `xorm:"NOT NULL DEFAULT 0"` | |||||
| CommitDatasetNum int `xorm:"NOT NULL DEFAULT 0"` | |||||
| UserIndex float64 `xorm:"NOT NULL DEFAULT 0"` | |||||
| UserLocation string `xorm:"NULL"` | |||||
| } | } | ||||
| type UserBusinessAnalysisLast30Day struct { | type UserBusinessAnalysisLast30Day struct { | ||||
| @@ -88,6 +100,18 @@ type UserBusinessAnalysisLast30Day struct { | |||||
| //user | //user | ||||
| Name string `xorm:"NOT NULL"` | Name string `xorm:"NOT NULL"` | ||||
| DataDate string `xorm:"NULL"` | DataDate string `xorm:"NULL"` | ||||
| CloudBrainTaskNum int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuDebugJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuDebugJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuTrainJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuTrainJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuInferenceJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuBenchMarkJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| CloudBrainRunTime int `xorm:"NOT NULL DEFAULT 0"` | |||||
| CommitDatasetNum int `xorm:"NOT NULL DEFAULT 0"` | |||||
| UserIndex float64 `xorm:"NOT NULL DEFAULT 0"` | |||||
| UserLocation string `xorm:"NULL"` | |||||
| } | } | ||||
| type UserBusinessAnalysisLastMonth struct { | type UserBusinessAnalysisLastMonth struct { | ||||
| @@ -132,6 +156,18 @@ type UserBusinessAnalysisLastMonth struct { | |||||
| //user | //user | ||||
| Name string `xorm:"NOT NULL"` | Name string `xorm:"NOT NULL"` | ||||
| DataDate string `xorm:"NULL"` | DataDate string `xorm:"NULL"` | ||||
| CloudBrainTaskNum int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuDebugJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuDebugJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuTrainJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuTrainJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuInferenceJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuBenchMarkJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| CloudBrainRunTime int `xorm:"NOT NULL DEFAULT 0"` | |||||
| CommitDatasetNum int `xorm:"NOT NULL DEFAULT 0"` | |||||
| UserIndex float64 `xorm:"NOT NULL DEFAULT 0"` | |||||
| UserLocation string `xorm:"NULL"` | |||||
| } | } | ||||
| type UserBusinessAnalysisCurrentMonth struct { | type UserBusinessAnalysisCurrentMonth struct { | ||||
| @@ -176,6 +212,18 @@ type UserBusinessAnalysisCurrentMonth struct { | |||||
| //user | //user | ||||
| Name string `xorm:"NOT NULL"` | Name string `xorm:"NOT NULL"` | ||||
| DataDate string `xorm:"NULL"` | DataDate string `xorm:"NULL"` | ||||
| CloudBrainTaskNum int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuDebugJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuDebugJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuTrainJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuTrainJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuInferenceJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuBenchMarkJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| CloudBrainRunTime int `xorm:"NOT NULL DEFAULT 0"` | |||||
| CommitDatasetNum int `xorm:"NOT NULL DEFAULT 0"` | |||||
| UserIndex float64 `xorm:"NOT NULL DEFAULT 0"` | |||||
| UserLocation string `xorm:"NULL"` | |||||
| } | } | ||||
| type UserBusinessAnalysisCurrentWeek struct { | type UserBusinessAnalysisCurrentWeek struct { | ||||
| @@ -220,6 +268,18 @@ type UserBusinessAnalysisCurrentWeek struct { | |||||
| //user | //user | ||||
| Name string `xorm:"NOT NULL"` | Name string `xorm:"NOT NULL"` | ||||
| DataDate string `xorm:"NULL"` | DataDate string `xorm:"NULL"` | ||||
| CloudBrainTaskNum int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuDebugJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuDebugJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuTrainJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuTrainJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuInferenceJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuBenchMarkJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| CloudBrainRunTime int `xorm:"NOT NULL DEFAULT 0"` | |||||
| CommitDatasetNum int `xorm:"NOT NULL DEFAULT 0"` | |||||
| UserIndex float64 `xorm:"NOT NULL DEFAULT 0"` | |||||
| UserLocation string `xorm:"NULL"` | |||||
| } | } | ||||
| type UserBusinessAnalysisYesterday struct { | type UserBusinessAnalysisYesterday struct { | ||||
| @@ -264,4 +324,30 @@ type UserBusinessAnalysisYesterday struct { | |||||
| //user | //user | ||||
| Name string `xorm:"NOT NULL"` | Name string `xorm:"NOT NULL"` | ||||
| DataDate string `xorm:"NULL"` | DataDate string `xorm:"NULL"` | ||||
| CloudBrainTaskNum int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuDebugJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuDebugJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuTrainJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuTrainJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NpuInferenceJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| GpuBenchMarkJob int `xorm:"NOT NULL DEFAULT 0"` | |||||
| CloudBrainRunTime int `xorm:"NOT NULL DEFAULT 0"` | |||||
| CommitDatasetNum int `xorm:"NOT NULL DEFAULT 0"` | |||||
| UserIndex float64 `xorm:"NOT NULL DEFAULT 0"` | |||||
| UserLocation string `xorm:"NULL"` | |||||
| } | |||||
| type UserAnalysisPara struct { | |||||
| Key string `xorm:"NOT NULL"` | |||||
| Value float64 `xorm:"NOT NULL DEFAULT 0"` | |||||
| } | |||||
| type UserMetrics struct { | |||||
| CountDate int64 `xorm:"pk"` | |||||
| ActivateRegistUser int `xorm:"NOT NULL DEFAULT 0"` | |||||
| NotActivateRegistUser int `xorm:"NOT NULL DEFAULT 0"` | |||||
| HasActivityUser int `xorm:"NOT NULL DEFAULT 0"` | |||||
| TotalActivateRegistUser int `xorm:"NOT NULL DEFAULT 0"` | |||||
| TotalHasActivityUser int `xorm:"NOT NULL DEFAULT 0"` | |||||
| } | } | ||||
| @@ -21,7 +21,7 @@ const ( | |||||
| CodeMountPath = "/code" | CodeMountPath = "/code" | ||||
| DataSetMountPath = "/dataset" | DataSetMountPath = "/dataset" | ||||
| ModelMountPath = "/model" | ModelMountPath = "/model" | ||||
| LogFile = "log.txt" | |||||
| LogFile = "log.txt" | |||||
| BenchMarkMountPath = "/benchmark" | BenchMarkMountPath = "/benchmark" | ||||
| BenchMarkResourceID = 1 | BenchMarkResourceID = 1 | ||||
| Snn4imagenetMountPath = "/snn4imagenet" | Snn4imagenetMountPath = "/snn4imagenet" | ||||
| @@ -291,16 +291,16 @@ func GenerateTask(ctx *context.Context, displayJobName, jobName, image, command, | |||||
| IsLatestVersion: "1", | IsLatestVersion: "1", | ||||
| VersionCount: versionCount, | VersionCount: versionCount, | ||||
| BranchName: branchName, | BranchName: branchName, | ||||
| BootFile: bootFile, | |||||
| DatasetName: datasetName, | |||||
| Parameters: params, | |||||
| BootFile: bootFile, | |||||
| DatasetName: datasetName, | |||||
| Parameters: params, | |||||
| }) | }) | ||||
| if err != nil { | if err != nil { | ||||
| return err | return err | ||||
| } | } | ||||
| task, err := models.GetCloudbrainByName(jobName) | |||||
| task, err := models.GetCloudbrainByJobID(jobID) | |||||
| if err != nil { | if err != nil { | ||||
| log.Error("GetCloudbrainByName failed: %v", err.Error()) | log.Error("GetCloudbrainByName failed: %v", err.Error()) | ||||
| return err | return err | ||||
| @@ -440,8 +440,10 @@ func RestartTask(ctx *context.Context, task *models.Cloudbrain, newID *string) e | |||||
| return err | return err | ||||
| } | } | ||||
| idString := strconv.FormatInt(newTask.ID, 10) | |||||
| *newID = idString | |||||
| stringId := strconv.FormatInt(newTask.ID, 10) | |||||
| *newID = stringId | |||||
| notification.NotifyOtherTask(ctx.User, ctx.Repo.Repository, stringId, task.DisplayJobName, models.ActionCreateDebugGPUTask) | |||||
| return nil | return nil | ||||
| } | } | ||||
| @@ -493,6 +493,11 @@ static.encyclopediascount=Encyclopedias Count | |||||
| static.createrepocount=Create Repo Count | static.createrepocount=Create Repo Count | ||||
| static.openiindex=OpenI Index | static.openiindex=OpenI Index | ||||
| static.registdate=Regist Date | static.registdate=Regist Date | ||||
| static.CloudBrainTaskNum=CloudBrain Task Count | |||||
| static.CloudBrainRunTime=CloudBrain Run Time | |||||
| static.CommitDatasetNum=Commit Dataset Count | |||||
| static.CommitModelCount=Commit Model Count | |||||
| static.UserIndex=User Index | |||||
| static.countdate=Count Date | static.countdate=Count Date | ||||
| static.all=All | static.all=All | ||||
| static.public.user_business_analysis_current_month=Current_Month | static.public.user_business_analysis_current_month=Current_Month | ||||
| @@ -911,7 +916,9 @@ language_other = Other | |||||
| datasets = Datasets | datasets = Datasets | ||||
| datasets.desc = Enable Dataset | datasets.desc = Enable Dataset | ||||
| cloudbrain_helper=Use GPU/NPU resources to open notebooks, model training tasks, etc. | cloudbrain_helper=Use GPU/NPU resources to open notebooks, model training tasks, etc. | ||||
| cloudbrain.exitinfo=Exit Information | |||||
| cloudbrain.platform=Platform | |||||
| cloudbrain.endtime=End Time | |||||
| model_manager = Model | model_manager = Model | ||||
| model_noright=No right | model_noright=No right | ||||
| model_rename=Duplicate model name, please modify model name. | model_rename=Duplicate model name, please modify model name. | ||||
| @@ -496,6 +496,11 @@ static.encyclopediascount=百科页面贡献次数 | |||||
| static.createrepocount=创建项目数 | static.createrepocount=创建项目数 | ||||
| static.openiindex=OpenI指数 | static.openiindex=OpenI指数 | ||||
| static.registdate=用户注册时间 | static.registdate=用户注册时间 | ||||
| static.CloudBrainTaskNum=云脑任务数 | |||||
| static.CloudBrainRunTime=云脑运行时间(小时) | |||||
| static.CommitDatasetNum=上传(提交)数据集文件数 | |||||
| static.CommitModelCount=提交模型数 | |||||
| static.UserIndex=用户指数 | |||||
| static.countdate=系统统计时间 | static.countdate=系统统计时间 | ||||
| static.all=所有 | static.all=所有 | ||||
| static.public.user_business_analysis_current_month=本月 | static.public.user_business_analysis_current_month=本月 | ||||
| @@ -958,7 +963,9 @@ cloudbrain_jobname_err=只能以小写字母或数字开头且只包含小写字 | |||||
| cloudbrain_query_fail=查询云脑任务失败。 | cloudbrain_query_fail=查询云脑任务失败。 | ||||
| cloudbrain.mirror_tag = 镜像标签 | cloudbrain.mirror_tag = 镜像标签 | ||||
| cloudbrain.mirror_description = 镜像描述 | cloudbrain.mirror_description = 镜像描述 | ||||
| cloudbrain.exitinfo=退出信息 | |||||
| cloudbrain.platform=平台 | |||||
| cloudbrain.endtime=结束时间 | |||||
| record_begintime_get_err=无法获取统计开始时间。 | record_begintime_get_err=无法获取统计开始时间。 | ||||
| parameter_is_wrong=输入参数错误,请检查输入参数。 | parameter_is_wrong=输入参数错误,请检查输入参数。 | ||||
| total_count_get_error=查询总页数失败。 | total_count_get_error=查询总页数失败。 | ||||
| @@ -547,6 +547,8 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
| }) | }) | ||||
| }, operationReq) | }, operationReq) | ||||
| m.Get("/query_user_metrics", operationReq, repo_ext.QueryMetrics) | |||||
| m.Get("/query_user_rank_list", operationReq, repo_ext.QueryRankingList) | |||||
| m.Get("/query_user_static_page", operationReq, repo_ext.QueryUserStaticDataPage) | m.Get("/query_user_static_page", operationReq, repo_ext.QueryUserStaticDataPage) | ||||
| m.Get("/query_user_current_month", operationReq, repo_ext.QueryUserStaticCurrentMonth) | m.Get("/query_user_current_month", operationReq, repo_ext.QueryUserStaticCurrentMonth) | ||||
| m.Get("/query_user_current_week", operationReq, repo_ext.QueryUserStaticCurrentWeek) | m.Get("/query_user_current_week", operationReq, repo_ext.QueryUserStaticCurrentWeek) | ||||
| @@ -65,7 +65,7 @@ func GetCloudbrainTask(ctx *context.APIContext) { | |||||
| log.Error("GetJob failed:", err) | log.Error("GetJob failed:", err) | ||||
| return | return | ||||
| } | } | ||||
| result, err := models.ConvertToJobResultPayload(jobResult.Payload) | |||||
| result, _ := models.ConvertToJobResultPayload(jobResult.Payload) | |||||
| if err != nil { | if err != nil { | ||||
| ctx.NotFound(err) | ctx.NotFound(err) | ||||
| log.Error("ConvertToJobResultPayload failed:", err) | log.Error("ConvertToJobResultPayload failed:", err) | ||||
| @@ -2,11 +2,9 @@ package repo | |||||
| import ( | import ( | ||||
| "bufio" | "bufio" | ||||
| "code.gitea.io/gitea/modules/timeutil" | |||||
| "encoding/json" | "encoding/json" | ||||
| "errors" | "errors" | ||||
| "fmt" | "fmt" | ||||
| "github.com/unknwon/i18n" | |||||
| "io" | "io" | ||||
| "net/http" | "net/http" | ||||
| "os" | "os" | ||||
| @@ -16,6 +14,9 @@ import ( | |||||
| "strings" | "strings" | ||||
| "time" | "time" | ||||
| "code.gitea.io/gitea/modules/timeutil" | |||||
| "github.com/unknwon/i18n" | |||||
| "code.gitea.io/gitea/models" | "code.gitea.io/gitea/models" | ||||
| "code.gitea.io/gitea/modules/auth" | "code.gitea.io/gitea/modules/auth" | ||||
| "code.gitea.io/gitea/modules/base" | "code.gitea.io/gitea/modules/base" | ||||
| @@ -400,18 +401,22 @@ func cloudBrainShow(ctx *context.Context, tpName base.TplName, jobType models.Jo | |||||
| if jobType == models.JobTypeTrain { | if jobType == models.JobTypeTrain { | ||||
| task, err = models.GetCloudbrainByJobID(ctx.Params(":jobid")) | task, err = models.GetCloudbrainByJobID(ctx.Params(":jobid")) | ||||
| } else { | } else { | ||||
| task, err = models.GetCloudbrainByID(ctx.Params(":id")) | |||||
| task, err = models.GetCloudbrainByIDWithDeleted(ctx.Params(":id")) | |||||
| } | } | ||||
| if err != nil { | if err != nil { | ||||
| log.Info("error:" + err.Error()) | log.Info("error:" + err.Error()) | ||||
| ctx.Data["error"] = err.Error() | ctx.Data["error"] = err.Error() | ||||
| return | |||||
| } | } | ||||
| result, err := cloudbrain.GetJob(task.JobID) | result, err := cloudbrain.GetJob(task.JobID) | ||||
| if err != nil { | if err != nil { | ||||
| log.Info("error:" + err.Error()) | log.Info("error:" + err.Error()) | ||||
| ctx.Data["error"] = err.Error() | ctx.Data["error"] = err.Error() | ||||
| return | |||||
| } | } | ||||
| if result != nil { | if result != nil { | ||||
| jobRes, _ := models.ConvertToJobResultPayload(result.Payload) | jobRes, _ := models.ConvertToJobResultPayload(result.Payload) | ||||
| jobRes.Resource.Memory = strings.ReplaceAll(jobRes.Resource.Memory, "Mi", "MB") | jobRes.Resource.Memory = strings.ReplaceAll(jobRes.Resource.Memory, "Mi", "MB") | ||||
| @@ -426,6 +431,15 @@ func cloudBrainShow(ctx *context.Context, tpName base.TplName, jobType models.Jo | |||||
| ctx.Data["resource_type"] = resourceType.Value | ctx.Data["resource_type"] = resourceType.Value | ||||
| } | } | ||||
| } | } | ||||
| } else { | |||||
| if gpuInfos == nil { | |||||
| json.Unmarshal([]byte(setting.GpuTypes), &gpuInfos) | |||||
| } | |||||
| for _, resourceType := range gpuInfos.GpuInfo { | |||||
| if resourceType.Queue == jobRes.Config.GpuType { | |||||
| ctx.Data["resource_type"] = resourceType.Value | |||||
| } | |||||
| } | |||||
| } | } | ||||
| taskRoles := jobRes.TaskRoles | taskRoles := jobRes.TaskRoles | ||||
| if jobRes.JobStatus.State != string(models.JobFailed) { | if jobRes.JobStatus.State != string(models.JobFailed) { | ||||
| @@ -436,9 +450,15 @@ func cloudBrainShow(ctx *context.Context, tpName base.TplName, jobType models.Jo | |||||
| task.ContainerID = taskRes.TaskStatuses[0].ContainerID | task.ContainerID = taskRes.TaskStatuses[0].ContainerID | ||||
| task.ContainerIp = taskRes.TaskStatuses[0].ContainerIP | task.ContainerIp = taskRes.TaskStatuses[0].ContainerIP | ||||
| models.ParseAndSetDurationFromCloudBrainOne(jobRes, task) | models.ParseAndSetDurationFromCloudBrainOne(jobRes, task) | ||||
| err = models.UpdateJob(task) | |||||
| if err != nil { | |||||
| ctx.Data["error"] = err.Error() | |||||
| if task.DeletedAt.IsZero() { //normal record | |||||
| err = models.UpdateJob(task) | |||||
| if err != nil { | |||||
| ctx.Data["error"] = err.Error() | |||||
| return | |||||
| } | |||||
| } else { //deleted record | |||||
| } | } | ||||
| } else { | } else { | ||||
| task.Status = jobRes.JobStatus.State | task.Status = jobRes.JobStatus.State | ||||
| @@ -455,7 +475,9 @@ func cloudBrainShow(ctx *context.Context, tpName base.TplName, jobType models.Jo | |||||
| ctx.Data["result"] = jobRes | ctx.Data["result"] = jobRes | ||||
| } else { | } else { | ||||
| log.Info("error:" + err.Error()) | log.Info("error:" + err.Error()) | ||||
| return | |||||
| } | } | ||||
| user, err := models.GetUserByID(task.UserID) | user, err := models.GetUserByID(task.UserID) | ||||
| if err == nil { | if err == nil { | ||||
| task.User = user | task.User = user | ||||
| @@ -510,6 +532,12 @@ func cloudBrainShow(ctx *context.Context, tpName base.TplName, jobType models.Jo | |||||
| } | } | ||||
| } | } | ||||
| attachment, err := models.GetAttachmentByUUID(task.Uuid) | |||||
| if err == nil { | |||||
| ctx.Data["datasetname"] = attachment.Name | |||||
| } else { | |||||
| ctx.Data["datasetname"] = "" | |||||
| } | |||||
| ctx.Data["task"] = task | ctx.Data["task"] = task | ||||
| ctx.Data["jobName"] = task.JobName | ctx.Data["jobName"] = task.JobName | ||||
| @@ -518,6 +546,9 @@ func cloudBrainShow(ctx *context.Context, tpName base.TplName, jobType models.Jo | |||||
| version_list_task = append(version_list_task, task) | version_list_task = append(version_list_task, task) | ||||
| ctx.Data["version_list_task"] = version_list_task | ctx.Data["version_list_task"] = version_list_task | ||||
| ctx.Data["debugListType"] = debugListType | ctx.Data["debugListType"] = debugListType | ||||
| ctx.Data["code_path"] = cloudbrain.CodeMountPath | |||||
| ctx.Data["dataset_path"] = cloudbrain.DataSetMountPath | |||||
| ctx.Data["model_path"] = cloudbrain.ModelMountPath | |||||
| ctx.Data["canDownload"] = cloudbrain.CanDeleteJob(ctx, task) | ctx.Data["canDownload"] = cloudbrain.CanDeleteJob(ctx, task) | ||||
| ctx.HTML(200, tpName) | ctx.HTML(200, tpName) | ||||
| } | } | ||||
| @@ -2,6 +2,7 @@ package repo | |||||
| import ( | import ( | ||||
| "archive/zip" | "archive/zip" | ||||
| "code.gitea.io/gitea/modules/notification" | |||||
| "code.gitea.io/gitea/modules/timeutil" | "code.gitea.io/gitea/modules/timeutil" | ||||
| "encoding/json" | "encoding/json" | ||||
| "errors" | "errors" | ||||
| @@ -430,7 +431,7 @@ func NotebookManage(ctx *context.Context) { | |||||
| Uuid: task.Uuid, | Uuid: task.Uuid, | ||||
| Image: task.Image, | Image: task.Image, | ||||
| ComputeResource: task.ComputeResource, | ComputeResource: task.ComputeResource, | ||||
| Description: task.Description, | |||||
| Description: task.Description, | |||||
| } | } | ||||
| err = models.RestartCloudbrain(task, newTask) | err = models.RestartCloudbrain(task, newTask) | ||||
| @@ -441,6 +442,7 @@ func NotebookManage(ctx *context.Context) { | |||||
| break | break | ||||
| } | } | ||||
| ID = strconv.FormatInt(newTask.ID, 10) | ID = strconv.FormatInt(newTask.ID, 10) | ||||
| notification.NotifyOtherTask(ctx.User, ctx.Repo.Repository, ID, task.DisplayJobName, models.ActionCreateDebugNPUTask) | |||||
| } else { | } else { | ||||
| task.Status = res.Status | task.Status = res.Status | ||||
| if task.EndTime == 0 && models.IsModelArtsDebugJobTerminal(task.Status) { | if task.EndTime == 0 && models.IsModelArtsDebugJobTerminal(task.Status) { | ||||
| @@ -54,7 +54,12 @@ func queryUserDataPage(ctx *context.Context, tableName string, queryObj interfac | |||||
| "N1": ctx.Tr("user.static.createrepocount"), | "N1": ctx.Tr("user.static.createrepocount"), | ||||
| "O1": ctx.Tr("user.static.openiindex"), | "O1": ctx.Tr("user.static.openiindex"), | ||||
| "P1": ctx.Tr("user.static.registdate"), | "P1": ctx.Tr("user.static.registdate"), | ||||
| "Q1": ctx.Tr("user.static.countdate"), | |||||
| "Q1": ctx.Tr("user.static.CloudBrainTaskNum"), | |||||
| "R1": ctx.Tr("user.static.CloudBrainRunTime"), | |||||
| "S1": ctx.Tr("user.static.CommitDatasetNum"), | |||||
| "T1": ctx.Tr("user.static.CommitModelCount"), | |||||
| "U1": ctx.Tr("user.static.UserIndex"), | |||||
| "V1": ctx.Tr("user.static.countdate"), | |||||
| } | } | ||||
| for k, v := range dataHeader { | for k, v := range dataHeader { | ||||
| //设置单元格的值 | //设置单元格的值 | ||||
| @@ -89,8 +94,14 @@ func queryUserDataPage(ctx *context.Context, tableName string, queryObj interfac | |||||
| formatTime := userRecord.RegistDate.Format("2006-01-02 15:04:05") | formatTime := userRecord.RegistDate.Format("2006-01-02 15:04:05") | ||||
| xlsx.SetCellValue(sheetName, "P"+rows, formatTime[0:len(formatTime)-3]) | xlsx.SetCellValue(sheetName, "P"+rows, formatTime[0:len(formatTime)-3]) | ||||
| xlsx.SetCellValue(sheetName, "Q"+rows, userRecord.CloudBrainTaskNum) | |||||
| xlsx.SetCellValue(sheetName, "R"+rows, fmt.Sprintf("%.2f", float64(userRecord.CloudBrainRunTime)/3600)) | |||||
| xlsx.SetCellValue(sheetName, "S"+rows, userRecord.CommitDatasetNum) | |||||
| xlsx.SetCellValue(sheetName, "T"+rows, userRecord.CommitModelCount) | |||||
| xlsx.SetCellValue(sheetName, "U"+rows, fmt.Sprintf("%.2f", userRecord.UserIndex)) | |||||
| formatTime = userRecord.DataDate | formatTime = userRecord.DataDate | ||||
| xlsx.SetCellValue(sheetName, "Q"+rows, formatTime) | |||||
| xlsx.SetCellValue(sheetName, "V"+rows, formatTime) | |||||
| } | } | ||||
| indexTotal += PAGE_SIZE | indexTotal += PAGE_SIZE | ||||
| @@ -115,6 +126,30 @@ func queryUserDataPage(ctx *context.Context, tableName string, queryObj interfac | |||||
| } | } | ||||
| } | } | ||||
| func QueryMetrics(ctx *context.Context) { | |||||
| startDate := ctx.Query("startDate") | |||||
| endDate := ctx.Query("endDate") | |||||
| startTime, _ := time.ParseInLocation("2006-01-02", startDate, time.Local) | |||||
| endTime, _ := time.ParseInLocation("2006-01-02", endDate, time.Local) | |||||
| result, count := models.QueryMetrics(startTime.Unix(), endTime.Unix()) | |||||
| mapInterface := make(map[string]interface{}) | |||||
| mapInterface["data"] = result | |||||
| mapInterface["count"] = count | |||||
| ctx.JSON(http.StatusOK, mapInterface) | |||||
| } | |||||
| func QueryRankingList(ctx *context.Context) { | |||||
| key := ctx.Query("key") | |||||
| tableName := ctx.Query("tableName") | |||||
| limit := ctx.QueryInt("limit") | |||||
| result, count := models.QueryRankList(key, tableName, limit) | |||||
| mapInterface := make(map[string]interface{}) | |||||
| mapInterface["data"] = result | |||||
| mapInterface["count"] = count | |||||
| ctx.JSON(http.StatusOK, mapInterface) | |||||
| } | |||||
| func QueryUserStaticCurrentMonth(ctx *context.Context) { | func QueryUserStaticCurrentMonth(ctx *context.Context) { | ||||
| queryUserDataPage(ctx, "public.user_business_analysis_current_month", new(models.UserBusinessAnalysisCurrentMonth)) | queryUserDataPage(ctx, "public.user_business_analysis_current_month", new(models.UserBusinessAnalysisCurrentMonth)) | ||||
| } | } | ||||
| @@ -221,7 +256,12 @@ func QueryUserStaticDataPage(ctx *context.Context) { | |||||
| "N1": ctx.Tr("user.static.createrepocount"), | "N1": ctx.Tr("user.static.createrepocount"), | ||||
| "O1": ctx.Tr("user.static.openiindex"), | "O1": ctx.Tr("user.static.openiindex"), | ||||
| "P1": ctx.Tr("user.static.registdate"), | "P1": ctx.Tr("user.static.registdate"), | ||||
| "Q1": ctx.Tr("user.static.countdate"), | |||||
| "Q1": ctx.Tr("user.static.CloudBrainTaskNum"), | |||||
| "R1": ctx.Tr("user.static.CloudBrainRunTime"), | |||||
| "S1": ctx.Tr("user.static.CommitDatasetNum"), | |||||
| "T1": ctx.Tr("user.static.CommitModelCount"), | |||||
| "U1": ctx.Tr("user.static.UserIndex"), | |||||
| "V1": ctx.Tr("user.static.countdate"), | |||||
| } | } | ||||
| for k, v := range dataHeader { | for k, v := range dataHeader { | ||||
| //设置单元格的值 | //设置单元格的值 | ||||
| @@ -249,9 +289,13 @@ func QueryUserStaticDataPage(ctx *context.Context) { | |||||
| formatTime := userRecord.RegistDate.Format("2006-01-02 15:04:05") | formatTime := userRecord.RegistDate.Format("2006-01-02 15:04:05") | ||||
| xlsx.SetCellValue(sheetName, "P"+rows, formatTime[0:len(formatTime)-3]) | xlsx.SetCellValue(sheetName, "P"+rows, formatTime[0:len(formatTime)-3]) | ||||
| xlsx.SetCellValue(sheetName, "Q"+rows, userRecord.CloudBrainTaskNum) | |||||
| xlsx.SetCellValue(sheetName, "R"+rows, fmt.Sprintf("%.2f", float64(userRecord.CloudBrainRunTime)/3600)) | |||||
| xlsx.SetCellValue(sheetName, "S"+rows, userRecord.CommitDatasetNum) | |||||
| xlsx.SetCellValue(sheetName, "T"+rows, userRecord.CommitModelCount) | |||||
| xlsx.SetCellValue(sheetName, "U"+rows, fmt.Sprintf("%.2f", userRecord.UserIndex)) | |||||
| formatTime = userRecord.DataDate | formatTime = userRecord.DataDate | ||||
| xlsx.SetCellValue(sheetName, "Q"+rows, formatTime+" 00:01") | |||||
| xlsx.SetCellValue(sheetName, "V"+rows, formatTime) | |||||
| } | } | ||||
| //设置默认打开的表单 | //设置默认打开的表单 | ||||
| @@ -247,7 +247,11 @@ func renderDirectory(ctx *context.Context, treeLink string) { | |||||
| ctx.Data["ReadmeInList"] = true | ctx.Data["ReadmeInList"] = true | ||||
| ctx.Data["ReadmeExist"] = true | ctx.Data["ReadmeExist"] = true | ||||
| ctx.Data["FileIsSymlink"] = readmeFile.isSymlink | ctx.Data["FileIsSymlink"] = readmeFile.isSymlink | ||||
| ctx.Data["ReadmeName"] = readmeFile.name | |||||
| if ctx.Repo.TreePath == "" { | |||||
| ctx.Data["ReadmeRelativePath"] = readmeFile.name | |||||
| } else { | |||||
| ctx.Data["ReadmeRelativePath"] = ctx.Repo.TreePath + "/" + readmeFile.name | |||||
| } | |||||
| if ctx.Repo.CanEnableEditor() { | if ctx.Repo.CanEnableEditor() { | ||||
| ctx.Data["CanEditFile"] = true | ctx.Data["CanEditFile"] = true | ||||
| @@ -579,11 +583,11 @@ func safeURL(address string) string { | |||||
| } | } | ||||
| type ContributorInfo struct { | type ContributorInfo struct { | ||||
| UserInfo *models.User // nil for contributor who is not a registered user | |||||
| RelAvatarLink string `json:"rel_avatar_link"` | |||||
| UserName string `json:"user_name"` | |||||
| Email string `json:"email"` | |||||
| CommitCnt int `json:"commit_cnt"` | |||||
| UserInfo *models.User // nil for contributor who is not a registered user | |||||
| RelAvatarLink string `json:"rel_avatar_link"` | |||||
| UserName string `json:"user_name"` | |||||
| Email string `json:"email"` | |||||
| CommitCnt int `json:"commit_cnt"` | |||||
| } | } | ||||
| type GetContributorsInfo struct { | type GetContributorsInfo struct { | ||||
| @@ -642,7 +646,7 @@ func Home(ctx *context.Context) { | |||||
| existedContributorInfo.CommitCnt += c.CommitCnt | existedContributorInfo.CommitCnt += c.CommitCnt | ||||
| } else { | } else { | ||||
| var newContributor = &ContributorInfo{ | var newContributor = &ContributorInfo{ | ||||
| user, "", "",c.Email, c.CommitCnt, | |||||
| user, "", "", c.Email, c.CommitCnt, | |||||
| } | } | ||||
| count++ | count++ | ||||
| contributorInfos = append(contributorInfos, newContributor) | contributorInfos = append(contributorInfos, newContributor) | ||||
| @@ -839,7 +843,7 @@ func renderCode(ctx *context.Context) { | |||||
| compareInfo, err = baseGitRepo.GetCompareInfo(ctx.Repo.Repository.RepoPath(), ctx.Repo.BranchName, ctx.Repo.Repository.BaseRepo.DefaultBranch) | compareInfo, err = baseGitRepo.GetCompareInfo(ctx.Repo.Repository.RepoPath(), ctx.Repo.BranchName, ctx.Repo.Repository.BaseRepo.DefaultBranch) | ||||
| ctx.Data["UpstreamSameBranchName"] = false | ctx.Data["UpstreamSameBranchName"] = false | ||||
| } | } | ||||
| if err==nil && compareInfo != nil { | |||||
| if err == nil && compareInfo != nil { | |||||
| if compareInfo.Commits != nil { | if compareInfo.Commits != nil { | ||||
| log.Info("compareInfoCommits数量:%d", compareInfo.Commits.Len()) | log.Info("compareInfoCommits数量:%d", compareInfo.Commits.Len()) | ||||
| ctx.Data["FetchUpstreamCnt"] = compareInfo.Commits.Len() | ctx.Data["FetchUpstreamCnt"] = compareInfo.Commits.Len() | ||||
| @@ -950,7 +954,7 @@ func ContributorsAPI(ctx *context.Context) { | |||||
| } else { | } else { | ||||
| // new committer info | // new committer info | ||||
| var newContributor = &ContributorInfo{ | var newContributor = &ContributorInfo{ | ||||
| user, user.RelAvatarLink(),user.Name, user.Email,c.CommitCnt, | |||||
| user, user.RelAvatarLink(), user.Name, user.Email, c.CommitCnt, | |||||
| } | } | ||||
| count++ | count++ | ||||
| contributorInfos = append(contributorInfos, newContributor) | contributorInfos = append(contributorInfos, newContributor) | ||||
| @@ -963,7 +967,7 @@ func ContributorsAPI(ctx *context.Context) { | |||||
| existedContributorInfo.CommitCnt += c.CommitCnt | existedContributorInfo.CommitCnt += c.CommitCnt | ||||
| } else { | } else { | ||||
| var newContributor = &ContributorInfo{ | var newContributor = &ContributorInfo{ | ||||
| user, "", "",c.Email,c.CommitCnt, | |||||
| user, "", "", c.Email, c.CommitCnt, | |||||
| } | } | ||||
| count++ | count++ | ||||
| contributorInfos = append(contributorInfos, newContributor) | contributorInfos = append(contributorInfos, newContributor) | ||||
| @@ -81,7 +81,7 @@ | |||||
| <span class="fitted" style="width: 90%;vertical-align: middle;">{{.DisplayJobName}}</span> | <span class="fitted" style="width: 90%;vertical-align: middle;">{{.DisplayJobName}}</span> | ||||
| </a> | </a> | ||||
| {{else if eq .JobType "TRAIN"}} | {{else if eq .JobType "TRAIN"}} | ||||
| <a class="title" href="{{AppSubUrl}}/{{.Repo.OwnerName}}/{{.Repo.Name}}/modelarts/train-job/{{$JobID}}" title="{{.DisplayJobName}}" style="font-size: 14px;"> | |||||
| <a class="title" href="{{AppSubUrl}}/{{.Repo.OwnerName}}/{{.Repo.Name}}{{if eq .ComputeResource "CPU/GPU"}}/cloudbrain{{else}}/modelarts{{end}}/train-job/{{$JobID}}" title="{{.DisplayJobName}}" style="font-size: 14px;"> | |||||
| <span class="fitted" style="width: 90%;vertical-align: middle;">{{.DisplayJobName}}</span> | <span class="fitted" style="width: 90%;vertical-align: middle;">{{.DisplayJobName}}</span> | ||||
| </a> | </a> | ||||
| {{else if eq .JobType "BENCHMARK"}} | {{else if eq .JobType "BENCHMARK"}} | ||||
| @@ -155,13 +155,13 @@ | |||||
| </a> | </a> | ||||
| </form> | </form> | ||||
| {{else}} | {{else}} | ||||
| <a style="padding: 0.5rem 1rem;" id="ai-stop-{{$JobID}}" class="ui basic ai_stop_version {{if eq .Status "KILLED" "FAILED" "START_FAILED" "KILLING" "COMPLETED"}}disabled {{else}} blue {{end}}button" data-repopath="{{.Repo.OwnerName}}/{{.Repo.Name}}/modelarts/{{if eq .JobType "INFERENCE"}}inference-job{{else}}train-job{{end}}" data-jobid="{{$JobID}}" data-version="{{.VersionName}}" > | |||||
| <a style="padding: 0.5rem 1rem;" id="ai-stop-{{$JobID}}" class="ui basic ai_stop_version {{if eq .Status "KILLED" "FAILED" "START_FAILED" "KILLING" "COMPLETED" "SUCCEEDED"}}disabled {{else}} blue {{end}}button" data-repopath="{{.Repo.OwnerName}}/{{.Repo.Name}}{{if eq .ComputeResource "CPU/GPU"}}/cloudbrain/train-job{{else}}/modelarts/{{if eq .JobType "INFERENCE"}}inference-job{{else}}train-job{{end}}{{end}}" data-jobid="{{$JobID}}" data-version="{{.VersionName}}" > | |||||
| {{$.i18n.Tr "repo.stop"}} | {{$.i18n.Tr "repo.stop"}} | ||||
| </a> | </a> | ||||
| {{end}} | {{end}} | ||||
| </div> | </div> | ||||
| <!-- 删除任务 --> | <!-- 删除任务 --> | ||||
| <form class="ui compact buttons" id="delForm-{{$JobID}}" action='{{AppSubUrl}}/{{.Repo.OwnerName}}/{{.Repo.Name}}{{if eq .JobType "BENCHMARK"}}/cloudbrain/benchmark{{else if eq .JobType "DEBUG"}}{{if eq .ComputeResource "NPU"}}/modelarts/notebook{{else}}/cloudbrain{{end}}{{else if eq .JobType "TRAIN"}}/modelarts/train-job{{end}}/{{$JobID}}/del?isadminpage=true' method="post"> | |||||
| <form class="ui compact buttons" id="delForm-{{$JobID}}" action='{{AppSubUrl}}/{{.Repo.OwnerName}}/{{.Repo.Name}}{{if eq .JobType "BENCHMARK"}}/cloudbrain/benchmark{{else if eq .JobType "DEBUG"}}{{if eq .ComputeResource "NPU"}}/modelarts/notebook{{else}}/cloudbrain{{end}}{{else if eq .JobType "TRAIN"}}{{if eq .ComputeResource "NPU"}}/modelarts/notebook{{else}}/cloudbrain{{end}}/train-job{{end}}/{{$JobID}}/del?isadminpage=true' method="post"> | |||||
| {{$.CsrfTokenHtml}} | {{$.CsrfTokenHtml}} | ||||
| <a style="padding: 0.5rem 1rem;margin-left:0.2rem" id="ai-delete-{{$JobID}}" data-repopath="{{.Repo.OwnerName}}/{{.Repo.Name}}/modelarts/inference-job/{{$JobID}}/del_version?isadminpage=true" data-version="{{.VersionName}}" class="ui basic ai_delete blue button" style="border-radius: .28571429rem;"> | <a style="padding: 0.5rem 1rem;margin-left:0.2rem" id="ai-delete-{{$JobID}}" data-repopath="{{.Repo.OwnerName}}/{{.Repo.Name}}/modelarts/inference-job/{{$JobID}}/del_version?isadminpage=true" data-version="{{.VersionName}}" class="ui basic ai_delete blue button" style="border-radius: .28571429rem;"> | ||||
| {{$.i18n.Tr "repo.delete"}} | {{$.i18n.Tr "repo.delete"}} | ||||
| @@ -281,7 +281,7 @@ td, th { | |||||
| </tr> | </tr> | ||||
| <tr class="ti-no-ng-animate"> | <tr class="ti-no-ng-animate"> | ||||
| <td class="ti-no-ng-animate ti-text-form-label text-width80"> | <td class="ti-no-ng-animate ti-text-form-label text-width80"> | ||||
| 镜像 | |||||
| {{.i18n.Tr "cloudbrain.mirror"}} | |||||
| </td> | </td> | ||||
| <td class="ti-text-form-content"> | <td class="ti-text-form-content"> | ||||
| @@ -292,7 +292,8 @@ td, th { | |||||
| </tr> | </tr> | ||||
| <tr class="ti-no-ng-animate"> | <tr class="ti-no-ng-animate"> | ||||
| <td class="ti-no-ng-animate ti-text-form-label text-width80"> | <td class="ti-no-ng-animate ti-text-form-label text-width80"> | ||||
| 类型 | |||||
| {{.i18n.Tr "repo.cloudbrain.benchmark.evaluate_type"}} | |||||
| </td> | </td> | ||||
| <td class="ti-text-form-content"> | <td class="ti-text-form-content"> | ||||
| @@ -313,7 +314,7 @@ td, th { | |||||
| <tr class="ti-no-ng-animate"> | <tr class="ti-no-ng-animate"> | ||||
| <td class="ti-no-ng-animate ti-text-form-label text-width80"> | <td class="ti-no-ng-animate ti-text-form-label text-width80"> | ||||
| 训练程序 | |||||
| {{.i18n.Tr "repo.cloudbrain.benchmark.evaluate_train"}} | |||||
| </td> | </td> | ||||
| <td class="ti-text-form-content"> | <td class="ti-text-form-content"> | ||||
| @@ -324,7 +325,7 @@ td, th { | |||||
| </tr> | </tr> | ||||
| <tr class="ti-no-ng-animate"> | <tr class="ti-no-ng-animate"> | ||||
| <td class="ti-no-ng-animate ti-text-form-label text-width80"> | <td class="ti-no-ng-animate ti-text-form-label text-width80"> | ||||
| 测试程序 | |||||
| {{.i18n.Tr "repo.cloudbrain.benchmark.evaluate_test"}} | |||||
| </td> | </td> | ||||
| <td class="ti-text-form-content"> | <td class="ti-text-form-content"> | ||||
| @@ -360,7 +361,7 @@ td, th { | |||||
| <tr class="ti-no-ng-animate"> | <tr class="ti-no-ng-animate"> | ||||
| <td class="ti-no-ng-animate ti-text-form-label text-width80"> | <td class="ti-no-ng-animate ti-text-form-label text-width80"> | ||||
| 创建者 | |||||
| {{$.i18n.Tr "repo.cloudbrain_creator"}} | |||||
| </td> | </td> | ||||
| <td class="ti-text-form-content"> | <td class="ti-text-form-content"> | ||||
| @@ -371,7 +372,7 @@ td, th { | |||||
| </tr> | </tr> | ||||
| <tr class="ti-no-ng-animate"> | <tr class="ti-no-ng-animate"> | ||||
| <td class="ti-no-ng-animate ti-text-form-label text-width80"> | <td class="ti-no-ng-animate ti-text-form-label text-width80"> | ||||
| 子类型 | |||||
| {{$.i18n.Tr "repo.cloudbrain.benchmark.evaluate_child_type"}} | |||||
| </td> | </td> | ||||
| <td class="ti-text-form-content"> | <td class="ti-text-form-content"> | ||||
| @@ -1,108 +1,501 @@ | |||||
| {{template "base/head" .}} | {{template "base/head" .}} | ||||
| <style> | |||||
| .according-panel-heading{ | |||||
| box-sizing: border-box; | |||||
| padding: 8px 16px; | |||||
| color: #252b3a; | |||||
| background-color: #f2f5fc; | |||||
| line-height: 1.5; | |||||
| cursor: pointer; | |||||
| -moz-user-select: none; | |||||
| -webkit-user-select: none; | |||||
| -ms-user-select: none; | |||||
| -khtml-user-select: none; | |||||
| user-select: none; | |||||
| } | |||||
| .accordion-panel-title { | |||||
| margin-top: 0; | |||||
| margin-bottom: 0; | |||||
| color: #252b3a; | |||||
| } | |||||
| .accordion-panel-title-content{ | |||||
| vertical-align: middle; | |||||
| display: inline-block; | |||||
| width: calc(100% - 32px); | |||||
| cursor: default; | |||||
| } | |||||
| .acc-margin-bottom { | |||||
| margin-bottom: 5px; | |||||
| } | |||||
| .title_text { | |||||
| font-size: 12px; | |||||
| } | |||||
| .ac-display-inblock { | |||||
| display: inline-block; | |||||
| } | |||||
| .cti-mgRight-sm { | |||||
| margin-right: 8px; | |||||
| } | |||||
| .ac-text-normal { | |||||
| font-size: 14px; | |||||
| color: #575d6c; | |||||
| } | |||||
| .uc-accordionTitle-black { | |||||
| color: #333; | |||||
| } | |||||
| .accordion-border{ | |||||
| border:1px solid #cce2ff; | |||||
| } | |||||
| .padding0{ | |||||
| padding: 0 !important; | |||||
| } | |||||
| .content-pad{ | |||||
| padding: 15px 35px; | |||||
| } | |||||
| .content-margin{ | |||||
| margin:10px 5px ; | |||||
| } | |||||
| .tab_2_content { | |||||
| min-height: 560px; | |||||
| margin-left: 10px; | |||||
| } | |||||
| .ac-grid { | |||||
| display: block; | |||||
| *zoom: 1; | |||||
| } | |||||
| .ac-grid-col { | |||||
| float: left; | |||||
| width: 100%; | |||||
| } | |||||
| .ac-grid-col2 .ac-grid-col { | |||||
| width: 50%; | |||||
| } | |||||
| .ti-form { | |||||
| text-align: left; | |||||
| max-width: 100%; | |||||
| vertical-align: middle; | |||||
| } | |||||
| .ti-form>tbody { | |||||
| font-size: 12px; | |||||
| } | |||||
| .ti-form>tbody, .ti-form>tbody>tr { | |||||
| vertical-align: inherit; | |||||
| } | |||||
| .info_text { | |||||
| padding-bottom: 20px; | |||||
| padding-right: 20px; | |||||
| font-size: 12px; | |||||
| } | |||||
| .ti-text-form-label { | |||||
| padding-bottom: 20px; | |||||
| padding-right: 20px; | |||||
| color: #8a8e99; | |||||
| font-size: 12px; | |||||
| white-space: nowrap !important; | |||||
| width: 80px; | |||||
| line-height: 30px; | |||||
| } | |||||
| .ti-text-form-content{ | |||||
| line-height: 30px; | |||||
| padding-bottom: 20px; | |||||
| } | |||||
| .ti-form>tbody>tr>td { | |||||
| vertical-align: top; | |||||
| white-space: normal; | |||||
| } | |||||
| td, th { | |||||
| padding: 0; | |||||
| } | |||||
| .ac-grid-col .text-span { | |||||
| width: 450px; | |||||
| overflow: hidden; | |||||
| text-overflow: ellipsis; | |||||
| white-space: nowrap; | |||||
| } | |||||
| .redo-color{ | |||||
| color: #3291F8; | |||||
| } | |||||
| .ti-action-menu-item:not(:last-child){ | |||||
| margin-right: 10px; | |||||
| padding-right: 11px; | |||||
| text-decoration: none!important; | |||||
| color: #526ecc; | |||||
| cursor: pointer; | |||||
| display: inline-block; | |||||
| -moz-user-select: none; | |||||
| -webkit-user-select: none; | |||||
| -ms-user-select: none; | |||||
| -khtml-user-select: none; | |||||
| user-select: none; | |||||
| position: relative; | |||||
| } | |||||
| .ti-action-menu-item:not(:last-child):after { | |||||
| content: ""; | |||||
| display: inline-block; | |||||
| position: absolute; | |||||
| height: 12px; | |||||
| right: 0; | |||||
| top: 50%; | |||||
| -webkit-transform: translateY(-6px); | |||||
| -ms-transform: translateY(-6px); | |||||
| -o-transform: translateY(-6px); | |||||
| transform: translateY(-6px); | |||||
| border-right: 1px solid #dfe1e6; | |||||
| } | |||||
| .text-width80{ | |||||
| width: 100px; | |||||
| line-height: 30px; | |||||
| } | |||||
| .border-according{ | |||||
| border: 1px solid #dfe1e6; | |||||
| } | |||||
| .disabled { | |||||
| cursor: default; | |||||
| pointer-events: none; | |||||
| color: rgba(0,0,0,.6) !important; | |||||
| opacity: .45 !important; | |||||
| } | |||||
| .pad20{ | |||||
| border:0px !important; | |||||
| } | |||||
| .model_file_bread{ | |||||
| margin-bottom: -0.5rem !important; | |||||
| padding-left: 1rem; | |||||
| padding-top: 0.5rem ; | |||||
| } | |||||
| </style> | |||||
| <div id="mask"> | |||||
| <div id="loadingPage"> | |||||
| <div class="rect1"></div> | |||||
| <div class="rect2"></div> | |||||
| <div class="rect3"></div> | |||||
| <div class="rect4"></div> | |||||
| <div class="rect5"></div> | |||||
| </div> | |||||
| </div> | |||||
| <div class="repository"> | <div class="repository"> | ||||
| {{template "repo/header" .}} | {{template "repo/header" .}} | ||||
| <div class="repository new repo ui middle very relaxed page grid"> | |||||
| <div class="column"> | |||||
| {{template "base/alert" .}} | |||||
| <div class="ui container"> | |||||
| <h4 class="ui header" id="vertical-segment"> | <h4 class="ui header" id="vertical-segment"> | ||||
| <div class="ui breadcrumb"> | |||||
| <a class="section" href="{{.RepoLink}}/debugjob?debugListType=all"> | |||||
| {{.i18n.Tr "repo.cloudbrain"}} | |||||
| </a> | |||||
| <div class="divider"> / </div> | |||||
| <a class="section backTodeBug" href="{{.RepoLink}}/debugjob?debugListType={{if eq $.debugListType "NPU"}}NPU{{else if eq $.debugListType "CPU/GPU"}}CPU/GPU{{else}}all{{end}}"> | |||||
| {{$.i18n.Tr "repo.modelarts.notebook"}} | |||||
| </a> | |||||
| <div class="divider"> / </div> | |||||
| {{with .task}} | |||||
| <div class="active section">{{.DisplayJobName}}</div> | |||||
| {{end}} | |||||
| </div> | |||||
| <div class="ui breadcrumb"> | |||||
| <a class="section" href="{{.RepoLink}}/debugjob?debugListType=all"> | |||||
| {{.i18n.Tr "repo.cloudbrain"}} | |||||
| </a> | |||||
| <div class="divider"> / </div> | |||||
| <a class="section backTodeBug" href="{{.RepoLink}}/debugjob?debugListType={{if eq $.debugListType "NPU"}}NPU{{else if eq $.debugListType "CPU/GPU"}}CPU/GPU{{else}}all{{end}}"> | |||||
| {{$.i18n.Tr "repo.modelarts.notebook"}} | |||||
| </a> | |||||
| <div class="divider"> / </div> | |||||
| <div class="active section">{{.displayJobName}}</div> | |||||
| </div> | |||||
| </h4> | </h4> | ||||
| <div> | |||||
| <div class="ui yellow segment"> | |||||
| {{with .task}} | |||||
| <p>任务名称: {{.DisplayJobName}}</p> | |||||
| {{end}} | |||||
| </div> | |||||
| <div class="ui green segment"> | |||||
| <p>任务结果:</p> | |||||
| {{with .taskRes}} | |||||
| {{range .TaskStatuses}} | |||||
| <table class="ui celled striped table"> | |||||
| <tbody> | |||||
| <tr> | |||||
| <td class="four wide"> 状态 </td> | |||||
| <td> {{.State}} </td> | |||||
| </tr> | |||||
| </tbody> | |||||
| </table> | |||||
| {{end}} | |||||
| {{end}} | |||||
| </div> | |||||
| <div class="ui blue segment"> | |||||
| {{with .result}} | |||||
| <table class="ui celled striped table"> | |||||
| <thead> | |||||
| <tr> <th colspan="2"> 硬件信息 </th> </tr> | |||||
| </thead> | |||||
| <tbody> | |||||
| <tr> | |||||
| <td class="four wide"> CPU </td> | |||||
| <td>{{.Resource.CPU}}</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td> Memory </td> | |||||
| <td>{{.Resource.Memory}}</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td> NvidiaComGpu </td> | |||||
| <td>{{.Resource.NvidiaComGpu}}</td> | |||||
| </tr> | |||||
| </tbody> | |||||
| </table> | |||||
| <table class="ui celled striped table"> | |||||
| <thead> | |||||
| <tr> <th colspan="2"> 调试信息 </th> </tr> | |||||
| </thead> | |||||
| <tbody> | |||||
| <tr> | |||||
| <td class="four wide"> 平台 </td> | |||||
| <td> {{.Platform}} </td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td> 开始时间 </td> | |||||
| {{if not (eq $.task.StartTime 0)}} | |||||
| <td>{{TimeSinceUnix1 $.task.StartTime}}</td> | |||||
| {{else}} | |||||
| <td>无<td> | |||||
| {{end}} | |||||
| </tr> | |||||
| <tr> | |||||
| <td> 结束时间 </td> | |||||
| {{if not (eq $.task.EndTime 0)}} | |||||
| <td>{{TimeSinceUnix1 $.task.EndTime}}</td> | |||||
| {{else}} | |||||
| <td>无<td> | |||||
| {{end}} | |||||
| </tr> | |||||
| <tr> | |||||
| <td> ExitCode </td> | |||||
| <td>{{.JobStatus.AppExitCode}}</td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td> 退出信息 </td> | |||||
| <td>{{.JobStatus.AppExitDiagnostics | nl2br}}</td> | |||||
| </tr> | |||||
| </tbody> | |||||
| </table> | |||||
| {{end}} | |||||
| </div> | |||||
| {{range $k ,$v := .version_list_task}} | |||||
| <div class="ui accordion border-according" id="accordion{{.VersionName}}" data-repopath="{{$.RepoRelPath}}" data-jobid="{{.JobID}}" data-version="{{.VersionName}}"> | |||||
| <input type="hidden" id="jobId_input" name="jobId_input" value="{{.JobID}}"> | |||||
| <div class="{{if eq $k 0}}active{{end}} title padding0"> | |||||
| <div class="according-panel-heading"> | |||||
| <div class="accordion-panel-title"> | |||||
| <i class="dropdown icon"></i> | |||||
| <span class="accordion-panel-title-content"> | |||||
| <span> | |||||
| <div class="ac-display-inblock title_text acc-margin-bottom"> | |||||
| <span class="cti-mgRight-sm"> | |||||
| {{if not (eq .StartTime 0)}} | |||||
| <td>{{TimeSinceUnix1 .StartTime}}</td> | |||||
| {{else}} | |||||
| <td>{{TimeSinceUnix1 .CreatedUnix}}<td> | |||||
| {{end}} | |||||
| </span> | |||||
| <span class="cti-mgRight-sm">{{$.i18n.Tr "repo.modelarts.status"}}: | |||||
| <span id="{{.VersionName}}-status-span"><i id="icon" style="vertical-align: middle;" class="{{.Status}}"></i><span id="text" style="margin-left: 0.4em;font-size: 12px;">{{.Status}}</span></span> | |||||
| </span> | |||||
| <span class="cti-mgRight-sm">{{$.i18n.Tr "repo.modelarts.train_job.dura_time"}}:</span> | |||||
| <span class="cti-mgRight-sm uc-accordionTitle-black" id="{{.VersionName}}-duration-span">{{$.duration}}</span> | |||||
| </div> | |||||
| </span> | |||||
| </span> | |||||
| </div> | |||||
| </div> | |||||
| </div> | |||||
| <div class="{{if eq $k 0}}active{{end}} content"> | |||||
| <div class="content-pad"> | |||||
| <div class="ui pointing secondary menu" style="border-bottom: 1px solid rgba(34,36,38,.15);"> | |||||
| <a class="active item" data-tab="first{{$k}}">{{$.i18n.Tr "repo.modelarts.train_job.config"}}</a> | |||||
| </div> | |||||
| <div class="ui tab active" data-tab="first{{$k}}"> | |||||
| <div style="padding-top: 10px;"> | |||||
| <div class="tab_2_content"> | |||||
| <div class="ac-grid ac-grid-col2"> | |||||
| <div class="ac-grid-col"> | |||||
| <table class="ti-form"> | |||||
| <tbody class="ti-text-form"> | |||||
| <tr class="ti-no-ng-animate"> | |||||
| <td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||||
| {{$.i18n.Tr "repo.cloudbrain_task"}} | |||||
| </td> | |||||
| <td class="ti-text-form-content"> | |||||
| <div class="text-span text-span-w"> | |||||
| {{.DisplayJobName}} | |||||
| </div> | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="ti-no-ng-animate"> | |||||
| <td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||||
| {{$.i18n.Tr "repo.modelarts.status"}} | |||||
| </td> | |||||
| <td class="ti-text-form-content"> | |||||
| <div class="text-span text-span-w" id="{{.VersionName}}-status"> | |||||
| {{.Status}} | |||||
| </div> | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="ti-no-ng-animate"> | |||||
| <td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||||
| {{$.i18n.Tr "repo.modelarts.train_job.start_time"}} | |||||
| </td> | |||||
| <td class="ti-text-form-content"> | |||||
| <div class="text-span text-span-w"> | |||||
| <span style="font-size: 12px;" class=""> | |||||
| {{if not (eq .StartTime 0)}} | |||||
| {{TimeSinceUnix1 .StartTime}} | |||||
| {{else}} | |||||
| {{TimeSinceUnix1 .CreatedUnix}} | |||||
| {{end}} | |||||
| </span> | |||||
| </div> | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="ti-no-ng-animate"> | |||||
| <td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||||
| {{$.i18n.Tr "repo.modelarts.train_job.dura_time"}} | |||||
| </td> | |||||
| <td class="ti-text-form-content"> | |||||
| <div class="text-span text-span-w" id="{{.VersionName}}-duration"> | |||||
| {{$.duration}} | |||||
| </div> | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="ti-no-ng-animate"> | |||||
| <td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||||
| {{$.i18n.Tr "cloudbrain.mirror"}} | |||||
| </td> | |||||
| <td class="ti-text-form-content"> | |||||
| <div class="text-span text-span-w" id="{{.VersionName}}-mirror"> | |||||
| {{.Image}} | |||||
| </div> | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="ti-no-ng-animate"> | |||||
| <td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||||
| {{$.i18n.Tr "cloudbrain.dataset_storage_path"}} | |||||
| </td> | |||||
| <td class="ti-text-form-content"> | |||||
| <div class="text-span text-span-w" id="dataset_storage_path"> | |||||
| {{$.dataset_path}} | |||||
| </div> | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="ti-no-ng-animate"> | |||||
| <td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||||
| {{$.i18n.Tr "cloudbrain.code_storage_path"}} | |||||
| </td> | |||||
| <td class="ti-text-form-content"> | |||||
| <div class="text-span text-span-w" id="code_storage_path"> | |||||
| {{$.code_path}} | |||||
| </div> | |||||
| </td> | |||||
| </tr> | |||||
| </tbody> | |||||
| </table> | |||||
| </div> | |||||
| <div class="ac-grid-col"> | |||||
| <table class="ti-form"> | |||||
| <tbody class="ti-text-form"> | |||||
| <tr class="ti-no-ng-animate"> | |||||
| <td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||||
| {{$.i18n.Tr "repo.cloudbrain.platform"}} | |||||
| </td> | |||||
| <td class="ti-text-form-content"> | |||||
| <div class="text-span text-span-w"> | |||||
| {{$.result.Platform}} | |||||
| </div> | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="ti-no-ng-animate"> | |||||
| <td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||||
| ExitCode | |||||
| </td> | |||||
| <td class="ti-text-form-content"> | |||||
| <div class="text-span text-span-w"> | |||||
| {{$.result.JobStatus.AppExitCode}} | |||||
| </div> | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="ti-no-ng-animate"> | |||||
| <td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||||
| {{$.i18n.Tr "repo.cloudbrain.endtime"}} | |||||
| </td> | |||||
| <td class="ti-text-form-content"> | |||||
| <div class="text-span text-span-w" id="{{.VersionName}}-BenchmarkTypeName"> | |||||
| {{if not (eq .StartTime 0)}} | |||||
| {{TimeSinceUnix1 .EndTime}} | |||||
| {{else}} | |||||
| -- | |||||
| {{end}} | |||||
| </div> | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="ti-no-ng-animate"> | |||||
| <td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||||
| {{$.i18n.Tr "repo.modelarts.train_job.dataset"}} | |||||
| </td> | |||||
| <td class="ti-text-form-content"> | |||||
| <div class="text-span text-span-w" id="{{.VersionName}}-BenchmarkTypeName"> | |||||
| {{$.datasetname}} | |||||
| </div> | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="ti-no-ng-animate"> | |||||
| <td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||||
| {{$.i18n.Tr "repo.modelarts.train_job.standard"}} | |||||
| </td> | |||||
| <td class="ti-text-form-content"> | |||||
| <div class="text-span text-span-w"> | |||||
| {{$.resource_spec}} | |||||
| </div> | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="ti-no-ng-animate"> | |||||
| <td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||||
| {{$.i18n.Tr "repo.cloudbrain_creator"}} | |||||
| </td> | |||||
| <td class="ti-text-form-content"> | |||||
| <div class="text-span text-span-w" id="{{.VersionName}}-mirror"> | |||||
| {{.User.Name}} | |||||
| </div> | |||||
| </td> | |||||
| </tr> | |||||
| <tr class="ti-no-ng-animate"> | |||||
| <td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||||
| {{$.i18n.Tr "cloudbrain.model_storage_path"}} | |||||
| </td> | |||||
| <td class="ti-text-form-content"> | |||||
| <div class="text-span text-span-w" id="model_storage_path"> | |||||
| {{$.model_path}} | |||||
| </div> | |||||
| </td> | |||||
| </tr> | |||||
| </tbody> | |||||
| </table> | |||||
| </div> | |||||
| </div> | |||||
| <div class="ac-grid ac-grid-col2"> | |||||
| <div class="ac-grid-col"> | |||||
| <span class="ti-text-form-label">{{$.i18n.Tr "repo.cloudbrain.exitinfo"}}</span> | |||||
| </div> | |||||
| </div> | |||||
| <div class="ac-grid-col"> | |||||
| <span class="info_text"> | |||||
| {{$.result.JobStatus.AppExitDiagnostics}} | |||||
| </span> | |||||
| </div> | |||||
| </div> | |||||
| </div> | |||||
| </div> | |||||
| </div> | |||||
| </div> | |||||
| </div> | </div> | ||||
| {{end}} {{template "base/paginate" .}} | |||||
| </div> | |||||
| <!-- 确认模态框 --> | |||||
| <div id="deletemodel"> | |||||
| <div class="ui basic modal"> | |||||
| <div class="ui icon header"> | |||||
| <i class="trash icon"></i> {{.i18n.Tr "cloudbrain.delete_task"}} | |||||
| </div> | |||||
| <div class="content"> | |||||
| <p>{{.i18n.Tr "cloudbrain.task_delete_confirm"}}</p> | |||||
| </div> | |||||
| <div class="actions"> | |||||
| <div class="ui red basic inverted cancel button"> | |||||
| <i class="remove icon"></i> {{.i18n.Tr "cloudbrain.operate_cancel"}} | |||||
| </div> | |||||
| <div class="ui green basic inverted ok button"> | |||||
| <i class="checkmark icon"></i> {{.i18n.Tr "cloudbrain.operate_confirm"}} | |||||
| </div> | |||||
| </div> | |||||
| </div> | |||||
| </div> | </div> | ||||
| </div> | |||||
| </div> | </div> | ||||
| {{template "base/footer" .}} | {{template "base/footer" .}} | ||||
| <script> | |||||
| $('.menu .item').tab() | |||||
| $(document).ready(function(){ | |||||
| $('.ui.accordion').accordion({selector:{trigger:'.icon'}}); | |||||
| }); | |||||
| $(document).ready(function(){ | |||||
| $('.secondary.menu .item').tab(); | |||||
| }); | |||||
| let userName | |||||
| let repoPath | |||||
| let jobName | |||||
| $(document).ready(function(){ | |||||
| let url = window.location.href; | |||||
| let urlArr = url.split('/') | |||||
| userName = urlArr.slice(-5)[0] | |||||
| repoPath = urlArr.slice(-4)[0] | |||||
| jobName = urlArr.slice(-1)[0] | |||||
| }) | |||||
| function loadLog(version_name){ | |||||
| document.getElementById("mask").style.display = "block" | |||||
| $.get(`/api/v1/repos/${userName}/${repoPath}/cloudbrain/${jobName}/log?version_name=${version_name}&lines=50&order=asc`, (data) => { | |||||
| $('input[name=end_line]').val(data.EndLine) | |||||
| $('input[name=start_line]').val(data.StartLine) | |||||
| $(`#log_file${version_name}`).text(data.Content) | |||||
| document.getElementById("mask").style.display = "none" | |||||
| }).fail(function(err) { | |||||
| console.log(err); | |||||
| document.getElementById("mask").style.display = "none" | |||||
| }); | |||||
| } | |||||
| </script> | |||||
| @@ -131,7 +131,7 @@ | |||||
| <a style="margin-left:30px;" href="{{.RepoLink}}/datasets/edit/{{.dataset.ID}}" class="ui primary basic mini {{if not $.CanWrite}} disabled {{end}} button">{{.i18n.Tr "repo.modelarts.modify"}}</a> | <a style="margin-left:30px;" href="{{.RepoLink}}/datasets/edit/{{.dataset.ID}}" class="ui primary basic mini {{if not $.CanWrite}} disabled {{end}} button">{{.i18n.Tr "repo.modelarts.modify"}}</a> | ||||
| </span> | </span> | ||||
| </div> | </div> | ||||
| {{if and (.dataset.Category) (.dataset.Task) (.dataset.License)}} | |||||
| {{if or (.dataset.Category) (.dataset.Task) (.dataset.License)}} | |||||
| <div class="column thirteen wide"> | <div class="column thirteen wide"> | ||||
| {{if .dataset.Category}} | {{if .dataset.Category}} | ||||
| {{$category := .dataset.Category}} | {{$category := .dataset.Category}} | ||||
| @@ -40,7 +40,7 @@ | |||||
| <div class="ui right file-actions"> | <div class="ui right file-actions"> | ||||
| {{if .Repository.CanEnableEditor}} | {{if .Repository.CanEnableEditor}} | ||||
| {{if .CanEditFile}} | {{if .CanEditFile}} | ||||
| <a href="{{.RepoLink}}/_edit/{{EscapePound .BranchName}}/{{EscapePound .ReadmeName}}"><span class="btn-octicon poping up" data-content="{{.EditFileTooltip}}" data-position="bottom center" data-variation="tiny inverted">{{svg "octicon-pencil" 16}}</span></a> | |||||
| <a href="{{.RepoLink}}/_edit/{{EscapePound .BranchName}}/{{EscapePound .ReadmeRelativePath}}"><span class="btn-octicon poping up" data-content="{{.EditFileTooltip}}" data-position="bottom center" data-variation="tiny inverted">{{svg "octicon-pencil" 16}}</span></a> | |||||
| {{else}} | {{else}} | ||||
| <span class="btn-octicon poping up disabled" data-content="{{.EditFileTooltip}}" data-position="bottom center" data-variation="tiny inverted">{{svg "octicon-pencil" 16}}</span> | <span class="btn-octicon poping up disabled" data-content="{{.EditFileTooltip}}" data-position="bottom center" data-variation="tiny inverted">{{svg "octicon-pencil" 16}}</span> | ||||
| {{end}} | {{end}} | ||||
| @@ -48,7 +48,7 @@ | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| {{end}} | {{end}} | ||||
| {{if not .ReadmeInList}} | {{if not .ReadmeInList}} | ||||
| <div class="file-header-right"> | <div class="file-header-right"> | ||||
| <div class="ui right file-actions"> | <div class="ui right file-actions"> | ||||
| @@ -133,7 +133,43 @@ | |||||
| <template slot-scope="scope"> | <template slot-scope="scope"> | ||||
| {{scope.row.RegistDate | transformTimestamp}} | {{scope.row.RegistDate | transformTimestamp}} | ||||
| </template> | </template> | ||||
| </el-table-column> | |||||
| <el-table-column | |||||
| prop="CloudBrainTaskNum" | |||||
| label="云脑任务数" | |||||
| width="120px" | |||||
| align="center"> | |||||
| </el-table-column> | </el-table-column> | ||||
| <el-table-column | |||||
| prop="CloudBrainRunTime" | |||||
| label="云脑运行时间(小时)" | |||||
| width="120px" | |||||
| align="center"> | |||||
| <template slot-scope="scope"> | |||||
| {{scope.row.CloudBrainRunTime | roundingToHour}} | |||||
| </template> | |||||
| </el-table-column> | |||||
| <el-table-column | |||||
| prop="CommitDatasetNum" | |||||
| label="上传(提交)数据集文件数" | |||||
| width="120px" | |||||
| align="center"> | |||||
| </el-table-column> | |||||
| <el-table-column | |||||
| prop="CommitModelCount" | |||||
| label="提交模型数" | |||||
| width="120px" | |||||
| align="center"> | |||||
| </el-table-column> | |||||
| <el-table-column | |||||
| prop="UserIndex" | |||||
| label="用户指数" | |||||
| width="120px" | |||||
| align="center"> | |||||
| <template slot-scope="scope"> | |||||
| {{scope.row.UserIndex | rounding}} | |||||
| </template> | |||||
| </el-table-column> | |||||
| <el-table-column | <el-table-column | ||||
| prop="DataDate" | prop="DataDate" | ||||
| label="系统统计时间" | label="系统统计时间" | ||||
| @@ -178,7 +214,7 @@ | |||||
| value_time: '', | value_time: '', | ||||
| search:'', | search:'', | ||||
| data:'', | data:'', | ||||
| columns: [{title: 'ID',key: 'ID'},{title: '用户名',key: 'Name'},{title: 'PR数',key: 'CodeMergeCount'},{title: 'commit数',key:'CommitCount'},{title: '提出任务数',key: 'IssueCount'},{title: '评论数',key: 'CommentCount'},{title: '关注项目数',key: 'FocusRepoCount'},{title: '点赞项目数',key: 'StarRepoCount'},{title: '登录次数',key: 'LoginCount'},{title:'关注者数',key:'WatchedCount'},{title:'commit代码行数',key:'CommitCodeSize'},{title:'已解决任务数',key:'SolveIssueCount'},{title:'百科页面贡献次数',key:'EncyclopediasCount'},{title:'创建项目',key:'CreateRepoCount'},{title:'用户注册时间',key:'RegistDate'},{title:'系统统计时间',key:'CountDate'}], | |||||
| columns: [{title: 'ID',key: 'ID'},{title: '用户名',key: 'Name'},{title: 'PR数',key: 'CodeMergeCount'},{title: 'commit数',key:'CommitCount'},{title: '提出任务数',key: 'IssueCount'},{title: '评论数',key: 'CommentCount'},{title: '关注项目数',key: 'FocusRepoCount'},{title: '点赞项目数',key: 'StarRepoCount'},{title: '登录次数',key: 'LoginCount'},{title:'关注者数',key:'WatchedCount'},{title:'commit代码行数',key:'CommitCodeSize'},{title:'已解决任务数',key:'SolveIssueCount'},{title:'百科页面贡献次数',key:'EncyclopediasCount'},{title:'创建项目',key:'CreateRepoCount'},{title:'用户注册时间',key:'RegistDate'},{title:'云脑任务数',key:'CloudBrainTaskNum'},{title:'云脑运行时间(小时)',key:'CloudBrainRunTime'},{title:'上传(提交)数据集文件数',key:'CommitDatasetNum'},{title:'提交模型数',key:'CommitModelCount'},{title:'用户指数',key:'UserIndex'},{title:'系统统计时间',key:'CountDate'}], | |||||
| blob:'', | blob:'', | ||||
| fileName:'', | fileName:'', | ||||
| dynamic:7, | dynamic:7, | ||||
| @@ -351,6 +387,12 @@ | |||||
| }, | }, | ||||
| filters:{ | filters:{ | ||||
| rounding (value) { | |||||
| return Number(value).toFixed(2) | |||||
| }, | |||||
| roundingToHour (value) { | |||||
| return (Number(value)/3600).toFixed(2) | |||||
| }, | |||||
| transformTimestamp(timestamp){ | transformTimestamp(timestamp){ | ||||
| let a = new Date(timestamp*1000); | let a = new Date(timestamp*1000); | ||||
| const date = new Date(a); | const date = new Date(a); | ||||