MessagesDao.go 7.9 KB

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