You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

user_data_analysis.go 29 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723
  1. package repo
  2. import (
  3. "fmt"
  4. "net/http"
  5. "net/url"
  6. "os"
  7. "time"
  8. "code.gitea.io/gitea/models"
  9. "code.gitea.io/gitea/modules/context"
  10. "code.gitea.io/gitea/modules/git"
  11. "code.gitea.io/gitea/modules/log"
  12. "code.gitea.io/gitea/modules/setting"
  13. "code.gitea.io/gitea/services/mailer"
  14. "github.com/360EntSecGroup-Skylar/excelize/v2"
  15. )
  16. const (
  17. PAGE_SIZE = 2000
  18. Excel_File_Path = "/useranalysis/"
  19. )
  20. func getUserMetricsExcelHeader(ctx *context.Context) map[string]string {
  21. excelHeader := make([]string, 0)
  22. excelHeader = append(excelHeader, ctx.Tr("user.metrics.date"))
  23. excelHeader = append(excelHeader, ctx.Tr("user.metrics.newregistuser"))
  24. excelHeader = append(excelHeader, ctx.Tr("user.metrics.newregistandactiveuser"))
  25. excelHeader = append(excelHeader, ctx.Tr("user.metrics.hasactivateuser"))
  26. excelHeader = append(excelHeader, ctx.Tr("user.metrics.newregistnotactiveuser"))
  27. excelHeader = append(excelHeader, ctx.Tr("user.metrics.newuseractiveindex"))
  28. excelHeader = append(excelHeader, ctx.Tr("user.metrics.currentdayactivity"))
  29. excelHeader = append(excelHeader, ctx.Tr("user.metrics.totalregistuser"))
  30. excelHeader = append(excelHeader, ctx.Tr("user.metrics.totalactiveduser"))
  31. excelHeader = append(excelHeader, ctx.Tr("user.metrics.totalhasactivityuser"))
  32. excelHeaderMap := make(map[string]string, 0)
  33. var i byte
  34. i = 0
  35. for _, value := range excelHeader {
  36. excelColumn := getColumn(i) + fmt.Sprint(1)
  37. excelHeaderMap[excelColumn] = value
  38. i++
  39. }
  40. return excelHeaderMap
  41. }
  42. func writeUserMetricsExcel(row int, xlsx *excelize.File, sheetName string, userMetrics *models.UserMetrics) {
  43. rows := fmt.Sprint(row)
  44. var tmp byte
  45. tmp = 0
  46. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userMetrics.DisplayDate)
  47. tmp = tmp + 1
  48. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userMetrics.ActivateRegistUser+userMetrics.NotActivateRegistUser)
  49. tmp = tmp + 1
  50. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userMetrics.ActivateRegistUser)
  51. tmp = tmp + 1
  52. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userMetrics.RegistActivityUser)
  53. tmp = tmp + 1
  54. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userMetrics.NotActivateRegistUser)
  55. tmp = tmp + 1
  56. t := userMetrics.ActivateIndex * 100
  57. value := "-"
  58. if t < 100 && t > 0 {
  59. value = fmt.Sprintf("%.2f", t) + "%"
  60. } else if t >= 100 {
  61. value = "100%"
  62. }
  63. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, value)
  64. tmp = tmp + 1
  65. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userMetrics.HasActivityUser)
  66. tmp = tmp + 1
  67. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userMetrics.TotalUser)
  68. tmp = tmp + 1
  69. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userMetrics.TotalActivateRegistUser)
  70. tmp = tmp + 1
  71. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userMetrics.TotalHasActivityUser)
  72. }
  73. func getExcelHeader(ctx *context.Context) map[string]string {
  74. excelHeader := make([]string, 0)
  75. excelHeader = append(excelHeader, ctx.Tr("user.static.id"))
  76. excelHeader = append(excelHeader, ctx.Tr("user.static.name"))
  77. excelHeader = append(excelHeader, ctx.Tr("user.static.UserIndex"))
  78. excelHeader = append(excelHeader, ctx.Tr("user.static.UserIndexPrimitive"))
  79. excelHeader = append(excelHeader, ctx.Tr("user.static.codemergecount"))
  80. excelHeader = append(excelHeader, ctx.Tr("user.static.commitcount"))
  81. excelHeader = append(excelHeader, ctx.Tr("user.static.issuecount"))
  82. excelHeader = append(excelHeader, ctx.Tr("user.static.commentcount"))
  83. excelHeader = append(excelHeader, ctx.Tr("user.static.focusrepocount"))
  84. excelHeader = append(excelHeader, ctx.Tr("user.static.starrepocount"))
  85. excelHeader = append(excelHeader, ctx.Tr("user.static.logincount"))
  86. excelHeader = append(excelHeader, ctx.Tr("user.static.watchedcount"))
  87. excelHeader = append(excelHeader, ctx.Tr("user.static.commitcodesize"))
  88. excelHeader = append(excelHeader, ctx.Tr("user.static.solveissuecount"))
  89. excelHeader = append(excelHeader, ctx.Tr("user.static.encyclopediascount"))
  90. excelHeader = append(excelHeader, ctx.Tr("user.static.createrepocount"))
  91. excelHeader = append(excelHeader, ctx.Tr("user.static.openiindex"))
  92. excelHeader = append(excelHeader, ctx.Tr("user.static.CloudBrainTaskNum"))
  93. excelHeader = append(excelHeader, ctx.Tr("user.static.CloudBrainRunTime"))
  94. excelHeader = append(excelHeader, ctx.Tr("user.static.CommitDatasetNum"))
  95. excelHeader = append(excelHeader, ctx.Tr("user.static.CommitModelCount"))
  96. excelHeader = append(excelHeader, ctx.Tr("user.static.FocusOtherUser"))
  97. excelHeader = append(excelHeader, ctx.Tr("user.static.CollectDataset"))
  98. excelHeader = append(excelHeader, ctx.Tr("user.static.CollectedDataset"))
  99. excelHeader = append(excelHeader, ctx.Tr("user.static.RecommendDataset"))
  100. excelHeader = append(excelHeader, ctx.Tr("user.static.CollectImage"))
  101. excelHeader = append(excelHeader, ctx.Tr("user.static.CollectedImage"))
  102. excelHeader = append(excelHeader, ctx.Tr("user.static.RecommendImage"))
  103. excelHeader = append(excelHeader, ctx.Tr("user.static.email"))
  104. excelHeader = append(excelHeader, ctx.Tr("user.static.location"))
  105. excelHeader = append(excelHeader, ctx.Tr("user.static.registdate"))
  106. excelHeader = append(excelHeader, ctx.Tr("user.static.countdate"))
  107. excelHeaderMap := make(map[string]string, 0)
  108. var i byte
  109. i = 0
  110. for _, value := range excelHeader {
  111. excelColumn := getColumn(i) + fmt.Sprint(1)
  112. log.Info("excelColumn=" + excelColumn)
  113. excelHeaderMap[excelColumn] = value
  114. i++
  115. }
  116. return excelHeaderMap
  117. }
  118. func writeExcel(row int, xlsx *excelize.File, sheetName string, userRecord *models.UserBusinessAnalysisAll) {
  119. rows := fmt.Sprint(row)
  120. var tmp byte
  121. tmp = 0
  122. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.ID)
  123. tmp = tmp + 1
  124. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.Name)
  125. tmp = tmp + 1
  126. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, fmt.Sprintf("%.2f", userRecord.UserIndex))
  127. tmp = tmp + 1
  128. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, fmt.Sprintf("%.2f", userRecord.UserIndexPrimitive))
  129. tmp = tmp + 1
  130. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CodeMergeCount)
  131. tmp = tmp + 1
  132. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CommitCount)
  133. tmp = tmp + 1
  134. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.IssueCount)
  135. tmp = tmp + 1
  136. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CommentCount)
  137. tmp = tmp + 1
  138. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.FocusRepoCount)
  139. tmp = tmp + 1
  140. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.StarRepoCount)
  141. tmp = tmp + 1
  142. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.LoginCount)
  143. tmp = tmp + 1
  144. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.WatchedCount)
  145. tmp = tmp + 1
  146. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CommitCodeSize)
  147. tmp = tmp + 1
  148. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.SolveIssueCount)
  149. tmp = tmp + 1
  150. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.EncyclopediasCount)
  151. tmp = tmp + 1
  152. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CreateRepoCount)
  153. tmp = tmp + 1
  154. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, fmt.Sprintf("%.2f", userRecord.OpenIIndex))
  155. tmp = tmp + 1
  156. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CloudBrainTaskNum)
  157. tmp = tmp + 1
  158. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, fmt.Sprintf("%.2f", float64(userRecord.CloudBrainRunTime)/3600))
  159. tmp = tmp + 1
  160. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CommitDatasetNum)
  161. tmp = tmp + 1
  162. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CommitModelCount)
  163. tmp = tmp + 1
  164. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.FocusOtherUser)
  165. tmp = tmp + 1
  166. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CollectDataset)
  167. tmp = tmp + 1
  168. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CollectedDataset)
  169. tmp = tmp + 1
  170. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.RecommendDataset)
  171. tmp = tmp + 1
  172. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CollectImage)
  173. tmp = tmp + 1
  174. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CollectedImage)
  175. tmp = tmp + 1
  176. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.RecommendImage)
  177. tmp = tmp + 1
  178. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.Email)
  179. tmp = tmp + 1
  180. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.UserLocation)
  181. tmp = tmp + 1
  182. formatTime := userRecord.RegistDate.Format("2006-01-02 15:04:05")
  183. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, formatTime[0:len(formatTime)-3])
  184. tmp = tmp + 1
  185. formatTime = userRecord.DataDate
  186. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, formatTime)
  187. }
  188. func writeExcelPage(row int, xlsx *excelize.File, sheetName string, userRecord *models.UserBusinessAnalysis) {
  189. rows := fmt.Sprint(row)
  190. var tmp byte
  191. tmp = 0
  192. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.ID)
  193. tmp = tmp + 1
  194. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.Name)
  195. tmp = tmp + 1
  196. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, fmt.Sprintf("%.2f", userRecord.UserIndex))
  197. tmp = tmp + 1
  198. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, fmt.Sprintf("%.2f", userRecord.UserIndexPrimitive))
  199. tmp = tmp + 1
  200. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CodeMergeCount)
  201. tmp = tmp + 1
  202. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CommitCount)
  203. tmp = tmp + 1
  204. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.IssueCount)
  205. tmp = tmp + 1
  206. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CommentCount)
  207. tmp = tmp + 1
  208. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.FocusRepoCount)
  209. tmp = tmp + 1
  210. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.StarRepoCount)
  211. tmp = tmp + 1
  212. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.LoginCount)
  213. tmp = tmp + 1
  214. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.WatchedCount)
  215. tmp = tmp + 1
  216. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CommitCodeSize)
  217. tmp = tmp + 1
  218. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.SolveIssueCount)
  219. tmp = tmp + 1
  220. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.EncyclopediasCount)
  221. tmp = tmp + 1
  222. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CreateRepoCount)
  223. tmp = tmp + 1
  224. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, fmt.Sprintf("%.2f", userRecord.OpenIIndex))
  225. tmp = tmp + 1
  226. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CloudBrainTaskNum)
  227. tmp = tmp + 1
  228. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, fmt.Sprintf("%.2f", float64(userRecord.CloudBrainRunTime)/3600))
  229. tmp = tmp + 1
  230. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CommitDatasetNum)
  231. tmp = tmp + 1
  232. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CommitModelCount)
  233. tmp = tmp + 1
  234. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.FocusOtherUser)
  235. tmp = tmp + 1
  236. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CollectDataset)
  237. tmp = tmp + 1
  238. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CollectedDataset)
  239. tmp = tmp + 1
  240. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.RecommendDataset)
  241. tmp = tmp + 1
  242. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CollectImage)
  243. tmp = tmp + 1
  244. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.CollectedImage)
  245. tmp = tmp + 1
  246. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.RecommendImage)
  247. tmp = tmp + 1
  248. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.Email)
  249. tmp = tmp + 1
  250. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.UserLocation)
  251. tmp = tmp + 1
  252. formatTime := userRecord.RegistDate.Format("2006-01-02 15:04:05")
  253. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, formatTime[0:len(formatTime)-3])
  254. tmp = tmp + 1
  255. formatTime = userRecord.DataDate
  256. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, formatTime)
  257. }
  258. func getColumn(tmp byte) string {
  259. var tmpA byte
  260. tmpA = 'A'
  261. if tmp < 26 {
  262. return string(tmpA + tmp)
  263. } else {
  264. return "A" + string(tmpA+(tmp-26))
  265. }
  266. }
  267. func queryUserDataPage(ctx *context.Context, tableName string, queryObj interface{}) {
  268. page := ctx.QueryInt("page")
  269. if page <= 0 {
  270. page = 1
  271. }
  272. pageSize := ctx.QueryInt("pageSize")
  273. if pageSize <= 0 {
  274. pageSize = setting.UI.IssuePagingNum
  275. }
  276. userName := ctx.Query("userName")
  277. IsReturnFile := ctx.QueryBool("IsReturnFile")
  278. if IsReturnFile {
  279. //writer exec file.
  280. xlsx := excelize.NewFile()
  281. sheetName := ctx.Tr("user.static.sheetname")
  282. index := xlsx.NewSheet(sheetName)
  283. xlsx.DeleteSheet("Sheet1")
  284. dataHeader := getExcelHeader(ctx)
  285. for k, v := range dataHeader {
  286. //设置单元格的值
  287. xlsx.SetCellValue(sheetName, k, v)
  288. }
  289. _, count := models.QueryUserStaticDataByTableName(1, 1, tableName, queryObj, userName)
  290. var indexTotal int64
  291. indexTotal = 0
  292. row := 1
  293. for {
  294. re, _ := models.QueryUserStaticDataByTableName(int(indexTotal), PAGE_SIZE, tableName, queryObj, "")
  295. log.Info("return count=" + fmt.Sprint(count))
  296. for _, userRecord := range re {
  297. row++
  298. writeExcel(row, xlsx, sheetName, userRecord)
  299. }
  300. indexTotal += PAGE_SIZE
  301. if indexTotal >= count {
  302. break
  303. }
  304. }
  305. //设置默认打开的表单
  306. xlsx.SetActiveSheet(index)
  307. filename := sheetName + "_" + ctx.Tr("user.static."+tableName) + ".xlsx"
  308. ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+url.QueryEscape(filename))
  309. ctx.Resp.Header().Set("Content-Type", "application/octet-stream")
  310. if _, err := xlsx.WriteTo(ctx.Resp); err != nil {
  311. log.Info("writer exel error." + err.Error())
  312. }
  313. } else {
  314. re, count := models.QueryUserStaticDataByTableName((page-1)*pageSize, pageSize, tableName, queryObj, userName)
  315. mapInterface := make(map[string]interface{})
  316. mapInterface["data"] = re
  317. mapInterface["count"] = count
  318. ctx.JSON(http.StatusOK, mapInterface)
  319. }
  320. }
  321. func queryMetrics(ctx *context.Context, tableName string, startTime time.Time, endTime time.Time) {
  322. IsReturnFile := ctx.QueryBool("IsReturnFile")
  323. var count int64
  324. result := make([]*models.UserMetrics, 0)
  325. if tableName == "public.user_business_analysis_current_year" {
  326. result = models.QueryMetricsForYear(startTime.Unix(), endTime.Unix())
  327. count = int64(len(result))
  328. } else if tableName == "public.user_business_analysis_all" {
  329. result = models.QueryMetricsForAll(startTime.Unix(), endTime.Unix())
  330. count = int64(len(result))
  331. } else {
  332. result, count = models.QueryMetricsPage(startTime.Unix(), endTime.Unix())
  333. }
  334. if IsReturnFile {
  335. //writer exec file.
  336. xlsx := excelize.NewFile()
  337. sheetName := ctx.Tr("user.metrics.sheetname")
  338. index := xlsx.NewSheet(sheetName)
  339. xlsx.DeleteSheet("Sheet1")
  340. dataHeader := getUserMetricsExcelHeader(ctx)
  341. for k, v := range dataHeader {
  342. //设置单元格的值
  343. xlsx.SetCellValue(sheetName, k, v)
  344. }
  345. row := 1
  346. log.Info("return count=" + fmt.Sprint(count))
  347. for _, userRecord := range result {
  348. row++
  349. writeUserMetricsExcel(row, xlsx, sheetName, userRecord)
  350. }
  351. //设置默认打开的表单
  352. xlsx.SetActiveSheet(index)
  353. filename := sheetName + "_" + ctx.Tr("user.static."+tableName) + ".xlsx"
  354. if tableName == "" {
  355. filename = sheetName + "_" + getTimeFileName(startTime) + "_" + getTimeFileName(endTime) + ".xlsx"
  356. }
  357. ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+url.QueryEscape(filename))
  358. ctx.Resp.Header().Set("Content-Type", "application/octet-stream")
  359. if _, err := xlsx.WriteTo(ctx.Resp); err != nil {
  360. log.Info("writer exel error." + err.Error())
  361. }
  362. } else {
  363. mapInterface := make(map[string]interface{})
  364. mapInterface["data"] = result
  365. mapInterface["count"] = count
  366. if tableName == "public.user_business_analysis_yesterday" {
  367. mapInterface["datarecordbegintime"] = setting.RadarMap.GrowthBeginTime
  368. if len(result) > 0 {
  369. dateTime := time.Unix(result[0].CountDate, 0)
  370. mapInterface["lastUpdatedTime"] = dateTime.Format("2006-01-02 15:04:05")
  371. } else {
  372. mapInterface["lastUpdatedTime"] = ""
  373. }
  374. }
  375. ctx.JSON(http.StatusOK, mapInterface)
  376. }
  377. }
  378. func getTimeFileName(t time.Time) string {
  379. t = t.Local()
  380. return t.Format("20060102")
  381. }
  382. func QueryRankingList(ctx *context.Context) {
  383. key := ctx.Query("key")
  384. tableName := ctx.Query("tableName")
  385. limit := ctx.QueryInt("limit")
  386. result, count := models.QueryRankList(key, tableName, limit)
  387. mapInterface := make(map[string]interface{})
  388. mapInterface["data"] = result
  389. mapInterface["count"] = count
  390. ctx.JSON(http.StatusOK, mapInterface)
  391. }
  392. func DownloadUserDefineFile(ctx *context.Context) {
  393. filename := ctx.Query("filename")
  394. length := len(filename)
  395. if filename[0:1] == "\"" {
  396. filename = filename[1 : length-1]
  397. }
  398. allFilename := setting.AppDataPath + Excel_File_Path + filename
  399. log.Info("allFilename=" + allFilename)
  400. _, err := os.Stat(allFilename)
  401. if err != nil { //文件不存在
  402. log.Info("file not exist.")
  403. ctx.JSON(http.StatusOK, "File Not Exist.")
  404. } else {
  405. ctx.ServeFile(allFilename, url.QueryEscape(filename))
  406. }
  407. }
  408. func QueryUserMetricsCurrentMonth(ctx *context.Context) {
  409. currentTimeNow := time.Now()
  410. pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 23, 59, 59, 0, currentTimeNow.Location())
  411. pageStartTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), 1, 0, 0, 0, 0, currentTimeNow.Location())
  412. pageStartTime = getStartTime(pageStartTime)
  413. queryMetrics(ctx, "public.user_business_analysis_current_month", pageStartTime, pageEndTime)
  414. }
  415. func QueryUserStaticCurrentMonth(ctx *context.Context) {
  416. queryUserDataPage(ctx, "public.user_business_analysis_current_month", new(models.UserBusinessAnalysisCurrentMonth))
  417. }
  418. func getStartTime(pageStartTime time.Time) time.Time {
  419. t, _ := time.ParseInLocation("2006-01-02", setting.RadarMap.GrowthBeginTime, time.Local)
  420. t = t.UTC()
  421. if pageStartTime.Before(t) {
  422. pageStartTime = t
  423. }
  424. return pageStartTime
  425. }
  426. func QueryUserMetricsCurrentWeek(ctx *context.Context) {
  427. currentTimeNow := time.Now()
  428. offset := int(time.Monday - currentTimeNow.Weekday())
  429. if offset > 0 {
  430. offset = -6
  431. }
  432. pageStartTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, offset)
  433. pageStartTime = getStartTime(pageStartTime)
  434. pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 23, 59, 59, 0, currentTimeNow.Location())
  435. queryMetrics(ctx, "public.user_business_analysis_current_week", pageStartTime, pageEndTime)
  436. }
  437. func QueryUserStaticCurrentWeek(ctx *context.Context) {
  438. queryUserDataPage(ctx, "public.user_business_analysis_current_week", new(models.UserBusinessAnalysisCurrentWeek))
  439. }
  440. func QueryUserStaticLastWeek(ctx *context.Context) {
  441. queryUserDataPage(ctx, "public.user_business_analysis_last_week", new(models.UserBusinessAnalysisLastWeek))
  442. }
  443. func QueryUserMetricsCurrentYear(ctx *context.Context) {
  444. currentTimeNow := time.Now()
  445. pageStartTime := time.Date(currentTimeNow.Year(), 1, 1, 0, 0, 0, 0, currentTimeNow.Location())
  446. pageStartTime = getStartTime(pageStartTime)
  447. pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 23, 59, 59, 0, currentTimeNow.Location())
  448. queryMetrics(ctx, "public.user_business_analysis_current_year", pageStartTime, pageEndTime)
  449. }
  450. func QueryUserStaticCurrentYear(ctx *context.Context) {
  451. queryUserDataPage(ctx, "public.user_business_analysis_current_year", new(models.UserBusinessAnalysisCurrentYear))
  452. }
  453. func QueryUserMetricsLast30Day(ctx *context.Context) {
  454. currentTimeNow := time.Now()
  455. pageStartTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, -30)
  456. pageStartTime = getStartTime(pageStartTime)
  457. pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 23, 59, 59, 0, currentTimeNow.Location())
  458. queryMetrics(ctx, "public.user_business_analysis_last30_day", pageStartTime, pageEndTime)
  459. }
  460. func QueryUserStaticLast30Day(ctx *context.Context) {
  461. queryUserDataPage(ctx, "public.user_business_analysis_last30_day", new(models.UserBusinessAnalysisLast30Day))
  462. }
  463. func QueryUserMetricsLastMonth(ctx *context.Context) {
  464. currentTimeNow := time.Now()
  465. thisMonth := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), 1, 0, 0, 0, 0, currentTimeNow.Location())
  466. pageStartTime := thisMonth.AddDate(0, -1, 0)
  467. pageStartTime = getStartTime(pageStartTime)
  468. pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), 1, 23, 59, 59, 0, currentTimeNow.Location()).AddDate(0, 0, -1)
  469. queryMetrics(ctx, "public.user_business_analysis_last_month", pageStartTime, pageEndTime)
  470. }
  471. func QueryUserStaticLastMonth(ctx *context.Context) {
  472. queryUserDataPage(ctx, "public.user_business_analysis_last_month", new(models.UserBusinessAnalysisLastMonth))
  473. }
  474. func QueryUserMetricsYesterday(ctx *context.Context) {
  475. currentTimeNow := time.Now()
  476. pageStartTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, time.Local)
  477. pageStartTime = getStartTime(pageStartTime)
  478. pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 23, 59, 59, 0, currentTimeNow.Location())
  479. queryMetrics(ctx, "public.user_business_analysis_yesterday", pageStartTime, pageEndTime)
  480. }
  481. func QueryUserStaticYesterday(ctx *context.Context) {
  482. queryUserDataPage(ctx, "public.user_business_analysis_yesterday", new(models.UserBusinessAnalysisYesterday))
  483. }
  484. func QueryUserMetricsAll(ctx *context.Context) {
  485. currentTimeNow := time.Now()
  486. pageStartTime := time.Date(2022, 4, 5, 0, 0, 0, 0, currentTimeNow.Location())
  487. pageStartTime = getStartTime(pageStartTime)
  488. pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 23, 59, 59, 0, currentTimeNow.Location())
  489. queryMetrics(ctx, "public.user_business_analysis_all", pageStartTime, pageEndTime)
  490. }
  491. func QueryUserStaticAll(ctx *context.Context) {
  492. queryUserDataPage(ctx, "public.user_business_analysis_all", new(models.UserBusinessAnalysisAll))
  493. }
  494. func QueryUserMetricDataPage(ctx *context.Context) {
  495. startDate := ctx.Query("startDate")
  496. endDate := ctx.Query("endDate")
  497. startTime, _ := time.ParseInLocation("2006-01-02", startDate, time.Local)
  498. startTime = startTime.UTC()
  499. endTime, _ := time.ParseInLocation("2006-01-02", endDate, time.Local)
  500. startTime = getStartTime(startTime)
  501. queryMetrics(ctx, "", startTime, endTime)
  502. }
  503. func QueryUserStaticDataPage(ctx *context.Context) {
  504. startDate := ctx.Query("startDate")
  505. endDate := ctx.Query("endDate")
  506. page := ctx.QueryInt("page")
  507. if page <= 0 {
  508. page = 1
  509. }
  510. pageSize := ctx.QueryInt("pageSize")
  511. if pageSize <= 0 {
  512. pageSize = setting.UI.IssuePagingNum
  513. }
  514. userName := ctx.Query("userName")
  515. IsReturnFile := ctx.QueryBool("IsReturnFile")
  516. log.Info("startDate=" + startDate + " endDate=" + endDate + " userName=" + userName + " page=" + fmt.Sprint(page))
  517. var startTime time.Time
  518. var endTime time.Time
  519. var isAll bool
  520. if startDate == "all" {
  521. isAll = true
  522. startTime = time.Now()
  523. endTime = time.Now()
  524. } else {
  525. startTime, _ = time.ParseInLocation("2006-01-02", startDate, time.Local)
  526. startTime = time.Date(startTime.Year(), startTime.Month(), startTime.Day(), 0, 0, 0, 0, startTime.Location())
  527. settingStartTime, _ := time.Parse("2006-01-02", setting.RadarMap.RecordBeginTime)
  528. if startTime.Unix() < settingStartTime.Unix() {
  529. startTime = settingStartTime
  530. startDate = settingStartTime.Format("2006-01-02")
  531. }
  532. endTime, _ = time.ParseInLocation("2006-01-02", endDate, time.Local)
  533. endTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 23, 59, 59, 0, startTime.Location())
  534. isAll = false
  535. log.Info("startTime=" + fmt.Sprint(startTime.Unix()) + " endDate=" + fmt.Sprint(endTime.Unix()))
  536. }
  537. if IsReturnFile {
  538. page = -1
  539. pageSize = -1
  540. }
  541. pageOpts := &models.UserBusinessAnalysisQueryOptions{
  542. ListOptions: models.ListOptions{
  543. Page: page,
  544. PageSize: pageSize,
  545. },
  546. UserName: userName,
  547. StartTime: startTime.Unix(),
  548. EndTime: endTime.Unix(),
  549. IsAll: isAll,
  550. }
  551. if IsReturnFile {
  552. //re, count := models.QueryUserStaticDataAll(pageOpts)
  553. wikiMap, _ := queryWikiCountMap(startTime, endTime)
  554. re, count := models.QueryUserStaticDataForUserDefine(pageOpts, wikiMap)
  555. sheetName := ctx.Tr("user.static.sheetname")
  556. filename := sheetName + "_" + startDate + "_" + endDate + ".xlsx"
  557. os.Remove(setting.AppDataPath + Excel_File_Path + filename)
  558. go writeFileToDisk(ctx, count, re, filename)
  559. ctx.JSON(http.StatusOK, ctx.Tr("user.static.downloadinfo")+setting.AppURL+"api/v1/download_user_define_file?filename="+filename)
  560. } else {
  561. mapInterface := make(map[string]interface{})
  562. re, count := models.QueryUserStaticDataPage(pageOpts)
  563. mapInterface["data"] = re
  564. mapInterface["count"] = count
  565. ctx.JSON(http.StatusOK, mapInterface)
  566. }
  567. }
  568. func writeFileToDisk(ctx *context.Context, count int64, re []*models.UserBusinessAnalysis, filename string) {
  569. log.Info("return count=" + fmt.Sprint(count))
  570. //writer exec file.
  571. xlsx := excelize.NewFile()
  572. sheetName := ctx.Tr("user.static.sheetname")
  573. index := xlsx.NewSheet(sheetName)
  574. xlsx.DeleteSheet("Sheet1")
  575. dataHeader := getExcelHeader(ctx)
  576. for k, v := range dataHeader {
  577. //设置单元格的值
  578. xlsx.SetCellValue(sheetName, k, v)
  579. }
  580. for i, userRecord := range re {
  581. row := i + 2
  582. writeExcelPage(row, xlsx, sheetName, userRecord)
  583. }
  584. //设置默认打开的表单
  585. xlsx.SetActiveSheet(index)
  586. //ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+url.QueryEscape(filename))
  587. //ctx.Resp.Header().Set("Content-Type", "application/octet-stream")
  588. filename = setting.AppDataPath + Excel_File_Path + filename
  589. os.Mkdir(setting.AppDataPath+Excel_File_Path, 0755)
  590. if err := xlsx.SaveAs(filename); err != nil {
  591. log.Info("writer exel error." + err.Error())
  592. } else {
  593. log.Info("write to file succeed, filepath=" + filename)
  594. }
  595. }
  596. func queryWikiCountMap(startTime time.Time, endTime time.Time) (map[string]int, error) {
  597. wikiMap := make(map[string]int)
  598. warnEmailMessage := "用户统计信息入库失败,请尽快定位。"
  599. repoList, err := models.GetAllRepositories()
  600. if err != nil {
  601. log.Error("query repo error." + err.Error())
  602. mailer.SendWarnNotifyMail(setting.Warn_Notify_Mails, warnEmailMessage)
  603. return nil, err
  604. }
  605. log.Info("start to query wiki data")
  606. for _, repoRecord := range repoList {
  607. wikiPath := models.WikiPath(repoRecord.OwnerName, repoRecord.Name)
  608. time, err := git.GetLatestCommitTime(wikiPath)
  609. if err == nil {
  610. log.Info("last commit time:" + time.Format("2006-01-02 15:04:05") + " wikiPath=" + wikiPath)
  611. if time.After(startTime) && time.Before(endTime) {
  612. wikiRepo, _, err := FindWikiRepoCommitByWikiPath(wikiPath)
  613. if err != nil {
  614. log.Error("wiki not exist. wikiPath=" + wikiPath)
  615. } else {
  616. log.Info("wiki exist, wikiPath=" + wikiPath)
  617. list, err := wikiRepo.GetCommitByPathAndDays(wikiPath, 1)
  618. if err != nil {
  619. log.Info("err,err=v%", err)
  620. } else {
  621. for logEntry := list.Front(); logEntry != nil; logEntry = logEntry.Next() {
  622. commit := logEntry.Value.(*git.Commit)
  623. log.Info("commit msg=" + commit.CommitMessage + " time=" + commit.Committer.When.Format("2006-01-02 15:04:05") + " user=" + commit.Committer.Name)
  624. if _, ok := wikiMap[commit.Committer.Name]; !ok {
  625. wikiMap[commit.Committer.Name] = 1
  626. } else {
  627. wikiMap[commit.Committer.Name] += 1
  628. }
  629. }
  630. }
  631. }
  632. }
  633. }
  634. }
  635. return wikiMap, nil
  636. }
  637. func TimingCountDataByDateAndReCount(date string, isReCount bool) {
  638. t, _ := time.Parse("2006-01-02", date)
  639. startTime := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location())
  640. startTime = startTime.UTC()
  641. endTime := time.Date(t.Year(), t.Month(), t.Day(), 23, 59, 59, 0, t.Location())
  642. endTime = endTime.UTC()
  643. log.Info("startTime time:" + startTime.Format("2006-01-02 15:04:05"))
  644. log.Info("endTime time:" + endTime.Format("2006-01-02 15:04:05"))
  645. warnEmailMessage := "用户统计信息入库失败,请尽快定位。"
  646. //query wiki data
  647. log.Info("start to time count data")
  648. wikiMap, err := queryWikiCountMap(startTime, endTime)
  649. //other user info data
  650. err = models.CounDataByDateAndReCount(wikiMap, startTime, endTime, isReCount)
  651. if err != nil {
  652. log.Error("count user info error." + err.Error())
  653. mailer.SendWarnNotifyMail(setting.Warn_Notify_Mails, warnEmailMessage)
  654. }
  655. log.Info("end to count all user info data")
  656. }
  657. func TimingCountDataByDate(date string) {
  658. TimingCountDataByDateAndReCount(date, true)
  659. }
  660. func TimingCountData() {
  661. log.Info("start to time count data")
  662. currentTimeNow := time.Now()
  663. log.Info("current time:" + currentTimeNow.Format("2006-01-02 15:04:05"))
  664. startTime := currentTimeNow.AddDate(0, 0, -1).Format("2006-01-02")
  665. TimingCountDataByDateAndReCount(startTime, false)
  666. }