get_wxs_logic.go 5.7 KB

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