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 36 kB

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