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); } } }
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); } } }