get_wxs_logic.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. package dashboard
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/suyuan32/simple-admin-common/msg/errormsg"
  6. "github.com/suyuan32/simple-admin-common/utils/pointy"
  7. "time"
  8. "wechat-api/ent"
  9. "wechat-api/ent/usagestatisticday"
  10. "wechat-api/ent/usagestatistichour"
  11. "wechat-api/ent/wx"
  12. "wechat-api/internal/utils/dberrorhandler"
  13. "wechat-api/internal/svc"
  14. "wechat-api/internal/types"
  15. "github.com/zeromicro/go-zero/core/logx"
  16. )
  17. type GetWxsLogic struct {
  18. logx.Logger
  19. ctx context.Context
  20. svcCtx *svc.ServiceContext
  21. }
  22. func NewGetWxsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetWxsLogic {
  23. return &GetWxsLogic{
  24. Logger: logx.WithContext(ctx),
  25. ctx: ctx,
  26. svcCtx: svcCtx}
  27. }
  28. func (l *GetWxsLogic) GetWxs(req *types.WxReq) (resp *types.WxResp, err error) {
  29. // 获取组织id
  30. var organizationId uint64 = 0
  31. isAdmin := l.ctx.Value("isAdmin").(bool)
  32. if isAdmin && req.OrganizationId != nil && *req.OrganizationId != 0 {
  33. organizationId = *req.OrganizationId
  34. } else {
  35. organizationId = l.ctx.Value("organizationId").(uint64)
  36. }
  37. // 解析起始和截止时间
  38. layouts := []string{
  39. "2006-01", // 对应 "2024-01"
  40. "2006-01-02", // 对应 "2024-01-01"
  41. }
  42. var layoutsType int
  43. var endTime time.Time
  44. for i, layout := range layouts {
  45. endTime, err = time.Parse(layout, *req.EndDate)
  46. layoutsType = i
  47. if err == nil {
  48. break
  49. }
  50. }
  51. if err != nil {
  52. fmt.Println("解析结束时间失败:", err)
  53. return
  54. }
  55. // 判断截止日期是否包含当前日
  56. var isCurrentDay bool
  57. now := time.Now()
  58. if layoutsType == 0 {
  59. isCurrentDay = endTime.Year() == now.Year() && endTime.Month() == now.Month()
  60. } else {
  61. isCurrentDay = endTime.Year() == now.Year() && endTime.Month() == now.Month() && endTime.Day() == now.Day()
  62. }
  63. wxs, err := l.svcCtx.DB.Wx.Query().Where(wx.OrganizationID(organizationId)).Page(l.ctx, req.Page, req.PageSize)
  64. if err != nil {
  65. return nil, dberrorhandler.DefaultEntError(l.Logger, err, req)
  66. }
  67. resp := &types.WxResp{}
  68. resp.Msg = errormsg.Success
  69. resp.Data.Total = wxs.PageDetails.Total
  70. var wxIds []string
  71. wxSet := make(map[string]*ent.Wx)
  72. for _, w := range wxs.List {
  73. wxIds = append(wxIds, w.Wxid)
  74. wxSet[w.Wxid] = w
  75. }
  76. var wxList []types.WxData
  77. if isCurrentDay {
  78. // 返回当日每小时的数据
  79. lastHourData, err := l.svcCtx.DB.UsageStatisticHour.Query().
  80. Where(
  81. usagestatistichour.OrganizationID(organizationId),
  82. usagestatistichour.BotIDIn(wxIds...),
  83. ).
  84. Order(ent.Desc(usagestatistichour.FieldAddtime)).
  85. First(l.ctx)
  86. if err != nil {
  87. return nil, err
  88. }
  89. if lastHourData == nil {
  90. return nil, err
  91. }
  92. usageStatisticHour, err := l.svcCtx.DB.UsageStatisticHour.Query().
  93. Where(
  94. usagestatistichour.OrganizationID(organizationId),
  95. usagestatistichour.BotIDIn(wxIds...),
  96. usagestatistichour.Addtime(lastHourData.Addtime),
  97. ).All(l.ctx)
  98. if err != nil {
  99. return nil, err
  100. }
  101. for _, hourData := range usageStatisticHour {
  102. wxList = append(wxList, types.WxData{
  103. Nickname: wxSet[hourData.BotID].Nickname,
  104. InteractionRate: float32(hourData.ActiveUser) / float32(hourData.TotalFriend),
  105. TotalFriend: hourData.TotalFriend,
  106. TotalGroup: hourData.TotalGroup,
  107. })
  108. }
  109. } else {
  110. // 返回当日每小时的数据
  111. lastDayData, err := l.svcCtx.DB.UsageStatisticDay.Query().
  112. Where(
  113. usagestatisticday.OrganizationID(organizationId),
  114. usagestatisticday.BotIDIn(wxIds...),
  115. ).
  116. Order(ent.Desc(usagestatisticday.FieldAddtime)).
  117. First(l.ctx)
  118. if err != nil {
  119. return nil, err
  120. }
  121. if lastDayData == nil {
  122. return nil, err
  123. }
  124. usageStatisticDay, err := l.svcCtx.DB.UsageStatisticDay.Query().
  125. Where(
  126. usagestatisticday.OrganizationID(organizationId),
  127. usagestatisticday.BotIDIn(wxIds...),
  128. usagestatisticday.Addtime(lastDayData.Addtime),
  129. ).All(l.ctx)
  130. if err != nil {
  131. return nil, err
  132. }
  133. for _, dayData := range usageStatisticDay {
  134. wxList = append(wxList, types.WxData{
  135. Nickname: wxSet[dayData.BotID].Nickname,
  136. InteractionRate: float32(dayData.ActiveUser) / float32(dayData.TotalFriend),
  137. TotalFriend: dayData.TotalFriend,
  138. TotalGroup: dayData.TotalGroup,
  139. })
  140. }
  141. }
  142. resp.Data.Data = wxList
  143. return resp, nil
  144. }