get_wx_list_logic.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package Wx
  2. import (
  3. "context"
  4. "math/rand"
  5. "strconv"
  6. "time"
  7. "wechat-api/ent"
  8. "wechat-api/ent/predicate"
  9. "wechat-api/ent/wx"
  10. "wechat-api/hook"
  11. "wechat-api/internal/svc"
  12. "wechat-api/internal/types"
  13. "wechat-api/internal/utils/dberrorhandler"
  14. "github.com/suyuan32/simple-admin-common/msg/errormsg"
  15. "github.com/suyuan32/simple-admin-common/utils/pointy"
  16. "github.com/zeromicro/go-zero/core/logx"
  17. )
  18. type GetWxListLogic struct {
  19. ctx context.Context
  20. svcCtx *svc.ServiceContext
  21. logx.Logger
  22. }
  23. func NewGetWxListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetWxListLogic {
  24. return &GetWxListLogic{
  25. ctx: ctx,
  26. svcCtx: svcCtx,
  27. Logger: logx.WithContext(ctx),
  28. }
  29. }
  30. func (l *GetWxListLogic) GetWxList(req *types.WxListReq) (*types.WxListResp, error) {
  31. organizationId := l.ctx.Value("organizationId").(uint64)
  32. servers, err := l.svcCtx.DB.Server.Query().All(l.ctx)
  33. serverSet := make(map[uint64]*ent.Server, len(servers))
  34. for _, s := range servers {
  35. serverSet[s.ID] = s
  36. }
  37. var predicates []predicate.Wx
  38. predicates = append(predicates, wx.OrganizationIDEQ(organizationId))
  39. if req.Port != nil {
  40. predicates = append(predicates, wx.PortContains(*req.Port))
  41. }
  42. if req.ProcessId != nil {
  43. predicates = append(predicates, wx.ProcessIDContains(*req.ProcessId))
  44. }
  45. if req.Callback != nil {
  46. predicates = append(predicates, wx.CallbackContains(*req.Callback))
  47. }
  48. data, err := l.svcCtx.DB.Wx.Query().Where(predicates...).WithAgent().Page(l.ctx, req.Page, req.PageSize)
  49. if err != nil {
  50. return nil, dberrorhandler.DefaultEntError(l.Logger, err, req)
  51. }
  52. resp := &types.WxListResp{}
  53. resp.Msg = errormsg.Success
  54. resp.Data.Total = data.PageDetails.Total
  55. for _, v := range data.List {
  56. // 创建 hookClient 客户端
  57. serverInfo := serverSet[v.ServerID]
  58. hookClient := hook.NewHook(serverInfo.PrivateIP, serverInfo.AdminPort, v.Port)
  59. // 获取登录状态
  60. loginInfo, err := hookClient.IsLoginStatus()
  61. var loginStatus uint8 = 0
  62. if err != nil {
  63. l.Error("退出登录失败", err)
  64. } else {
  65. if loginInfo.Onlinestatus == "3" {
  66. loginStatus = 1
  67. }
  68. }
  69. processID := v.ProcessID
  70. wxid := v.Wxid
  71. account := v.Account
  72. nickname := v.Nickname
  73. tel := v.Tel
  74. headBig := v.HeadBig
  75. if loginStatus == 1 {
  76. // 如果处于登录状态,获取登录信息
  77. wxInfo, _ := hookClient.GetSelfLoginInfo()
  78. if err != nil {
  79. l.Error("退出登录失败", err)
  80. } else {
  81. processID = wxInfo.ProcessID
  82. wxid = wxInfo.Wxid
  83. account = wxInfo.Account
  84. nickname = wxInfo.Nickname
  85. tel = wxInfo.Tel
  86. headBig = wxInfo.HeadBig
  87. _ = l.svcCtx.DB.Wx.UpdateOneID(v.ID).
  88. SetNotNilStatus(&loginStatus).
  89. SetNotNilProcessID(&wxInfo.ProcessID).
  90. SetNotNilWxid(&wxInfo.Wxid).
  91. SetNotNilAccount(&wxInfo.Account).
  92. SetNotNilNickname(&wxInfo.Nickname).
  93. SetNotNilTel(&wxInfo.Tel).
  94. SetNotNilHeadBig(&wxInfo.HeadBig).
  95. Exec(l.ctx)
  96. }
  97. } else {
  98. if loginStatus != v.Status {
  99. wxid = strconv.Itoa(rand.New(rand.NewSource(time.Now().UnixNano())).Intn(1000000))
  100. _ = l.svcCtx.DB.Wx.UpdateOneID(v.ID).
  101. SetNotNilStatus(&loginStatus).
  102. SetWxid(wxid).
  103. Exec(l.ctx)
  104. }
  105. }
  106. var agent types.AgentInfo
  107. if v.Edges.Agent != nil {
  108. agent = types.AgentInfo{
  109. BaseIDInfo: types.BaseIDInfo{
  110. Id: &v.AgentID,
  111. CreatedAt: pointy.GetPointer(v.Edges.Agent.CreatedAt.UnixMilli()),
  112. UpdatedAt: pointy.GetPointer(v.Edges.Agent.UpdatedAt.UnixMilli()),
  113. },
  114. Name: &v.Edges.Agent.Name,
  115. Role: &v.Edges.Agent.Role,
  116. Status: &v.Edges.Agent.Status,
  117. Background: &v.Edges.Agent.Background,
  118. Examples: &v.Edges.Agent.Examples,
  119. }
  120. }
  121. resp.Data.Data = append(resp.Data.Data,
  122. types.WxInfo{
  123. BaseIDInfo: types.BaseIDInfo{
  124. Id: &v.ID,
  125. CreatedAt: pointy.GetPointer(v.CreatedAt.UnixMilli()),
  126. UpdatedAt: pointy.GetPointer(v.UpdatedAt.UnixMilli()),
  127. },
  128. Status: &loginStatus,
  129. ServerId: &v.ServerID,
  130. Port: &v.Port,
  131. ProcessId: &processID,
  132. Callback: &v.Callback,
  133. Wxid: &wxid,
  134. Account: &account,
  135. Nickname: &nickname,
  136. Tel: &tel,
  137. HeadBig: &headBig,
  138. OrganizationId: &v.OrganizationID,
  139. AgentId: &v.AgentID,
  140. AgentInfo: &agent,
  141. })
  142. }
  143. return resp, nil
  144. }