Ejemplo n.º 1
0
        public async Task <Ticket> Update(Ticket Ticket)
        {
            if (!await TicketValidator.Update(Ticket))
            {
                return(Ticket);
            }
            try
            {
                var oldData = await UOW.TicketRepository.Get(Ticket.Id);

                await UOW.Begin();

                DateTime Now = StaticParams.DateTimeNow;
                // Gán thời gian xử lý và thời gian phản hồi cho ticket từ SLAPolicy
                SLAPolicy SLAPolicy = await UOW.SLAPolicyRepository.GetByTicket(Ticket);

                if (SLAPolicy != null)
                {
                    //Ticket.SLAPolicyId = SLAPolicy.Id;
                    Ticket.FirstResponeTime = oldData.CreatedAt.AddMinutes(Utils.ConvertSLATimeToMenute(SLAPolicy.FirstResponseTime.Value, SLAPolicy.FirstResponseUnitId.Value));
                    Ticket.ResolveTime      = oldData.CreatedAt.AddMinutes(Utils.ConvertSLATimeToMenute(SLAPolicy.ResolveTime.Value, SLAPolicy.ResolveUnitId.Value));
                }
                // Ticket chuyển từ trạng thái hoạt động sang dừng
                if (!Ticket.IsWork.Value && oldData.IsWork.Value)
                {
                    Ticket.LastHoldingAt = Now;
                }
                // Ticket chuyển từ trạng thái dừng sang hoạt động
                else if (Ticket.IsWork.Value && !oldData.IsWork.Value)
                {
                    Ticket.FirstResponeTime = Now.AddMinutes(oldData.FirstRespTimeRemaining.Value);
                    Ticket.ResolveTime      = Now.AddMinutes(oldData.ResolveTimeRemaining.Value);
                    Ticket.HoldingTime      = oldData.HoldingTime + (long)(Now.Subtract(oldData.LastHoldingAt.Value).TotalMinutes);
                }
                // Lưu lại lịch sử ticket
                Ticket.TicketOfUsers = new List <TicketOfUser>();
                Ticket.TicketOfUsers.Add(
                    new TicketOfUser()
                {
                    TicketStatusId = Ticket.TicketStatusId,
                    UserId         = Ticket.UserId,
                    Notes          = Ticket.Notes,
                    TicketId       = Ticket.Id
                }
                    );
                // Đóng ticket
                if (Ticket.TicketStatusId == TicketStatusEnum.RESOLVED.Id || Ticket.TicketStatusId == TicketStatusEnum.CLOSED.Id)
                {
                    Ticket.ResolvedAt    = Now;
                    Ticket.ResolveMinute = (long)(Now.Subtract(oldData.CreatedAt).TotalMinutes);
                    Ticket.IsClose       = true;

                    var ot = (long)(Now.Subtract(Ticket.ResolveTime.Value).TotalMinutes);
                    if (ot > 0)
                    {
                        Ticket.SLAOverTime = ot;
                    }

                    if (Ticket.TicketStatusId == TicketStatusEnum.CLOSED.Id)
                    {
                        Ticket.closedAt = Now;
                    }

                    // Update trạng thái SLA
                    if (oldData.ResolveTime < Now)
                    {
                        Ticket.SLAStatusId = SLAStatusEnum.Fail.Id;
                    }
                    else
                    {
                        Ticket.SLAStatusId = SLAStatusEnum.Success.Id;
                    }
                }
                // Mở lại ticket
                if (Ticket.TicketStatusId != TicketStatusEnum.RESOLVED.Id && Ticket.TicketStatusId != TicketStatusEnum.CLOSED.Id && oldData.IsClose.Value)
                {
                    Ticket.ReraisedTimes = oldData.ReraisedTimes.Value + 1;
                    Ticket.IsClose       = false;
                }

                // Update thời gian phản hồi còn lại và thời gian xử lý còn lại
                var frtr = (long)(oldData.FirstResponeTime.Value.Subtract(Now).TotalMinutes);
                Ticket.FirstRespTimeRemaining = frtr < 0 ? 0 : frtr;
                var rtr = (long)(oldData.ResolveTime.Value.Subtract(Now).TotalMinutes);
                Ticket.ResolveTimeRemaining = rtr < 0 ? 0 : rtr;

                await UOW.TicketRepository.Update(Ticket);

                await UOW.Commit();

                Ticket = await UOW.TicketRepository.Get(Ticket.Id);

                // Push noti ticket đã sử dụng
                NotifyUsed(Ticket);

                // Thông báo cho người phụ trách ticket
                List <UserNotification> UserNotifications = new List <UserNotification>();
                var AssignUser = await UOW.AppUserRepository.Get(Ticket.UserId);

                var CurrentUser = await UOW.AppUserRepository.Get(CurrentContext.UserId);

                List <long> RecipientIds = new List <long>();
                RecipientIds.Add(Ticket.UserId);
                RecipientIds.Add(Ticket.CreatorId);
                foreach (var id in RecipientIds)
                {
                    UserNotification NotificationUtils = new UserNotification
                    {
                        TitleWeb    = $"Thông báo từ CRM",
                        ContentWeb  = $"Ticket [{Ticket.TicketNumber} - {Ticket.Name} - {Ticket.TicketIssueLevel.Name}] đã được gán cho {AssignUser.DisplayName} bởi {CurrentUser.DisplayName}",
                        LinkWebsite = $"{TicketRoute.Detail}/*".Replace("*", Ticket.Id.ToString()),
                        Time        = Now,
                        Unread      = true,
                        SenderId    = CurrentContext.UserId,
                        RecipientId = id
                    };
                    UserNotifications.Add(NotificationUtils);
                }

                await NotificationService.BulkSend(UserNotifications);

                await Logging.CreateAuditLog(Ticket, oldData, nameof(TicketService));

                return(Ticket);
            }
            catch (Exception ex)
            {
                await UOW.Rollback();

                if (ex.InnerException == null)
                {
                    await Logging.CreateSystemLog(ex, nameof(TicketService));

                    throw new MessageException(ex);
                }
                else
                {
                    await Logging.CreateSystemLog(ex.InnerException, nameof(TicketService));

                    throw new MessageException(ex.InnerException);
                }
            }
        }
Ejemplo n.º 2
0
        public async Task <Ticket> Create(Ticket Ticket)
        {
            if (!await TicketValidator.Create(Ticket))
            {
                return(Ticket);
            }

            try
            {
                await UOW.Begin();

                var newId = await TicketGeneratedIdService.GetNewTicketId();

                Ticket.TicketNumber   = newId.Id.ToString().PadLeft(6, '0');
                Ticket.UserId         = CurrentContext.UserId;
                Ticket.CreatorId      = CurrentContext.UserId;
                Ticket.Subject        = "";
                Ticket.SLA            = Ticket.TicketIssueLevel.SLA;
                Ticket.IsAlerted      = false;
                Ticket.IsAlertedFRT   = false;
                Ticket.IsEscalated    = false;
                Ticket.IsEscalatedFRT = false;
                Ticket.IsClose        = false;
                Ticket.IsOpen         = true;
                Ticket.IsWait         = false;
                Ticket.IsWork         = true;
                Ticket.ReraisedTimes  = 0;
                Ticket.HoldingTime    = 0;
                Ticket.TicketStatusId = TicketStatusEnum.NEW.Id;
                Ticket.TicketOfUsers  = new List <TicketOfUser>();
                Ticket.TicketOfUsers.Add(
                    new TicketOfUser()
                {
                    TicketStatusId = TicketStatusEnum.NEW.Id,
                    UserId         = Ticket.UserId
                }
                    );
                SLAPolicy SLAPolicy = await UOW.SLAPolicyRepository.GetByTicket(Ticket);

                DateTime Now = StaticParams.DateTimeNow;
                if (SLAPolicy != null)
                {
                    // Ticket.SLAPolicyId = SLAPolicy.Id;
                    Ticket.FirstResponeTime = Now.AddMinutes(Utils.ConvertSLATimeToMenute(SLAPolicy.FirstResponseTime.Value, SLAPolicy.FirstResponseUnitId.Value));
                    Ticket.ResolveTime      = Now.AddMinutes(Utils.ConvertSLATimeToMenute(SLAPolicy.ResolveTime.Value, SLAPolicy.ResolveUnitId.Value));
                }
                await UOW.TicketRepository.Create(Ticket);

                await TicketGeneratedIdService.UpdateUsed(int.Parse(Ticket.TicketNumber));

                await UOW.Commit();

                Ticket = await UOW.TicketRepository.Get(Ticket.Id);

                NotifyUsed(Ticket);
                var CurrentUser = await UOW.AppUserRepository.Get(CurrentContext.UserId);

                var RecipientIds = await UOW.PermissionRepository.ListAppUser(TicketRoute.Update);

                List <UserNotification> UserNotifications = new List <UserNotification>();
                //foreach (var id in RecipientIds)
                //{
                UserNotification NotificationUtils = new UserNotification
                {
                    TitleWeb    = $"Thông báo từ CRM",
                    ContentWeb  = $"Ticket [{Ticket.TicketNumber} - {Ticket.Name} - {Ticket.TicketIssueLevel.Name}] đã được thêm mới lên hệ thống bởi {CurrentUser.DisplayName}",
                    LinkWebsite = $"{TicketRoute.Detail}/*".Replace("*", Ticket.Id.ToString()),
                    Time        = Now,
                    Unread      = true,
                    SenderId    = CurrentContext.UserId,
                    RecipientId = CurrentContext.UserId,
                    RowId       = Guid.NewGuid(),
                };
                UserNotifications.Add(NotificationUtils);
                //}

                List <EventMessage <UserNotification> > EventUserNotifications = UserNotifications.Select(x => new EventMessage <UserNotification>(x, x.RowId)).ToList();
                RabbitManager.PublishList(EventUserNotifications, RoutingKeyEnum.UserNotificationSend);


                await Logging.CreateAuditLog(Ticket, new { }, nameof(TicketService));

                return(Ticket);
            }
            catch (Exception ex)
            {
                if (ex.InnerException == null)
                {
                    await Logging.CreateSystemLog(ex, nameof(TicketService));

                    throw new MessageException(ex);
                }
                else
                {
                    await Logging.CreateSystemLog(ex.InnerException, nameof(TicketService));

                    throw new MessageException(ex.InnerException);
                }
            }
        }