CdrNotificationHandler.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using Hotline.CallCenter.Calls;
  2. using Hotline.CallCenter.Tels;
  3. using Hotline.Share.Enums.CallCenter;
  4. using Hotline.Share.Notifications;
  5. using MediatR;
  6. namespace Hotline.Application.Handlers.CallCenter.FlowControl
  7. {
  8. public class CdrNotificationHandler:INotificationHandler<CdrNotification>
  9. {
  10. private readonly ICallRecordRepository _callRecordRepository;
  11. private readonly ICallDetailRepository _callDetailRepository;
  12. private readonly ITelHoldRepository _telHoldRepository;
  13. private readonly ICallRepository _callRepository;
  14. public CdrNotificationHandler(ICallRecordRepository callRecordRepository, ICallDetailRepository callDetailRepository, ICallRepository callRepository,ITelHoldRepository telHoldRepository)
  15. {
  16. _callRecordRepository = callRecordRepository;
  17. _callDetailRepository = callDetailRepository;
  18. _callRepository = callRepository;
  19. _telHoldRepository = telHoldRepository;
  20. }
  21. public async Task Handle(CdrNotification notification, CancellationToken cancellationToken)
  22. {
  23. //内部互拨
  24. if (notification.Type == "LO")
  25. {
  26. //获取最后一通内线电话
  27. var call = await _callRepository.GetLastLOCall(notification.CPN, notification.CDPN);
  28. if (call != null)
  29. {
  30. var model = new CallRecord()
  31. {
  32. CallId = call.Id,
  33. CdrId = notification.Id,
  34. CDRCallId = notification.CallId,
  35. TimeStart = notification.TimeStart,
  36. Group = notification.Group,
  37. Type = (ECDRType)Enum.Parse(typeof(ECDRType),notification.Type),
  38. Route = (ECDRRoute)Enum.Parse(typeof(ECDRRoute),notification.Route),
  39. CPN = notification.CPN,
  40. CDPN= notification.CDPN,
  41. TimeEnd = notification.TimeEnd,
  42. Duration= notification.Duration,
  43. TrunkNumber = notification.TrunkNumber,
  44. Recording = notification.Recording,
  45. RecCodec = notification.RecCodec,
  46. };
  47. await _callRecordRepository.AddAsync(model, cancellationToken);
  48. call.Duration = double.Parse(model.Duration);
  49. await _callRepository.UpdateAsync(call, cancellationToken);
  50. //处理Hold计算
  51. await _telHoldRepository.HandleHoldTime(call.Id, notification.TimeEnd, cancellationToken);
  52. }
  53. }
  54. else
  55. {
  56. var callDetail = await
  57. _callDetailRepository.GetAsync(x => x.OMCallId == notification.CallId,true,x=>x.CreationTime, cancellationToken);
  58. if (callDetail != null)
  59. {
  60. var model = new CallRecord()
  61. {
  62. CallId = callDetail.CallId,
  63. CdrId = notification.Id,
  64. CDRCallId = notification.CallId,
  65. TimeStart = notification.TimeStart,
  66. Group = notification.Group,
  67. Type = (ECDRType)Enum.Parse(typeof(ECDRType), notification.Type),
  68. Route = (ECDRRoute)Enum.Parse(typeof(ECDRRoute), notification.Route),
  69. CPN = notification.CPN,
  70. CDPN = notification.CDPN,
  71. TimeEnd = notification.TimeEnd,
  72. Duration = notification.Duration,
  73. TrunkNumber = notification.TrunkNumber,
  74. Recording = notification.Recording,
  75. RecCodec = notification.RecCodec,
  76. };
  77. if (!string.IsNullOrEmpty(notification.VisitorId))
  78. model.VisitorId = notification.VisitorId;
  79. if (!string.IsNullOrEmpty(notification.OuterId))
  80. model.OuterId = notification.OuterId;
  81. await _callRecordRepository.AddAsync(model, cancellationToken);
  82. var callModel = await _callRepository.GetAsync(x => x.Id == callDetail.CallId, cancellationToken);
  83. if (callModel != null)
  84. {
  85. callModel.Duration = double.Parse(model.Duration);
  86. await _callRepository.UpdateAsync(callModel, cancellationToken);
  87. }
  88. //处理Hold计算
  89. await _telHoldRepository.HandleHoldTime(callDetail.CallId, notification.TimeEnd, cancellationToken);
  90. }
  91. }
  92. }
  93. }
  94. }