package dao import ( "encoding/json" . "gitdxz.51daxuetong.cn/go_dev/jjl-tools/tinodeService/lib" "strconv" "strings" "time" ) type MessageDao struct { } type Messages struct { Createdat time.Time `json:"createdat"` Updatedat string `json:"updatedat"` Topic string `json:"topic"` From int64 `json:"from"` Realname string `json:"realname"` Avatar string `json:"avatar"` Content string `json:"content"` Role int `json:"role"` Head string `json:"head"` ChatId string `json:"chat_id"` } type ChatUser struct { Realname string `json:"realname"` Avatar string `json:"avatar"` Uid int `json:"uid"` } type Members struct { Id int Uid int ChatUid int Nickname string Avatar string CreateTime string } type InspectionDao struct { } func (insdao *InspectionDao) getUserFromDB(role int, uid int64) (ChatUser, error) { var member ChatUser var tableName string if role == 1 { tableName = "go_user" } else { tableName = "members" } err := GetTiNodeDbInstance().Debug().Table(tableName).Where("chat_uid=?",uid).Find(&member).Error if err !=nil { return member, err } return member, nil } func (insdao *InspectionDao) GetUserFromRedis(role int, uid int64) (ChatUser, error) { var customer ChatUser var member Members ccd := InspectionDao{} //获取客服名字 if role == 1 { key := "customer:info:" + strconv.FormatInt(uid, 10) redisCli := GetRedisInstance().Connect(1) info, err := redisCli.Get(key).Result() if err != nil { customer, errs := ccd.getUserFromDB(1, uid) if customer.Realname == "" || errs != nil { customer.Realname = "无此客服" } return customer, nil } err = json.Unmarshal([]byte(info), &customer) if err != nil { customer.Realname = "无此客服" } return customer, nil } else { leadsDao := LeadsDao{} //获取用户信息 var mcacheKey = "member:info:*:" + strconv.FormatInt(uid, 10) uidStr := strconv.FormatInt(uid, 10) redis := GetRedisInstance().Connect(2) cacheKey := redis.Keys(mcacheKey).Val() if len(cacheKey) == 0 { //读库 customer, errs := ccd.getUserFromDB(2, uid) if customer.Realname == "" || errs != nil { customer.Realname = UidSEncodeNoErr(uidStr) } //再从leads表获取用户名 leadsInfo, _ := leadsDao.GetLeadsInfo(map[string]interface{}{"uid": uid}) if leadsInfo.Name != "" { customer.Realname = leadsInfo.Name } return customer, nil } info, _ := redis.Get(cacheKey[0]).Result() json.Unmarshal([]byte(info), &member) customer.Realname = member.Nickname customer.Avatar = member.Avatar if member.Nickname == "" { customer.Realname = UidSEncodeNoErr(uidStr) } //再从leads表获取用户名 leadsInfo, _ := leadsDao.GetLeadsInfo(map[string]interface{}{"uid": uid}) if leadsInfo.Name != "" { customer.Realname = leadsInfo.Name } return customer, nil } return customer, nil } func (mesDao MessageDao) GetMessagesList(topic, sid, messageTime string, limit int) (mesList []Messages, err error) { 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") if topic != "" { res = res.Where("messages.topic = ?", topic) } if sid != "" { res = res.Where("messages.chat_id = ?", sid) } if messageTime != "" { res = res.Where("messages.createdat < ?", messageTime) } res = res.Order("messages.id DESC").Limit(limit).Find(&mesList) if err != nil { return nil, err } ccd := InspectionDao{} var customer ChatUser for k, v := range mesList { customer.Realname = "" customer, _ := ccd.GetUserFromRedis(v.Role, v.From) mesList[k].Realname = customer.Realname mesList[k].Avatar = customer.Avatar //聊天内容去掉开头和结尾的"" mesList[k].Content = strings.Trim(v.Content, "\"") } return } type ChatRecordDao struct { } type SemJsChatRecord struct { CHAT_ID int `gorm:"column:CHAT_ID"` SID string `gorm:"column:SID"` CREATE_TIME string `gorm:"column:CREATE_TIME"` //创建时间 VISITOR_ID string `gorm:"column:VISITOR_ID"` //访客ID USER_ID string `gorm:"column:USER_ID"` //客服ID VISITOR_STATIC_ID string `gorm:"column:VISITOR_STATIC_ID"` //访客唯一标识 INVITE_MODE int64 `gorm:"column:INVITE_MODE"` REFER_PAGE string `gorm:"column:REFER_PAGE" json:"refer_page"` //来源地址 COMPANY_ID int `gorm:"column:COMPANY_ID"` CHAT_URL string `gorm:"column:CHAT_URL"` //对话发起页 FIRST_URL string `gorm:"column:FIRST_URL"` //着陆页 BIZ int `gorm:"column:BIZ"` CHANNLE_ID int `gorm:"column:CHANNLE_ID"` CATEGORY_ID int `gorm:"column:CATEGORY_ID"` END int `gorm:"column:END"` GrUserId string `json:"gr_user_id"` //growingIO生成的UserID标识符 Topic string `json:"topic"` //会话名 CustomerMsgNum int `json:"customer_msg_num"` //客服发送消息数 UserMsgNum int `json:"user_msg_num"` //用户发送消息数 UserFirstMsgTime string `json:"user_first_msg_time"` //用户第一条消息时间 CustomerFirstReplyTime string `json:"customer_first_reply_time"` //客服第一次回复时间 CallEndTime string `json:"call_end_time"` CallEndType string `json:"call_end_type"` Ip string `json:"ip"` Seqid int `json:"seqid"` //消息总条数 Delid int `json:"delid"` //删除条数 Tags string `json:"tags"` //标签 LeadsId int `json:"leads_id"` //名片id LeadsName string `json:"leads_name"` //名片名称 Telephone string `json:"telephone"` //电话 Mobile string `json:"mobile"` //手机 Industry string `json:"industry"` //客户行业 Remark string `json:"remark"` //备注 CreateUserId string `json:"create_user_id"` //创建人ID OwnerUserId string `json:"owner_user_id"` //负责人ID Uid string `json:"uid"` //用户uid MobileEncrypted string `json:"mobile_encrypted""` //手机号加密 MobileMask string `json:"mobile_mask"` //手机号掩码 Country int `json:"country"` //国家 City int `json:"city"` //城市 WeChat string `json:"we_chat"` //微信 Qq string `json:"qq"` //qq CUid string `json:"cUid"` GroupId int `json:"group_id"` //技能组id GroupName string `json:"group_name"` //技能组名称 Realname string `json:"realname"` //客服名称 ChannelName string `json:"channel_name"` CategoryName string `json:"category_name"` VisitorName string `json:"visitor_name"` } func (chatdao *ChatRecordDao) GetChatRecordByChatId(chatId string) (info SemJsChatRecord, err error) { err = GetTiNodeDbInstance().Debug().Table("sem_js_chat_record").Where("SID = ?", chatId).First(&info).Error if err != nil { return } return } /** * 获取sem_js_chat_record 详情 * @apiParam {string} topic * @apiParam {string} sid */ func (chatdao *ChatRecordDao) GetGroupByChatRecordLists(topic, sid string) (list []SemJsChatRecord, err error) { sql := GetTiNodeDbInstance().Debug().Table("sem_js_chat_record") if topic != "" { sql = sql.Where("topic = ?", topic) } if sid != "" { sql = sql.Where("SID = ?", sid) } err = sql.Find(&list).Error return }