Beispiel #1
0
 public ConversationsQuery(long userId, int page, string country, ChatRoomStatus status, string assignTo, WaitingFor?conversationStatus)
 {
     UserId             = userId;
     Page               = page;
     Country            = country;
     Status             = status;
     AssignTo           = assignTo;
     ConversationStatus = conversationStatus;
 }
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="room">聊天室</param>
        /// <param name="userID">取消息的用户ID</param>
        /// <param name="recentMsgs">取得的消息</param>
        public void Init(ChatRoom room, string userID, List <ChatMessage> recentMsgs, bool iswap = false)
        {
            int            delay = 0, timeShift = 0, isTyping = 0;
            ChatRoomStatus status = ChatRoomStatus.Closed;

            if (room != null)
            {
                TimeSpan ts = DateTime.Now - room.CreateDate;
                if (ts.TotalSeconds > 5000)
                {
                    timeShift = 5000;
                }
                else
                {
                    timeShift = (int)ts.TotalSeconds;
                }

                isTyping = room.IsCustomerTyping ? 1 : 0;
                status   = room.Status;
                if (status == ChatRoomStatus.Chatting && !room.IsContainsSelf(userID))
                {
                    status = ChatRoomStatus.Closed;
                }
            }
            recentMsgs.ForEach(item =>
            {
                delay = timeShift - item.TimeShift;
                if (delay > this.MaxDelay)
                {
                    this.MaxDelay = delay;
                }
                if (iswap)
                {
                    this.MsgList.Add(item.FormatMessage_wap);
                }
                else
                {
                    this.MsgList.Add(item.FormatMessage);
                }
            });
            this.IsTyping = isTyping;
            switch (status)
            {
            case ChatRoomStatus.Closed:
                this.Status = -1;
                break;

            case ChatRoomStatus.Initting:
            case ChatRoomStatus.WaitService:
                this.Status = 1;
                break;

            case ChatRoomStatus.Chatting:
                this.Status = 2;
                break;
            }
        }
        //[Authorize(Policy = Policy.IsraelUser)]
        public async Task <IEnumerable <ConversationDto> > ConversationAsync([FromQuery] ConversationDetailsRequest request
                                                                             , CancellationToken token)
        {
            ChatRoomStatus p = null;

            if (request.Status.HasValue)
            {
                p = Enumeration.FromValue <ChatRoomStatus>(request.Status.Value);
            }

            var query = new ConversationsQuery(request.Id.GetValueOrDefault(), request.Page, User.GetCountryClaim(),
                                               p, request.AssignTo, request.AutoStatus);

            return(await _queryBus.QueryAsync(query, token));
        }
Beispiel #4
0
            public async Task <IEnumerable <ConversationDto> > GetAsync(ConversationsQuery query, CancellationToken token)
            {
                var p = _statelessSession.Query <ViewConversation>();


                if (!string.IsNullOrEmpty(query.AssignTo))
                {
                    p = p.Where(w => w.AssignTo == query.AssignTo);
                }
                if (!string.IsNullOrEmpty(query.Country))
                {
                    p = p.Where(w => w.Country == query.Country);
                }

                //switch (query.AssignTo)
                //{
                //    case ChatRoomAssign.Unassigned:
                //        p = p.Where(w => w.AssignTo == null);
                //        break;
                //    case ChatRoomAssign.All:
                //        break;
                //    default:
                //        p = p.Where(w => w.AssignTo == query.AssignTo);
                //        break;
                //}

                //p = p.Where(w => w.Status == ChatRoomStatus2.SessionScheduled);

                if (query.Status != null)
                {
                    if (query.Status == ChatRoomStatus.New)
                    {
                        p = p.Where(w => w.Status == query.Status || w.Status == null);
                    }
                    else
                    {
                        p = p.Where(w => w.Status == query.Status);
                    }
                }
                else
                {
                    if (query.UserId > 0)
                    {
                    }
                    else
                    {
                        var v = ChatRoomStatus.GetActiveStatus().ToArray();
                        p = p.Where(w => v.Contains(w.Status) || w.Status == null);
                    }
                }


                switch (query.ConversationStatus)
                {
                case WaitingFor.Tutor:
                    p = p.Where(w => w.ConversationStatus == 1);
                    break;

                case WaitingFor.Student:
                    p = p.Where(w => w.ConversationStatus == 2);
                    break;

                case WaitingFor.Conv:
                    p = p.Where(w => w.ConversationStatus > 2);
                    break;
                }

                if (query.UserId > 0)
                {
                    p = p.Where(w => w.TutorId == query.UserId || w.UserId == query.UserId);
                }
                return(await p.Select(s => new ConversationDto()
                {
                    Id = s.Id,
                    UserId = s.UserId,
                    Status = s.Status,
                    LastMessage = s.LastMessage,
                    TutorId = s.TutorId,
                    AssignTo = s.AssignTo,
                    HoursFromLastMessage = s.HoursFromLastMessage,
                    RequestFor = s.RequestFor,
                    StudyRoomExists = s.StudyRoomExists,
                    TutorEmail = s.TutorEmail,
                    TutorName = s.TutorName,
                    TutorPhoneNumber = s.TutorPhoneNumber,
                    UserEmail = s.UserEmail,
                    UserName = s.UserName,
                    UserPhoneNumber = s.UserPhoneNumber,
                    ConversationStatus = s.ConversationStatus
                }).OrderByDescending(o => o.LastMessage)
                       .Take(20).Skip(20 * query.Page).ToListAsync(token));

                //                const string sql = @"
                //with cte as (
                //Select
                //cr.Id ,
                //cra.status,
                //cra.AssignTo,
                //cr.Identifier ,
                //cr.UpdateTime as lastMessage,
                //u.id as userId,
                //u.Name,
                //u.Email,
                //u.PhoneNumberHash,
                //case when (select top 1 UserId from sb.ChatMessage cm where  cm.ChatRoomId = cr.id ) = cu.userid then 0 else 1 end as isTutor

                //from sb.ChatUser cu
                //join sb.ChatRoom cr on cu.ChatRoomId = cr.Id
                //left join sb.ChatRoomAdmin cra
                //	on cr.Id = cra.Id
                //join sb.[user] u on cu.UserId = u.Id
                //)
                //select c.Identifier as id,
                //c.lastMessage as lastMessage,
                //c.Name as UserName,
                //c.PhoneNumberHash as UserPhoneNumber,
                //c.Email as UserEmail,
                //c.userId as UserId,
                //d.Name as TutorName,
                //d.PhoneNumberHash as TutorPhoneNumber,
                //d.Email as TutorEmail,
                //d.UserId as TutorId,
                //c.status,
                //c.AssignTo,
                //(SELECT max (grp) FROM
                //(
                //SELECT *, COUNT(isstart) OVER( PARTITION BY ChatRoomId ORDER BY Id ROWS UNBOUNDED PRECEDING) AS grp
                //FROM (
                //SELECT *,
                //CASE WHEN ABS(UserId - LAG(UserId) OVER(PARTITION BY ChatRoomId ORDER BY Id)) <= 1 THEN NULL ELSE 1 END AS isstart
                //FROM sb.ChatMessage
                //where ChatRoomId = c.id
                //) t1
                //) t2) as conversationStatus,
                //case when (Select  id from sb.StudyRoom where Identifier = c.Identifier) is null then 0 else 1 end  as studyRoomExists,
                //datediff(HOUR, c.lastMessage, GETUTCDATE()) as HoursFromLastMessage
                //from cte c
                //inner join cte d on d.id = c.id and c.isTutor = 0 and d.isTutor = 1
                // where (c.UserId = @UserId or @UserId = 0 or d.userId = @UserId)
                // and (c.AssignTo = @AssignTo or @AssignTo = 'all' or (@AssignTo = 'Unassigned' and (c.AssignTo is null or c.AssignTo = 'Unassigned')))
                //		and (c.status = @Status or @Status = 'all' or (@Status = 'Unassigned' and (c.status is null or c.status = 'Unassigned')))
                //		and ((SELECT max (grp) FROM
                //(
                //SELECT *, COUNT(isstart) OVER( PARTITION BY ChatRoomId ORDER BY Id ROWS UNBOUNDED PRECEDING) AS grp
                //FROM (
                //SELECT *,
                //CASE WHEN ABS(UserId - LAG(UserId) OVER(PARTITION BY ChatRoomId ORDER BY Id)) <= 1 THEN NULL ELSE 1 END AS isstart
                //FROM sb.ChatMessage
                //where ChatRoomId = c.id
                //) t1
                //) t2) = @Conv or @Conv = 0
                //or (@Conv = 3 and (SELECT max (grp) FROM
                //(
                //SELECT *, COUNT(isstart) OVER( PARTITION BY ChatRoomId ORDER BY Id ROWS UNBOUNDED PRECEDING) AS grp
                //FROM (
                //SELECT *,
                //CASE WHEN ABS(UserId - LAG(UserId) OVER(PARTITION BY ChatRoomId ORDER BY Id)) <= 1 THEN NULL ELSE 1 END AS isstart
                //FROM sb.ChatMessage
                //where ChatRoomId = c.id
                //) t1
                //) t2) > 2))
                //order by c.lastMessage desc
                //OFFSET @pageSize * @PageNumber ROWS
                //FETCH NEXT @pageSize ROWS ONLY;";
                //                using (var connection = _dapper.OpenConnection())
                //                {
                //                    var res = await connection.QueryAsync<ConversationDto>(sql,
                //                        new
                //                        {
                //                            query.UserId,
                //                            pageSize = 50,
                //                            PageNumber = query.Page,
                //                            Status = query.Status.ToString(),
                //                            AssignTo = query.AssignTo.ToString(),
                //                            Conv = (int)query.ConversationStatus
                //                        });
                //                    return res;
                //                }
            }
 public ChangeConversationStatusCommand(string identifier, ChatRoomStatus modelStatus)
 {
     Identifier = identifier;
     Status     = modelStatus;
 }