123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- using Hotline.CallCenter.Calls;
- using Hotline.CallCenter.Tels;
- using Hotline.Share.Enums.CallCenter;
- using Hotline.Share.Notifications;
- using MediatR;
- namespace Hotline.Application.Handlers.CallCenter.FlowControl
- {
- public class CdrNotificationHandler:INotificationHandler<CdrNotification>
- {
- private readonly ICallRecordRepository _callRecordRepository;
- private readonly ICallDetailRepository _callDetailRepository;
- private readonly ITelHoldRepository _telHoldRepository;
- private readonly ICallRepository _callRepository;
- public CdrNotificationHandler(ICallRecordRepository callRecordRepository, ICallDetailRepository callDetailRepository, ICallRepository callRepository,ITelHoldRepository telHoldRepository)
- {
- _callRecordRepository = callRecordRepository;
- _callDetailRepository = callDetailRepository;
- _callRepository = callRepository;
- _telHoldRepository = telHoldRepository;
- }
- public async Task Handle(CdrNotification notification, CancellationToken cancellationToken)
- {
- //内部互拨
- if (notification.Type == "LO")
- {
- //获取最后一通内线电话
- var call = await _callRepository.GetLastLOCall(notification.CPN, notification.CDPN);
- if (call != null)
- {
- var model = new CallRecord()
- {
- CallId = call.Id,
- CdrId = notification.Id,
- CDRCallId = notification.CallId,
- TimeStart = notification.TimeStart,
- Group = notification.Group,
- Type = (ECDRType)Enum.Parse(typeof(ECDRType),notification.Type),
- Route = (ECDRRoute)Enum.Parse(typeof(ECDRRoute),notification.Route),
- CPN = notification.CPN,
- CDPN= notification.CDPN,
- TimeEnd = notification.TimeEnd,
- Duration= notification.Duration,
- TrunkNumber = notification.TrunkNumber,
- Recording = notification.Recording,
- RecCodec = notification.RecCodec,
- };
- await _callRecordRepository.AddAsync(model, cancellationToken);
- call.Duration = double.Parse(model.Duration);
- await _callRepository.UpdateAsync(call, cancellationToken);
- //处理Hold计算
- await _telHoldRepository.HandleHoldTime(call.Id, notification.TimeEnd, cancellationToken);
- }
-
- }
- else
- {
- var callDetail = await
- _callDetailRepository.GetAsync(x => x.OMCallId == notification.CallId,true,x=>x.CreationTime, cancellationToken);
- if (callDetail != null)
- {
- var model = new CallRecord()
- {
- CallId = callDetail.CallId,
- CdrId = notification.Id,
- CDRCallId = notification.CallId,
- TimeStart = notification.TimeStart,
- Group = notification.Group,
- Type = (ECDRType)Enum.Parse(typeof(ECDRType), notification.Type),
- Route = (ECDRRoute)Enum.Parse(typeof(ECDRRoute), notification.Route),
- CPN = notification.CPN,
- CDPN = notification.CDPN,
- TimeEnd = notification.TimeEnd,
- Duration = notification.Duration,
- TrunkNumber = notification.TrunkNumber,
- Recording = notification.Recording,
- RecCodec = notification.RecCodec,
- };
- if (!string.IsNullOrEmpty(notification.VisitorId))
- model.VisitorId = notification.VisitorId;
- if (!string.IsNullOrEmpty(notification.OuterId))
- model.OuterId = notification.OuterId;
- await _callRecordRepository.AddAsync(model, cancellationToken);
- var callModel = await _callRepository.GetAsync(x => x.Id == callDetail.CallId, cancellationToken);
- if (callModel != null)
- {
- callModel.Duration = double.Parse(model.Duration);
- await _callRepository.UpdateAsync(callModel, cancellationToken);
- }
- //处理Hold计算
- await _telHoldRepository.HandleHoldTime(callDetail.CallId, notification.TimeEnd, cancellationToken);
- }
- }
- }
- }
- }
|