package wechat import ( "context" "github.com/zeromicro/go-zero/core/logx" "wechat-api/ent" "wechat-api/ent/agent" "wechat-api/ent/contact" "wechat-api/ent/label" "wechat-api/ent/labelrelationship" "wechat-api/ent/wx" ) type WxSafeChange struct { Ctx context.Context Tx *ent.Tx WxId string OrganizationId uint64 } func (w *WxSafeChange) KeepAllSafe() error { err := w.BlockListSafe() if err != nil { return err } err = w.AgentSafe() if err != nil { return err } err = w.LabelSafe() if err != nil { return err } return nil } func (w *WxSafeChange) BlockListSafe() error { wxinfo, err := w.Tx.Wx.Query(). Where( wx.Wxid(w.WxId), ). Only(w.Ctx) if err != nil { if ent.IsNotFound(err) { return nil } return err } bl := []string{} if wxinfo == nil { return nil } for _, l := range wxinfo.BlockList { if l != "" && l != "ALL" { bl = append(bl, l) } } for _, l := range wxinfo.GroupBlockList { if l != "" && l != "ALL" { bl = append(bl, l) } } for _, l := range wxinfo.AllowList { if l != "" && l != "ALL" { bl = append(bl, l) } } for _, l := range wxinfo.GroupAllowList { if l != "" && l != "ALL" { bl = append(bl, l) } } contactList, err := w.Tx.Contact.Query(). Where( contact.WxWxidNEQ(w.WxId), contact.WxidIn(bl...), ).All(w.Ctx) if err != nil && !ent.IsNotFound(err) { return err } if contactList != nil { _, err = w.Tx.Wx.UpdateOneID(wxinfo.ID). SetBlockList([]string{}). SetGroupBlockList([]string{}). SetAllowList([]string{"ALL"}). SetGroupAllowList([]string{"ALL"}). Save(w.Ctx) if err != nil { return err } } return nil } func (w *WxSafeChange) AgentSafe() error { wxinfo, err := w.Tx.Wx.Query(). Where( wx.Wxid(w.WxId), wx.HasAgentWith( agent.DeletedAtIsNil(), agent.OrganizationIDNEQ(w.OrganizationId), ), ). WithAgent(). Only(w.Ctx) if err != nil { if ent.IsNotFound(err) { return nil } return err } if wxinfo != nil && wxinfo.Edges.Agent != nil { _, err = w.Tx.Wx.UpdateOneID(wxinfo.ID). SetAgentID(0). Save(w.Ctx) if err != nil { return err } } return nil } func (w *WxSafeChange) LabelSafe() error { wxinfo, err := w.Tx.Wx.Query(). Where( wx.Wxid(w.WxId), ). Only(w.Ctx) if err != nil || wxinfo == nil { return err } // 获取现有联系人的所有标签名称 contactLabelNames, err := w.Tx.Label.Query(). Where( label.DeletedAtIsNil(), label.HasLabelRelationshipsWith( labelrelationship.DeletedAtIsNil(), labelrelationship.HasContactsWith( contact.WxWxidEQ(w.WxId), ), ), ). Select(label.FieldName). Strings(w.Ctx) if err != nil { if ent.IsNotFound(err) { return nil } return err } newLabelNames, err := w.Tx.Label.Query(). Where( label.DeletedAtIsNil(), label.OrganizationIDEQ(w.OrganizationId), ). Select(label.FieldName). Strings(w.Ctx) if err != nil && !ent.IsNotFound(err) { return err } // 构建 newLabelNames 的 set newLabelSet := make(map[string]struct{}) for _, name := range newLabelNames { newLabelSet[name] = struct{}{} } // 找出 contactLabelNames 中 newLabelNames 没有的 var diffLabelNames []string for _, name := range contactLabelNames { if _, exists := newLabelSet[name]; !exists { diffLabelNames = append(diffLabelNames, name) } } if diffLabelNames != nil && len(diffLabelNames) > 0 { // 创建新标签 for _, labelName := range diffLabelNames { _, err = w.Tx.Label.Create(). SetName(labelName). SetOrganizationID(w.OrganizationId). SetConditions("{}"). Save(w.Ctx) if err != nil { return err } } } // 建立新的标签 id 映射关系 logx.Info("contactLabelNames", contactLabelNames) logx.Info("diffLabelNames", diffLabelNames) orgLabels, err := w.Tx.Label.Query(). Where( label.DeletedAtIsNil(), label.OrganizationIDEQ(w.OrganizationId), label.NameIn(contactLabelNames...), ). Select(label.FieldID, label.FieldName). All(w.Ctx) if err != nil { return err } labelSet := make(map[string]uint64) for _, l := range orgLabels { logx.Info("l.Name", l.Name, l.ID) logx.Info("l.ID", l.ID) labelSet[l.Name] = l.ID } // 建立新的标签关系 labelRelationships, err := w.Tx.LabelRelationship.Query(). Where( labelrelationship.DeletedAtIsNil(), labelrelationship.HasContactsWith( contact.WxWxidEQ(w.WxId), ), ).WithLabels().WithContacts().All(w.Ctx) if err != nil { return err } for _, relationship := range labelRelationships { if relationship.Edges.Labels == nil { continue } _, err = w.Tx.LabelRelationship.Create(). SetLabelID(labelSet[relationship.Edges.Labels.Name]). SetContactID(relationship.Edges.Contacts.ID). Save(w.Ctx) if err != nil { return err } } // 删除旧的标签关系 _, err = w.Tx.LabelRelationship.Delete(). Where( labelrelationship.DeletedAtIsNil(), labelrelationship.HasLabelsWith( label.OrganizationIDNEQ(wxinfo.OrganizationID)), labelrelationship.HasContactsWith( contact.WxWxidEQ(w.WxId), ), ).Exec(w.Ctx) if err != nil { return err } return nil }