CallController.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. using Hotline.CallCenter.BlackLists;
  2. using Hotline.CallCenter.Calls;
  3. using Hotline.Permissions;
  4. using Hotline.Repository.SqlSugar.Extensions;
  5. using Hotline.Share.Dtos;
  6. using Hotline.Share.Dtos.CallCenter;
  7. using Hotline.Share.Enums.CallCenter;
  8. using Hotline.Share.Requests;
  9. using MapsterMapper;
  10. using Microsoft.AspNetCore.Mvc;
  11. namespace Hotline.Api.Controllers
  12. {
  13. /// <summary>
  14. /// 通话相关接口
  15. /// </summary>
  16. public class CallController : BaseController
  17. {
  18. private readonly ICallRepository _callRepository;
  19. private readonly IMapper _mapper;
  20. private readonly IBlacklistDomainService _blacklistDomainService;
  21. private readonly IBlacklistRepository _blacklistRepository;
  22. /// <summary>
  23. /// 通话相关接口构造
  24. /// </summary>
  25. /// <param name="callRepository"></param>
  26. /// <param name="mapper"></param>
  27. /// <param name="blacklistDomainService"></param>
  28. /// <param name="blacklistRepository"></param>
  29. public CallController(
  30. ICallRepository callRepository,
  31. IMapper mapper,
  32. IBlacklistDomainService blacklistDomainService,
  33. IBlacklistRepository blacklistRepository)
  34. {
  35. _callRepository = callRepository;
  36. _mapper = mapper;
  37. _blacklistDomainService = blacklistDomainService;
  38. _blacklistRepository = blacklistRepository;
  39. }
  40. #region 通话记录
  41. /// <summary>
  42. /// 分页通话记录列表
  43. /// </summary>
  44. /// <param name="request"></param>
  45. /// <returns></returns>
  46. [Permission(EPermission.GetCallList)]
  47. [HttpGet("paged")]
  48. public async Task<PagedDto<CallDto>> GetCallList([FromQuery] GetCallListRequest request)
  49. {
  50. var (total, items) = await _callRepository.Queryable()
  51. .Includes(d => d.CallDetails)
  52. .WhereIF(!string.IsNullOrEmpty(request.PhoneNum), d => d.FromNo.Contains(request.PhoneNum!))
  53. .WhereIF(!string.IsNullOrEmpty(request.ToNum), d => d.ToNo.Contains(request.ToNum!))
  54. .WhereIF(request.Direction is not null, d => d.CallDirection == request.Direction)
  55. .WhereIF(request.CallState is not null, request.CallState == ECallState.On ? d => d.CallDetails.Any(q => q.EventName == "ANSWERED") : d => !d.CallDetails.Any(q => q.EventName == "ANSWERED"))
  56. .WhereIF(!string.IsNullOrEmpty(request.UserName), d => d.UserName.Contains(request.UserName))
  57. .OrderByDescending(d => d.CreationTime)
  58. .ToPagedListAsync(request.PageIndex, request.PageSize);
  59. return new PagedDto<CallDto>(total, _mapper.Map<IReadOnlyList<CallDto>>(items));
  60. }
  61. /// <summary>
  62. /// 查询未接通话记录
  63. /// </summary>
  64. /// <param name="request"></param>
  65. /// <returns></returns>
  66. [Permission(EPermission.GetCallListMissed)]
  67. [HttpGet("messed-paged")]
  68. public async Task<PagedDto<CallDto>> GetCallListMissed([FromQuery] GetCallListRequest request)
  69. {
  70. var (total, items) = await _callRepository.Queryable()
  71. .Where(x => !x.CallDetails.Any(d => d.EventName == "ANSWERED"))
  72. .WhereIF(!string.IsNullOrEmpty(request.PhoneNum), d => d.FromNo.Contains(request.PhoneNum!))
  73. .WhereIF(!string.IsNullOrEmpty(request.ToNum), d => d.ToNo.Contains(request.ToNum!))
  74. .WhereIF(request.Direction is not null, d => d.CallDirection == request.Direction)
  75. .Includes(d => d.CallDetails)
  76. .OrderByDescending(d => d.CreationTime)
  77. .ToPagedListAsync(request.PageIndex, request.PageSize);
  78. return new PagedDto<CallDto>(total, _mapper.Map<IReadOnlyList<CallDto>>(items));
  79. }
  80. #endregion
  81. #region 对外通话记录
  82. /// <summary>
  83. /// 通话记录(外部对接)
  84. /// </summary>
  85. /// <param name="request"></param>
  86. /// <returns></returns>
  87. [HttpGet("out-calllist")]
  88. public async Task<IReadOnlyList<OutCallDto>> GetOutCallList([FromQuery] GetOutCallListRequest request)
  89. {
  90. var list = await _callRepository.QueryPartAsync(request.time);
  91. List<OutCallDto> outCallList = new List<OutCallDto>();
  92. foreach (var item in list)
  93. {
  94. OutCallDto outCallDto = new OutCallDto();
  95. outCallDto.CallId = item.Id;
  96. outCallDto.InfoType = EInfoType.Call;//TODO目前写死(只有电话)
  97. outCallDto.Direction = item.CallDirection;
  98. outCallDto.Cpn = item.FromNo ?? "";
  99. outCallDto.Cdpn = item.ToNo ?? "";
  100. outCallDto.Answered = item.CallDetails?.FirstOrDefault(x => x.EventName == "ANSWERED")?.AnswerNo ?? "";
  101. outCallDto.BeginTime = item.CreationTime;
  102. outCallDto.OnTime = item.CallDetails?.FirstOrDefault(x => x.EventName == "ANSWERED")?.CreationTime;//TODO 接通时间是否可以为空
  103. outCallDto.ByeTime = item.CallDetails?.FirstOrDefault(x => x.EventName == "BYE")?.CreationTime;
  104. outCallDto.TalkTime = item.Duration;
  105. outCallDto.SoundFileName = item.CallDetails?.FirstOrDefault(x => x.EventName == "BYE")?.Recording ?? "";
  106. outCallDto.EvaluateResult = "";
  107. outCallDto.EndBy = item.EndBy;
  108. outCallDto.OnState = item.CallDetails?.Any(x => x.EventName == "ANSWERED") == true ? EOnState.On : EOnState.NoOn;
  109. outCallList.Add(outCallDto);
  110. }
  111. return outCallList;
  112. }
  113. #endregion
  114. #region 黑名单
  115. /// <summary>
  116. /// 添加电话号至黑名单
  117. /// </summary>
  118. /// <param name="dto"></param>
  119. /// <returns></returns>
  120. [Permission(EPermission.AddBlackList)]
  121. [HttpPost("blacklist")]
  122. public async Task AddBlacklist([FromBody] AddBlacklistDto dto)
  123. {
  124. await _blacklistDomainService.AddAsync(dto, HttpContext.RequestAborted);
  125. }
  126. /// <summary>
  127. /// 删除黑名单数据
  128. /// </summary>
  129. /// <param name="phone"></param>
  130. [Permission(EPermission.RemoveBlacklist)]
  131. [HttpDelete("blacklist/{phone}")]
  132. public void RemoveBlacklist(string phone)
  133. {
  134. _blacklistDomainService.RemoveAsync(phone);
  135. }
  136. /// <summary>
  137. /// 分页查询黑名单
  138. /// </summary>
  139. /// <param name="dto"></param>
  140. /// <returns></returns>
  141. [Permission(EPermission.QueryPagedBlack)]
  142. [HttpGet("blacklist/paged")]
  143. public async Task<PagedDto<Blacklist>> QueryPaged([FromQuery] BlacklistPagedDto dto)
  144. {
  145. var (total, items) = await _blacklistRepository.QueryPagedAsync(
  146. d => true,
  147. d => d.OrderByDescending(x => x.CreationTime),
  148. dto.PageIndex,
  149. dto.PageSize,
  150. whereIfs: (!string.IsNullOrEmpty(dto.PhoneNo), d => d.PhoneNo.Contains(dto.PhoneNo!)));
  151. return new PagedDto<Blacklist>(total, items);
  152. }
  153. #endregion
  154. }
  155. }