MessagesDao.go 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. package dao
  2. import (
  3. "encoding/json"
  4. . "gitdxz.51daxuetong.cn/go_dev/jjl-tools/tinodeService/lib"
  5. "strconv"
  6. "strings"
  7. "time"
  8. )
  9. type MessageDao struct {
  10. }
  11. type Messages struct {
  12. Createdat time.Time `json:"createdat"`
  13. Updatedat string `json:"updatedat"`
  14. Topic string `json:"topic"`
  15. From int64 `json:"from"`
  16. Realname string `json:"realname"`
  17. Avatar string `json:"avatar"`
  18. Content string `json:"content"`
  19. Role int `json:"role"`
  20. Head string `json:"head"`
  21. ChatId string `json:"chat_id"`
  22. }
  23. type ChatUser struct {
  24. Realname string `json:"realname"`
  25. Avatar string `json:"avatar"`
  26. Uid int `json:"uid"`
  27. }
  28. type Members struct {
  29. Id int
  30. Uid int
  31. ChatUid int
  32. Nickname string
  33. Avatar string
  34. CreateTime string
  35. }
  36. type InspectionDao struct {
  37. }
  38. func (insdao *InspectionDao) getUserFromDB(role int, uid int64) (ChatUser, error) {
  39. var member ChatUser
  40. var tableName string
  41. if role == 1 {
  42. tableName = "go_user"
  43. } else {
  44. tableName = "members"
  45. }
  46. err := GetTiNodeDbInstance().Debug().Table(tableName).Where("chat_uid=?",uid).Find(&member).Error
  47. if err !=nil {
  48. return member, err
  49. }
  50. return member, nil
  51. }
  52. func (insdao *InspectionDao) GetUserFromRedis(role int, uid int64) (ChatUser, error) {
  53. var customer ChatUser
  54. var member Members
  55. ccd := InspectionDao{}
  56. //获取客服名字
  57. if role == 1 {
  58. key := "customer:info:" + strconv.FormatInt(uid, 10)
  59. redisCli := GetRedisInstance().Connect(1)
  60. info, err := redisCli.Get(key).Result()
  61. if err != nil {
  62. customer, errs := ccd.getUserFromDB(1, uid)
  63. if customer.Realname == "" || errs != nil {
  64. customer.Realname = "无此客服"
  65. }
  66. return customer, nil
  67. }
  68. err = json.Unmarshal([]byte(info), &customer)
  69. if err != nil {
  70. customer.Realname = "无此客服"
  71. }
  72. return customer, nil
  73. } else {
  74. leadsDao := LeadsDao{}
  75. //获取用户信息
  76. var mcacheKey = "member:info:*:" + strconv.FormatInt(uid, 10)
  77. uidStr := strconv.FormatInt(uid, 10)
  78. redis := GetRedisInstance().Connect(2)
  79. cacheKey := redis.Keys(mcacheKey).Val()
  80. if len(cacheKey) == 0 {
  81. //读库
  82. customer, errs := ccd.getUserFromDB(2, uid)
  83. if customer.Realname == "" || errs != nil {
  84. customer.Realname = UidSEncodeNoErr(uidStr)
  85. }
  86. //再从leads表获取用户名
  87. leadsInfo, _ := leadsDao.GetLeadsInfo(map[string]interface{}{"uid": uid})
  88. if leadsInfo.Name != "" {
  89. customer.Realname = leadsInfo.Name
  90. }
  91. return customer, nil
  92. }
  93. info, _ := redis.Get(cacheKey[0]).Result()
  94. json.Unmarshal([]byte(info), &member)
  95. customer.Realname = member.Nickname
  96. customer.Avatar = member.Avatar
  97. if member.Nickname == "" {
  98. customer.Realname = UidSEncodeNoErr(uidStr)
  99. }
  100. //再从leads表获取用户名
  101. leadsInfo, _ := leadsDao.GetLeadsInfo(map[string]interface{}{"uid": uid})
  102. if leadsInfo.Name != "" {
  103. customer.Realname = leadsInfo.Name
  104. }
  105. return customer, nil
  106. }
  107. return customer, nil
  108. }
  109. func (mesDao MessageDao) GetMessagesList(topic, sid, messageTime string, limit int) (mesList []Messages, err error) {
  110. res := GetTiNodeDbInstance().Debug().Table("messages").Joins("left join dellog on dellog.topic = messages.topic AND messages.seqid = dellog.low").Where("messages.deletedat is null AND messages.delid = 0 AND dellog.deletedfor IS NULL")
  111. if topic != "" {
  112. res = res.Where("messages.topic = ?", topic)
  113. }
  114. if sid != "" {
  115. res = res.Where("messages.chat_id = ?", sid)
  116. }
  117. if messageTime != "" {
  118. res = res.Where("messages.createdat < ?", messageTime)
  119. }
  120. res = res.Order("messages.id DESC").Limit(limit).Find(&mesList)
  121. if err != nil {
  122. return nil, err
  123. }
  124. ccd := InspectionDao{}
  125. var customer ChatUser
  126. for k, v := range mesList {
  127. customer.Realname = ""
  128. customer, _ := ccd.GetUserFromRedis(v.Role, v.From)
  129. mesList[k].Realname = customer.Realname
  130. mesList[k].Avatar = customer.Avatar
  131. //聊天内容去掉开头和结尾的""
  132. mesList[k].Content = strings.Trim(v.Content, "\"")
  133. }
  134. return
  135. }
  136. type ChatRecordDao struct {
  137. }
  138. type SemJsChatRecord struct {
  139. CHAT_ID int `gorm:"column:CHAT_ID"`
  140. SID string `gorm:"column:SID"`
  141. CREATE_TIME string `gorm:"column:CREATE_TIME"` //创建时间
  142. VISITOR_ID string `gorm:"column:VISITOR_ID"` //访客ID
  143. USER_ID string `gorm:"column:USER_ID"` //客服ID
  144. VISITOR_STATIC_ID string `gorm:"column:VISITOR_STATIC_ID"` //访客唯一标识
  145. INVITE_MODE int64 `gorm:"column:INVITE_MODE"`
  146. REFER_PAGE string `gorm:"column:REFER_PAGE" json:"refer_page"` //来源地址
  147. COMPANY_ID int `gorm:"column:COMPANY_ID"`
  148. CHAT_URL string `gorm:"column:CHAT_URL"` //对话发起页
  149. FIRST_URL string `gorm:"column:FIRST_URL"` //着陆页
  150. BIZ int `gorm:"column:BIZ"`
  151. CHANNLE_ID int `gorm:"column:CHANNLE_ID"`
  152. CATEGORY_ID int `gorm:"column:CATEGORY_ID"`
  153. END int `gorm:"column:END"`
  154. GrUserId string `json:"gr_user_id"` //growingIO生成的UserID标识符
  155. Topic string `json:"topic"` //会话名
  156. CustomerMsgNum int `json:"customer_msg_num"` //客服发送消息数
  157. UserMsgNum int `json:"user_msg_num"` //用户发送消息数
  158. UserFirstMsgTime string `json:"user_first_msg_time"` //用户第一条消息时间
  159. CustomerFirstReplyTime string `json:"customer_first_reply_time"` //客服第一次回复时间
  160. CallEndTime string `json:"call_end_time"`
  161. CallEndType string `json:"call_end_type"`
  162. Ip string `json:"ip"`
  163. Seqid int `json:"seqid"` //消息总条数
  164. Delid int `json:"delid"` //删除条数
  165. Tags string `json:"tags"` //标签
  166. LeadsId int `json:"leads_id"` //名片id
  167. LeadsName string `json:"leads_name"` //名片名称
  168. Telephone string `json:"telephone"` //电话
  169. Mobile string `json:"mobile"` //手机
  170. Industry string `json:"industry"` //客户行业
  171. Remark string `json:"remark"` //备注
  172. CreateUserId string `json:"create_user_id"` //创建人ID
  173. OwnerUserId string `json:"owner_user_id"` //负责人ID
  174. Uid string `json:"uid"` //用户uid
  175. MobileEncrypted string `json:"mobile_encrypted""` //手机号加密
  176. MobileMask string `json:"mobile_mask"` //手机号掩码
  177. Country int `json:"country"` //国家
  178. City int `json:"city"` //城市
  179. WeChat string `json:"we_chat"` //微信
  180. Qq string `json:"qq"` //qq
  181. CUid string `json:"cUid"`
  182. GroupId int `json:"group_id"` //技能组id
  183. GroupName string `json:"group_name"` //技能组名称
  184. Realname string `json:"realname"` //客服名称
  185. ChannelName string `json:"channel_name"`
  186. CategoryName string `json:"category_name"`
  187. VisitorName string `json:"visitor_name"`
  188. }
  189. func (chatdao *ChatRecordDao) GetChatRecordByChatId(chatId string) (info SemJsChatRecord, err error) {
  190. err = GetTiNodeDbInstance().Debug().Table("sem_js_chat_record").Where("SID = ?", chatId).First(&info).Error
  191. if err != nil {
  192. return
  193. }
  194. return
  195. }
  196. /**
  197. * 获取sem_js_chat_record 详情
  198. * @apiParam {string} topic
  199. * @apiParam {string} sid
  200. */
  201. func (chatdao *ChatRecordDao) GetGroupByChatRecordLists(topic, sid string) (list []SemJsChatRecord, err error) {
  202. sql := GetTiNodeDbInstance().Debug().Table("sem_js_chat_record")
  203. if topic != "" {
  204. sql = sql.Where("topic = ?", topic)
  205. }
  206. if sid != "" {
  207. sql = sql.Where("SID = ?", sid)
  208. }
  209. err = sql.Find(&list).Error
  210. return
  211. }