friend_push_notice.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. package MessageHandlers
  2. import (
  3. "context"
  4. "encoding/json"
  5. "entgo.io/ent/dialect/sql"
  6. "github.com/zeromicro/go-zero/core/logx"
  7. "strconv"
  8. "strings"
  9. "time"
  10. "wechat-api/ent"
  11. "wechat-api/ent/label"
  12. "wechat-api/ent/labellog"
  13. "wechat-api/ent/wx"
  14. "wechat-api/internal/pkg/wechat_ws"
  15. "wechat-api/internal/svc"
  16. "wechat-api/workphone"
  17. )
  18. type FriendPushNoticeHandler struct {
  19. svcCtx *svc.ServiceContext
  20. }
  21. func NewFriendPushNoticeHandler(svcCtx *svc.ServiceContext) *FriendPushNoticeHandler {
  22. return &FriendPushNoticeHandler{
  23. svcCtx: svcCtx,
  24. }
  25. }
  26. func (f *FriendPushNoticeHandler) Handler(msg *wechat_ws.MsgJsonObject) error {
  27. if msg.MsgType == "FriendPushNotice" {
  28. message := workphone.FriendPushNoticeMessage{}
  29. err := json.Unmarshal([]byte(msg.Message), &message)
  30. if err != nil {
  31. return err
  32. }
  33. // 拿到租户 id
  34. wx_info, err := f.svcCtx.DB.Wx.Query().
  35. Where(
  36. wx.WxidEQ(message.WeChatId), // Additional filter by organizationId
  37. ).
  38. Only(context.TODO())
  39. //hookClient := hook.NewHook("", "", "")
  40. for _, friend := range message.Friends {
  41. friendType := 1
  42. //if friend.Type == 1 {
  43. // friendType = 2
  44. // _ = hookClient.RequestChatRoomInfo(friend.FriendId, message.WeChatId)
  45. //} else {
  46. // friendType = 1
  47. //}
  48. _, err = f.svcCtx.DB.Contact.Create().
  49. SetWxWxid(message.WeChatId).
  50. SetType(friendType).
  51. SetWxid(friend.FriendId).
  52. SetAccount(friend.FriendNo).
  53. SetNickname(friend.FriendNick).
  54. SetMarkname(friend.Memo).
  55. SetHeadimg(friend.Avatar).
  56. //SetSex(cast.ToInt(friend.Gender)).
  57. SetOrganizationID(wx_info.OrganizationID).
  58. OnConflict().
  59. UpdateNewValues().
  60. SetType(friendType).
  61. SetOrganizationID(wx_info.OrganizationID).
  62. ID(context.TODO())
  63. if err != nil {
  64. logx.Error("Contact.Create: ", wx_info.OrganizationID)
  65. return err
  66. }
  67. }
  68. }
  69. return nil
  70. }
  71. type FriendPushNoticeTypeHandler struct {
  72. svcCtx *svc.ServiceContext
  73. }
  74. func NewFriendPushNoticeTypeHandler(svcCtx *svc.ServiceContext) *FriendPushNoticeTypeHandler {
  75. return &FriendPushNoticeTypeHandler{
  76. svcCtx: svcCtx,
  77. }
  78. }
  79. // Handle 实现 MessageHandlerStrategy 接口
  80. func (f *FriendPushNoticeTypeHandler) Handle(ctx context.Context, msg *wechat_ws.MsgJsonObject, svcCtx *svc.ServiceContext) error {
  81. message := workphone.FriendPushNoticeMessage{}
  82. err := json.Unmarshal([]byte(msg.Message), &message)
  83. //logx.Infof("msg.Message 的内容是:%s", msg.Message)
  84. if err != nil {
  85. logx.Errorf("Unmarshal.fail")
  86. return err
  87. }
  88. // 拿到租户 id
  89. wxInfo, err := svcCtx.DB.Wx.Query().
  90. Where(
  91. wx.WxidEQ(message.WeChatId), // Additional filter by organizationId
  92. ).
  93. Only(ctx)
  94. if err != nil {
  95. return err
  96. }
  97. var labelRelationshipCreates []*ent.LabelRelationshipCreate
  98. for _, friend := range message.Friends {
  99. var friendId uint64
  100. friendType := 1
  101. friendId, err = svcCtx.DB.Contact.Create().
  102. SetWxWxid(message.WeChatId).
  103. SetType(friendType).
  104. SetWxid(friend.FriendId).
  105. SetAccount(friend.FriendNo).
  106. SetNickname(friend.FriendNick).
  107. SetMarkname(friend.Memo).
  108. SetHeadimg(friend.Avatar).
  109. SetOrganizationID(wxInfo.OrganizationID).
  110. OnConflict().
  111. UpdateNewValues().
  112. SetType(friendType).
  113. SetOrganizationID(wxInfo.OrganizationID).
  114. ID(ctx)
  115. if err != nil {
  116. logx.Errorf("Contact.Create 失败, OrgID=%d, err=%v", wxInfo.OrganizationID, err)
  117. return err
  118. }
  119. //判断friend里的labelId="1,2,3,4,5"为空就不处理了,不为空的时候就查下label表里有没有这个labelId,没有就插入,有就跳过
  120. if friend.LabelIds == "" {
  121. continue
  122. }
  123. //获取labelId,并且按照逗号去分割成数组
  124. labelIdsStr := friend.LabelIds
  125. var ids []int
  126. ids, err = ParseCSVToIntSlice(labelIdsStr)
  127. if err != nil {
  128. continue
  129. }
  130. //转换成labelIds的切片,去labelLog里 用labelId in 查下一下数据。
  131. //labelIds := strings.Split(labelIdsStr, ",")
  132. //ids, _ = ParseCSVToIntSlice(labelIdsStr)
  133. LabelLogs, err := svcCtx.DB.LabelLog.Query().
  134. Where(labellog.LabelIDIn(ids...)).
  135. All(ctx)
  136. if err != nil || len(LabelLogs) == 0 {
  137. continue
  138. }
  139. //映射本地的name + type + model + organization_id
  140. currentOrgID := wxInfo.OrganizationID
  141. for _, remoteLabel := range LabelLogs {
  142. labelInfo, err := svcCtx.DB.Label.Query().Where(
  143. label.NameEQ(remoteLabel.LabelName),
  144. label.FromEQ(2),
  145. label.ModeEQ(2),
  146. label.OrganizationID(currentOrgID),
  147. ).Only(ctx)
  148. if err != nil || ent.IsNotFound(err) {
  149. logx.Error("label not found.fail: ", wxInfo.OrganizationID)
  150. continue
  151. }
  152. //生成批量的关系数据 待插入
  153. labelRelationshipCreates = append(labelRelationshipCreates,
  154. svcCtx.DB.LabelRelationship.Create().
  155. //SetID(int(label.LabelId)).
  156. SetOrganizationID(wxInfo.OrganizationID).
  157. SetContactID(friendId).
  158. SetLabelID(labelInfo.ID).
  159. SetCreatedAt(time.Now()).
  160. SetUpdatedAt(time.Now()),
  161. )
  162. //
  163. }
  164. }
  165. if len(labelRelationshipCreates) > 0 {
  166. errShip := svcCtx.DB.LabelRelationship.CreateBulk(labelRelationshipCreates...).
  167. OnConflict(
  168. sql.ConflictColumns("label_id", "contact_id"),
  169. ).DoNothing().Exec(ctx)
  170. if errShip != nil {
  171. logx.Error("label_relationship.create.fail: ", wxInfo.OrganizationID, labelRelationshipCreates)
  172. return err
  173. }
  174. }
  175. return nil
  176. }
  177. func ParseCSVToIntSlice(csv string) ([]int, error) {
  178. if csv == "" {
  179. return nil, nil
  180. }
  181. parts := strings.Split(csv, ",")
  182. var result []int
  183. for _, p := range parts {
  184. n, err := strconv.Atoi(strings.TrimSpace(p))
  185. if err != nil {
  186. return nil, err
  187. }
  188. result = append(result, n)
  189. }
  190. return result, nil
  191. }