get_wxs_logic.go 5.3 KB

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