package Wx import ( "context" "github.com/zeromicro/go-zero/core/errorx" "wechat-api/ent" "wechat-api/ent/wx" "wechat-api/hook" "wechat-api/internal/utils/dberrorhandler" "github.com/suyuan32/simple-admin-common/msg/errormsg" "wechat-api/internal/svc" "wechat-api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) type CreateWxLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger } func NewCreateWxLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateWxLogic { return &CreateWxLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx), } } func (l *CreateWxLogic) CreateWx(req *types.WxInfo) (*types.BaseMsgResp, error) { server, err := l.svcCtx.DB.Server.Get(l.ctx, *req.ServerId) if err != nil { l.Error("获取服务器信息失败", err) return nil, err } hook := hook.NewHook(server.PrivateIP, server.AdminPort, *req.Port) portOccupied, err := hook.GetPortOccupiedInfo(*req.Port) if err != nil { l.Error("获取端口占用信息失败", err) return nil, err } if portOccupied.Occupied != "1" { l.Error("端口未使用,请重新扫码登陆", err) return nil, err } loginStatus, err := hook.IsLoginStatus() if err != nil { return nil, err } if loginStatus.Onlinestatus == "3" { selfInfo, err := hook.GetSelfLoginInfo() if err != nil { return nil, err } wxInfo, err := l.svcCtx.DB.Wx.Query().Where(wx.ServerIDEQ(server.ID)).Where(wx.PortEQ(*req.Port)).Limit(1).Only(l.ctx) if err != nil && !ent.IsNotFound(err) { l.Error("查询微信信息失败", err) return nil, err } var dbErr error if ent.IsNotFound(err) { if req.Callback != nil && *req.Callback != "" { _ = hook.ConfigureMsgRecive("1", *req.Callback) } _, dbErr = l.svcCtx.DB.Wx.Create(). SetNotNilServerID(req.ServerId). SetNotNilPort(req.Port). SetNotNilProcessID(&selfInfo.ProcessID). SetNotNilCallback(req.Callback). SetNotNilWxid(&selfInfo.Wxid). SetNotNilAccount(&selfInfo.Account). SetNotNilNickname(&selfInfo.Nickname). SetNotNilTel(&selfInfo.Tel). SetNotNilHeadBig(&selfInfo.HeadBig). SetStatus(1). Save(l.ctx) } else { if req.Callback != nil && *req.Callback != "" && wxInfo.Callback != *req.Callback { _ = hook.ConfigureMsgRecive("1", *req.Callback) } _, dbErr = l.svcCtx.DB.Wx.UpdateOneID(wxInfo.ID). SetNotNilProcessID(&selfInfo.ProcessID). SetNotNilCallback(req.Callback). SetNotNilWxid(&selfInfo.Wxid). SetNotNilAccount(&selfInfo.Account). SetNotNilNickname(&selfInfo.Nickname). SetNotNilTel(&selfInfo.Tel). SetNotNilHeadBig(&selfInfo.HeadBig). SetStatus(1). Save(l.ctx) } if dbErr != nil { return nil, dberrorhandler.DefaultEntError(l.Logger, dbErr, req) } } else { l.Error("微信未登录", "loginStatus", loginStatus) return nil, errorx.NewDefaultError("微信未登陆,当前登陆状态:" + loginStatus.Onlinestatus + "," + loginStatus.Msg) } return &types.BaseMsgResp{Msg: errormsg.Success}, nil }