@@ -6,6 +6,8 @@ import ( | |||||
"strings" | "strings" | ||||
"time" | "time" | ||||
"code.gitea.io/gitea/modules/log" | |||||
"code.gitea.io/gitea/modules/git" | "code.gitea.io/gitea/modules/git" | ||||
) | ) | ||||
@@ -213,7 +215,8 @@ func GetAllUserKPIStats() (map[string]*git.UserKPIStats, error) { | |||||
for _, repository := range repositorys { | for _, repository := range repositorys { | ||||
authorsOneRepo, err1 := git.GetUserKPIStats(repository.RepoPath()) | authorsOneRepo, err1 := git.GetUserKPIStats(repository.RepoPath()) | ||||
if err1 != nil { | if err1 != nil { | ||||
return nil, err | |||||
log.Warn("get user kpi status err:"+repository.RepoPath(), err1.Error()) | |||||
continue | |||||
} | } | ||||
for key, value := range authorsOneRepo { | for key, value := range authorsOneRepo { | ||||
@@ -89,7 +89,7 @@ type UserBusinessAnalysis struct { | |||||
//action :ActionCommitRepo // 5 | //action :ActionCommitRepo // 5 | ||||
CommitCount int `xorm:"NOT NULL DEFAULT 0"` | CommitCount int `xorm:"NOT NULL DEFAULT 0"` | ||||
//action :ActionCreateIssue // 10 | |||||
//action :ActionCreateIssue // 6 | |||||
IssueCount int `xorm:"NOT NULL DEFAULT 0"` | IssueCount int `xorm:"NOT NULL DEFAULT 0"` | ||||
//comment table current date | //comment table current date | ||||
@@ -406,7 +406,7 @@ func CounDataByDateAndReCount(wikiCountMap map[string]int, startTime time.Time, | |||||
DataDate := startTime.Format("2006-01-02") | DataDate := startTime.Format("2006-01-02") | ||||
CodeMergeCountMap := queryPullRequest(start_unix, end_unix) | CodeMergeCountMap := queryPullRequest(start_unix, end_unix) | ||||
CommitCountMap := queryAction(start_unix, end_unix, 5) | |||||
CommitCountMap := queryCommitAction(start_unix, end_unix, 5) | |||||
IssueCountMap := queryAction(start_unix, end_unix, 6) | IssueCountMap := queryAction(start_unix, end_unix, 6) | ||||
CommentCountMap := queryComment(start_unix, end_unix) | CommentCountMap := queryComment(start_unix, end_unix) | ||||
@@ -674,6 +674,24 @@ func queryPullRequest(start_unix int64, end_unix int64) map[int64]int { | |||||
return resultMap | return resultMap | ||||
} | } | ||||
func queryCommitAction(start_unix int64, end_unix int64, actionType int64) map[int64]int { | |||||
sess := x.NewSession() | |||||
defer sess.Close() | |||||
sess.Select("id,user_id,op_type,act_user_id").Table("action").Where("user_id=act_user_id and op_type=" + fmt.Sprint(actionType) + " and created_unix>=" + fmt.Sprint(start_unix) + " and created_unix<=" + fmt.Sprint(end_unix)) | |||||
actionList := make([]*Action, 0) | |||||
sess.Find(&actionList) | |||||
resultMap := make(map[int64]int) | |||||
log.Info("query action size=" + fmt.Sprint(len(actionList))) | |||||
for _, actionRecord := range actionList { | |||||
if _, ok := resultMap[actionRecord.UserID]; !ok { | |||||
resultMap[actionRecord.UserID] = 1 | |||||
} else { | |||||
resultMap[actionRecord.UserID] += 1 | |||||
} | |||||
} | |||||
return resultMap | |||||
} | |||||
func queryAction(start_unix int64, end_unix int64, actionType int64) map[int64]int { | func queryAction(start_unix int64, end_unix int64, actionType int64) map[int64]int { | ||||
sess := x.NewSession() | sess := x.NewSession() | ||||
defer sess.Close() | defer sess.Close() | ||||
@@ -0,0 +1 @@ | |||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1637739132178" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1729" width="64" height="64" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css"></style></defs><path d="M512 69.717333l383.018667 221.141334v442.282666L512 954.282667 128.981333 733.141333V290.858667L512 69.717333zM192.96 375.402667v320.768L480 861.888V541.141333l-287.04-165.76z m638.058667 0L544 541.162667V861.866667l287.018667-165.717334V375.424zM512 143.637333L215.722667 314.666667 512 485.717333l296.256-171.050666L512 143.616z" fill="#8a8a8a" p-id="1730"></path></svg> |
@@ -4,7 +4,6 @@ import ( | |||||
"fmt" | "fmt" | ||||
"net/http" | "net/http" | ||||
"net/url" | "net/url" | ||||
"strings" | |||||
"time" | "time" | ||||
"code.gitea.io/gitea/models" | "code.gitea.io/gitea/models" | ||||
@@ -39,6 +38,7 @@ func QueryUserStaticDataPage(ctx *context.Context) { | |||||
endTime = time.Now() | endTime = time.Now() | ||||
} else { | } else { | ||||
startTime, _ = time.ParseInLocation("2006-01-02", startDate, time.Local) | startTime, _ = time.ParseInLocation("2006-01-02", startDate, time.Local) | ||||
startTime = time.Date(startTime.Year(), startTime.Month(), startTime.Day(), 12, 0, 0, 0, startTime.Location()) | |||||
settingStartTime, _ := time.Parse("2006-01-02", setting.RadarMap.RecordBeginTime) | settingStartTime, _ := time.Parse("2006-01-02", setting.RadarMap.RecordBeginTime) | ||||
if startTime.Unix() < settingStartTime.Unix() { | if startTime.Unix() < settingStartTime.Unix() { | ||||
startTime = settingStartTime | startTime = settingStartTime | ||||
@@ -46,6 +46,8 @@ func QueryUserStaticDataPage(ctx *context.Context) { | |||||
} | } | ||||
endTime, _ = time.ParseInLocation("2006-01-02", endDate, time.Local) | endTime, _ = time.ParseInLocation("2006-01-02", endDate, time.Local) | ||||
endTime = endTime.AddDate(0, 0, 1) | endTime = endTime.AddDate(0, 0, 1) | ||||
endTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 23, 59, 59, 0, startTime.Location()) | |||||
isAll = false | isAll = false | ||||
log.Info("startTime=" + fmt.Sprint(startTime.Unix()) + " endDate=" + fmt.Sprint(endTime.Unix())) | log.Info("startTime=" + fmt.Sprint(startTime.Unix()) + " endDate=" + fmt.Sprint(endTime.Unix())) | ||||
} | } | ||||
@@ -126,23 +128,8 @@ func QueryUserStaticDataPage(ctx *context.Context) { | |||||
//设置默认打开的表单 | //设置默认打开的表单 | ||||
xlsx.SetActiveSheet(index) | xlsx.SetActiveSheet(index) | ||||
var filename string | |||||
nowTime := time.Now() | |||||
nowZeroTime := time.Date(nowTime.Year(), nowTime.Month(), nowTime.Day(), 0, 0, 0, 0, nowTime.Location()) | |||||
if endTime.Unix() >= nowZeroTime.Unix() { | |||||
endDate = nowZeroTime.AddDate(0, 0, -1).Format("2006-01-02") | |||||
} | |||||
if isAll { | |||||
filename = sheetName + "_" + ctx.Tr("user.static.all") + ".xlsx" | |||||
} else { | |||||
filename = sheetName + "_" + strings.ReplaceAll(startDate, "-", "") + "_" + strings.ReplaceAll(endDate, "-", "") + ".xlsx" | |||||
} | |||||
if len(userName) > 0 { | |||||
filename = sheetName + "_" + userName + "_" + strings.ReplaceAll(startDate, "-", "") + "_" + strings.ReplaceAll(endDate, "-", "") + ".xlsx" | |||||
} | |||||
filename := sheetName + "_" + ctx.Tr("user.static.all") + ".xlsx" | |||||
ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+url.QueryEscape(filename)) | ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+url.QueryEscape(filename)) | ||||
ctx.Resp.Header().Set("Content-Type", "application/octet-stream") | ctx.Resp.Header().Set("Content-Type", "application/octet-stream") | ||||
@@ -13,7 +13,7 @@ | |||||
<el-tab-pane label="项目分析" name="second" id="second" > | <el-tab-pane label="项目分析" name="second" id="second" > | ||||
<ProAnalysis ref='ProAnalysis'id="pro" v-if="isRouterAlive"></ProAnalysis> | <ProAnalysis ref='ProAnalysis'id="pro" v-if="isRouterAlive"></ProAnalysis> | ||||
<span slot="label"> | <span slot="label"> | ||||
<el-image style="width: 13px; height: 13px" src="/img/pro.svg"> | |||||
<el-image style="width: 13px; height: 13px" src="/img/pro_new.svg"> | |||||
</el-image> | </el-image> | ||||
项目分析 | 项目分析 | ||||
</span> | </span> | ||||
@@ -199,9 +199,9 @@ | |||||
<div class="item_l" id="charts"> | <div class="item_l" id="charts"> | ||||
<div style="font-size:14px;color:#409eff;margin:20px 5px;">OpenI指数:{{tableDataIDTotal.openi | rounding}}</div> | <div style="font-size:14px;color:#409eff;margin:20px 5px;">OpenI指数:{{tableDataIDTotal.openi | rounding}}</div> | ||||
<div > | <div > | ||||
<el-col :span='8' id="radar_openi" :style="{width: '400px', height: '300px'}"></el-col> | |||||
<el-col :span='8' id="radar_openi" :style="{ height: '300px'}"></el-col> | |||||
<el-col :span='16' id="line_openi" :style="{width: '600px', height: '300px',float:'right'}"></el-col> | |||||
<el-col :span='16' id="line_openi" :style="{ height: '300px',float:'right'}"></el-col> | |||||
</div> | </div> | ||||
</div> | </div> | ||||
</el-col> | </el-col> | ||||
@@ -292,7 +292,7 @@ | |||||
<input type="checkbox" class="checkboxchart" name="checkboxchart" checked="checked" value="commit"/>commit | <input type="checkbox" class="checkboxchart" name="checkboxchart" checked="checked" value="commit"/>commit | ||||
</label> | </label> | ||||
</div> | </div> | ||||
<div id ="selectData" style="width: 1280px;height: 300px;"> | |||||
<div id ="selectData" style="height: 300px;"> | |||||
</div> | </div> | ||||
@@ -712,8 +712,9 @@ | |||||
params:this.paramsID | params:this.paramsID | ||||
}).then((res)=>{ | }).then((res)=>{ | ||||
if (bool_val){ | if (bool_val){ | ||||
this.tableDataIDOpenI = res.data | |||||
this.tableDataIDOpenI = res.data | |||||
this.drawOpenItrend() | this.drawOpenItrend() | ||||
}else{ | }else{ | ||||
@@ -925,6 +926,11 @@ | |||||
] | ] | ||||
}; | }; | ||||
this.echartsOITd.setOption(option) | this.echartsOITd.setOption(option) | ||||
// setTimeout(function (){ | |||||
// window.onresize = function () { | |||||
// this.echartsOITd.resize(); | |||||
// } | |||||
// },200) | |||||
}, | }, | ||||
drawSelectData(){ | drawSelectData(){ | ||||
@@ -1018,6 +1024,11 @@ | |||||
] | ] | ||||
}; | }; | ||||
this.echartsSelectData.setOption(this.option) | this.echartsSelectData.setOption(this.option) | ||||
// setTimeout(function (){ | |||||
// window.onresize = function () { | |||||
// this.echartsSelectData.resize; | |||||
// } | |||||
// },200) | |||||
// // 使用刚指定的选择项数据显示图表。 | // // 使用刚指定的选择项数据显示图表。 | ||||
// var selectArr = this.echartsSelectData.getOption().legend[0].data;//legend所有值 | // var selectArr = this.echartsSelectData.getOption().legend[0].data;//legend所有值 | ||||
@@ -1117,14 +1128,13 @@ | |||||
mounted() { | mounted() { | ||||
// document.getElementById("all").style.outline="none" | |||||
// document.getElementById("all").focus() | |||||
this.getAllProList("all",7) | this.getAllProList("all",7) | ||||
console.log("id:"+this.pro_id); | console.log("id:"+this.pro_id); | ||||
// document.getElementById('radar_openi').style.width = document.getElementById('charts').offsetWidth*0.4+'px' | |||||
// document.getElementById('line_openi').style.width = document.getElementById('charts').offsetWidth*0.6+'px' | |||||
// document.getElementById('selectData').style.width = document.getElementById('linecharts').offsetWidth+'px' | |||||
document.getElementById('radar_openi').style.width = document.getElementById('pro_main').offsetWidth*0.22+'px' | |||||
document.getElementById('line_openi').style.width = document.getElementById('pro_main').offsetWidth*0.33+'px' | |||||
document.getElementById('selectData').style.width = document.getElementById('pro_main').offsetWidth*0.8+'px' | |||||
this.radarOpenI = this.$echarts.init(document.getElementById('radar_openi')) | this.radarOpenI = this.$echarts.init(document.getElementById('radar_openi')) | ||||
this.echartsOITd = this.$echarts.init(document.getElementById('line_openi')) | this.echartsOITd = this.$echarts.init(document.getElementById('line_openi')) | ||||
this.echartsSelectData = this.$echarts.init(document.getElementById('selectData')) | this.echartsSelectData = this.$echarts.init(document.getElementById('selectData')) | ||||
@@ -1266,4 +1276,4 @@ | |||||
margin-top: 10px; | margin-top: 10px; | ||||
font-weight:bold; | font-weight:bold; | ||||
} | } | ||||
</style> | |||||
</style> |