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_invitation.go 16 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. package repo
  2. import (
  3. "fmt"
  4. "net/http"
  5. "net/url"
  6. "sort"
  7. "time"
  8. "code.gitea.io/gitea/models"
  9. "code.gitea.io/gitea/modules/context"
  10. "code.gitea.io/gitea/modules/log"
  11. "code.gitea.io/gitea/modules/setting"
  12. "github.com/360EntSecGroup-Skylar/excelize/v2"
  13. )
  14. func QueryInvitationCurrentMonth(ctx *context.Context) {
  15. // userName := ctx.Query("userName")
  16. // currentTimeNow := time.Now()
  17. // pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, currentTimeNow.Location())
  18. // pageStartTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), 1, 0, 0, 0, 0, currentTimeNow.Location())
  19. //queryUserDataPage(ctx, "public.user_business_analysis_current_month", new(models.UserBusinessAnalysisCurrentMonth))
  20. //_, count := models.QueryUserStaticDataByTableName(1, 1, "public.user_business_analysis_current_month", new(models.UserBusinessAnalysisCurrentMonth), userName, 1)
  21. queryDataFromStaticTable(ctx, "public.user_business_analysis_current_month", new(models.UserBusinessAnalysisCurrentMonth))
  22. }
  23. func getInvitationExcelHeader(ctx *context.Context) map[string]string {
  24. excelHeader := make([]string, 0)
  25. excelHeader = append(excelHeader, ctx.Tr("user.static.id"))
  26. excelHeader = append(excelHeader, ctx.Tr("user.static.name"))
  27. excelHeader = append(excelHeader, ctx.Tr("user.static.invitationNum"))
  28. excelHeader = append(excelHeader, ctx.Tr("user.static.phone"))
  29. excelHeader = append(excelHeader, ctx.Tr("user.static.registdate"))
  30. excelHeaderMap := make(map[string]string, 0)
  31. var i byte
  32. i = 0
  33. for _, value := range excelHeader {
  34. excelColumn := getColumn(i) + fmt.Sprint(1)
  35. excelHeaderMap[excelColumn] = value
  36. i++
  37. }
  38. return excelHeaderMap
  39. }
  40. func getInvitationDetailExcelHeader(ctx *context.Context) map[string]string {
  41. excelHeader := make([]string, 0)
  42. excelHeader = append(excelHeader, ctx.Tr("user.static.id"))
  43. excelHeader = append(excelHeader, ctx.Tr("user.static.name"))
  44. excelHeader = append(excelHeader, ctx.Tr("user.static.srcUserId"))
  45. excelHeader = append(excelHeader, ctx.Tr("user.static.phone"))
  46. excelHeader = append(excelHeader, ctx.Tr("user.static.registdate"))
  47. excelHeaderMap := make(map[string]string, 0)
  48. var i byte
  49. i = 0
  50. for _, value := range excelHeader {
  51. excelColumn := getColumn(i) + fmt.Sprint(1)
  52. excelHeaderMap[excelColumn] = value
  53. i++
  54. }
  55. return excelHeaderMap
  56. }
  57. func writeInvitationExcel(row int, xlsx *excelize.File, sheetName string, userRecord *models.UserBusinessAnalysisAll) {
  58. rows := fmt.Sprint(row)
  59. var tmp byte
  60. tmp = 0
  61. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.ID)
  62. tmp = tmp + 1
  63. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.Name)
  64. tmp = tmp + 1
  65. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.InvitationUserNum)
  66. tmp = tmp + 1
  67. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.Phone)
  68. tmp = tmp + 1
  69. formatTime := userRecord.RegistDate.Format("2006-01-02 15:04:05")
  70. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, formatTime[0:len(formatTime)-3])
  71. }
  72. func writeInvitationDetailExcel(row int, xlsx *excelize.File, sheetName string, userRecord *models.Invitation) {
  73. rows := fmt.Sprint(row)
  74. var tmp byte
  75. tmp = 0
  76. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.UserID)
  77. tmp = tmp + 1
  78. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.Name)
  79. tmp = tmp + 1
  80. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.SrcUserID)
  81. tmp = tmp + 1
  82. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.Phone)
  83. tmp = tmp + 1
  84. formatTime := userRecord.CreatedUnix.Format("2006-01-02 15:04:05")
  85. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, formatTime[0:len(formatTime)-3])
  86. }
  87. func DownloadInvitationDetail(ctx *context.Context) {
  88. xlsx := excelize.NewFile()
  89. sheetName := ctx.Tr("user.static.invitationdetailsheetname")
  90. index := xlsx.NewSheet(sheetName)
  91. xlsx.DeleteSheet("Sheet1")
  92. excelHeader := getInvitationDetailExcelHeader(ctx)
  93. for k, v := range excelHeader {
  94. //设置单元格的值
  95. xlsx.SetCellValue(sheetName, k, v)
  96. }
  97. userNameMap := models.GetAllUserName()
  98. _, count := models.QueryInvitaionPage(1, 1)
  99. var indexTotal int64
  100. indexTotal = 0
  101. row := 1
  102. for {
  103. re, _ := models.QueryInvitaionPage(int(indexTotal), PAGE_SIZE)
  104. log.Info("return count=" + fmt.Sprint(count))
  105. for _, userRecord := range re {
  106. row++
  107. userRecord.Name = userNameMap[userRecord.UserID]
  108. if userRecord.Name == "" {
  109. userRecord.Name = "已注销"
  110. }
  111. writeInvitationDetailExcel(row, xlsx, sheetName, userRecord)
  112. }
  113. indexTotal += PAGE_SIZE
  114. if indexTotal >= count {
  115. break
  116. }
  117. }
  118. //设置默认打开的表单
  119. xlsx.SetActiveSheet(index)
  120. filename := sheetName + ".xlsx"
  121. ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+url.QueryEscape(filename))
  122. ctx.Resp.Header().Set("Content-Type", "application/octet-stream")
  123. if _, err := xlsx.WriteTo(ctx.Resp); err != nil {
  124. log.Info("writer exel error." + err.Error())
  125. }
  126. }
  127. func queryDataFromStaticTable(ctx *context.Context, tableName string, queryObj interface{}) {
  128. page, pageSize := getPageInfo(ctx)
  129. userName := ctx.Query("userName")
  130. IsReturnFile := ctx.QueryBool("IsReturnFile")
  131. if IsReturnFile {
  132. //writer exec file.
  133. xlsx := excelize.NewFile()
  134. sheetName := ctx.Tr("user.static.invitationsheetname")
  135. index := xlsx.NewSheet(sheetName)
  136. xlsx.DeleteSheet("Sheet1")
  137. excelHeader := getInvitationExcelHeader(ctx)
  138. for k, v := range excelHeader {
  139. //设置单元格的值
  140. xlsx.SetCellValue(sheetName, k, v)
  141. }
  142. _, count := models.QueryUserInvitationDataByTableName(1, 1, tableName, queryObj, "", 1)
  143. var indexTotal int64
  144. indexTotal = 0
  145. row := 1
  146. for {
  147. re, _ := models.QueryUserInvitationDataByTableName(int(indexTotal), PAGE_SIZE, tableName, queryObj, "", 1)
  148. log.Info("return count=" + fmt.Sprint(count))
  149. for _, userRecord := range re {
  150. row++
  151. writeInvitationExcel(row, xlsx, sheetName, userRecord)
  152. }
  153. indexTotal += PAGE_SIZE
  154. if indexTotal >= count {
  155. break
  156. }
  157. }
  158. //设置默认打开的表单
  159. xlsx.SetActiveSheet(index)
  160. filename := sheetName + "_" + ctx.Tr("user.static."+tableName) + ".xlsx"
  161. ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+url.QueryEscape(filename))
  162. ctx.Resp.Header().Set("Content-Type", "application/octet-stream")
  163. if _, err := xlsx.WriteTo(ctx.Resp); err != nil {
  164. log.Info("writer exel error." + err.Error())
  165. }
  166. } else {
  167. resultRecord, count := models.QueryUserInvitationDataByTableName((page-1)*pageSize, pageSize, tableName, queryObj, userName, 1)
  168. result := make([]models.Invitation, 0)
  169. for _, record := range resultRecord {
  170. invi := models.Invitation{
  171. SrcUserID: record.ID,
  172. Name: record.Name,
  173. InvitationUserNum: record.InvitationUserNum,
  174. Phone: record.Phone,
  175. CreatedUnix: record.RegistDate,
  176. }
  177. result = append(result, invi)
  178. }
  179. mapInterface := make(map[string]interface{})
  180. mapInterface["data"] = result
  181. mapInterface["count"] = count
  182. ctx.JSON(http.StatusOK, mapInterface)
  183. }
  184. }
  185. func QueryInvitationCurrentWeek(ctx *context.Context) {
  186. // currentTimeNow := time.Now()
  187. // offset := int(time.Monday - currentTimeNow.Weekday())
  188. // if offset > 0 {
  189. // offset = -6
  190. // }
  191. // pageStartTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, offset)
  192. // pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, currentTimeNow.Location())
  193. // queryData(ctx, pageStartTime.Unix(), pageEndTime.Unix())
  194. queryDataFromStaticTable(ctx, "public.user_business_analysis_current_week", new(models.UserBusinessAnalysisCurrentWeek))
  195. }
  196. func QueryInvitationLastWeek(ctx *context.Context) {
  197. // currentTimeNow := time.Now()
  198. // offset := int(time.Monday - currentTimeNow.Weekday())
  199. // if offset > 0 {
  200. // offset = -6
  201. // }
  202. // pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, offset)
  203. // pageStartTime := pageEndTime.AddDate(0, 0, -7)
  204. // queryData(ctx, pageStartTime.Unix(), pageEndTime.Unix())
  205. queryDataFromStaticTable(ctx, "public.user_business_analysis_last_week", new(models.UserBusinessAnalysisLastWeek))
  206. }
  207. func QueryInvitationCurrentYear(ctx *context.Context) {
  208. // currentTimeNow := time.Now()
  209. // pageStartTime := time.Date(currentTimeNow.Year(), 1, 1, 0, 0, 0, 0, currentTimeNow.Location())
  210. // pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, currentTimeNow.Location())
  211. // queryData(ctx, pageStartTime.Unix(), pageEndTime.Unix())
  212. queryDataFromStaticTable(ctx, "public.user_business_analysis_current_year", new(models.UserBusinessAnalysisCurrentYear))
  213. }
  214. func QueryInvitationLast30Day(ctx *context.Context) {
  215. // currentTimeNow := time.Now()
  216. // pageStartTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, -30)
  217. // pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, currentTimeNow.Location())
  218. // queryData(ctx, pageStartTime.Unix(), pageEndTime.Unix())
  219. queryDataFromStaticTable(ctx, "public.user_business_analysis_last30_day", new(models.UserBusinessAnalysisLast30Day))
  220. }
  221. func QueryInvitationLastMonth(ctx *context.Context) {
  222. // currentTimeNow := time.Now()
  223. // thisMonth := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), 1, 0, 0, 0, 0, currentTimeNow.Location())
  224. // pageStartTime := thisMonth.AddDate(0, -1, 0)
  225. // pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), 1, 23, 59, 59, 0, currentTimeNow.Location()).AddDate(0, 0, -1)
  226. // queryData(ctx, pageStartTime.Unix(), pageEndTime.Unix())
  227. queryDataFromStaticTable(ctx, "public.user_business_analysis_last_month", new(models.UserBusinessAnalysisLastMonth))
  228. }
  229. func QueryInvitationYesterday(ctx *context.Context) {
  230. // currentTimeNow := time.Now().AddDate(0, 0, -1)
  231. // pageStartTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, time.Local)
  232. // pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 23, 59, 59, 0, currentTimeNow.Location())
  233. // queryData(ctx, pageStartTime.Unix(), pageEndTime.Unix())
  234. queryDataFromStaticTable(ctx, "public.user_business_analysis_yesterday", new(models.UserBusinessAnalysisYesterday))
  235. }
  236. func QueryInvitationAll(ctx *context.Context) {
  237. // currentTimeNow := time.Now()
  238. // pageStartTime := time.Date(2022, 8, 5, 0, 0, 0, 0, currentTimeNow.Location())
  239. // pageEndTime := time.Date(currentTimeNow.Year(), currentTimeNow.Month(), currentTimeNow.Day(), 0, 0, 0, 0, currentTimeNow.Location())
  240. // queryData(ctx, pageStartTime.Unix(), pageEndTime.Unix())
  241. queryDataFromStaticTable(ctx, "public.user_business_analysis_all", new(models.UserBusinessAnalysisAll))
  242. }
  243. func QueryUserDefineInvitationPage(ctx *context.Context) {
  244. startDate := ctx.Query("startDate")
  245. endDate := ctx.Query("endDate")
  246. startTime, _ := time.ParseInLocation("2006-01-02", startDate, time.Local)
  247. //startTime = startTime.UTC()
  248. endTime, _ := time.ParseInLocation("2006-01-02", endDate, time.Local)
  249. queryData(ctx, startTime, endTime)
  250. }
  251. func queryData(ctx *context.Context, startTime time.Time, endTime time.Time) {
  252. page, pageSize := getPageInfo(ctx)
  253. IsReturnFile := ctx.QueryBool("IsReturnFile")
  254. dbResult := models.QueryInvitaionByTime(startTime.Unix(), endTime.Unix())
  255. invitaionNumMap := make(map[int64]int, 0)
  256. allUserIds := make([]int64, 0)
  257. for _, record := range dbResult {
  258. if _, ok := invitaionNumMap[record.SrcUserID]; !ok {
  259. invitaionNumMap[record.SrcUserID] = 1
  260. } else {
  261. invitaionNumMap[record.SrcUserID] = invitaionNumMap[record.SrcUserID] + 1
  262. }
  263. }
  264. invitaionNumList := make([]models.Invitation, 0)
  265. for key, value := range invitaionNumMap {
  266. invi := models.Invitation{
  267. SrcUserID: key,
  268. InvitationUserNum: value,
  269. }
  270. invitaionNumList = append(invitaionNumList, invi)
  271. allUserIds = append(allUserIds, key)
  272. }
  273. sort.Slice(invitaionNumList, func(i, j int) bool {
  274. return invitaionNumList[i].InvitationUserNum > invitaionNumList[j].InvitationUserNum
  275. })
  276. if IsReturnFile {
  277. xlsx := excelize.NewFile()
  278. sheetName := ctx.Tr("user.static.invitationsheetname")
  279. index := xlsx.NewSheet(sheetName)
  280. xlsx.DeleteSheet("Sheet1")
  281. excelHeader := getInvitationExcelHeader(ctx)
  282. for k, v := range excelHeader {
  283. //设置单元格的值
  284. xlsx.SetCellValue(sheetName, k, v)
  285. }
  286. end := 100
  287. userMap := make(map[int64]*models.User, 0)
  288. log.Info("len(allUserIds)=" + fmt.Sprint(len(allUserIds)))
  289. for i := 0; i < len(allUserIds); i += 100 {
  290. if end >= len(allUserIds) {
  291. end = len(allUserIds)
  292. }
  293. log.Info("i=" + fmt.Sprint(i) + " end=" + fmt.Sprint(end))
  294. if i == end {
  295. break
  296. }
  297. userList, err := models.GetUsersByIDs(allUserIds[i:end])
  298. if err == nil {
  299. for _, tmp := range userList {
  300. userMap[tmp.ID] = tmp
  301. }
  302. } else {
  303. }
  304. end = end + 100
  305. }
  306. row := 1
  307. log.Info("len(userMap)=" + fmt.Sprint(len(userMap)))
  308. for _, userRecord := range invitaionNumList {
  309. row++
  310. rows := fmt.Sprint(row)
  311. var tmp byte
  312. tmp = 0
  313. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.SrcUserID)
  314. tmp = tmp + 1
  315. name := "已注销"
  316. if userMap[userRecord.SrcUserID] != nil {
  317. name = userMap[userRecord.SrcUserID].Name
  318. }
  319. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, name)
  320. tmp = tmp + 1
  321. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.InvitationUserNum)
  322. tmp = tmp + 1
  323. Phone := ""
  324. if userMap[userRecord.SrcUserID] != nil {
  325. Phone = userMap[userRecord.SrcUserID].PhoneNumber
  326. }
  327. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, Phone)
  328. tmp = tmp + 1
  329. formatTime := ""
  330. if userMap[userRecord.SrcUserID] != nil {
  331. formatTime = userMap[userRecord.SrcUserID].CreatedUnix.Format("2006-01-02 15:04:05")
  332. formatTime = formatTime[0 : len(formatTime)-3]
  333. }
  334. xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, formatTime)
  335. }
  336. //设置默认打开的表单
  337. xlsx.SetActiveSheet(index)
  338. filename := sheetName + "_" + getTimeFileName(startTime) + "_" + getTimeFileName(endTime) + ".xlsx"
  339. //filename := sheetName + "_" + ctx.Tr("user.static."+tableName) + ".xlsx"
  340. ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+url.QueryEscape(filename))
  341. ctx.Resp.Header().Set("Content-Type", "application/octet-stream")
  342. if _, err := xlsx.WriteTo(ctx.Resp); err != nil {
  343. log.Info("writer exel error." + err.Error())
  344. }
  345. } else {
  346. result := make([]*models.Invitation, 0)
  347. userIds := make([]int64, 0)
  348. end := len(invitaionNumList) - 1
  349. for start := (page - 1) * pageSize; start <= end; start++ {
  350. invi := invitaionNumList[start]
  351. //todo name phone,createunix
  352. result = append(result, &invi)
  353. userIds = append(userIds, invi.SrcUserID)
  354. if len(result) == pageSize {
  355. break
  356. }
  357. }
  358. userList, err := models.GetUsersByIDs(userIds)
  359. if err == nil {
  360. for _, invi := range result {
  361. tmpUser := userList[0]
  362. for _, tmp := range userList {
  363. if tmp.ID == invi.SrcUserID {
  364. tmpUser = tmp
  365. break
  366. }
  367. }
  368. if invi.SrcUserID == tmpUser.ID {
  369. invi.Name = tmpUser.Name
  370. invi.Phone = tmpUser.PhoneNumber
  371. invi.CreatedUnix = tmpUser.CreatedUnix
  372. } else {
  373. invi.Name = "已注销"
  374. }
  375. }
  376. } else {
  377. log.Info("query user error." + err.Error())
  378. }
  379. mapInterface := make(map[string]interface{})
  380. mapInterface["data"] = result
  381. mapInterface["count"] = len(invitaionNumList)
  382. ctx.JSON(http.StatusOK, mapInterface)
  383. }
  384. }
  385. func getPageInfo(ctx *context.Context) (int, int) {
  386. page := ctx.QueryInt("page")
  387. if page <= 0 {
  388. page = 1
  389. }
  390. pageSize := ctx.QueryInt("pageSize")
  391. if pageSize <= 0 {
  392. pageSize = setting.UI.IssuePagingNum
  393. }
  394. return page, pageSize
  395. }