123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- package label_relationship
- import (
- "context"
- "github.com/suyuan32/simple-admin-common/msg/errormsg"
- "wechat-api/ent"
- "wechat-api/ent/contact"
- "wechat-api/ent/custom_types"
- "wechat-api/ent/labelrelationship"
- "wechat-api/ent/messagerecords"
- "wechat-api/ent/soptask"
- "wechat-api/internal/svc"
- "wechat-api/internal/types"
- "wechat-api/internal/utils/dberrorhandler"
- "github.com/zeromicro/go-zero/core/logx"
- )
- type UpdateLabelRelationshipsLogic struct {
- logx.Logger
- ctx context.Context
- svcCtx *svc.ServiceContext
- }
- func NewUpdateLabelRelationshipsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UpdateLabelRelationshipsLogic {
- return &UpdateLabelRelationshipsLogic{
- Logger: logx.WithContext(ctx),
- ctx: ctx,
- svcCtx: svcCtx}
- }
- func (l *UpdateLabelRelationshipsLogic) UpdateLabelRelationships(req *types.LabelRelationshipsInfo) (resp *types.BaseMsgResp, err error) {
- // 开始事务
- tx, err := l.svcCtx.DB.Tx(context.Background())
- if err != nil {
- return nil, dberrorhandler.DefaultEntError(l.Logger, err, req)
- }
- // 获取联系人信息
- c, err := tx.Contact.Query().Where(contact.ID(*req.ContactId)).Only(l.ctx)
- // 获取联系人当前已关联的标签
- currentLabelRelationships, err := tx.LabelRelationship.Query().Where(labelrelationship.ContactID(*req.ContactId)).All(l.ctx)
- if err != nil {
- _ = tx.Rollback()
- return nil, dberrorhandler.DefaultEntError(l.Logger, err, req)
- }
- // 提取当前标签ID
- var currentLabelIds []uint64
- for _, relationship := range currentLabelRelationships {
- currentLabelIds = append(currentLabelIds, relationship.LabelID)
- }
- // 对比新旧标签ID,找出需要新增和移除的标签
- addLabelIds, removeLabelIds := compareLabelIds(req.LabelIds, currentLabelIds)
- // 如果 req.UpdateType 为空,或 req.UpdateType 的值为 “all” 时
- if req.UpdateType == nil || *req.UpdateType == "all" {
- // 删除需要移除的标签关系
- for _, id := range removeLabelIds {
- _, err := tx.LabelRelationship.
- Delete().
- Where(
- labelrelationship.ContactID(*req.ContactId),
- labelrelationship.LabelID(id),
- ).
- Exec(l.ctx)
- if err != nil {
- _ = tx.Rollback()
- return nil, dberrorhandler.DefaultEntError(l.Logger, err, req)
- }
- }
- }
- // 创建需要新增的标签关系
- for _, id := range addLabelIds {
- _, _ = tx.LabelRelationship.Create().
- SetLabelID(id).
- SetContactID(*req.ContactId).
- Save(l.ctx)
- //if err != nil {
- // return nil, dberrorhandler.DefaultEntError(l.Logger, err, req)
- //}
- }
- currentLabelIds = req.LabelIds
- // 获取所有 status 为 3 且 bot_wxid_list 包含 c.wx_wxid 的 sop_task
- sopTasks, err := tx.SopTask.Query().Where(soptask.Status(3)).All(l.ctx)
- l.Logger.Info("UpdateLabelRelationships sopTasks:", sopTasks)
- if err != nil {
- _ = tx.Rollback()
- return nil, dberrorhandler.DefaultEntError(l.Logger, err, req)
- }
- var filteredSopTasks []*ent.SopTask
- for _, task := range sopTasks {
- for _, botWxid := range task.BotWxidList {
- if botWxid == c.WxWxid {
- filteredSopTasks = append(filteredSopTasks, task)
- break
- }
- }
- }
- // 获取所有 filteredSopTasks 的 sop_stages
- var sopStages []*ent.SopStage
- for _, task := range filteredSopTasks {
- stages, err := task.QueryTaskStages().All(l.ctx)
- if err != nil {
- _ = tx.Rollback()
- return nil, dberrorhandler.DefaultEntError(l.Logger, err, req)
- }
- sopStages = append(sopStages, stages...)
- }
- err = l.AddLabelRelationships(sopStages, *c, currentLabelIds)
- if err != nil {
- _ = tx.Rollback()
- return nil, err
- }
- // 所有操作成功,提交事务
- err = tx.Commit()
- if err != nil {
- return nil, dberrorhandler.DefaultEntError(l.Logger, err, req)
- }
- return &types.BaseMsgResp{
- Code: 0,
- Msg: errormsg.Success,
- }, nil
- }
- func (l *UpdateLabelRelationshipsLogic) AddLabelRelationships(sopStages []*ent.SopStage, contact ent.Contact, currentLabelIds []uint64) (err error) {
- // 开始事务
- tx, err := l.svcCtx.DB.Tx(context.Background())
- if err != nil {
- return dberrorhandler.DefaultEntError(l.Logger, err, nil)
- }
- // 遍历 sop_stages,找出满足条件的 stage
- for _, stage := range sopStages {
- if stage.ConditionType == 1 && isLabelIdListMatchFilter(currentLabelIds, stage.ConditionOperator, stage.ConditionList) {
- // 判断是否有 contact_wxid、source_type、source_id、sub_source_id 相同的记录
- _, err = tx.MessageRecords.Query().
- Where(
- messagerecords.ContactWxid(contact.Wxid),
- messagerecords.SourceType(3),
- messagerecords.SourceID(stage.ID),
- messagerecords.SubSourceID(0),
- ).
- Only(l.ctx)
- if err == nil {
- continue
- }
- // 判断ActionMessage是否为空
- sourceType := 3
- if stage.ActionMessage != nil {
- for _, message := range stage.ActionMessage {
- _, _ = tx.MessageRecords.Create().
- SetNotNilBotWxid(&contact.WxWxid).
- SetNotNilContactID(&contact.ID).
- SetNotNilContactType(&contact.Type).
- SetNotNilContactWxid(&contact.Wxid).
- SetNotNilContentType(&message.Type).
- SetNotNilContent(&message.Content).
- SetNotNilSourceType(&sourceType).
- SetNotNilSourceID(&stage.ID).
- Save(l.ctx)
- //if err != nil {
- // return dberrorhandler.DefaultEntError(l.Logger, err, nil)
- //}
- }
- }
- if stage.ActionLabel != nil {
- // 获取 addLabelIds 中不在 currentLabelIds 中的标签ID
- var newLabelIds []uint64
- // 创建一个映射,用于快速查找 currentLabelIds 中的元素
- currentLabelIdSet := make(map[uint64]struct{})
- for _, id := range currentLabelIds {
- currentLabelIdSet[id] = struct{}{}
- }
- // 遍历 addLabelIds,找出不在 currentLabelIds 中的元素
- for _, id := range stage.ActionLabel {
- if _, exists := currentLabelIdSet[id]; !exists {
- newLabelIds = append(newLabelIds, id)
- }
- }
- if len(newLabelIds) == 0 {
- return nil
- }
- // 创建需要新增的标签关系
- for _, id := range newLabelIds {
- _, err = tx.LabelRelationship.Create().
- SetLabelID(id).
- SetContactID(contact.ID).
- Save(l.ctx)
- //if err != nil {
- // return dberrorhandler.DefaultEntError(l.Logger, err, nil)
- //}
- }
- // 合并 currentLabelIds 和 newLabelIds
- currentLabelIds = append(currentLabelIds, newLabelIds...)
- // 递归调用 AddLabelRelationships
- err = l.AddLabelRelationships(sopStages, contact, currentLabelIds)
- if err != nil {
- _ = tx.Rollback()
- return err
- }
- }
- }
- }
- // 所有操作成功,提交事务
- err = tx.Commit()
- if err != nil {
- return dberrorhandler.DefaultEntError(l.Logger, err, nil)
- }
- return nil
- }
- // compareLabelIds compares the new label ids with the current ones and returns the ids to be added and removed
- func compareLabelIds(newLabelIds []uint64, currentLabelIds []uint64) (addLabelIds []uint64, removeLabelIds []uint64) {
- newLabelIdSet := make(map[uint64]struct{}, len(newLabelIds))
- for _, id := range newLabelIds {
- newLabelIdSet[id] = struct{}{}
- }
- for _, id := range currentLabelIds {
- if _, ok := newLabelIdSet[id]; ok {
- delete(newLabelIdSet, id)
- } else {
- removeLabelIds = append(removeLabelIds, id)
- }
- }
- for id := range newLabelIdSet {
- addLabelIds = append(addLabelIds, id)
- }
- return
- }
- func isLabelIdListMatchFilter(labelIdList []uint64, conditionOperator int, conditionList []custom_types.Condition) bool {
- labelIdSet := make(map[uint64]struct{})
- for _, id := range labelIdList {
- labelIdSet[id] = struct{}{}
- }
- for _, condition := range conditionList {
- match := false
- for _, id := range condition.LabelIdList {
- if _, ok := labelIdSet[id]; ok {
- match = true
- break
- }
- }
- if condition.Equal == 2 {
- match = !match
- }
- if (conditionOperator == 1 && !match) || (conditionOperator == 2 && match) {
- return match
- }
- }
- return conditionOperator == 1
- }
|