You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
308 lines
8.2 KiB
308 lines
8.2 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"fmt" |
|
"time" |
|
|
|
"go-common/app/admin/ep/saga/conf" |
|
"go-common/app/admin/ep/saga/model" |
|
"go-common/library/cache/memcache" |
|
"go-common/library/log" |
|
|
|
"github.com/xanzy/go-gitlab" |
|
) |
|
|
|
// QueryProject query commit info according to project id. |
|
func (s *Service) QueryProject(c context.Context, object string, req *model.ProjectDataReq) (resp *model.ProjectDataResp, err error) { |
|
var ( |
|
data []*model.DataWithTime |
|
queryDes string |
|
total int |
|
) |
|
|
|
log.Info("QuerySingleProjectData Type: %d", req.QueryType) |
|
switch req.QueryType { |
|
case model.LastYearPerMonth: |
|
queryDes = model.LastYearPerMonthNote |
|
case model.LastMonthPerDay: |
|
queryDes = model.LastMonthPerDayNote |
|
case model.LastYearPerDay: |
|
queryDes = model.LastYearPerDayNote |
|
default: |
|
log.Warn("QueryProjectCommit Type is not in range") |
|
return |
|
} |
|
queryDes = req.ProjectName + " " + object + queryDes |
|
|
|
if data, total, err = s.QueryProjectByTime(req.ProjectID, object, req.QueryType); err != nil { |
|
return |
|
} |
|
|
|
resp = &model.ProjectDataResp{ |
|
ProjectName: req.ProjectName, |
|
QueryDes: queryDes, |
|
Total: total, |
|
Data: data, |
|
} |
|
return |
|
} |
|
|
|
// QueryProjectByTime ... |
|
func (s *Service) QueryProjectByTime(projectID int, object string, queryType int) (resp []*model.DataWithTime, allNum int, err error) { |
|
var ( |
|
layout = "2006-01-02" |
|
fmtLayout = `%d-%d-%d 00:00:00` |
|
//response *gitlab.Response |
|
since time.Time |
|
until time.Time |
|
count int |
|
totalItems int |
|
) |
|
|
|
year, month, _ := time.Now().Date() |
|
thisMonth := time.Date(year, month, 1, 0, 0, 0, 0, time.Local) |
|
|
|
if queryType == model.LastYearPerMonth { |
|
count = model.MonthNumPerYear |
|
} else if queryType == model.LastMonthPerDay { |
|
_, _, count = thisMonth.AddDate(0, 0, -1).Date() |
|
} else if queryType == model.LastYearPerDay { |
|
count = model.DayNumPerYear |
|
} |
|
|
|
for i := 1; i <= count; i++ { |
|
if queryType == model.LastYearPerMonth { |
|
since = thisMonth.AddDate(0, -i, 0) |
|
until = thisMonth.AddDate(0, -i+1, 0) |
|
} else if queryType == model.LastMonthPerDay { |
|
since = thisMonth.AddDate(0, 0, -i) |
|
until = thisMonth.AddDate(0, 0, -i+1) |
|
} else if queryType == model.LastYearPerDay { |
|
since = thisMonth.AddDate(0, 0, -i) |
|
until = thisMonth.AddDate(0, 0, -i+1) |
|
} |
|
|
|
sinceStr := fmt.Sprintf(fmtLayout, since.Year(), since.Month(), since.Day()) |
|
untilStr := fmt.Sprintf(fmtLayout, until.Year(), until.Month(), until.Day()) |
|
if object == model.ObjectCommit { |
|
/*if _, response, err = s.gitlab.ListProjectCommit(projectID, 1, &since, &until); err != nil { |
|
return |
|
}*/ |
|
if totalItems, err = s.dao.CountCommitByTime(projectID, sinceStr, untilStr); err != nil { |
|
return |
|
} |
|
} else if object == model.ObjectMR { |
|
/*if _, response, err = s.gitlab.ListProjectMergeRequests(projectID, &since, &until, -1); err != nil { |
|
return |
|
}*/ |
|
if totalItems, err = s.dao.CountMRByTime(projectID, sinceStr, untilStr); err != nil { |
|
return |
|
} |
|
} else { |
|
log.Warn("QueryProjectByTime object(%s) is not support!", object) |
|
return |
|
} |
|
|
|
perData := &model.DataWithTime{ |
|
//TotalItem: response.TotalItems, |
|
TotalItem: totalItems, |
|
StartTime: since.Format(layout), |
|
EndTime: until.Format(layout), |
|
} |
|
resp = append(resp, perData) |
|
//allNum = allNum + response.TotalItems |
|
allNum = allNum + totalItems |
|
} |
|
return |
|
} |
|
|
|
// QueryTeam ... |
|
func (s *Service) QueryTeam(c context.Context, object string, req *model.TeamDataRequest) (resp *model.TeamDataResp, err error) { |
|
var ( |
|
projectInfo []*model.ProjectInfo |
|
reqProject = &model.ProjectInfoRequest{} |
|
|
|
dataMap = make(map[string]*model.TeamDataResp) |
|
data []*model.DataWithTime |
|
queryDes string |
|
total int |
|
key string |
|
keyNotExist bool |
|
) |
|
|
|
if len(req.Department) <= 0 && len(req.Business) <= 0 { |
|
log.Warn("query department and business are empty!") |
|
return |
|
} |
|
|
|
//log.Info("QueryTeamCommit Query Type: %d", req.QueryType) |
|
switch req.QueryType { |
|
case model.LastYearPerMonth: |
|
queryDes = model.LastYearPerMonthNote |
|
case model.LastMonthPerDay: |
|
queryDes = model.LastMonthPerDayNote |
|
case model.LastYearPerDay: |
|
queryDes = model.LastYearPerDayNote |
|
default: |
|
log.Warn("QueryTeamCommit Type is not in range") |
|
return |
|
} |
|
queryDes = req.Department + " " + req.Business + " " + object + queryDes |
|
|
|
//get value from mc |
|
key = "saga_admin_" + req.Department + "_" + req.Business + "_" + model.KeyTypeConst[req.QueryType] |
|
if err = s.dao.GetData(c, key, &dataMap); err != nil { |
|
if err == memcache.ErrNotFound { |
|
log.Warn("no such key (%s) in cache, err (%s)", key, err.Error()) |
|
keyNotExist = true |
|
} else { |
|
return |
|
} |
|
} |
|
if _, ok := dataMap[object]; !ok { |
|
keyNotExist = true |
|
} else { |
|
resp = dataMap[object] |
|
return |
|
} |
|
|
|
log.Info("sync team %s start => type= %d, Department= %s, Business= %s", object, req.QueryType, req.Department, req.Business) |
|
|
|
reqProject.Department = req.Department |
|
reqProject.Business = req.Business |
|
if _, projectInfo, err = s.dao.QueryProjectInfo(false, reqProject); err != nil { |
|
return |
|
} |
|
|
|
if len(projectInfo) <= 0 { |
|
log.Warn("Found no project!") |
|
return |
|
} |
|
|
|
if data, total, err = s.QueryTeamByTime(object, req, req.QueryType, projectInfo); err != nil { |
|
return |
|
} |
|
|
|
resp = &model.TeamDataResp{ |
|
Department: req.Department, |
|
Business: req.Business, |
|
QueryDes: queryDes, |
|
Total: total, |
|
Data: data, |
|
} |
|
|
|
//set value to mc |
|
if keyNotExist { |
|
dataMap[object] = resp |
|
if err = s.dao.SetData(c, key, dataMap); err != nil { |
|
return |
|
} |
|
} |
|
|
|
log.Info("sync team %s end", object) |
|
return |
|
} |
|
|
|
// QueryTeamByTime query commit info per month of last year and per day of last month according to team. |
|
func (s *Service) QueryTeamByTime(object string, req *model.TeamDataRequest, queryType int, projectInfo []*model.ProjectInfo) (resp []*model.DataWithTime, allNum int, err error) { |
|
var ( |
|
layout = "2006-01-02" |
|
response *gitlab.Response |
|
since time.Time |
|
until time.Time |
|
count int |
|
num int |
|
) |
|
|
|
year, month, _ := time.Now().Date() |
|
thisMonth := time.Date(year, month, 1, 0, 0, 0, 0, time.Local) |
|
|
|
if queryType == model.LastYearPerMonth { |
|
count = model.MonthNumPerYear |
|
} else if queryType == model.LastMonthPerDay { |
|
_, _, count = thisMonth.AddDate(0, 0, -1).Date() |
|
} else if queryType == model.LastYearPerDay { |
|
count = model.DayNumPerYear |
|
} |
|
|
|
for i := 1; i <= count; i++ { |
|
if queryType == model.LastYearPerMonth { |
|
since = thisMonth.AddDate(0, -i, 0) |
|
until = thisMonth.AddDate(0, -i+1, 0) |
|
} else if queryType == model.LastMonthPerDay { |
|
since = thisMonth.AddDate(0, 0, -i) |
|
until = thisMonth.AddDate(0, 0, -i+1) |
|
} else if queryType == model.LastYearPerDay { |
|
since = thisMonth.AddDate(0, 0, -i) |
|
until = thisMonth.AddDate(0, 0, -i+1) |
|
} |
|
|
|
num = 0 |
|
for _, project := range projectInfo { |
|
if object == model.ObjectCommit { |
|
if _, response, err = s.gitlab.ListProjectCommit(project.ProjectID, 1, &since, &until); err != nil { |
|
return |
|
} |
|
} else if object == model.ObjectMR { |
|
if _, response, err = s.gitlab.ListProjectMergeRequests(project.ProjectID, &since, &until, -1); err != nil { |
|
return |
|
} |
|
} else { |
|
log.Warn("QueryTeamByTime object(%s) is not support!", object) |
|
return |
|
} |
|
num = num + response.TotalItems |
|
} |
|
|
|
perData := &model.DataWithTime{ |
|
TotalItem: num, |
|
StartTime: since.Format(layout), |
|
EndTime: until.Format(layout), |
|
} |
|
resp = append(resp, perData) |
|
allNum = allNum + num |
|
} |
|
return |
|
} |
|
|
|
// SyncData ... |
|
func (s *Service) SyncData(c context.Context) (err error) { |
|
log.Info("sync all data info start!") |
|
for _, de := range conf.Conf.Property.DeInfo { |
|
for _, bu := range conf.Conf.Property.BuInfo { |
|
for k, keyType := range model.KeyTypeConst { |
|
|
|
key := "saga_admin_" + de.Value + "_" + bu.Value + "_" + keyType |
|
if err = s.dao.DeleteData(c, key); err != nil { |
|
return |
|
} |
|
|
|
req := &model.TeamDataRequest{ |
|
TeamParam: model.TeamParam{ |
|
Department: de.Value, |
|
Business: bu.Value, |
|
}, |
|
QueryType: k, |
|
} |
|
|
|
if k == 3 { |
|
if _, err = s.QueryTeamPipeline(c, req); err != nil { |
|
return |
|
} |
|
continue |
|
} |
|
|
|
if _, err = s.QueryTeamCommit(c, req); err != nil { |
|
return |
|
} |
|
|
|
if _, err = s.QueryTeamMr(c, req); err != nil { |
|
return |
|
} |
|
} |
|
} |
|
} |
|
log.Info("sync all data info end!") |
|
return |
|
}
|
|
|