check_wx_logic.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package Wx
  2. import (
  3. "context"
  4. "errors"
  5. "github.com/suyuan32/simple-admin-common/msg/errormsg"
  6. "github.com/zeromicro/go-zero/core/errorx"
  7. "wechat-api/ent"
  8. agentModel "wechat-api/ent/agent"
  9. "wechat-api/ent/wx"
  10. "wechat-api/hook"
  11. "wechat-api/internal/utils/dberrorhandler"
  12. "wechat-api/internal/svc"
  13. "wechat-api/internal/types"
  14. "github.com/zeromicro/go-zero/core/logx"
  15. )
  16. type CheckWxLogic struct {
  17. logx.Logger
  18. ctx context.Context
  19. svcCtx *svc.ServiceContext
  20. }
  21. func NewCheckWxLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CheckWxLogic {
  22. return &CheckWxLogic{
  23. Logger: logx.WithContext(ctx),
  24. ctx: ctx,
  25. svcCtx: svcCtx}
  26. }
  27. func (l *CheckWxLogic) CheckWx(req *types.WxInfo) (resp *types.BaseMsgResp, err error) {
  28. isAdmin := l.ctx.Value("isAdmin").(bool)
  29. if !isAdmin {
  30. l.Error("没有权限,请联系管理员", nil)
  31. return nil, nil
  32. }
  33. // 获取服务器信息
  34. server, err := l.svcCtx.DB.Server.Get(l.ctx, *req.ServerId)
  35. if err != nil {
  36. l.Error("获取服务器信息失败", err)
  37. return nil, err
  38. }
  39. hook := hook.NewHook(server.PrivateIP, server.AdminPort, *req.Port)
  40. // 判断端口是否被占用
  41. portOccupied, err := hook.GetPortOccupiedInfo(*req.Port)
  42. if err != nil {
  43. l.Error("获取端口占用信息失败", err)
  44. return nil, err
  45. }
  46. if portOccupied.Occupied != "1" {
  47. l.Error("端口未使用,请重新扫码登陆", err)
  48. return nil, err
  49. }
  50. // 判断所选模式是否可用
  51. if req.AgentId != nil {
  52. agent, err := l.svcCtx.DB.Agent.Query().Where(agentModel.Status(1), agentModel.ID(*req.AgentId)).First(l.ctx)
  53. if err != nil && ent.IsNotFound(err) || agent == nil {
  54. return nil, errors.New("所选模式不存在或者已被禁用,请选择其他模式")
  55. }
  56. }
  57. loginStatus, err := hook.IsLoginStatus()
  58. if err != nil {
  59. return nil, err
  60. }
  61. if loginStatus.Onlinestatus == "3" {
  62. selfInfo, err := hook.GetSelfLoginInfo()
  63. if err != nil {
  64. return nil, err
  65. }
  66. wxInfo, err := l.svcCtx.DB.Wx.Query().Where(wx.ServerIDEQ(server.ID)).Where(wx.PortEQ(*req.Port)).Limit(1).Only(l.ctx)
  67. if err != nil && !ent.IsNotFound(err) {
  68. l.Error("查询微信信息失败", err)
  69. return nil, err
  70. }
  71. if req.Callback != nil && *req.Callback != "" {
  72. _ = hook.ConfigureMsgRecive("1", *req.Callback)
  73. }
  74. var dbErr error
  75. if ent.IsNotFound(err) {
  76. l.Error("账号不存在,请联系管理员", err)
  77. return nil, err
  78. } else {
  79. _, dbErr = l.svcCtx.DB.Wx.UpdateOneID(wxInfo.ID).
  80. SetNotNilProcessID(&selfInfo.ProcessID).
  81. SetNotNilCallback(req.Callback).
  82. SetNotNilWxid(&selfInfo.Wxid).
  83. SetNotNilAccount(&selfInfo.Account).
  84. SetNotNilNickname(&selfInfo.Nickname).
  85. SetNotNilTel(&selfInfo.Tel).
  86. SetNotNilHeadBig(&selfInfo.HeadBig).
  87. SetStatus(1).
  88. Save(l.ctx)
  89. }
  90. if dbErr != nil {
  91. return nil, dberrorhandler.DefaultEntError(l.Logger, dbErr, req)
  92. }
  93. } else {
  94. l.Error("微信未登录", "loginStatus", loginStatus)
  95. return nil, errorx.NewDefaultError("微信未登陆,当前登陆状态:" + loginStatus.Onlinestatus + "," + loginStatus.Msg)
  96. }
  97. return &types.BaseMsgResp{Msg: errormsg.Success}, nil
  98. }