package MessageHandlers import ( "context" "encoding/json" "errors" "github.com/zeromicro/go-zero/core/logx" "time" "wechat-api/ent/addwechatfriendlog" "wechat-api/internal/pkg/wechat_ws" "wechat-api/internal/svc" ) type FindContactTaskResultNoticeHandler struct { svcCtx *svc.ServiceContext } func NewFindContactTaskResultNoticeHandler(svcCtx *svc.ServiceContext) *FindContactTaskResultNoticeHandler { return &FindContactTaskResultNoticeHandler{ svcCtx: svcCtx, } } type EnumGender int const ( UnknownGender EnumGender = 0 Male EnumGender = 1 Female EnumGender = 2 ) // 自定义 JSON 解析,支持字符串 -> 枚举 func (e *EnumGender) UnmarshalJSON(b []byte) error { var s string if err := json.Unmarshal(b, &s); err == nil { switch s { case "Male": *e = Male case "Female": *e = Female default: *e = UnknownGender } return nil } var i int if err := json.Unmarshal(b, &i); err == nil { *e = EnumGender(i) return nil } return errors.New("invalid gender value") } // 用于反序列化的消息结构体(扩展 Gender 类型) type FindContactTaskResultNoticeMessage struct { WeChatId string `json:"WeChatId"` SearchText string `json:"SearchText"` Success bool `json:"Success"` IsFriend bool `json:"IsFriend"` UserName *string `json:"UserName"` Alias *string `json:"Alias"` NickName *string `json:"NickName"` Gender *EnumGender `json:"Gender"` // 也是指针 Country *string `json:"Country"` Province *string `json:"Province"` City *string `json:"City"` Avatar *string `json:"Avatar"` ErrMsg *string `json:"ErrMsg"` } func (f *FindContactTaskResultNoticeHandler) Handle(ctx context.Context, msg *wechat_ws.MsgJsonObject, svcCtx *svc.ServiceContext) error { var message FindContactTaskResultNoticeMessage logx.Infof("msg.Message 的内容是:%s", msg.Message) if err := json.Unmarshal([]byte(msg.Message), &message); err != nil { return err } //logx.Infof("msg.Message 的内容是:%s", message) //var isCanAdd int m, err := ParseJSONStringToMap(msg.Message) if err != nil { logx.Errorf("解析 JSON 失败: %v", err) return err } update := svcCtx.DB.AddWechatFriendLog.Update(). Where(addwechatfriendlog.OwnerWxIDEQ(message.WeChatId)). Where(addwechatfriendlog.FindContentEQ(message.SearchText)). SetFindResult(m). SetUpdatedAt(time.Now().Unix()) if message.Success { if message.IsFriend { update = update.SetIsCanAdd(0) } else { update = update.SetIsCanAdd(1) } } if _, err := update.Save(ctx); err != nil { logx.Errorf("更新 AddWechatFriendLog 失败: %v", err) return err } return nil } func ParseJSONStringToMap(jsonStr string) (map[string]interface{}, error) { if !json.Valid([]byte(jsonStr)) { return nil, errors.New("非法 JSON 字符串") } var result map[string]interface{} err := json.Unmarshal([]byte(jsonStr), &result) return result, err }