123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- package dashboard
- import (
- "context"
- "fmt"
- "github.com/suyuan32/simple-admin-common/msg/errormsg"
- "math"
- "strconv"
- "strings"
- "time"
- "wechat-api/ent"
- "wechat-api/ent/predicate"
- "wechat-api/ent/usagestatisticday"
- "wechat-api/ent/usagestatistichour"
- "wechat-api/ent/wx"
- "wechat-api/internal/svc"
- "wechat-api/internal/types"
- "github.com/zeromicro/go-zero/core/logx"
- )
- type GetWxsLogic struct {
- logx.Logger
- ctx context.Context
- svcCtx *svc.ServiceContext
- }
- func NewGetWxsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetWxsLogic {
- return &GetWxsLogic{
- Logger: logx.WithContext(ctx),
- ctx: ctx,
- svcCtx: svcCtx}
- }
- func (l *GetWxsLogic) GetWxs(req *types.WxReq) (resp *types.WxResp, err error) {
- // 获取组织id
- var organizationId uint64 = 0
- isAdmin := l.ctx.Value("isAdmin").(bool)
- if isAdmin {
- if req.OrganizationId != nil && *req.OrganizationId != 0 {
- organizationId = *req.OrganizationId
- }
- } else {
- organizationId = l.ctx.Value("organizationId").(uint64)
- }
- // 解析起始和截止时间
- layouts := []string{
- "2006-01", // 对应 "2024-01"
- "2006-01-02", // 对应 "2024-01-01"
- }
- var layoutsType int
- var endTime time.Time
- for i, layout := range layouts {
- endTime, err = time.Parse(layout, *req.EndDate)
- layoutsType = i
- if err == nil {
- break
- }
- }
- if err != nil {
- fmt.Println("解析结束时间失败:", err)
- return
- }
- // 判断截止日期是否包含当前日
- var isCurrentDay bool
- now := time.Now()
- if layoutsType == 0 {
- isCurrentDay = endTime.Year() == now.Year() && endTime.Month() == now.Month()
- } else {
- isCurrentDay = endTime.Year() == now.Year() && endTime.Month() == now.Month() && endTime.Day() == now.Day()
- }
- var predicates []predicate.Wx
- if organizationId != 0 {
- predicates = append(predicates, wx.OrganizationID(organizationId))
- }
- if req.Wxid != nil {
- predicates = append(predicates, wx.Wxid(*req.Wxid))
- }
- wxs, err := l.svcCtx.DB.Wx.Query().Where(predicates...).All(l.ctx)
- if err != nil {
- return nil, nil
- }
- resp = &types.WxResp{}
- resp.Msg = errormsg.Success
- var wxIds []string
- wxSet := make(map[string]*ent.Wx)
- for _, w := range wxs {
- if !strings.HasPrefix(w.Wxid, "temp-") {
- wxIds = append(wxIds, w.Wxid)
- wxSet[w.Wxid] = w
- }
- }
- var wxList []types.WxData
- if isCurrentDay {
- // 返回当日每小时的数据
- var predicatesH []predicate.UsageStatisticHour
- if organizationId != 0 {
- predicatesH = append(predicatesH, usagestatistichour.OrganizationID(organizationId))
- predicatesH = append(predicatesH, usagestatistichour.BotIDIn(wxIds...))
- }
- lastHourData, err := l.svcCtx.DB.UsageStatisticHour.Query().
- Where(predicatesH...).
- Order(ent.Desc(usagestatistichour.FieldAddtime)).
- First(l.ctx)
- if err != nil {
- return nil, nil
- }
- if lastHourData == nil {
- return nil, err
- }
- var predicatesHour []predicate.UsageStatisticHour
- if organizationId != 0 {
- predicatesHour = append(predicatesHour, usagestatistichour.OrganizationID(organizationId))
- }
- predicatesHour = append(predicatesHour, usagestatistichour.BotIDIn(wxIds...))
- predicatesHour = append(predicatesHour, usagestatistichour.Addtime(lastHourData.Addtime))
- usageStatisticHour, err := l.svcCtx.DB.UsageStatisticHour.Query().Where(predicatesHour...).Page(l.ctx, req.Page, req.PageSize)
- if err != nil {
- return nil, nil
- }
- if usageStatisticHour != nil && usageStatisticHour.List != nil {
- resp.Data.Total = usageStatisticHour.PageDetails.Total
- for _, hourData := range usageStatisticHour.List {
- if wxSet[hourData.BotID] != nil {
- rate := float32(0)
- if hourData.TotalFriend != 0 {
- rate = float32(float64(hourData.ActiveUser)) / float32(float64(hourData.TotalFriend))
- rate = float32(math.Round(float64(rate) * 100))
- }
- wxList = append(wxList, types.WxData{
- Nickname: wxSet[hourData.BotID].Nickname,
- InteractionRate: rate,
- TotalFriend: hourData.TotalFriend,
- TotalGroup: hourData.TotalGroup,
- })
- }
- }
- }
- } else {
- endAddTimeString := endTime.Format("20060102")
- endAddTime, err := strconv.ParseUint(endAddTimeString, 10, 64)
- if err != nil {
- fmt.Println("转换截止时间失败:", err)
- return nil, err
- }
- var predicatesDay []predicate.UsageStatisticDay
- if organizationId != 0 {
- predicatesDay = append(predicatesDay, usagestatisticday.OrganizationID(organizationId))
- }
- predicatesDay = append(predicatesDay, usagestatisticday.BotIDIn(wxIds...))
- predicatesDay = append(predicatesDay, usagestatisticday.Addtime(endAddTime))
- usageStatisticDay, err := l.svcCtx.DB.UsageStatisticDay.Query().
- Where(predicatesDay...).Page(l.ctx, req.Page, req.PageSize)
- if err != nil {
- return nil, err
- }
- if usageStatisticDay != nil && usageStatisticDay.List != nil {
- resp.Data.Total = usageStatisticDay.PageDetails.Total
- for _, dayData := range usageStatisticDay.List {
- if wxSet[dayData.BotID] != nil {
- rate := float32(0)
- if dayData.TotalFriend != 0 {
- rate = float32(float64(dayData.ActiveUser)) / float32(float64(dayData.TotalFriend))
- rate = float32(math.Round(float64(rate) * 100))
- }
- wxList = append(wxList, types.WxData{
- Nickname: wxSet[dayData.BotID].Nickname,
- InteractionRate: rate,
- TotalFriend: dayData.TotalFriend,
- TotalGroup: dayData.TotalGroup,
- })
- }
- }
- }
- }
- resp.Data.Data = wxList
- return resp, nil
- }
|