get_wxs_logic.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. package dashboard
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/suyuan32/simple-admin-common/msg/errormsg"
  6. "math"
  7. "strconv"
  8. "strings"
  9. "time"
  10. "wechat-api/ent"
  11. "wechat-api/ent/predicate"
  12. "wechat-api/ent/usagestatisticday"
  13. "wechat-api/ent/usagestatistichour"
  14. "wechat-api/ent/wx"
  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, nil
  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, nil
  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, nil
  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(float64(hourData.ActiveUser)) / float32(float64(hourData.TotalFriend))
  123. rate = float32(math.Round(float64(rate) * 100))
  124. }
  125. wxList = append(wxList, types.WxData{
  126. Nickname: wxSet[hourData.BotID].Nickname,
  127. InteractionRate: rate,
  128. TotalFriend: hourData.TotalFriend,
  129. TotalGroup: hourData.TotalGroup,
  130. })
  131. }
  132. }
  133. }
  134. } else {
  135. endAddTimeString := endTime.Format("20060102")
  136. endAddTime, err := strconv.ParseUint(endAddTimeString, 10, 64)
  137. if err != nil {
  138. fmt.Println("转换截止时间失败:", err)
  139. return nil, err
  140. }
  141. var predicatesDay []predicate.UsageStatisticDay
  142. if organizationId != 0 {
  143. predicatesDay = append(predicatesDay, usagestatisticday.OrganizationID(organizationId))
  144. }
  145. predicatesDay = append(predicatesDay, usagestatisticday.BotIDIn(wxIds...))
  146. predicatesDay = append(predicatesDay, usagestatisticday.Addtime(endAddTime))
  147. usageStatisticDay, err := l.svcCtx.DB.UsageStatisticDay.Query().
  148. Where(predicatesDay...).Page(l.ctx, req.Page, req.PageSize)
  149. if err != nil {
  150. return nil, err
  151. }
  152. if usageStatisticDay != nil && usageStatisticDay.List != nil {
  153. resp.Data.Total = usageStatisticDay.PageDetails.Total
  154. for _, dayData := range usageStatisticDay.List {
  155. if wxSet[dayData.BotID] != nil {
  156. rate := float32(0)
  157. if dayData.TotalFriend != 0 {
  158. rate = float32(float64(dayData.ActiveUser)) / float32(float64(dayData.TotalFriend))
  159. rate = float32(math.Round(float64(rate) * 100))
  160. }
  161. wxList = append(wxList, types.WxData{
  162. Nickname: wxSet[dayData.BotID].Nickname,
  163. InteractionRate: rate,
  164. TotalFriend: dayData.TotalFriend,
  165. TotalGroup: dayData.TotalGroup,
  166. })
  167. }
  168. }
  169. }
  170. }
  171. resp.Data.Data = wxList
  172. return resp, nil
  173. }