contact.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. package wechat
  2. import (
  3. "context"
  4. "go-common/app/admin/ep/saga/model"
  5. "go-common/library/log"
  6. )
  7. // Changes changes structure
  8. type Changes struct {
  9. Adds []*model.ContactInfo
  10. Upts []*model.ContactInfo
  11. Dels []*model.ContactInfo
  12. }
  13. // SyncContacts sync the contacts from wechat work 更新用户信息列表
  14. func (w *Wechat) SyncContacts(c context.Context) (err error) {
  15. //更新数据库用户列表 contact_infos
  16. if err = w.AnalysisContacts(c); err != nil {
  17. return
  18. }
  19. //更新用户saga信息
  20. /*if err = w.UpdateVisible(c); err != nil {
  21. return
  22. }*/
  23. return
  24. }
  25. // AnalysisContacts analysis the contact difference and save them 从企业微信更新用户列表最新
  26. func (w *Wechat) AnalysisContacts(c context.Context) (err error) {
  27. var (
  28. contactsInDB []*model.ContactInfo
  29. wechatContacts []*model.ContactInfo
  30. changes = &Changes{}
  31. )
  32. //数据库里查询用户信息列表
  33. if contactsInDB, err = w.dao.ContactInfos(); err != nil {
  34. return
  35. }
  36. //企业微信接口查询用户列表
  37. if wechatContacts, err = w.QueryWechatContacts(c); err != nil {
  38. return
  39. }
  40. if changes, err = w.diffChanges(wechatContacts, contactsInDB); err != nil {
  41. return
  42. }
  43. //saveChanges 更新用户信息
  44. if err = w.saveChanges(changes); err != nil {
  45. return
  46. }
  47. return
  48. }
  49. // QueryWechatContacts query wechat contacts with access token 获取用户信息列表
  50. func (w *Wechat) QueryWechatContacts(c context.Context) (contacts []*model.ContactInfo, err error) {
  51. var (
  52. token string
  53. )
  54. if token, err = w.AccessToken(c, w.contact); err != nil {
  55. return
  56. }
  57. if contacts, err = w.dao.WechatContacts(c, token); err != nil {
  58. return
  59. }
  60. return
  61. }
  62. //saveChanges 保存企业微信与数据库用户信息的更新内容
  63. func (w *Wechat) saveChanges(changes *Changes) (err error) {
  64. var (
  65. contact *model.ContactInfo
  66. )
  67. log.Info("saveChanges add(%d), upt(%d), del(%d)", len(changes.Adds), len(changes.Upts), len(changes.Dels))
  68. for _, contact = range changes.Adds {
  69. if err = w.dao.CreateContact(contact); err != nil {
  70. return
  71. }
  72. log.Info("saveChanges add: %v", contact)
  73. }
  74. for _, contact = range changes.Upts {
  75. if err = w.dao.UptContact(contact); err != nil {
  76. return
  77. }
  78. log.Info("saveChanges upt: %v", contact)
  79. }
  80. for _, contact = range changes.Dels {
  81. if err = w.dao.DelContact(contact); err != nil {
  82. return
  83. }
  84. log.Info("saveChanges del: %v", contact)
  85. }
  86. return
  87. }
  88. //diffChanges 对比企业微信用户列表和数据库用户列表
  89. func (w *Wechat) diffChanges(wechatContacts, contactsInDB []*model.ContactInfo) (changes *Changes, err error) {
  90. var (
  91. contact *model.ContactInfo
  92. wechatContactsMap = make(map[string]*model.ContactInfo)
  93. contactsInDBMap = make(map[string]*model.ContactInfo)
  94. wechatContactIDs []string
  95. dbContactsIDs []string
  96. userID string
  97. )
  98. changes = new(Changes)
  99. for _, contact = range wechatContacts {
  100. wechatContactsMap[contact.UserID] = contact
  101. wechatContactIDs = append(wechatContactIDs, contact.UserID)
  102. }
  103. for _, contact = range contactsInDB {
  104. contactsInDBMap[contact.UserID] = contact
  105. dbContactsIDs = append(dbContactsIDs, contact.UserID)
  106. }
  107. // 分析变化
  108. for _, userID = range wechatContactIDs {
  109. contact = wechatContactsMap[userID]
  110. if w.inSlice(dbContactsIDs, userID) { // 企业微信联系人ID,在数据库中能找到
  111. if !contact.AlmostEqual(contactsInDBMap[userID]) { // 但是域不同
  112. contact.ID = contactsInDBMap[userID].ID
  113. changes.Upts = append(changes.Upts, contact)
  114. }
  115. } else {
  116. changes.Adds = append(changes.Adds, contact) // 这个联系人是新增的
  117. }
  118. }
  119. for _, userID = range dbContactsIDs {
  120. if !w.inSlice(wechatContactIDs, userID) {
  121. changes.Dels = append(changes.Dels, contactsInDBMap[userID])
  122. }
  123. }
  124. return
  125. }
  126. func (w *Wechat) inSlice(slice []string, target string) bool {
  127. for _, v := range slice {
  128. if v == target {
  129. return true
  130. }
  131. }
  132. return false
  133. }
  134. // UpdateVisible update the visible property 更新用户saga信息
  135. func (w *Wechat) UpdateVisible(c context.Context) (err error) {
  136. var (
  137. user *model.UserInfo
  138. users []*model.UserInfo
  139. contact *model.ContactInfo
  140. )
  141. //获取用户ID列表
  142. if users, err = w.querySagaVisible(c); err != nil {
  143. return
  144. }
  145. for _, user = range users {
  146. //定义用户信息--saga是否可使用(是)
  147. contact = &model.ContactInfo{UserID: user.UserID, VisibleSaga: true}
  148. if err = w.dao.UptContact(contact); err != nil {
  149. return
  150. }
  151. }
  152. return
  153. }
  154. //querySagaVisible 获取用户ID列表
  155. func (w *Wechat) querySagaVisible(c context.Context) (users []*model.UserInfo, err error) {
  156. var (
  157. token string
  158. )
  159. if token, err = w.AccessToken(c, w.saga); err != nil {
  160. return
  161. }
  162. if users, err = w.dao.WechatSagaVisible(c, token, w.saga.AppID); err != nil {
  163. return
  164. }
  165. return
  166. }