friend_push_notice.go 6.3 KB

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