gitea源码

org_worktime.go 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. // Copyright 2025 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package organization
  4. import (
  5. "context"
  6. "sort"
  7. "code.gitea.io/gitea/models/db"
  8. "xorm.io/builder"
  9. )
  10. type WorktimeSumByRepos struct {
  11. RepoName string
  12. SumTime int64
  13. }
  14. func GetWorktimeByRepos(ctx context.Context, org *Organization, unitFrom, unixTo int64) (results []WorktimeSumByRepos, err error) {
  15. err = db.GetEngine(ctx).
  16. Select("repository.name AS repo_name, SUM(tracked_time.time) AS sum_time").
  17. Table("tracked_time").
  18. Join("INNER", "issue", "tracked_time.issue_id = issue.id").
  19. Join("INNER", "repository", "issue.repo_id = repository.id").
  20. Where(builder.Eq{"repository.owner_id": org.ID}).
  21. And(builder.Eq{"tracked_time.deleted": false}).
  22. And(builder.Gte{"tracked_time.created_unix": unitFrom}).
  23. And(builder.Lte{"tracked_time.created_unix": unixTo}).
  24. GroupBy("repository.name").
  25. OrderBy("repository.name").
  26. Find(&results)
  27. return results, err
  28. }
  29. type WorktimeSumByMilestones struct {
  30. RepoName string
  31. MilestoneName string
  32. MilestoneID int64
  33. MilestoneDeadline int64
  34. SumTime int64
  35. HideRepoName bool
  36. }
  37. func GetWorktimeByMilestones(ctx context.Context, org *Organization, unitFrom, unixTo int64) (results []WorktimeSumByMilestones, err error) {
  38. err = db.GetEngine(ctx).
  39. Select("repository.name AS repo_name, milestone.name AS milestone_name, milestone.id AS milestone_id, milestone.deadline_unix as milestone_deadline, SUM(tracked_time.time) AS sum_time").
  40. Table("tracked_time").
  41. Join("INNER", "issue", "tracked_time.issue_id = issue.id").
  42. Join("INNER", "repository", "issue.repo_id = repository.id").
  43. Join("LEFT", "milestone", "issue.milestone_id = milestone.id").
  44. Where(builder.Eq{"repository.owner_id": org.ID}).
  45. And(builder.Eq{"tracked_time.deleted": false}).
  46. And(builder.Gte{"tracked_time.created_unix": unitFrom}).
  47. And(builder.Lte{"tracked_time.created_unix": unixTo}).
  48. GroupBy("repository.name, milestone.name, milestone.deadline_unix, milestone.id").
  49. OrderBy("repository.name, milestone.deadline_unix, milestone.id").
  50. Find(&results)
  51. // TODO: pgsql: NULL values are sorted last in default ascending order, so we need to sort them manually again.
  52. sort.Slice(results, func(i, j int) bool {
  53. if results[i].RepoName != results[j].RepoName {
  54. return results[i].RepoName < results[j].RepoName
  55. }
  56. if results[i].MilestoneDeadline != results[j].MilestoneDeadline {
  57. return results[i].MilestoneDeadline < results[j].MilestoneDeadline
  58. }
  59. return results[i].MilestoneID < results[j].MilestoneID
  60. })
  61. // Show only the first RepoName, for nicer output.
  62. prevRepoName := ""
  63. for i := 0; i < len(results); i++ {
  64. res := &results[i]
  65. res.MilestoneDeadline = 0 // clear the deadline because we do not really need it
  66. if prevRepoName == res.RepoName {
  67. res.HideRepoName = true
  68. }
  69. prevRepoName = res.RepoName
  70. }
  71. return results, err
  72. }
  73. type WorktimeSumByMembers struct {
  74. UserName string
  75. SumTime int64
  76. }
  77. func GetWorktimeByMembers(ctx context.Context, org *Organization, unitFrom, unixTo int64) (results []WorktimeSumByMembers, err error) {
  78. err = db.GetEngine(ctx).
  79. Select("`user`.name AS user_name, SUM(tracked_time.time) AS sum_time").
  80. Table("tracked_time").
  81. Join("INNER", "issue", "tracked_time.issue_id = issue.id").
  82. Join("INNER", "repository", "issue.repo_id = repository.id").
  83. Join("INNER", "`user`", "tracked_time.user_id = `user`.id").
  84. Where(builder.Eq{"repository.owner_id": org.ID}).
  85. And(builder.Eq{"tracked_time.deleted": false}).
  86. And(builder.Gte{"tracked_time.created_unix": unitFrom}).
  87. And(builder.Lte{"tracked_time.created_unix": unixTo}).
  88. GroupBy("`user`.name").
  89. OrderBy("sum_time DESC").
  90. Find(&results)
  91. return results, err
  92. }