RingExtToOuterNotificationHandler.cs 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using CallCenter.Notifications;
  2. using CallCenter.Calls;
  3. using CallCenter.Share.Enums;
  4. using MediatR;
  5. using CallCenter.Tools;
  6. namespace CallCenter.Application.Handlers
  7. {
  8. public class RingExtToOuterNotificationHandler:INotificationHandler<RingExtToOuterNotification>
  9. {
  10. private readonly ICallRepository _callRepository;
  11. private readonly ICallDetailRepository _callDetailRepository;
  12. public RingExtToOuterNotificationHandler(ICallRepository callRepository, ICallDetailRepository callDetailRepository)
  13. {
  14. _callRepository = callRepository;
  15. _callDetailRepository = callDetailRepository;
  16. }
  17. public async Task Handle(RingExtToOuterNotification notification, CancellationToken cancellationToken)
  18. {
  19. var model = await _callRepository.GetAsync(x =>
  20. x.FromNo == notification.TelNo && x.ToNo == notification.Outer.To && x.CreationTime >=DateTime.Now.AddHours(-2),true,x=>x.CreationTime, cancellationToken);
  21. if (model==null)
  22. {
  23. model = await _callRepository.GetAsync(
  24. x => x.ConversationId == notification.Outer.Id && x.ToNo == notification.Outer.To &&
  25. x.Trunk == notification.Outer.Trunk,true,x=>x.CreationTime, cancellationToken);
  26. }
  27. if (model!=null)
  28. {
  29. model.CallStatus = ECallStatus.Ring;
  30. await _callRepository.UpdateAsync(model, cancellationToken);
  31. var detail = new CallDetail()
  32. {
  33. CallId = model.Id,
  34. CallStatus = ECallStatus.Ring,
  35. EventName = notification.Attribute,
  36. ConversationId = notification.Outer.Id,
  37. OMCallId = notification.Outer.CallId,
  38. FromNo = notification.Outer.From,
  39. ToNo = notification.Outer.To,
  40. };
  41. if (string.IsNullOrEmpty(detail.FromNo))
  42. detail.FromNo = notification.TelNo;
  43. await _callDetailRepository.AddAsync(detail, cancellationToken);
  44. }
  45. else
  46. {
  47. var isp = PhoneIspTool.GetPhoneIsp(notification.Outer.To);
  48. string telNo = (string.IsNullOrEmpty(notification.Outer.From) || string.IsNullOrWhiteSpace(notification.Outer.From)) ? notification.TelNo : notification.Outer.From;
  49. var callModel = new Call()
  50. {
  51. CallStatus = ECallStatus.Ring,
  52. CallDirection = ECallDirection.Out,
  53. CallType = ECallType.ExtToOuter,
  54. ConversationId = notification.Outer.Id,
  55. FromNo = telNo,
  56. ToNo = notification.Outer.To,
  57. Trunk = notification.Outer.Trunk,
  58. PhoneIsp = isp
  59. };
  60. callModel.Modified();
  61. var callId = await _callRepository.AddAsync(callModel, cancellationToken);
  62. //写入明细
  63. var detail = new CallDetail()
  64. {
  65. CallId = callId,
  66. CallStatus = ECallStatus.Ring,
  67. ConversationId = notification.Outer.Id,
  68. OMCallId = notification.Outer.CallId,
  69. EventName = notification.Attribute,
  70. FromNo = notification.Outer.From,
  71. ToNo = notification.Outer.To,
  72. };
  73. await _callDetailRepository.AddAsync(detail, cancellationToken);
  74. }
  75. }
  76. }
  77. }