AnsweredVisitorToExtNotificationHandler.cs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using Hotline.Caches;
  2. using Hotline.CallCenter.Calls;
  3. using Hotline.Realtimes;
  4. using Hotline.Share.Enums.CallCenter;
  5. using Hotline.Share.Notifications;
  6. using MediatR;
  7. namespace Hotline.Application.Handlers.CallCenter.FlowControl
  8. {
  9. public class AnsweredVisitorToExtNotificationHandler:INotificationHandler<AnsweredVisitorToExtNotification>
  10. {
  11. private readonly ICallRepository _callRepository;
  12. private readonly ICallDetailRepository _callDetailRepository;
  13. private readonly IUserCacheManager _userCacheManager;
  14. private readonly IRealtimeService _realtimeService;
  15. public AnsweredVisitorToExtNotificationHandler(ICallRepository callRepository, ICallDetailRepository callDetailRepository,IUserCacheManager userCacheManager,IRealtimeService realtimeService)
  16. {
  17. _callRepository = callRepository;
  18. _callDetailRepository = callDetailRepository;
  19. _userCacheManager = userCacheManager;
  20. _realtimeService = realtimeService;
  21. }
  22. public async Task Handle(AnsweredVisitorToExtNotification notification, CancellationToken cancellationToken)
  23. {
  24. var model = await _callRepository.GetAsync(
  25. x => x.ConversationId == notification.Visitor.Id &&
  26. x.FromNo == notification.Visitor.From && x.CreationTime >= DateTime.Now.AddHours(-2),true,x=>x.CreationTime, cancellationToken);
  27. var workModel = _userCacheManager.GetWorkByTel(notification.TelNo);
  28. if (model != null)
  29. {
  30. model.CallStatus = ECallStatus.Answered;
  31. model.ToNoExt = notification.TelNo;
  32. model.AnsweredTime = DateTime.Now;
  33. model.UserId = workModel.UserId;
  34. model.UserName = workModel.UserName;
  35. await _callRepository.UpdateAsync(model, cancellationToken);
  36. var detail = new CallDetail()
  37. {
  38. CallId = model.Id,
  39. CallStatus = ECallStatus.Answered,
  40. OMCallId = notification.Visitor.CallId,
  41. ConversationId = notification.Visitor.Id,
  42. EventName = notification.Attribute,
  43. AnswerNo = notification.TelNo,
  44. FromNo = notification.Visitor.From,
  45. ToNo = notification.Visitor.To,
  46. };
  47. await _callDetailRepository.AddAsync(detail, cancellationToken);
  48. var callDetail = _callDetailRepository.GetAsync(x => x.CallId == model.Id && x.EventName == "ANSWER");
  49. if (callDetail==null)
  50. {
  51. //调用业务通知 通知前端
  52. await _realtimeService.AnsweredAsync(workModel.UserId, new Share.Dtos.Realtime.AnsweredDto() { Id = model.Id, From = notification.Visitor.From, To = notification.TelNo }, cancellationToken);
  53. }
  54. }
  55. }
  56. }
  57. }